phaser.js 4.5 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655100656100657100658100659100660100661100662100663100664100665100666100667100668100669100670100671100672100673100674100675100676100677100678100679100680100681100682100683100684100685100686100687100688100689100690100691100692100693100694100695100696100697100698100699100700100701100702100703100704100705100706100707100708100709100710100711100712100713100714100715100716100717100718100719100720100721100722100723100724100725100726100727100728100729100730100731100732100733100734100735100736100737100738100739100740100741100742100743100744100745100746100747100748100749100750100751100752100753100754100755100756100757100758100759100760100761100762100763100764100765100766100767100768100769100770100771100772100773100774100775100776100777100778100779100780100781100782100783100784100785100786100787100788100789100790100791100792100793100794100795100796100797100798100799100800100801100802100803100804100805100806100807100808100809100810100811100812100813100814100815100816100817100818100819100820100821100822100823100824100825100826100827100828100829100830100831100832100833100834100835100836100837100838100839100840100841100842100843100844100845100846100847100848100849100850100851100852100853100854100855100856100857100858100859100860100861100862100863100864100865100866100867100868100869100870100871100872100873100874100875100876100877100878100879100880100881100882100883100884100885100886100887100888100889100890100891100892100893100894100895100896100897100898100899100900100901100902100903100904100905100906100907100908100909100910100911100912100913100914100915100916100917100918100919100920100921100922100923100924100925100926100927100928100929100930100931100932100933100934100935100936100937100938100939100940100941100942100943100944100945100946100947100948100949100950100951100952100953100954100955100956100957100958100959100960100961100962100963100964100965100966100967100968100969100970100971100972100973100974100975100976100977100978100979100980100981100982100983100984100985100986100987100988100989100990100991100992100993100994100995100996100997100998100999101000101001101002101003101004101005101006101007101008101009101010101011101012101013101014101015101016101017101018101019101020101021101022101023101024101025101026101027101028101029101030101031101032101033101034101035101036101037101038101039101040101041101042101043101044101045101046101047101048101049101050101051101052101053101054101055101056101057101058101059101060101061101062101063101064101065101066101067101068101069101070101071101072101073101074101075101076101077101078101079101080101081101082101083101084101085101086101087101088101089101090101091101092101093101094101095101096101097101098101099101100101101101102101103101104101105101106101107101108101109101110101111101112101113101114101115101116101117101118101119101120101121101122101123101124101125101126101127101128101129101130101131101132101133101134101135101136101137101138101139101140101141101142101143101144101145101146101147101148101149101150101151101152101153101154101155101156101157101158101159101160101161101162101163101164101165101166101167101168101169101170101171101172101173101174101175101176101177101178101179101180101181101182101183101184101185101186101187101188101189101190101191101192101193101194101195101196101197101198101199101200101201101202101203101204101205101206101207101208101209101210101211101212101213101214101215101216101217101218101219101220101221101222101223101224101225101226101227101228101229101230101231101232101233101234101235101236101237101238101239101240101241101242101243101244101245101246101247101248101249101250101251101252101253101254101255101256101257101258101259101260101261101262101263101264101265101266101267101268101269101270101271101272101273101274101275101276101277101278101279101280101281101282101283101284101285101286101287101288101289101290101291101292101293101294101295101296101297101298101299101300101301101302101303101304101305101306101307101308101309101310101311101312101313101314101315101316101317101318101319101320101321101322101323101324101325101326101327101328101329101330101331101332101333101334101335101336101337101338101339101340101341101342101343101344101345101346101347101348101349101350101351101352101353101354101355101356101357101358101359101360101361101362101363101364101365101366101367101368101369101370101371101372101373101374101375101376101377101378101379101380101381101382101383101384101385101386101387101388101389101390101391101392101393101394101395101396101397101398101399101400101401101402101403101404101405101406101407101408101409101410101411101412101413101414101415101416101417101418101419101420101421101422101423101424101425101426101427101428101429101430101431101432101433101434101435101436101437101438101439101440101441101442101443101444101445101446101447101448101449101450101451101452101453101454101455101456101457101458101459101460101461101462101463101464101465101466101467101468101469101470101471101472101473101474101475101476101477101478101479101480101481101482101483101484101485101486101487101488101489101490101491101492101493101494101495101496101497101498101499101500101501101502101503101504101505101506101507101508101509101510101511101512101513101514101515101516101517101518101519101520101521101522101523101524101525101526101527101528101529101530101531101532101533101534101535101536101537101538101539101540101541101542101543101544101545101546101547101548101549101550101551101552101553101554101555101556101557101558101559101560101561101562101563101564101565101566101567101568101569101570101571101572101573101574101575101576101577101578101579101580101581101582101583101584101585101586101587101588101589101590101591101592101593101594101595101596101597101598101599101600101601101602101603101604101605101606101607101608101609101610101611101612101613101614101615101616101617101618101619101620101621101622101623101624101625101626101627101628101629101630101631101632101633101634101635101636101637101638101639101640101641101642101643101644101645101646101647101648101649101650101651101652101653101654101655101656101657101658101659101660101661101662101663101664101665101666101667101668101669101670101671101672101673101674101675101676101677101678101679101680101681101682101683101684101685101686101687101688101689101690101691101692101693101694101695101696101697101698101699101700101701101702101703101704101705101706101707101708101709101710101711101712101713101714101715101716101717101718101719101720101721101722101723101724101725101726101727101728101729101730101731101732101733101734101735101736101737101738101739101740101741101742101743101744101745101746101747101748101749101750101751101752101753101754101755101756101757101758101759101760101761101762101763101764101765101766101767101768101769101770101771101772101773101774101775101776101777101778101779101780101781101782101783101784101785101786101787101788101789101790101791101792101793101794101795101796101797101798101799101800101801101802101803101804101805101806101807101808101809101810101811101812101813101814101815101816101817101818101819101820101821101822101823101824101825101826101827101828101829101830101831101832101833101834101835101836101837101838101839101840101841101842101843101844101845101846101847101848101849101850101851101852101853101854101855101856101857101858101859101860101861101862101863101864101865101866101867101868101869101870101871101872101873101874101875101876101877101878101879101880101881101882101883101884101885101886101887101888101889101890101891101892101893101894101895101896101897101898101899101900101901101902101903101904101905101906101907101908101909101910101911101912101913101914101915101916101917101918101919101920101921101922101923101924101925101926101927101928101929101930101931101932101933101934101935101936101937101938101939101940101941101942101943101944101945101946101947101948101949101950101951101952101953101954101955101956101957101958101959101960101961101962101963101964101965101966101967101968101969101970101971101972101973101974101975101976101977101978101979101980101981101982101983101984101985101986101987101988101989101990101991101992101993101994101995101996101997101998101999102000102001102002102003102004102005102006102007102008102009102010102011102012102013102014102015102016102017102018102019102020102021102022102023102024102025102026102027102028102029102030102031102032102033102034102035102036102037102038102039102040102041102042102043102044102045102046102047102048102049102050102051102052102053102054102055102056102057102058102059102060102061102062102063102064102065102066102067102068102069102070102071102072102073102074102075102076102077102078102079102080102081102082102083102084102085102086102087102088102089102090102091102092102093102094102095102096102097102098102099102100102101102102102103102104102105102106102107102108102109102110102111102112102113102114102115102116102117102118102119102120102121102122102123102124102125102126102127102128102129102130102131102132102133102134102135102136102137102138102139102140102141102142102143102144102145102146102147102148102149102150102151102152102153102154102155102156102157102158102159102160102161102162102163102164102165102166102167102168102169102170102171102172102173102174102175102176102177102178102179102180102181102182102183102184102185102186102187102188102189102190102191102192102193102194102195102196102197102198102199102200102201102202102203102204102205102206102207102208102209102210102211102212102213102214102215102216102217102218102219102220102221102222102223102224102225102226102227102228102229102230102231102232102233102234102235102236102237102238102239102240102241102242102243102244102245102246102247102248102249102250102251102252102253102254102255102256102257102258102259102260102261102262102263102264102265102266102267102268102269102270102271102272102273102274102275102276102277102278102279102280102281102282102283102284102285102286102287102288102289102290102291102292102293102294102295102296102297102298102299102300102301102302102303102304102305102306102307102308102309102310102311102312102313102314102315102316102317102318102319102320102321102322102323102324102325102326102327102328102329102330102331102332102333102334102335102336102337102338102339102340102341102342102343102344102345102346102347102348102349102350102351102352102353102354102355102356102357102358102359102360102361102362102363102364102365102366102367102368102369102370102371102372102373102374102375102376102377102378102379102380102381102382102383102384102385102386102387102388102389102390102391102392102393102394102395102396102397102398102399102400102401102402102403102404102405102406102407102408102409102410102411102412102413102414102415102416102417102418102419102420102421102422102423102424102425102426102427102428102429102430102431102432102433102434102435102436102437102438102439102440102441102442102443102444102445102446102447102448102449102450102451102452102453102454102455102456102457102458102459102460102461102462102463102464102465102466102467102468102469102470102471102472102473102474102475102476102477102478102479102480102481102482102483102484102485102486102487102488102489102490102491102492102493102494102495102496102497102498102499102500102501102502102503102504102505102506102507102508102509102510102511102512102513102514102515102516102517102518102519102520102521102522102523102524102525102526102527102528102529102530102531102532102533102534102535102536102537102538102539102540102541102542102543102544102545102546102547102548102549102550102551102552102553102554102555102556102557102558102559102560102561102562102563102564102565102566102567102568102569102570102571102572102573102574102575102576102577102578102579102580102581102582102583102584102585102586102587102588102589102590102591102592102593102594102595102596102597102598102599102600102601102602102603102604102605102606102607102608102609102610102611102612102613102614102615102616102617102618102619102620102621102622102623102624102625102626102627102628102629102630102631102632102633102634102635102636102637102638102639102640102641102642102643102644102645102646102647102648102649102650102651102652102653102654102655102656102657102658102659102660102661102662102663102664102665102666102667102668102669102670102671102672102673102674102675102676102677102678102679102680102681102682102683102684102685102686102687102688102689102690102691102692102693102694102695102696102697102698102699102700102701102702102703102704102705102706102707102708102709102710102711102712102713102714102715102716102717102718102719102720102721102722102723102724102725102726102727102728102729102730102731102732102733102734102735102736102737102738102739102740102741102742102743102744102745102746102747102748102749102750102751102752102753102754102755102756102757102758102759102760102761102762102763102764102765102766102767102768102769102770102771102772102773102774102775102776102777102778102779102780102781102782102783102784102785102786102787102788102789102790102791102792102793102794102795102796102797102798102799102800102801102802102803102804102805102806102807102808102809102810102811102812102813102814102815102816102817102818102819102820102821102822102823102824102825102826102827102828102829102830102831102832102833102834102835102836102837102838102839102840102841102842102843102844102845102846102847102848102849102850102851102852102853102854102855102856102857102858102859102860102861102862102863102864102865102866102867102868102869102870102871102872102873102874102875102876102877102878102879102880102881102882102883102884102885102886102887102888102889102890102891102892102893102894102895102896102897102898102899102900102901102902102903102904102905102906102907102908102909102910102911102912102913102914102915102916102917102918102919102920102921102922102923102924102925102926102927102928102929102930102931102932102933102934102935102936102937102938102939102940102941102942102943102944102945102946102947102948102949102950102951102952102953102954102955102956102957102958102959102960102961102962102963102964102965102966102967102968102969102970102971102972102973102974102975102976102977102978102979102980102981102982102983102984102985102986102987102988102989102990102991102992102993102994102995102996102997102998102999103000103001103002103003103004103005103006103007103008103009103010103011103012103013103014103015103016103017103018103019103020103021103022103023103024103025103026103027103028103029103030103031103032103033103034103035103036103037103038103039103040103041103042103043103044103045103046103047103048103049103050103051103052103053103054103055103056103057103058103059103060103061103062103063103064103065103066103067103068103069103070103071103072103073103074103075103076103077103078103079103080103081103082103083103084103085103086103087103088103089103090103091103092103093103094103095103096103097103098103099103100103101103102103103103104103105103106103107103108103109103110103111103112103113103114103115103116103117103118103119103120103121103122103123103124103125103126103127103128103129103130103131103132103133103134103135103136103137103138103139103140103141103142103143103144103145103146103147103148103149103150103151103152103153103154103155103156103157103158103159103160103161103162103163103164103165103166103167103168103169103170103171103172103173103174103175103176103177103178103179103180103181103182103183103184103185103186103187103188103189103190103191103192103193103194103195103196103197103198103199103200103201103202103203103204103205103206103207103208103209103210103211103212103213103214103215103216103217103218103219103220103221103222103223103224103225103226103227103228103229103230103231103232103233103234103235103236103237103238103239103240103241103242103243103244103245103246103247103248103249103250103251103252103253103254103255103256103257103258103259103260103261103262103263103264103265103266103267103268103269103270103271103272103273103274103275103276103277103278103279103280103281103282103283103284103285103286103287103288103289103290103291103292103293103294103295103296103297103298103299103300103301103302103303103304103305103306103307103308103309103310103311103312103313103314103315103316103317103318103319103320103321103322103323103324103325103326103327103328103329103330103331103332103333103334103335103336103337103338103339103340103341103342103343103344103345103346103347103348103349103350103351103352103353103354103355103356103357103358103359103360103361103362103363103364103365103366103367103368103369103370103371103372103373103374103375103376103377103378103379103380103381103382103383103384103385103386103387103388103389103390103391103392103393103394103395103396103397103398103399103400103401103402103403103404103405103406103407103408103409103410103411103412103413103414103415103416103417103418103419103420103421103422103423103424103425103426103427103428103429103430103431103432103433103434103435103436103437103438103439103440103441103442103443103444103445103446103447103448103449103450103451103452103453103454103455103456103457103458103459103460103461103462103463103464103465103466103467103468103469103470103471103472103473103474103475103476103477103478103479103480103481103482103483103484103485103486103487103488103489103490103491103492103493103494103495103496103497103498103499103500103501103502103503103504103505103506103507103508103509103510103511103512103513103514103515103516103517103518103519103520103521103522103523103524103525103526103527103528103529103530103531103532103533103534103535103536103537103538103539103540103541103542103543103544103545103546103547103548103549103550103551103552103553103554103555103556103557103558103559103560103561103562103563103564103565103566103567103568103569103570103571103572103573103574103575103576103577103578103579103580103581103582103583103584103585103586103587103588103589103590103591103592103593103594103595103596103597103598103599103600103601103602103603103604103605103606103607103608103609103610103611103612103613103614103615103616103617103618103619103620103621103622103623103624103625103626103627103628103629103630103631103632103633103634103635103636103637103638103639103640103641103642103643103644103645103646103647103648103649103650103651103652103653103654103655103656103657103658103659103660103661103662103663103664103665103666103667103668103669103670103671103672103673103674103675103676103677103678103679103680103681103682103683103684103685103686103687103688103689103690103691103692103693103694103695103696103697103698103699103700103701103702103703103704103705103706103707103708103709103710103711103712103713103714103715103716103717103718103719103720103721103722103723103724103725103726103727103728103729103730103731103732103733103734103735103736103737103738103739103740103741103742103743103744103745103746103747103748103749103750103751103752103753103754103755103756103757103758103759103760103761103762103763103764103765103766103767103768103769103770103771103772103773103774103775103776103777103778103779103780103781103782103783103784103785103786103787103788103789103790103791103792103793103794103795103796103797103798103799103800103801103802103803103804103805103806103807103808103809103810103811103812103813103814103815103816103817103818103819103820103821103822103823103824103825103826103827103828103829103830103831103832103833103834103835103836103837103838103839103840103841103842103843103844103845103846103847103848103849103850103851103852103853103854103855103856103857103858103859103860103861103862103863103864103865103866103867103868103869103870103871103872103873103874103875103876103877103878103879103880103881103882103883103884103885103886103887103888103889103890103891103892103893103894103895103896103897103898103899103900103901103902103903103904103905103906103907103908103909103910103911103912103913103914103915103916103917103918103919103920103921103922103923103924103925103926103927103928103929103930103931103932103933103934103935103936103937103938103939103940103941103942103943103944103945103946103947103948103949103950103951103952103953103954103955103956103957103958103959103960103961103962103963103964103965103966103967103968103969103970103971103972103973103974103975103976103977103978103979103980103981103982103983103984103985103986103987103988103989103990103991103992103993103994103995103996103997103998103999104000104001104002104003104004104005104006104007104008104009104010104011104012104013104014104015104016104017104018104019104020104021104022104023104024104025104026104027104028104029104030104031104032104033104034104035104036104037104038104039104040104041104042104043104044104045104046104047104048104049104050104051104052104053104054104055104056104057104058104059104060104061104062104063104064104065104066104067104068104069104070104071104072104073104074104075104076104077104078104079104080104081104082104083104084104085104086104087104088104089104090104091104092104093104094104095104096104097104098104099104100104101104102104103104104104105104106104107104108104109104110104111104112104113104114104115104116104117104118104119104120104121104122104123104124104125104126104127104128104129104130104131104132104133104134104135104136104137104138104139104140104141104142104143104144104145104146104147104148104149104150104151104152104153104154104155104156104157104158104159104160104161104162104163104164104165104166104167104168104169104170104171104172104173104174104175104176104177104178104179104180104181104182104183104184104185104186104187104188104189104190104191104192104193104194104195104196104197104198104199104200104201104202104203104204104205104206104207104208104209104210104211104212104213104214104215104216104217104218104219104220104221104222104223104224104225104226104227104228104229104230104231104232104233104234104235104236104237104238104239104240104241104242104243104244104245104246104247104248104249104250104251104252104253104254104255104256104257104258104259104260104261104262104263104264104265104266104267104268104269104270104271104272104273104274104275104276104277104278104279104280104281104282104283104284104285104286104287104288104289104290104291104292104293104294104295104296104297104298104299104300104301104302104303104304104305104306104307104308104309104310104311104312104313104314104315104316104317104318104319104320104321104322104323104324104325104326104327104328104329104330104331104332104333104334104335104336104337104338104339104340104341104342104343104344104345104346104347104348104349104350104351104352104353104354104355104356104357104358104359104360104361104362104363104364104365104366104367104368104369104370104371104372104373104374104375104376104377104378104379104380104381104382104383104384104385104386104387104388104389104390104391104392104393104394104395104396104397104398104399104400104401104402104403104404104405104406104407104408104409104410104411104412104413104414104415104416104417104418104419104420104421104422104423104424104425104426104427104428104429104430104431104432104433104434104435104436104437104438104439104440104441104442104443104444104445104446104447104448104449104450104451104452104453104454104455104456104457104458104459104460104461104462104463104464104465104466104467104468104469104470104471104472104473104474104475104476104477104478104479104480104481104482104483104484104485104486104487104488104489104490104491104492104493104494104495104496104497104498104499104500104501104502104503104504104505104506104507104508104509104510104511104512104513104514104515104516104517104518104519104520104521104522104523104524104525104526104527104528104529104530104531104532104533104534104535104536104537104538104539104540104541104542104543104544104545104546104547104548104549104550104551104552104553104554104555104556104557104558104559104560104561104562104563104564104565104566104567104568104569104570104571104572104573104574104575104576104577104578104579104580104581104582104583104584104585104586104587104588104589104590104591104592104593104594104595104596104597104598104599104600104601104602104603104604104605104606104607104608104609104610104611104612104613104614104615104616104617104618104619104620104621104622104623104624104625104626104627104628104629104630104631104632104633104634104635104636104637104638104639104640104641104642104643104644104645104646104647104648104649104650104651104652104653104654104655104656104657104658104659104660104661104662104663104664104665104666104667104668104669104670104671104672104673104674104675104676104677104678104679104680104681104682104683104684104685104686104687104688104689104690104691104692104693104694104695104696104697104698104699104700104701104702104703104704104705104706104707104708104709104710104711104712104713104714104715104716104717104718104719104720104721104722104723104724104725104726104727104728104729104730104731104732104733104734104735104736104737104738104739104740104741104742104743104744104745104746104747104748104749104750104751104752104753104754104755104756104757104758104759104760104761104762104763104764104765104766104767104768104769104770104771104772104773104774104775104776104777104778104779104780104781104782104783104784104785104786104787104788104789104790104791104792104793104794104795104796104797104798104799104800104801104802104803104804104805104806104807104808104809104810104811104812104813104814104815104816104817104818104819104820104821104822104823104824104825104826104827104828104829104830104831104832104833104834104835104836104837104838104839104840104841104842104843104844104845104846104847104848104849104850104851104852104853104854104855104856104857104858104859104860104861104862104863104864104865104866104867104868104869104870104871104872104873104874104875104876104877104878104879104880104881104882104883104884104885104886104887104888104889104890104891104892104893104894104895104896104897104898104899104900104901104902104903104904104905104906104907104908104909104910104911104912104913104914104915104916104917104918104919104920104921104922104923104924104925104926104927104928104929104930104931104932104933104934104935104936104937104938104939104940104941104942104943104944104945104946104947104948104949104950104951104952104953104954104955104956104957104958104959104960104961104962104963104964104965104966104967104968104969104970104971104972104973104974104975104976104977104978104979104980104981104982104983104984104985104986104987104988104989104990104991104992104993104994104995104996104997104998104999105000105001105002105003105004105005105006105007105008105009105010105011105012105013105014105015105016105017105018105019105020105021105022105023105024105025105026105027105028105029105030105031105032105033105034105035105036105037105038105039105040105041105042105043105044105045105046105047105048105049105050105051105052105053105054105055105056105057105058105059105060105061105062105063105064105065105066105067105068105069105070105071105072105073105074105075105076105077105078105079105080105081105082105083105084105085105086105087105088105089105090105091105092105093105094105095105096105097105098105099105100105101105102105103105104105105105106105107105108105109105110105111105112105113105114105115105116105117105118105119105120105121105122105123105124105125105126105127105128105129105130105131105132105133105134105135105136105137105138105139105140105141105142105143105144105145105146105147105148105149105150105151105152105153105154105155105156105157105158105159105160105161105162105163105164105165105166105167105168105169105170105171105172105173105174105175105176105177105178105179105180105181105182105183105184105185105186105187105188105189105190105191105192105193105194105195105196105197105198105199105200105201105202105203105204105205105206105207105208105209105210105211105212105213105214105215105216105217105218105219105220105221105222105223105224105225105226105227105228105229105230105231105232105233105234105235105236105237105238105239105240105241105242105243105244105245105246105247105248105249105250105251105252105253105254105255105256105257105258105259105260105261105262105263105264105265105266105267105268105269105270105271105272105273105274105275105276105277105278105279105280105281105282105283105284105285105286105287105288105289105290105291105292105293105294105295105296105297105298105299105300105301105302105303105304105305105306105307105308105309105310105311105312105313105314105315105316105317105318105319105320105321105322105323105324105325105326105327105328105329105330105331105332105333105334105335105336105337105338105339105340105341105342105343105344105345105346105347105348105349105350105351105352105353105354105355105356105357105358105359105360105361105362105363105364105365105366105367105368105369105370105371105372105373105374105375105376105377105378105379105380105381105382105383105384105385105386105387105388105389105390105391105392105393105394105395105396105397105398105399105400105401105402105403105404105405105406105407105408105409105410105411105412105413105414105415105416105417105418105419105420105421105422105423105424105425105426105427105428105429105430105431105432105433105434105435105436105437105438105439105440105441105442105443105444105445105446105447105448105449105450105451105452105453105454105455105456105457105458105459105460105461105462105463105464105465105466105467105468105469105470105471105472105473105474105475105476105477105478105479105480105481105482105483105484105485105486105487105488105489105490105491105492105493105494105495105496105497105498105499105500105501105502105503105504105505105506105507105508105509105510105511105512105513105514105515105516105517105518105519105520105521105522105523105524105525105526105527105528105529105530105531105532105533105534105535105536105537105538105539105540105541105542105543105544105545105546105547105548105549105550105551105552105553105554105555105556105557105558105559105560105561105562105563105564105565105566105567105568105569105570105571105572105573105574105575105576105577105578105579105580105581105582105583105584105585105586105587105588105589105590105591105592105593105594105595105596105597105598105599105600105601105602105603105604105605105606105607105608105609105610105611105612105613105614105615105616105617105618105619105620105621105622105623105624105625105626105627105628105629105630105631105632105633105634105635105636105637105638105639105640105641105642105643105644105645105646105647105648105649105650105651105652105653105654105655105656105657105658105659105660105661105662105663105664105665105666105667105668105669105670105671105672105673105674105675105676105677105678105679105680105681105682105683105684105685105686105687105688105689105690105691105692105693105694105695105696105697105698105699105700105701105702105703105704105705105706105707105708105709105710105711105712105713105714105715105716105717105718105719105720105721105722105723105724105725105726105727105728105729105730105731105732105733105734105735105736105737105738105739105740105741105742105743105744105745105746105747105748105749105750105751105752105753105754105755105756105757105758105759105760105761105762105763105764105765105766105767105768105769105770105771105772105773105774105775105776105777105778105779105780105781105782105783105784105785105786105787105788105789105790105791105792105793105794105795105796105797105798105799105800105801105802105803105804105805105806105807105808105809105810105811105812105813105814105815105816105817105818105819105820105821105822105823105824105825105826105827105828105829105830105831105832105833105834105835105836105837105838105839105840105841105842105843105844105845105846105847105848105849105850105851105852105853105854105855105856105857105858105859105860105861105862105863105864105865105866105867105868105869105870105871105872105873105874105875105876105877105878105879105880105881105882105883105884105885105886105887105888105889105890105891105892105893105894105895105896105897105898105899105900105901105902105903105904105905105906105907105908105909105910105911105912105913105914105915105916105917105918105919105920105921105922105923105924105925105926105927105928105929105930105931105932105933105934105935105936105937105938105939105940105941105942105943105944105945105946105947105948105949105950105951105952105953105954105955105956105957105958105959105960105961105962105963105964105965105966105967105968105969105970105971105972105973105974105975105976105977105978105979105980105981105982105983105984105985105986105987105988105989105990105991105992105993105994105995105996105997105998105999106000106001106002106003106004106005106006106007106008106009106010106011106012106013106014106015106016106017106018106019106020106021106022106023106024106025106026106027106028106029106030106031106032106033106034106035106036106037106038106039106040106041106042106043106044106045106046106047106048106049106050106051106052106053106054106055106056106057106058106059106060106061106062106063106064106065106066106067106068106069106070106071106072106073106074106075106076106077106078106079106080106081106082106083106084106085106086106087106088106089106090106091106092106093106094106095106096106097106098106099106100106101106102106103106104106105106106106107106108106109106110106111106112106113106114106115106116106117106118106119106120106121106122106123106124106125106126106127106128106129106130106131106132106133106134106135106136106137106138106139106140106141106142106143106144106145106146106147106148106149106150106151106152106153106154106155106156106157106158106159106160106161106162106163106164106165106166106167106168106169106170106171106172106173106174106175106176106177106178106179106180106181106182106183106184106185106186106187106188106189106190106191106192106193106194106195106196106197106198106199106200106201106202106203106204106205106206106207106208106209106210106211106212106213106214106215106216106217106218106219106220106221106222106223106224106225106226106227106228106229106230106231106232106233106234106235106236106237106238106239106240106241106242106243106244106245106246106247106248106249106250106251106252106253106254106255106256106257106258106259106260106261106262106263106264106265106266106267106268106269106270106271106272106273106274106275106276106277106278106279106280106281106282106283106284106285106286106287106288106289106290106291106292106293106294106295106296106297106298106299106300106301106302106303106304106305106306106307106308106309106310106311106312106313106314106315106316106317106318106319106320106321106322106323106324106325106326106327106328106329106330106331106332106333106334106335106336106337106338106339106340106341106342106343106344106345106346106347106348106349106350106351106352106353106354106355106356106357106358106359106360106361106362106363106364106365106366106367106368106369106370106371106372106373106374106375106376106377106378106379106380106381106382106383106384106385106386106387106388106389106390106391106392106393106394106395106396106397106398106399106400106401106402106403106404106405106406106407106408106409106410106411106412106413106414106415106416106417106418106419106420106421106422106423106424106425106426106427106428106429106430106431106432106433106434106435106436106437106438106439106440106441106442106443106444106445106446106447106448106449106450106451106452106453106454106455106456106457106458106459106460106461106462106463106464106465106466106467106468106469106470106471106472106473106474106475106476106477106478106479106480106481106482106483106484106485106486106487106488106489106490106491106492106493106494106495106496106497106498106499106500106501106502106503106504106505106506106507106508106509106510106511106512106513106514106515106516106517106518106519106520106521106522106523106524106525106526106527106528106529106530106531106532106533106534106535106536106537106538106539106540106541106542106543106544106545106546106547106548106549106550106551106552106553106554106555106556106557106558106559106560106561106562106563106564106565106566106567106568106569106570106571106572106573106574106575106576106577106578106579106580106581106582106583106584106585106586106587106588106589106590106591106592106593106594106595106596106597106598106599106600106601106602106603106604106605106606106607106608106609106610106611106612106613106614106615106616106617106618106619106620106621106622106623106624106625106626106627106628106629106630106631106632106633106634106635106636106637106638106639106640106641106642106643106644106645106646106647106648106649106650106651106652106653106654106655106656106657106658106659106660106661106662106663106664106665106666106667106668106669106670106671106672106673106674106675106676106677106678106679106680106681106682106683106684106685106686106687106688106689106690106691106692106693106694106695106696106697106698106699106700106701106702106703106704106705106706106707106708106709106710106711106712106713106714106715106716106717106718106719106720106721106722106723106724106725106726106727106728106729106730106731106732106733106734106735106736106737106738106739106740106741106742106743106744106745106746106747106748106749106750106751106752106753106754106755106756106757106758106759106760106761106762106763106764106765106766106767106768106769106770106771106772106773106774106775106776106777106778106779106780106781106782106783106784106785106786106787106788106789106790106791106792106793106794106795106796106797106798106799106800106801106802106803106804106805106806106807106808106809106810106811106812106813106814106815106816106817106818106819106820106821106822106823106824106825106826106827106828106829106830106831106832106833106834106835106836106837106838106839106840106841106842106843106844106845106846106847106848106849106850106851106852106853106854106855106856106857106858106859106860106861106862106863106864106865106866106867106868106869106870106871106872106873106874106875106876106877106878106879106880106881106882106883106884106885106886106887106888106889106890106891106892106893106894106895106896106897106898106899106900106901106902106903106904106905106906106907106908106909106910106911106912106913106914106915106916106917106918106919106920106921106922106923106924106925106926106927106928106929106930106931106932106933106934106935106936106937106938106939106940106941106942106943106944106945106946106947106948106949106950106951106952106953106954106955106956106957106958106959106960106961106962106963106964106965106966106967106968106969106970106971106972106973106974106975106976106977106978106979106980106981106982106983106984106985106986106987106988106989106990106991106992106993106994106995106996106997106998106999107000107001107002107003107004107005107006107007107008107009107010107011107012107013107014107015107016107017107018107019107020107021107022107023107024107025107026107027107028107029107030107031107032107033107034107035107036107037107038107039107040107041107042107043107044107045107046107047107048107049107050107051107052107053107054107055107056107057107058107059107060107061107062107063107064107065107066107067107068107069107070107071107072107073107074107075107076107077107078107079107080107081107082107083107084107085107086107087107088107089107090107091107092107093107094107095107096107097107098107099107100107101107102107103107104107105107106107107107108107109107110107111107112107113107114107115107116107117107118107119107120107121107122107123107124107125107126107127107128107129107130107131107132107133107134107135107136107137107138107139107140107141107142107143107144107145107146107147107148107149107150107151107152107153107154107155107156107157107158107159107160107161107162107163107164107165107166107167107168107169107170107171107172107173107174107175107176107177107178107179107180107181107182107183107184107185107186107187107188107189107190107191107192107193107194107195107196107197107198107199107200107201107202107203107204107205107206107207107208107209107210107211107212107213107214107215107216107217107218107219107220107221107222107223107224107225107226107227107228107229107230107231107232107233107234107235107236107237107238107239107240107241107242107243107244107245107246107247107248107249107250107251107252107253107254107255107256107257107258107259107260107261107262107263107264107265107266107267107268107269107270107271107272107273107274107275107276107277107278107279107280107281107282107283107284107285107286107287107288107289107290107291107292107293107294107295107296107297107298107299107300107301107302107303107304107305107306107307107308107309107310107311107312107313107314107315107316107317107318107319107320107321107322107323107324107325107326107327107328107329107330107331107332107333107334107335107336107337107338107339107340107341107342107343107344107345107346107347107348107349107350107351107352107353107354107355107356107357107358107359107360107361107362107363107364107365107366107367107368107369107370107371107372107373107374107375107376107377107378107379107380107381107382107383107384107385107386107387107388107389107390107391107392107393107394107395107396107397107398107399107400107401107402107403107404107405107406107407107408107409107410107411107412107413107414107415107416107417107418107419107420107421107422107423107424107425107426107427107428107429107430107431107432107433107434107435107436107437107438107439107440107441107442107443107444107445107446107447107448107449107450107451107452107453107454107455107456107457107458107459107460107461107462107463107464107465107466107467107468107469107470107471107472107473107474107475107476107477107478107479107480107481107482107483107484107485107486107487107488107489107490107491107492107493107494107495107496107497107498107499107500107501107502107503107504107505107506107507107508107509107510107511107512107513107514107515107516107517107518107519107520107521107522107523107524107525107526107527107528107529107530107531107532107533107534107535107536107537107538107539107540107541107542107543107544107545107546107547107548107549107550107551107552107553107554107555107556107557107558107559107560107561107562107563107564107565107566107567107568107569107570107571107572107573107574107575107576107577107578107579107580107581107582107583107584107585107586107587107588107589107590107591107592107593107594107595107596107597107598107599107600107601107602107603107604107605107606107607107608107609107610107611107612107613107614107615107616107617107618107619107620107621107622107623107624107625107626107627107628107629107630107631107632107633107634107635107636107637107638107639107640107641107642107643107644107645107646107647107648107649107650107651107652107653107654107655107656107657107658107659107660107661107662107663107664107665107666107667107668107669107670107671107672107673107674107675107676107677107678107679107680107681107682107683107684107685107686107687107688107689107690107691107692107693107694107695107696107697107698107699107700107701107702107703107704107705107706107707107708107709107710107711107712107713107714107715107716107717107718107719107720107721107722107723107724107725107726107727107728107729107730107731107732107733107734107735107736107737107738107739107740107741107742107743107744107745107746107747107748107749107750107751107752107753107754107755107756107757107758107759107760107761107762107763107764107765107766107767107768107769107770107771107772107773107774107775107776107777107778107779107780107781107782107783107784107785107786107787107788107789107790107791107792107793107794107795107796107797107798107799107800107801107802107803107804107805107806107807107808107809107810107811107812107813107814107815107816107817107818107819107820107821107822107823107824107825107826107827107828107829107830107831107832107833107834107835107836107837107838107839107840107841107842107843107844107845107846107847107848107849107850107851107852107853107854107855107856107857107858107859107860107861107862107863107864107865107866107867107868107869107870107871107872107873107874107875107876107877107878107879107880107881107882107883107884107885107886107887107888107889107890107891107892107893107894107895107896107897107898107899107900107901107902107903107904107905107906107907107908107909107910107911107912107913107914107915107916107917107918107919107920107921107922107923107924107925107926107927107928107929107930107931107932107933107934107935107936107937107938107939107940107941107942107943107944107945107946107947107948107949107950107951107952107953107954107955107956107957107958107959107960107961107962107963107964107965107966107967107968107969107970107971107972107973107974107975107976107977107978107979107980107981107982107983107984107985107986107987107988107989107990107991107992107993107994107995107996107997107998107999108000108001108002108003108004108005108006108007108008108009108010108011108012108013108014108015108016108017108018108019108020108021108022108023108024108025108026108027108028108029108030108031108032108033108034108035108036108037108038108039108040108041108042108043108044108045108046108047108048108049108050108051108052108053108054108055108056108057108058108059108060108061108062108063108064108065108066108067108068108069108070108071108072108073108074108075108076108077108078108079108080108081108082108083108084108085108086108087108088108089108090108091108092108093108094108095108096108097108098108099108100108101108102108103108104108105108106108107108108108109108110108111108112108113108114108115108116108117108118108119108120108121108122108123108124108125108126108127108128108129108130108131108132108133108134108135108136108137108138108139108140108141108142108143108144108145108146108147108148108149108150108151108152108153108154108155108156108157108158108159108160108161108162108163108164108165108166108167108168108169108170108171108172108173108174108175108176108177108178108179108180108181108182108183108184108185108186108187108188108189108190108191108192108193108194108195108196108197108198108199108200108201108202108203108204108205108206108207108208108209108210108211108212108213108214108215108216108217108218108219108220108221108222108223108224108225108226108227108228108229108230108231108232108233108234108235108236108237108238108239108240108241108242108243108244108245108246108247108248108249108250108251108252108253108254108255108256108257108258108259108260108261108262108263108264108265108266108267108268108269108270108271108272108273108274108275108276108277108278108279108280108281108282108283108284108285108286108287108288108289108290108291108292108293108294108295108296108297108298108299108300108301108302108303108304108305108306108307108308108309108310108311108312108313108314108315108316108317108318108319108320108321108322108323108324108325108326108327108328108329108330108331108332108333108334108335108336108337108338108339108340108341108342108343108344108345108346108347108348108349108350108351108352108353108354108355108356108357108358108359108360108361108362108363108364108365108366108367108368108369108370108371108372108373108374108375108376108377108378108379108380108381108382108383108384108385108386108387108388108389108390108391108392108393108394108395108396108397108398108399108400108401108402108403108404108405108406108407108408108409108410108411108412108413108414108415108416108417108418108419108420108421108422108423108424108425108426108427108428108429108430108431108432108433108434108435108436108437108438108439108440108441108442108443108444108445108446108447108448108449108450108451108452108453108454108455108456108457108458108459108460108461108462108463108464108465108466108467108468108469108470108471108472108473108474108475108476108477108478108479108480108481108482108483108484108485108486108487108488108489108490108491108492108493108494108495108496108497108498108499108500108501108502108503108504108505108506108507108508108509108510108511108512108513108514108515108516108517108518108519108520108521108522108523108524108525108526108527108528108529108530108531108532108533108534108535108536108537108538108539108540108541108542108543108544108545108546108547108548108549108550108551108552108553108554108555108556108557108558108559108560108561108562108563108564108565108566108567108568108569108570108571108572108573108574108575108576108577108578108579108580108581108582108583108584108585108586108587108588108589108590108591108592108593108594108595108596108597108598108599108600108601108602108603108604108605108606108607108608108609108610108611108612108613108614108615108616108617108618108619108620108621108622108623108624108625108626108627108628108629108630108631108632108633108634108635108636108637108638108639108640108641108642108643108644108645108646108647108648108649108650108651108652108653108654108655108656108657108658108659108660108661108662108663108664108665108666108667108668108669108670108671108672108673108674108675108676108677108678108679108680108681108682108683108684108685108686108687108688108689108690108691108692108693108694108695108696108697108698108699108700108701108702108703108704108705108706108707108708108709108710108711108712108713108714108715108716108717108718108719108720108721108722108723108724108725108726108727108728108729108730108731108732108733108734108735108736108737108738108739108740108741108742108743108744108745108746108747108748108749108750108751108752108753108754108755108756108757108758108759108760108761108762108763108764108765108766108767108768108769108770108771108772108773108774108775108776108777108778108779108780108781108782108783108784108785108786108787108788108789108790108791108792108793108794108795108796108797108798108799108800108801108802108803108804108805108806108807108808108809108810108811108812108813108814108815108816108817108818108819108820108821108822108823108824108825108826108827108828108829108830108831108832108833108834108835108836108837108838108839108840108841108842108843108844108845108846108847108848108849108850108851108852108853108854108855108856108857108858108859108860108861108862108863108864108865108866108867108868108869108870108871108872108873108874108875108876108877108878108879108880108881108882108883108884108885108886108887108888108889108890108891108892108893108894108895108896108897108898108899108900108901108902108903108904108905108906108907108908108909108910108911108912108913108914108915108916108917108918108919108920108921108922108923108924108925108926108927108928108929108930108931108932108933108934108935108936108937108938108939108940108941108942108943108944108945108946108947108948108949108950108951108952108953108954108955108956108957108958108959108960108961108962108963108964108965108966108967108968108969108970108971108972108973108974108975108976108977108978108979108980108981108982108983108984108985108986108987108988108989108990108991108992108993108994108995108996108997108998108999109000109001109002109003109004109005109006109007109008109009109010109011109012109013109014109015109016109017109018109019109020109021109022109023109024109025109026109027109028109029109030109031109032109033109034109035109036109037109038109039109040109041109042109043109044109045109046109047109048109049109050109051109052109053109054109055109056109057109058109059109060109061109062109063109064109065109066109067109068109069109070109071109072109073109074109075109076109077109078109079109080109081109082109083109084109085109086109087109088109089109090109091109092109093109094109095109096109097109098109099109100109101109102109103109104109105109106109107109108109109109110109111109112109113109114109115109116109117109118109119109120109121109122109123109124109125109126109127109128109129109130109131109132109133109134109135109136109137109138109139109140109141109142109143109144109145109146109147109148109149109150109151109152109153109154109155109156109157109158109159109160109161109162109163109164109165109166109167109168109169109170109171109172109173109174109175109176109177109178109179109180109181109182109183109184109185109186109187109188109189109190109191109192109193109194109195109196109197109198109199109200109201109202109203109204109205109206109207109208109209109210109211109212109213109214109215109216109217109218109219109220109221109222109223109224109225109226109227109228109229109230109231109232109233109234109235109236109237109238109239109240109241109242109243109244109245109246109247109248109249109250109251109252109253109254109255109256109257109258109259109260109261109262109263109264109265109266109267109268109269109270109271109272109273109274109275109276109277109278109279109280109281109282109283109284109285109286109287109288109289109290109291109292109293109294109295109296109297109298109299109300109301109302109303109304109305109306109307109308109309109310109311109312109313109314109315109316109317109318109319109320109321109322109323109324109325109326109327109328109329109330109331109332109333109334109335109336109337109338109339109340109341109342109343109344109345109346109347109348109349109350109351109352109353109354109355109356109357109358109359109360109361109362109363109364109365109366109367109368109369109370109371109372109373109374109375109376109377109378109379109380109381109382109383109384109385109386109387109388109389109390109391109392109393109394109395109396109397109398109399109400109401109402109403109404109405109406109407109408109409109410109411109412109413109414109415109416109417109418109419109420109421109422109423109424109425109426109427109428109429109430109431109432109433109434109435109436109437109438109439109440109441109442109443109444109445109446109447109448109449109450109451109452109453109454109455109456109457109458109459109460109461109462109463109464109465109466109467109468109469109470109471109472109473109474109475109476109477109478109479109480109481109482109483109484109485109486109487109488109489109490109491109492109493109494109495109496109497109498109499109500109501109502109503109504109505109506109507109508109509109510109511109512109513109514109515109516109517109518109519109520109521109522109523109524109525109526109527109528109529109530109531109532109533109534109535109536109537109538109539109540109541109542109543109544109545109546109547109548109549109550109551109552109553109554109555109556109557109558109559109560109561109562109563109564109565109566109567109568109569109570109571109572109573109574109575109576109577109578109579109580109581109582109583109584109585109586109587109588109589109590109591109592109593109594109595109596109597109598109599109600109601109602109603109604109605109606109607109608109609109610109611109612109613109614109615109616109617109618109619109620109621109622109623109624109625109626109627109628109629109630109631109632109633109634109635109636109637109638109639109640109641109642109643109644109645109646109647109648109649109650109651109652109653109654109655109656109657109658109659109660109661109662109663109664109665109666109667109668109669109670109671109672109673109674109675109676109677109678109679109680109681109682109683109684109685109686109687109688109689109690109691109692109693109694109695109696109697109698109699109700109701109702109703109704109705109706109707109708109709109710109711109712109713109714109715109716109717109718109719109720109721109722109723109724109725109726109727109728109729109730109731109732109733109734109735109736109737109738109739109740109741109742109743109744109745109746109747109748109749109750109751109752109753109754109755109756109757109758109759109760109761109762109763109764109765109766109767109768109769109770109771109772109773109774109775109776109777109778109779109780109781109782109783109784109785109786109787109788109789109790109791109792109793109794109795109796109797109798109799109800109801109802109803109804109805109806109807109808109809109810109811109812109813109814109815109816109817109818109819109820109821109822109823109824109825109826109827109828109829109830109831109832109833109834109835109836109837109838109839109840109841109842109843109844109845109846109847109848109849109850109851109852109853109854109855109856109857109858109859109860109861109862109863109864109865109866109867109868109869109870109871109872109873109874109875109876109877109878109879109880109881109882109883109884109885109886109887109888109889109890109891109892109893109894109895109896109897109898109899109900109901109902109903109904109905109906109907109908109909109910109911109912109913109914109915109916109917109918109919109920109921109922109923109924109925109926109927109928109929109930109931109932109933109934109935109936109937109938109939109940109941109942109943109944109945109946109947109948109949109950109951109952109953109954109955109956109957109958109959109960109961109962109963109964109965109966109967109968109969109970109971109972109973109974109975109976109977109978109979109980109981109982109983109984109985109986109987109988109989109990109991109992109993109994109995109996109997109998109999110000110001110002110003110004110005110006110007110008110009110010110011110012110013110014110015110016110017110018110019110020110021110022110023110024110025110026110027110028110029110030110031110032110033110034110035110036110037110038110039110040110041110042110043110044110045110046110047110048110049110050110051110052110053110054110055110056110057110058110059110060110061110062110063110064110065110066110067110068110069110070110071110072110073110074110075110076110077110078110079110080110081110082110083110084110085110086110087110088110089110090110091110092110093110094110095110096110097110098110099110100110101110102110103110104110105110106110107110108110109110110110111110112110113110114110115110116110117110118110119110120110121110122110123110124110125110126110127110128110129110130110131110132110133110134110135110136110137110138110139110140110141110142110143110144110145110146110147110148110149110150110151110152110153110154110155110156110157110158110159110160110161110162110163110164110165110166110167110168110169110170110171110172110173110174110175110176110177110178110179110180110181110182110183110184110185110186110187110188110189110190110191110192110193110194110195110196110197110198110199110200110201110202110203110204110205110206110207110208110209110210110211110212110213110214110215110216110217110218110219110220110221110222110223110224110225110226110227110228110229110230110231110232110233110234110235110236110237110238110239110240110241110242110243110244110245110246110247110248110249110250110251110252110253110254110255110256110257110258110259110260110261110262110263110264110265110266110267110268110269110270110271110272110273110274110275110276110277110278110279110280110281110282110283110284110285110286110287110288110289110290110291110292110293110294110295110296110297110298110299110300110301110302110303110304110305110306110307110308110309110310110311110312110313110314110315110316110317110318110319110320110321110322110323110324110325110326110327110328110329110330110331110332110333110334110335110336110337110338110339110340110341110342110343110344110345110346110347110348110349110350110351110352110353110354110355110356110357110358110359110360110361110362110363110364110365110366110367110368110369110370110371110372110373110374110375110376110377110378110379110380110381110382110383110384110385110386110387110388110389110390110391110392110393110394110395110396110397110398110399110400110401110402110403110404110405110406110407110408110409110410110411110412110413110414110415110416110417110418110419110420110421110422110423110424110425110426110427110428110429110430110431110432110433110434110435110436110437110438110439110440110441110442110443110444110445110446110447110448110449110450110451110452110453110454110455110456110457110458110459110460110461110462110463110464110465110466110467110468110469110470110471110472110473110474110475110476110477110478110479110480110481110482110483110484110485110486110487110488110489110490110491110492110493110494110495110496110497110498110499110500110501110502110503110504110505110506110507110508110509110510110511110512110513110514110515110516110517110518110519110520110521110522110523110524110525110526110527110528110529110530110531110532110533110534110535110536110537110538110539110540110541110542110543110544110545110546110547110548110549110550110551110552110553110554110555110556110557110558110559110560110561110562110563110564110565110566110567110568110569110570110571110572110573110574110575110576110577110578110579110580110581110582110583110584110585110586110587110588110589110590110591110592110593110594110595110596110597110598110599110600110601110602110603110604110605110606110607110608110609110610110611110612110613110614110615110616110617110618110619110620110621110622110623110624110625110626110627110628110629110630110631110632110633110634110635110636110637110638110639110640110641110642110643110644110645110646110647110648110649110650110651110652110653110654110655110656110657110658110659110660110661110662110663110664110665110666110667110668110669110670110671110672110673110674110675110676110677110678110679110680110681110682110683110684110685110686110687110688110689110690110691110692110693110694110695110696110697110698110699110700110701110702110703110704110705110706110707110708110709110710110711110712110713110714110715110716110717110718110719110720110721110722110723110724110725110726110727110728110729110730110731110732110733110734110735110736110737110738110739110740110741110742110743110744110745110746110747110748110749110750110751110752110753110754110755110756110757110758110759110760110761110762110763110764110765110766110767110768110769110770110771110772110773110774110775110776110777110778110779110780110781110782110783110784110785110786110787110788110789110790110791110792110793110794110795110796110797110798110799110800110801110802110803110804110805110806110807110808110809110810110811110812110813110814110815110816110817110818110819110820110821110822110823110824110825110826110827110828110829110830110831110832110833110834110835110836110837110838110839110840110841110842110843110844110845110846110847110848110849110850110851110852110853110854110855110856110857110858110859110860110861110862110863110864110865110866110867110868110869110870110871110872110873110874110875110876110877110878110879110880110881110882110883110884110885110886110887110888110889110890110891110892110893110894110895110896110897110898110899110900110901110902110903110904110905110906110907110908110909110910110911110912110913110914110915110916110917110918110919110920110921110922110923110924110925110926110927110928110929110930110931110932110933110934110935110936110937110938110939110940110941110942110943110944110945110946110947110948110949110950110951110952110953110954110955110956110957110958110959110960110961110962110963110964110965110966110967110968110969110970110971110972110973110974110975110976110977110978110979110980110981110982110983110984110985110986110987110988110989110990110991110992110993110994110995110996110997110998110999111000111001111002111003111004111005111006111007111008111009111010111011111012111013111014111015111016111017111018111019111020111021111022111023111024111025111026111027111028111029111030111031111032111033111034111035111036111037111038111039111040111041111042111043111044111045111046111047111048111049111050111051111052111053111054111055111056111057111058111059111060111061111062111063111064111065111066111067111068111069111070111071111072111073111074111075111076111077111078111079111080111081111082111083111084111085111086111087111088111089111090111091111092111093111094111095111096111097111098111099111100111101111102111103111104111105111106111107111108111109111110111111111112111113111114111115111116111117111118111119111120111121111122111123111124111125111126111127111128111129111130111131111132111133111134111135111136111137111138111139111140111141111142111143111144111145111146111147111148111149111150111151111152111153111154111155111156111157111158111159111160111161111162111163111164111165111166111167111168111169111170111171111172111173111174111175111176111177111178111179111180111181111182111183111184111185111186111187111188111189111190111191111192111193111194111195111196111197111198111199111200111201111202111203111204111205111206111207111208111209111210111211111212111213111214111215111216111217111218111219111220111221111222111223111224111225111226111227111228111229111230111231111232111233111234111235111236111237111238111239111240111241111242111243111244111245111246111247111248111249111250111251111252111253111254111255111256111257111258111259111260111261111262111263111264111265111266111267111268111269111270111271111272111273111274111275111276111277111278111279111280111281111282111283111284111285111286111287111288111289111290111291111292111293111294111295111296111297111298111299111300111301111302111303111304111305111306111307111308111309111310111311111312111313111314111315111316111317111318111319111320111321111322111323111324111325111326111327111328111329111330111331111332111333111334111335111336111337111338111339111340111341111342111343111344111345111346111347111348111349111350111351111352111353111354111355111356111357111358111359111360111361111362111363111364111365111366111367111368111369111370111371111372111373111374111375111376111377111378111379111380111381111382111383111384111385111386111387111388111389111390111391111392111393111394111395111396111397111398111399111400111401111402111403111404111405111406111407111408111409111410111411111412111413111414111415111416111417111418111419111420111421111422111423111424111425111426111427111428111429111430111431111432111433111434111435111436111437111438111439111440111441111442111443111444111445111446111447111448111449111450111451111452111453111454111455111456111457111458111459111460111461111462111463111464111465111466111467111468111469111470111471111472111473111474111475111476111477111478111479111480111481111482111483111484111485111486111487111488111489111490111491111492111493111494111495111496111497111498111499111500111501111502111503111504111505111506111507111508111509111510111511111512111513111514111515111516111517111518111519111520111521111522111523111524111525111526111527111528111529111530111531111532111533111534111535111536111537111538111539111540111541111542111543111544111545111546111547111548111549111550111551111552111553111554111555111556111557111558111559111560111561111562111563111564111565111566111567111568111569111570111571111572111573111574111575111576111577111578111579111580111581111582111583111584111585111586111587111588111589111590111591111592111593111594111595111596111597111598111599111600111601111602111603111604111605111606111607111608111609111610111611111612111613111614111615111616111617111618111619111620111621111622111623111624111625111626111627111628111629111630111631111632111633111634111635111636111637111638111639111640111641111642111643111644111645111646111647111648111649111650111651111652111653111654111655111656111657111658111659111660111661111662111663111664111665111666111667111668111669111670111671111672111673111674111675111676111677111678111679111680111681111682111683111684111685111686111687111688111689111690111691111692111693111694111695111696111697111698111699111700111701111702111703111704111705111706111707111708111709111710111711111712111713111714111715111716111717111718111719111720111721111722111723111724111725111726111727111728111729111730111731111732111733111734111735111736111737111738111739111740111741111742111743111744111745111746111747111748111749111750111751111752111753111754111755111756111757111758111759111760111761111762111763111764111765111766111767111768111769111770111771111772111773111774111775111776111777111778111779111780111781111782111783111784111785111786111787111788111789111790111791111792111793111794111795111796111797111798111799111800111801111802111803111804111805111806111807111808111809111810111811111812111813111814111815111816111817111818111819111820111821111822111823111824111825111826111827111828111829111830111831111832111833111834111835111836111837111838111839111840111841111842111843111844111845111846111847111848111849111850111851111852111853111854111855111856111857111858111859111860111861111862111863111864111865111866111867111868111869111870111871111872111873111874111875111876111877111878111879111880111881111882111883111884111885111886111887111888111889111890111891111892111893111894111895111896111897111898111899111900111901111902111903111904111905111906111907111908111909111910111911111912111913111914111915111916111917111918111919111920111921111922111923111924111925111926111927111928111929111930111931111932111933111934111935111936111937111938111939111940111941111942111943111944111945111946111947111948111949111950111951111952111953111954111955111956111957111958111959111960111961111962111963111964111965111966111967111968111969111970111971111972111973111974111975111976111977111978111979111980111981111982111983111984111985111986111987111988111989111990111991111992111993111994111995111996111997111998111999112000112001112002112003112004112005112006112007112008112009112010112011112012112013112014112015112016112017112018112019112020112021112022112023112024112025112026112027112028112029112030112031112032112033112034112035112036112037112038112039112040112041112042112043112044112045112046112047112048112049112050112051112052112053112054112055112056112057112058112059112060112061112062112063112064112065112066112067112068112069112070112071112072112073112074112075112076112077112078112079112080112081112082112083112084112085112086112087112088112089112090112091112092112093112094112095112096112097112098112099112100112101112102112103112104112105112106112107112108112109112110112111112112112113112114112115112116112117112118112119112120112121112122112123112124112125112126112127112128112129112130112131112132112133112134112135112136112137112138112139112140112141112142112143112144112145112146112147112148112149112150112151112152112153112154112155112156112157112158112159112160112161112162112163112164112165112166112167112168112169112170112171112172112173112174112175112176112177112178112179112180112181112182112183112184112185112186112187112188112189112190112191112192112193112194112195112196112197112198112199112200112201112202112203112204112205112206112207112208112209112210112211112212112213112214112215112216112217112218112219112220112221112222112223112224112225112226112227112228112229112230112231112232112233112234112235112236112237112238112239112240112241112242112243112244112245112246112247112248112249112250112251112252112253112254112255112256112257112258112259112260112261112262112263112264112265112266112267112268112269112270112271112272112273112274112275112276112277112278112279112280112281112282112283112284112285112286112287112288112289112290112291112292112293112294112295112296112297112298112299112300112301112302112303112304112305112306112307112308112309112310112311112312112313112314112315112316112317112318112319112320112321112322112323112324112325112326112327112328112329112330112331112332112333112334112335112336112337112338112339112340112341112342112343112344112345112346112347112348112349112350112351112352112353112354112355112356112357112358112359112360112361112362112363112364112365112366112367112368112369112370112371112372112373112374112375112376112377112378112379112380112381112382112383112384112385112386112387112388112389112390112391112392112393112394112395112396112397112398112399112400112401112402112403112404112405112406112407112408112409112410112411112412112413112414112415112416112417112418112419112420112421112422112423112424112425112426112427112428112429112430112431112432112433112434112435112436112437112438112439112440112441112442112443112444112445112446112447112448112449112450112451112452112453112454112455112456112457112458112459112460112461112462112463112464112465112466112467112468112469112470112471112472112473112474112475112476112477112478112479112480112481112482112483112484112485112486112487112488112489112490112491112492112493112494112495112496112497112498112499112500112501112502112503112504112505112506112507112508112509112510112511112512112513112514112515112516112517112518112519112520112521112522112523112524112525112526112527112528112529112530112531112532112533112534112535112536112537112538112539112540112541112542112543112544112545112546112547112548112549112550112551112552112553112554112555112556112557112558112559112560112561112562112563112564112565112566112567112568112569112570112571112572112573112574112575112576112577112578112579112580112581112582112583112584112585112586112587112588112589112590112591112592112593112594112595112596112597112598112599112600112601112602112603112604112605112606112607112608112609112610112611112612112613112614112615112616112617112618112619112620112621112622112623112624112625112626112627112628112629112630112631112632112633112634112635112636112637112638112639112640112641112642112643112644112645112646112647112648112649112650112651112652112653112654112655112656112657112658112659112660112661112662112663112664112665112666112667112668112669112670112671112672112673112674112675112676112677112678112679112680112681112682112683112684112685112686112687112688112689112690112691112692112693112694112695112696112697112698112699112700112701112702112703112704112705112706112707112708112709112710112711112712112713112714112715112716112717112718112719112720112721112722112723112724112725112726112727112728112729112730112731112732112733112734112735112736112737112738112739112740112741112742112743112744112745112746112747112748112749112750112751112752112753112754112755112756112757112758112759112760112761112762112763112764112765112766112767112768112769112770112771112772112773112774112775112776112777112778112779112780112781112782112783112784112785112786112787112788112789112790112791112792112793112794112795112796112797112798112799112800112801112802112803112804112805112806112807112808112809112810112811112812112813112814112815112816112817112818112819112820112821112822112823112824112825112826112827112828112829112830112831112832112833112834112835112836112837112838112839112840112841112842112843112844112845112846112847112848112849112850112851112852112853112854112855112856112857112858112859112860112861112862112863112864112865112866112867112868112869112870112871112872112873112874112875112876112877112878112879112880112881112882112883112884112885112886112887112888112889112890112891112892112893112894112895112896112897112898112899112900112901112902112903112904112905112906112907112908112909112910112911112912112913112914112915112916112917112918112919112920112921112922112923112924112925112926112927112928112929112930112931112932112933112934112935112936112937112938112939112940112941112942112943112944112945112946112947112948112949112950112951112952112953112954112955112956112957112958112959112960112961112962112963112964112965112966112967112968112969112970112971112972112973112974112975112976112977112978112979112980112981112982112983112984112985112986112987112988112989112990112991112992112993112994112995112996112997112998112999113000113001113002113003113004113005113006113007113008113009113010113011113012113013113014113015113016113017113018113019113020113021113022113023113024113025113026113027113028113029113030113031113032113033113034113035113036113037113038113039113040113041113042113043113044113045113046113047113048113049113050113051113052113053113054113055113056113057113058113059113060113061113062113063113064113065113066113067113068113069113070113071113072113073113074113075113076113077113078113079113080113081113082113083113084113085113086113087113088113089113090113091113092113093113094113095113096113097113098113099113100113101113102113103113104113105113106113107113108113109113110113111113112113113113114113115113116113117113118113119113120113121113122113123113124113125113126113127113128113129113130113131113132113133113134113135113136113137113138113139113140113141113142113143113144113145113146113147113148113149113150113151113152113153113154113155113156113157113158113159113160113161113162113163113164113165113166113167113168113169113170113171113172113173113174113175113176113177113178113179113180113181113182113183113184113185113186113187113188113189113190113191113192113193113194113195113196113197113198113199113200113201113202113203113204113205113206113207113208113209113210113211113212113213113214113215113216113217113218113219113220113221113222113223113224113225113226113227113228113229113230113231113232113233113234113235113236113237113238113239113240113241113242113243113244113245113246113247113248113249113250113251113252113253113254113255113256113257113258113259113260113261113262113263113264113265113266113267113268113269113270113271113272113273113274113275113276113277113278113279113280113281113282113283113284113285113286113287113288113289113290113291113292113293113294113295113296113297113298113299113300113301113302113303113304113305113306113307113308113309113310113311113312113313113314113315113316113317113318113319113320113321113322113323113324113325113326113327113328113329113330113331113332113333113334113335113336113337113338113339113340113341113342113343113344113345113346113347113348113349113350113351113352113353113354113355113356113357113358113359113360113361113362113363113364113365113366113367113368113369113370113371113372113373113374113375113376113377113378113379113380113381113382113383113384113385113386113387113388113389113390113391113392113393113394113395113396113397113398113399113400113401113402113403113404113405113406113407113408113409113410113411113412113413113414113415113416113417113418113419113420113421113422113423113424113425113426113427113428113429113430113431113432113433113434113435113436113437113438113439113440113441113442113443113444113445113446113447113448113449113450113451113452113453113454113455113456113457113458113459113460113461113462113463113464113465113466113467113468113469113470113471113472113473113474113475113476113477113478113479113480113481113482113483113484113485113486113487113488113489113490113491113492113493113494113495113496113497113498113499113500113501113502113503113504113505113506113507113508113509113510113511113512113513113514113515113516113517113518113519113520113521113522113523113524113525113526113527113528113529113530113531113532113533113534113535113536113537113538113539113540113541113542113543113544113545113546113547113548113549113550113551113552113553113554113555113556113557113558113559113560113561113562113563113564113565113566113567113568113569113570113571113572113573113574113575113576113577113578113579113580113581113582113583113584113585113586113587113588113589113590113591113592113593113594113595113596113597113598113599113600113601113602113603113604113605113606113607113608113609113610113611113612113613113614113615113616113617113618113619113620113621113622113623113624113625113626113627113628113629113630113631113632113633113634113635113636113637113638113639113640113641113642113643113644113645113646113647113648113649113650113651113652113653113654113655113656113657113658113659113660113661113662113663113664113665113666113667113668113669113670113671113672113673113674113675113676113677113678113679113680113681113682113683113684113685113686113687113688113689113690113691113692113693113694113695113696113697113698113699113700113701113702113703113704113705113706113707113708113709113710113711113712113713113714113715113716113717113718113719113720113721113722113723113724113725113726113727113728113729113730113731113732113733113734113735113736113737113738113739113740113741113742113743113744113745113746113747113748113749113750113751113752113753113754113755113756113757113758113759113760113761113762113763113764113765113766113767113768113769113770113771113772113773113774113775113776113777113778113779113780113781113782113783113784113785113786113787113788113789113790113791113792113793113794113795113796113797113798113799113800113801113802113803113804113805113806113807113808113809113810113811113812113813113814113815113816113817113818113819113820113821113822113823113824113825113826113827113828113829113830113831113832113833113834113835113836113837113838113839113840113841113842113843113844113845113846113847113848113849113850113851113852113853113854113855113856113857113858113859113860113861113862113863113864113865113866113867113868113869113870113871113872113873113874113875113876113877113878113879113880113881113882113883113884113885113886113887113888113889113890113891113892113893113894113895113896113897113898113899113900113901113902113903113904113905113906113907113908113909113910113911113912113913113914113915113916113917113918113919113920113921113922113923113924113925113926113927113928113929113930113931113932113933113934113935113936113937113938113939113940113941113942113943113944113945113946113947113948113949113950113951113952113953113954113955113956113957113958113959113960113961113962113963113964113965113966113967113968113969113970113971113972113973113974113975113976113977113978113979113980113981113982113983113984113985113986113987113988113989113990113991113992113993113994113995113996113997113998113999114000114001114002114003114004114005114006114007114008114009114010114011114012114013114014114015114016114017114018114019114020114021114022114023114024114025114026114027114028114029114030114031114032114033114034114035114036114037114038114039114040114041114042114043114044114045114046114047114048114049114050114051114052114053114054114055114056114057114058114059114060114061114062114063114064114065114066114067114068114069114070114071114072114073114074114075114076114077114078114079114080114081114082114083114084114085114086114087114088114089114090114091114092114093114094114095114096114097114098114099114100114101114102114103114104114105114106114107114108114109114110114111114112114113114114114115114116114117114118114119114120114121114122114123114124114125114126114127114128114129114130114131114132114133114134114135114136114137114138114139114140114141114142114143114144114145114146114147114148114149114150114151114152114153114154114155114156114157114158114159114160114161114162114163114164114165114166114167114168114169114170114171114172114173114174114175114176114177114178114179114180114181114182114183114184114185114186114187114188114189114190114191114192114193114194114195114196114197114198114199114200114201114202114203114204114205114206114207114208114209114210114211114212114213114214114215114216114217114218114219114220114221114222114223114224114225114226114227114228114229114230114231114232114233114234114235114236114237114238114239114240114241114242114243114244114245114246114247114248114249114250114251114252114253114254114255114256114257114258114259114260114261114262114263114264114265114266114267114268114269114270114271114272114273114274114275114276114277114278114279114280114281114282114283114284114285114286114287114288114289114290114291114292114293114294114295114296114297114298114299114300114301114302114303114304114305114306114307114308114309114310114311114312114313114314114315114316114317114318114319114320114321114322114323114324114325114326114327114328114329114330114331114332114333114334114335114336114337114338114339114340114341114342114343114344114345114346114347114348114349114350114351114352114353114354114355114356114357114358114359114360114361114362114363114364114365114366114367114368114369114370114371114372114373114374114375114376114377114378114379114380114381114382114383114384114385114386114387114388114389114390114391114392114393114394114395114396114397114398114399114400114401114402114403114404114405114406114407114408114409114410114411114412114413114414114415114416114417114418114419114420114421114422114423114424114425114426114427114428114429114430114431114432114433114434114435114436114437114438114439114440114441114442114443114444114445114446114447114448114449114450114451114452114453114454114455114456114457114458114459114460114461114462114463114464114465114466114467114468114469114470114471114472114473114474114475114476114477114478114479114480114481114482114483114484114485114486114487114488114489114490114491114492114493114494114495114496114497114498114499114500114501114502114503114504114505114506114507114508114509114510114511114512114513114514114515114516114517114518114519114520114521114522114523114524114525114526114527114528114529114530114531114532114533114534114535114536114537114538114539114540114541114542114543114544114545114546114547114548114549114550114551114552114553114554114555114556114557114558114559114560114561114562114563114564114565114566114567114568114569114570114571114572114573114574114575114576114577114578114579114580114581114582114583114584114585114586114587114588114589114590114591114592114593114594114595114596114597114598114599114600114601114602114603114604114605114606114607114608114609114610114611114612114613114614114615114616114617114618114619114620114621114622114623114624114625114626114627114628114629114630114631114632114633114634114635114636114637114638114639114640114641114642114643114644114645114646114647114648114649114650114651114652114653114654114655114656114657114658114659114660114661114662114663114664114665114666114667114668114669114670114671114672114673114674114675114676114677114678114679114680114681114682114683114684114685114686114687114688114689114690114691114692114693114694114695114696114697114698114699114700114701114702114703114704114705114706114707114708114709114710114711114712114713114714114715114716114717114718114719114720114721114722114723114724114725114726114727114728114729114730114731114732114733114734114735114736114737114738114739114740114741114742114743114744114745114746114747114748114749114750114751114752114753114754114755114756114757114758114759114760114761114762114763114764114765114766114767114768114769114770114771114772114773114774114775114776114777114778114779114780114781114782114783114784114785114786114787114788114789114790114791114792114793114794114795114796114797114798114799114800114801114802114803114804114805114806114807114808114809114810114811114812114813114814114815114816114817114818114819114820114821114822114823114824114825114826114827114828114829114830114831114832114833114834114835114836114837114838114839114840114841114842114843114844114845114846114847114848114849114850114851114852114853114854114855114856114857114858114859114860114861114862114863114864114865114866114867114868114869114870114871114872114873114874114875114876114877114878114879114880114881114882114883114884114885114886114887114888114889114890114891114892114893114894114895114896114897114898114899114900114901114902114903114904114905114906114907114908114909114910114911114912114913114914114915114916114917114918114919114920114921114922114923114924114925114926114927114928114929114930114931114932114933114934114935114936114937114938114939114940114941114942114943114944114945114946114947114948114949114950114951114952114953114954114955114956114957114958114959114960114961114962114963114964114965114966114967114968114969114970114971114972114973114974114975114976114977114978114979114980114981114982114983114984114985114986114987114988114989114990114991114992114993114994114995114996114997114998114999115000115001115002115003115004115005115006115007115008115009115010115011115012115013115014115015115016115017115018115019115020115021115022115023115024115025115026115027115028115029115030115031115032115033115034115035115036115037115038115039115040115041115042115043115044115045115046115047115048115049115050115051115052115053115054115055115056115057115058115059115060115061115062115063115064115065115066115067115068115069115070115071115072115073115074115075115076115077115078115079115080115081115082115083115084115085115086115087115088115089115090115091115092115093115094115095115096115097115098115099115100115101115102115103115104115105115106115107115108115109115110115111115112115113115114115115115116115117115118115119115120115121115122115123115124115125115126115127115128115129115130115131115132115133115134115135115136115137115138115139115140115141115142115143115144115145115146115147115148115149115150115151115152115153115154115155115156115157115158115159115160115161115162115163115164115165115166115167115168115169115170115171115172115173115174115175115176115177115178115179115180115181115182115183115184115185115186115187115188115189115190115191115192115193115194115195115196115197115198115199115200115201115202115203115204115205115206115207115208115209115210115211115212115213115214115215115216115217115218115219115220115221115222115223115224115225115226115227115228115229115230115231115232115233115234115235115236115237115238115239115240115241115242115243115244115245115246115247115248115249115250115251115252115253115254115255115256115257115258115259115260115261115262115263115264115265115266115267115268115269115270115271115272115273115274115275115276115277115278115279115280115281115282115283115284115285115286115287115288115289115290115291115292115293115294115295115296115297115298115299115300115301115302115303115304115305115306115307115308115309115310115311115312115313115314115315115316115317115318115319115320115321115322115323115324115325115326115327115328115329115330115331115332115333115334115335115336115337115338115339115340115341115342115343115344115345115346115347115348115349115350115351115352115353115354115355115356115357115358115359115360115361115362115363115364115365115366115367115368115369115370115371115372115373115374115375115376115377115378115379115380115381115382115383115384115385115386115387115388115389115390115391115392115393115394115395115396115397115398115399115400115401115402115403115404115405115406115407115408115409115410115411115412115413115414115415115416115417115418115419115420115421115422115423115424115425115426115427115428115429115430115431115432115433115434115435115436115437115438115439115440115441115442115443115444115445115446115447115448115449115450115451115452115453115454115455115456115457115458115459115460115461115462115463115464115465115466115467115468115469115470115471115472115473115474115475115476115477115478115479115480115481115482115483115484115485115486115487115488115489115490115491115492115493115494115495115496115497115498115499115500115501115502115503115504115505115506115507115508115509115510115511115512115513115514115515115516115517115518115519115520115521115522115523115524115525115526115527115528115529115530115531115532115533115534115535115536115537115538115539115540115541115542115543115544115545115546115547115548115549115550115551115552115553115554115555115556115557115558115559115560115561115562115563115564115565115566115567115568115569115570115571115572115573115574115575115576115577115578115579115580115581115582115583115584115585115586115587115588115589115590115591115592115593115594115595115596115597115598115599115600115601115602115603115604115605115606115607115608115609115610115611115612115613115614115615115616115617115618115619115620115621115622115623115624115625115626115627115628115629115630115631115632115633115634115635115636115637115638115639115640115641115642115643115644115645115646115647115648115649115650115651115652115653115654115655115656115657115658115659115660115661115662115663115664115665115666115667115668115669115670115671115672115673115674115675115676115677115678115679115680115681115682115683115684115685115686115687115688115689115690115691115692115693115694115695115696115697115698115699115700115701115702115703115704115705115706115707115708115709115710115711115712115713115714115715115716115717115718115719115720115721115722115723115724115725115726115727115728115729115730115731115732115733115734115735115736115737115738115739115740115741115742115743115744115745115746115747115748115749115750115751115752115753115754115755115756115757115758115759115760115761115762115763115764115765115766115767115768115769115770115771115772115773115774115775115776115777115778115779115780115781115782115783115784115785115786115787115788115789115790115791115792115793115794115795115796115797115798115799115800115801115802115803115804115805115806115807115808115809115810115811115812115813115814115815115816115817115818115819115820115821115822115823115824115825115826115827115828115829115830115831115832115833115834115835115836115837115838115839115840115841115842115843115844115845115846115847115848115849115850115851115852115853115854115855115856115857115858115859115860115861115862115863115864115865115866115867115868115869115870115871115872115873115874115875115876115877115878115879115880115881115882115883115884115885115886115887115888115889115890115891115892115893115894115895115896115897115898115899115900115901115902115903115904115905115906115907115908115909115910115911115912115913115914115915115916115917115918115919115920115921115922115923115924115925115926115927115928115929115930115931115932115933115934115935115936115937115938115939115940115941115942115943115944115945115946115947115948115949115950115951115952115953115954115955115956115957115958115959115960115961115962115963115964115965115966115967115968115969115970115971115972115973115974115975115976115977115978115979115980115981115982115983115984115985115986115987115988115989115990115991115992115993115994115995115996115997115998115999116000116001116002116003116004116005116006116007116008116009116010116011116012116013116014116015116016116017116018116019116020116021116022116023116024116025116026116027116028116029116030116031116032116033116034116035116036116037116038116039116040116041116042116043116044116045116046116047116048116049116050116051116052116053116054116055116056116057116058116059116060116061116062116063116064116065116066116067116068116069116070116071116072116073116074116075116076116077116078116079116080116081116082116083116084116085116086116087116088116089116090116091116092116093116094116095116096116097116098116099116100116101116102116103116104116105116106116107116108116109116110116111116112116113116114116115116116116117116118116119116120116121116122116123116124116125116126116127116128116129116130116131116132116133116134116135116136116137116138116139116140116141116142116143116144116145116146116147116148116149116150116151116152116153116154116155116156116157116158116159116160116161116162116163116164116165116166116167116168116169116170116171116172116173116174116175116176116177116178116179116180116181116182116183116184116185116186116187116188116189116190116191116192116193116194116195116196116197116198116199116200116201116202116203116204116205116206116207116208116209116210116211116212116213116214116215116216116217116218116219116220116221116222116223116224116225116226116227116228116229116230116231116232116233116234116235116236116237116238116239116240116241116242116243116244116245116246116247116248116249116250116251116252116253116254116255116256116257116258116259116260116261116262116263116264116265116266116267116268116269116270116271116272116273116274116275116276116277116278116279116280116281116282116283116284116285116286116287116288116289116290116291116292116293116294116295116296116297116298116299116300116301116302116303116304116305116306116307116308116309116310116311116312116313116314116315116316116317116318116319116320116321116322116323116324116325116326116327116328116329116330116331116332116333116334116335116336116337116338116339116340116341116342116343116344116345116346116347116348116349116350116351116352116353116354116355116356116357116358116359116360116361116362116363116364116365116366116367116368116369116370116371116372116373116374116375116376116377116378116379116380116381116382116383116384116385116386116387116388116389116390116391116392116393116394116395116396116397116398116399116400116401116402116403116404116405116406116407116408116409116410116411116412116413116414116415116416116417116418116419116420116421116422116423116424116425116426116427116428116429116430116431116432116433116434116435116436116437116438116439116440116441116442116443116444116445116446116447116448116449116450116451116452116453116454116455116456116457116458116459116460116461116462116463116464116465116466116467116468116469116470116471116472116473116474116475116476116477116478116479116480116481116482116483116484116485116486116487116488116489116490116491116492116493116494116495116496116497116498116499116500116501116502116503116504116505116506116507116508116509116510116511116512116513116514116515116516116517116518116519116520116521116522116523116524116525116526116527116528116529116530116531116532116533116534116535116536116537116538116539116540116541116542116543116544116545116546116547116548116549116550116551116552116553116554116555116556116557116558116559116560116561116562116563116564116565116566116567116568116569116570116571116572116573116574116575116576116577116578116579116580116581116582116583116584116585116586116587116588116589116590116591116592116593116594116595116596116597116598116599116600116601116602116603116604116605116606116607116608116609116610116611116612116613116614116615116616116617116618116619116620116621116622116623116624116625116626116627116628116629116630116631116632116633116634116635116636116637116638116639116640116641116642116643116644116645116646116647116648116649116650116651116652116653116654116655116656116657116658116659116660116661116662116663116664116665116666116667116668116669116670116671116672116673116674116675116676116677116678116679116680116681116682116683116684116685116686116687116688116689116690116691116692116693116694116695116696116697116698116699116700116701116702116703116704116705116706116707116708116709116710116711116712116713116714116715116716116717116718116719116720116721116722116723116724116725116726116727116728116729116730116731116732116733116734116735116736116737116738116739116740116741116742116743116744116745116746116747116748116749116750116751116752116753116754116755116756116757116758116759116760116761116762116763116764116765116766116767116768116769116770116771116772116773116774116775116776116777116778116779116780116781116782116783116784116785116786116787116788116789116790116791116792116793116794116795116796116797116798116799116800116801116802116803116804116805116806116807116808116809116810116811116812116813116814116815116816116817116818116819116820116821116822116823116824116825116826116827116828116829116830116831116832116833116834116835116836116837116838116839116840116841116842116843116844116845116846116847116848116849116850116851116852116853116854116855116856116857116858116859116860116861116862116863116864116865116866116867116868116869116870116871116872116873116874116875116876116877116878116879116880116881116882116883116884116885116886116887116888116889116890116891116892116893116894116895116896116897116898116899116900116901116902116903116904116905116906116907116908116909116910116911116912116913116914116915116916116917116918116919116920116921116922116923116924116925116926116927116928116929116930116931116932116933116934116935116936116937116938116939116940116941116942116943116944116945116946116947116948116949116950116951116952116953116954116955116956116957116958116959116960116961116962116963116964116965116966116967116968116969116970116971116972116973116974116975116976116977116978116979116980116981116982116983116984116985116986116987116988116989116990116991116992116993116994116995116996116997116998116999117000117001117002117003117004117005117006117007117008117009117010117011117012117013117014117015117016117017117018117019117020117021117022117023117024117025117026117027117028117029117030117031117032117033117034117035117036117037117038117039117040117041117042117043117044117045117046117047117048117049117050117051117052117053117054117055117056117057117058117059117060117061117062117063117064117065117066117067117068117069117070117071117072117073117074117075117076117077117078117079117080117081117082117083117084117085117086117087117088117089117090117091117092117093117094117095117096117097117098117099117100117101117102117103117104117105117106117107117108117109117110117111117112117113117114117115117116117117117118117119117120117121117122117123117124117125117126117127117128117129117130117131117132117133117134117135117136117137117138117139117140117141117142117143117144117145117146117147117148117149117150117151117152117153117154117155117156117157117158117159117160117161117162117163117164117165117166117167117168117169117170117171117172117173117174117175117176117177117178117179117180117181117182117183117184117185117186117187117188117189117190117191117192117193117194117195117196117197117198117199117200117201117202117203117204117205117206117207117208117209117210117211117212117213117214117215117216117217117218117219117220117221117222117223117224117225117226117227117228117229117230117231117232117233117234117235117236117237117238117239117240117241117242117243117244117245117246117247117248117249117250117251117252117253117254117255117256117257117258117259117260117261117262117263117264117265117266117267117268117269117270117271117272117273117274117275117276117277117278117279117280117281117282117283117284117285117286117287117288117289117290117291117292117293117294117295117296117297117298117299117300117301117302117303117304117305117306117307117308117309117310117311117312117313117314117315117316117317117318117319117320117321117322117323117324117325117326117327117328117329117330117331117332117333117334117335117336117337117338117339117340117341117342117343117344117345117346117347117348117349117350117351117352117353117354117355117356117357117358117359117360117361117362117363117364117365117366117367117368117369117370117371117372117373117374117375117376117377117378117379117380117381117382117383117384117385117386117387117388117389117390117391117392117393117394117395117396117397117398117399117400117401117402117403117404117405117406117407117408117409117410117411117412117413117414117415117416117417117418117419117420117421117422117423117424117425117426117427117428117429117430117431117432117433117434117435117436117437117438117439117440117441117442117443117444117445117446117447117448117449117450117451117452117453117454117455117456117457117458117459117460117461117462117463117464117465117466117467117468117469117470117471117472117473117474117475117476117477117478117479117480117481117482117483117484117485117486117487117488117489117490117491117492117493117494117495117496117497117498117499117500117501117502117503117504117505117506117507117508117509117510117511117512117513117514117515117516117517117518117519117520117521117522117523117524117525117526117527117528117529117530117531117532117533117534117535117536117537117538117539117540117541117542117543117544117545117546117547117548117549117550117551117552117553117554117555117556117557117558117559117560117561117562117563117564117565117566117567117568117569117570117571117572117573117574117575117576117577117578117579117580117581117582117583117584117585117586117587117588117589117590117591117592117593117594117595117596117597117598117599117600117601117602117603117604117605117606117607117608117609117610117611117612117613117614117615117616117617117618117619117620117621117622117623117624117625117626117627117628117629117630117631117632117633117634117635117636117637117638117639117640117641117642117643117644117645117646117647117648117649117650117651117652117653117654117655117656117657117658117659117660117661117662117663117664117665117666117667117668117669117670117671117672117673117674117675117676117677117678117679117680117681117682117683117684117685117686117687117688117689117690117691117692117693117694117695117696117697117698117699117700117701117702117703117704117705117706117707117708117709117710117711117712117713117714117715117716117717117718117719117720117721117722117723117724117725117726117727117728117729117730117731117732117733117734117735117736117737117738117739117740117741117742117743117744117745117746117747117748117749117750117751117752117753117754117755117756117757117758117759117760117761117762117763117764117765117766117767117768117769117770117771117772117773117774117775117776117777117778117779117780117781117782117783117784117785117786117787117788117789117790117791117792117793117794117795117796117797117798117799117800117801117802117803117804117805117806117807117808117809117810117811117812117813117814117815117816117817117818117819117820117821117822117823117824117825117826117827117828117829117830117831117832117833117834117835117836117837117838117839117840117841117842117843117844117845117846117847117848117849117850117851117852117853117854117855117856117857117858117859117860117861117862117863117864117865117866117867117868117869117870117871117872117873117874117875117876117877117878117879117880117881117882117883117884117885117886117887117888117889117890117891117892117893117894117895117896117897117898117899117900117901117902117903117904117905117906117907117908117909117910117911117912117913117914117915117916117917117918117919117920117921117922117923117924117925117926117927117928117929117930117931117932117933117934117935117936117937117938117939117940117941117942117943117944117945117946117947117948117949117950117951117952117953117954117955117956117957117958117959117960117961117962117963117964117965117966117967117968117969117970117971117972117973117974117975117976117977117978117979117980117981117982117983117984117985117986117987117988117989117990117991117992117993117994117995117996117997117998117999118000118001118002118003118004118005118006118007118008118009118010118011118012118013118014118015118016118017118018118019118020118021118022118023118024118025118026118027118028118029118030118031118032118033118034118035118036118037118038118039118040118041118042118043118044118045118046118047118048118049118050118051118052118053118054118055118056118057118058118059118060118061118062118063118064118065118066118067118068118069118070118071118072118073118074118075118076118077118078118079118080118081118082118083118084118085118086118087118088118089118090118091118092118093118094118095118096118097118098118099118100118101118102118103118104118105118106118107118108118109118110118111118112118113118114118115118116118117118118118119118120118121118122118123118124118125118126118127118128118129118130118131118132118133118134118135118136118137118138118139118140118141118142118143118144118145118146118147118148118149118150118151118152118153118154118155118156118157118158118159118160118161118162118163118164118165118166118167118168118169118170118171118172118173118174118175118176118177118178118179118180118181118182118183118184118185118186118187118188118189118190118191118192118193118194118195118196118197118198118199118200118201118202118203118204118205118206118207118208118209118210118211118212118213118214118215118216118217118218118219118220118221118222118223118224118225118226118227118228118229118230118231118232118233118234118235118236118237118238118239118240118241118242118243118244118245118246118247118248118249118250118251118252118253118254118255118256118257118258118259118260118261118262118263118264118265118266118267118268118269118270118271118272118273118274118275118276118277118278118279118280118281118282118283118284118285118286118287118288118289118290118291118292118293118294118295118296118297118298118299118300118301118302118303118304118305118306118307118308118309118310118311118312118313118314118315118316118317118318118319118320118321118322118323118324118325118326118327118328118329118330118331118332118333118334118335118336118337118338118339118340118341118342118343118344118345118346118347118348118349118350118351118352118353118354118355118356118357118358118359118360118361118362118363118364118365118366118367118368118369118370118371118372118373118374118375118376118377118378118379118380118381118382118383118384118385118386118387118388118389118390118391118392118393118394118395118396118397118398118399118400118401118402118403118404118405118406118407118408118409118410118411118412118413118414118415118416118417118418118419118420118421118422118423118424118425118426118427118428118429118430118431118432118433118434118435118436118437118438118439118440118441118442118443118444118445118446118447118448118449118450118451118452118453118454118455118456118457118458118459118460118461118462118463118464118465118466118467118468118469118470118471118472118473118474118475118476118477118478118479118480118481118482118483118484118485118486118487118488118489118490118491118492118493118494118495118496118497118498118499118500118501118502118503118504118505118506118507118508118509118510118511118512118513118514118515118516118517118518118519118520118521118522118523118524118525118526118527118528118529118530118531118532118533118534118535118536118537118538118539118540118541118542118543118544118545118546118547118548118549118550118551118552118553118554118555118556118557118558118559118560118561118562118563118564118565118566118567118568118569118570118571118572118573118574118575118576118577118578118579118580118581118582118583118584118585118586118587118588118589118590118591118592118593118594118595118596118597118598118599118600118601118602118603118604118605118606118607118608118609118610118611118612118613118614118615118616118617118618118619118620118621118622118623118624118625118626118627118628118629118630118631118632118633118634118635118636118637118638118639118640118641118642118643118644118645118646118647118648118649118650118651118652118653118654118655118656118657118658118659118660118661118662118663118664118665118666118667118668118669118670118671118672118673118674118675118676118677118678118679118680118681118682118683118684118685118686118687118688118689118690118691118692118693118694118695118696118697118698118699118700118701118702118703118704118705118706118707118708118709118710118711118712118713118714118715118716118717118718118719118720118721118722118723118724118725118726118727118728118729118730118731118732118733118734118735118736118737118738118739118740118741118742118743118744118745118746118747118748118749118750118751118752118753118754118755118756118757118758118759118760118761118762118763118764118765118766118767118768118769118770118771118772118773118774118775118776118777118778118779118780118781118782118783118784118785118786118787118788118789118790118791118792118793118794118795118796118797118798118799118800118801118802118803118804118805118806118807118808118809118810118811118812118813118814118815118816118817118818118819118820118821118822118823118824118825118826118827118828118829118830118831118832118833118834118835118836118837118838118839118840118841118842118843118844118845118846118847118848118849118850118851118852118853118854118855118856118857118858118859118860118861118862118863118864118865118866118867118868118869118870118871118872118873118874118875118876118877118878118879118880118881118882118883118884118885118886118887118888118889118890118891118892118893118894118895118896118897118898118899118900118901118902118903118904118905118906118907118908118909118910118911118912118913118914118915118916118917118918118919118920118921118922118923118924118925118926118927118928118929118930118931118932118933118934118935118936118937118938118939118940118941118942118943118944118945118946118947118948118949118950118951118952118953118954118955118956118957118958118959118960118961118962118963118964118965118966118967118968118969118970118971118972118973118974118975118976118977118978118979118980118981118982118983118984118985118986118987118988118989118990118991118992118993118994118995118996118997118998118999119000119001119002119003119004119005119006119007119008119009119010119011119012119013119014119015119016119017119018119019119020119021119022119023119024119025119026119027119028119029119030119031119032119033119034119035119036119037119038119039119040119041119042119043119044119045119046119047119048119049119050119051119052119053119054119055119056119057119058119059119060119061119062119063119064119065119066119067119068119069119070119071119072119073119074119075119076119077119078119079119080119081119082119083119084119085119086119087119088119089119090119091119092119093119094119095119096119097119098119099119100119101119102119103119104119105119106119107119108119109119110119111119112119113119114119115119116119117119118119119119120119121119122119123119124119125119126119127119128119129119130119131119132119133119134119135119136119137119138119139119140119141119142119143119144119145119146119147119148119149119150119151119152119153119154119155119156119157119158119159119160119161119162119163119164119165119166119167119168119169119170119171119172119173119174119175119176119177119178119179119180119181119182119183119184119185119186119187119188119189119190119191119192119193119194119195119196119197119198119199119200119201119202119203119204119205119206119207119208119209119210119211119212119213119214119215119216119217119218119219119220119221119222119223119224119225119226119227119228119229119230119231119232119233119234119235119236119237119238119239119240119241119242119243119244119245119246119247119248119249119250119251119252119253119254119255119256119257119258119259119260119261119262119263119264119265119266119267119268119269119270119271119272119273119274119275119276119277119278119279119280119281119282119283119284119285119286119287119288119289119290119291119292119293119294119295119296119297119298119299119300119301119302119303119304119305119306119307119308119309119310119311119312119313119314119315119316119317119318119319119320119321119322119323119324119325119326119327119328119329119330119331119332119333119334119335119336119337119338119339119340119341119342119343119344119345119346119347119348119349119350119351119352119353119354119355119356119357119358119359119360119361119362119363119364119365119366119367119368119369119370119371119372119373119374119375119376119377119378119379119380119381119382119383119384119385119386119387119388119389119390119391119392119393119394119395119396119397119398119399119400119401119402119403119404119405119406119407119408119409119410119411119412119413119414119415119416119417119418119419119420119421119422119423119424119425119426119427119428119429119430119431119432119433119434119435119436119437119438119439119440119441119442119443119444119445119446119447119448119449119450119451119452119453119454119455119456119457119458119459119460119461119462119463119464119465119466119467119468119469119470119471119472119473119474119475119476119477119478119479119480119481119482119483119484119485119486119487119488119489119490119491119492119493119494119495119496119497119498119499119500119501119502119503119504119505119506119507119508119509119510119511119512119513119514119515119516119517119518119519119520119521119522119523119524119525119526119527119528119529119530119531119532119533119534119535119536119537119538119539119540119541119542119543119544119545119546119547119548119549119550119551119552119553119554119555119556119557119558119559119560119561119562119563119564119565119566119567119568119569119570119571119572119573119574119575119576119577119578119579119580119581119582119583119584119585119586119587119588119589119590119591119592119593119594119595119596119597119598119599119600119601119602119603119604119605119606119607119608119609119610119611119612119613119614119615119616119617119618119619119620119621119622119623119624119625119626119627119628119629119630119631119632119633119634119635119636119637119638119639119640119641119642119643119644119645119646119647119648119649119650119651119652119653119654119655119656119657119658119659119660119661119662119663119664119665119666119667119668119669119670119671119672119673119674119675119676119677119678119679119680119681119682119683119684119685119686119687119688119689119690119691119692119693119694119695119696119697119698119699119700119701119702119703119704119705119706119707119708119709119710119711119712119713119714119715119716119717119718119719119720119721119722119723119724119725119726119727119728119729119730119731119732119733119734119735119736119737119738119739119740119741119742119743119744119745119746119747119748119749119750119751119752119753119754119755119756119757119758119759119760119761119762119763119764119765119766119767119768119769119770119771119772119773119774119775119776119777119778119779119780119781119782119783119784119785119786119787119788119789119790119791119792119793119794119795119796119797119798119799119800119801119802119803119804119805119806119807119808119809119810119811119812119813119814119815119816119817119818119819119820119821119822119823119824119825119826119827119828119829119830119831119832119833119834119835119836119837119838119839119840119841119842119843119844119845119846119847119848119849119850119851119852119853119854119855119856119857119858119859119860119861119862119863119864119865119866119867119868119869119870119871119872119873119874119875119876119877119878119879119880119881119882119883119884119885119886119887119888119889119890119891119892119893119894119895119896119897119898119899119900119901119902119903119904119905119906119907119908119909119910119911119912119913119914119915119916119917119918119919119920119921119922119923119924119925119926119927119928119929119930119931119932119933119934119935119936119937119938119939119940119941119942119943119944119945119946119947119948119949119950119951119952119953119954119955119956119957119958119959119960119961119962119963119964119965119966119967119968119969119970119971119972119973119974119975119976119977119978119979119980119981119982119983119984119985119986119987119988119989119990119991119992119993119994119995119996119997119998119999120000120001120002120003120004120005120006120007120008120009120010120011120012120013120014120015120016120017120018120019120020120021120022120023120024120025120026120027120028120029120030120031120032120033120034120035120036120037120038120039120040120041120042120043120044120045120046120047120048120049120050120051120052120053120054120055120056120057120058120059120060120061120062120063120064120065120066120067120068120069120070120071120072120073120074120075120076120077120078120079120080120081120082120083120084120085120086120087120088120089120090120091120092120093120094120095120096120097120098120099120100120101120102120103120104120105120106120107120108120109120110120111120112120113120114120115120116120117120118120119120120120121120122120123120124120125120126120127120128120129120130120131120132120133120134120135120136120137120138120139120140120141120142120143120144120145120146120147120148120149120150120151120152120153120154120155120156120157120158120159120160120161120162120163120164120165120166120167120168120169120170120171120172120173120174120175120176120177120178120179120180120181120182120183120184120185120186120187120188120189120190120191120192120193120194120195120196120197120198120199120200120201120202120203120204120205120206120207120208120209120210120211120212120213120214120215120216120217120218120219120220120221120222120223120224120225120226120227120228120229120230120231120232120233120234120235120236120237120238120239120240120241120242120243120244120245120246120247120248120249120250120251120252120253120254120255120256120257120258120259120260120261120262120263120264120265120266120267120268120269120270120271120272120273120274120275120276120277120278120279120280120281120282120283120284120285120286120287120288120289120290120291120292120293120294120295120296120297120298120299120300120301120302120303120304120305120306120307120308120309120310120311120312120313120314120315120316120317120318120319120320120321120322120323120324120325120326120327120328120329120330120331120332120333120334120335120336120337120338120339120340120341120342120343120344120345120346120347120348120349120350120351120352120353120354120355120356120357120358120359120360120361120362120363120364120365120366120367120368120369120370120371120372120373120374120375120376120377120378120379120380120381120382120383120384120385120386120387120388120389120390120391120392120393120394120395120396120397120398120399120400120401120402120403120404120405120406120407120408120409120410120411120412120413120414120415120416120417120418120419120420120421120422120423120424120425120426120427120428120429120430120431120432120433120434120435120436120437120438120439120440120441120442120443120444120445120446120447120448120449120450120451120452120453120454120455120456120457120458120459120460120461120462120463120464120465120466120467120468120469120470120471120472120473120474120475120476120477120478120479120480120481120482120483120484120485120486120487120488120489120490120491120492120493120494120495120496120497120498120499120500120501120502120503120504120505120506120507120508120509120510120511120512120513120514120515120516120517120518120519120520120521120522120523120524120525120526120527120528120529120530120531120532120533120534120535120536120537120538120539120540120541120542120543120544120545120546120547120548120549120550120551120552120553120554120555120556120557120558120559120560120561120562120563120564120565120566120567120568120569120570120571120572120573120574120575120576120577120578120579120580120581120582120583120584120585120586120587120588120589120590120591120592120593120594120595120596120597120598120599120600120601120602120603120604120605120606120607120608120609120610120611120612120613120614120615120616120617120618120619120620120621120622120623120624120625120626120627120628120629120630120631120632120633120634120635120636120637120638120639120640120641120642120643120644120645120646120647120648120649120650120651120652120653120654120655120656120657120658120659120660120661120662120663120664120665120666120667120668120669120670120671120672120673120674120675120676120677120678120679120680120681120682120683120684120685120686120687120688120689120690120691120692120693120694120695120696120697120698120699120700120701120702120703120704120705120706120707120708120709120710120711120712120713120714120715120716120717120718120719120720120721120722120723120724120725120726120727120728120729120730120731120732120733120734120735120736120737120738120739120740120741120742120743120744120745120746120747120748120749120750120751120752120753120754120755120756120757120758120759120760120761120762120763120764120765120766120767120768120769120770120771120772120773120774120775120776120777120778120779120780120781120782120783120784120785120786120787120788120789120790120791120792120793120794120795120796120797120798120799120800120801120802120803120804120805120806120807120808120809120810120811120812120813120814120815120816120817120818120819120820120821120822120823120824120825120826120827120828120829120830120831120832120833120834120835120836120837120838120839120840120841120842120843120844120845120846120847120848120849120850120851120852120853120854120855120856120857120858120859120860120861120862120863120864120865120866120867120868120869120870120871120872120873120874120875120876120877120878120879120880120881120882120883120884120885120886120887120888120889120890120891120892120893120894120895120896120897120898120899120900120901120902120903120904120905120906120907120908120909120910120911120912120913120914120915120916120917120918120919120920120921120922120923120924120925120926120927120928120929120930120931120932120933120934120935120936120937120938120939120940120941120942120943120944120945120946120947120948120949120950120951120952120953120954120955120956120957120958120959120960120961120962120963120964120965120966120967120968120969120970120971120972120973120974120975120976120977120978120979120980120981120982120983120984120985120986120987120988120989120990120991120992120993120994120995120996120997120998120999121000121001121002121003121004121005121006121007121008121009121010121011121012121013121014121015121016121017121018121019121020121021121022121023121024121025121026121027121028121029121030121031121032121033121034121035121036121037121038121039121040121041121042121043121044121045121046121047121048121049121050121051121052121053121054121055121056121057121058121059121060121061121062121063121064121065121066121067121068121069121070121071121072121073121074121075121076121077121078121079121080121081121082121083121084121085121086121087121088121089121090121091121092121093121094121095121096121097121098121099121100121101121102121103121104121105121106121107121108121109121110121111121112121113121114121115121116121117121118121119121120121121121122121123121124121125121126121127121128121129121130121131121132121133121134121135121136121137121138121139121140121141121142121143121144121145121146121147121148121149121150121151121152121153121154121155121156121157121158121159121160121161121162121163121164121165121166121167121168121169121170121171121172121173121174121175121176121177121178121179121180121181121182121183121184121185121186121187121188121189121190121191121192121193121194121195121196121197121198121199121200121201121202121203121204121205121206121207121208121209121210121211121212121213121214121215121216121217121218121219121220121221121222121223121224121225121226121227121228121229121230121231121232121233121234121235121236121237121238121239121240121241121242121243121244121245121246121247121248121249121250121251121252121253121254121255121256121257121258121259121260121261121262121263121264121265121266121267121268121269121270121271121272121273121274121275121276121277121278121279121280121281121282121283121284121285121286121287121288121289121290121291121292121293121294121295121296121297121298121299121300121301121302121303121304121305121306121307121308121309121310121311121312121313121314121315121316121317121318121319121320121321121322121323121324121325121326121327121328121329121330121331121332121333121334121335121336121337121338121339121340121341121342121343121344121345121346121347121348121349121350121351121352121353121354121355121356121357121358121359121360121361121362121363121364121365121366121367121368121369121370121371121372121373121374121375121376121377121378121379121380121381121382121383121384121385121386121387121388121389121390121391121392121393121394121395121396121397121398121399121400121401121402121403121404121405121406121407121408121409121410121411121412121413121414121415121416121417121418121419121420121421121422121423121424121425121426121427121428121429121430121431121432121433121434121435121436121437121438121439121440121441121442121443121444121445121446121447121448121449121450121451121452121453121454121455121456121457121458121459121460121461121462121463121464121465121466121467121468121469121470121471121472121473121474121475121476121477121478121479121480121481121482121483121484121485121486121487121488121489121490121491121492121493121494121495121496121497121498121499121500121501121502121503121504121505121506121507121508121509121510121511121512121513121514121515121516121517121518121519121520121521121522121523121524121525121526121527121528121529121530121531121532121533121534121535121536121537121538121539121540121541121542121543121544121545121546121547121548121549121550121551121552121553121554121555121556121557121558121559121560121561121562121563121564121565121566121567121568121569121570121571121572121573121574121575121576121577121578121579121580121581121582121583121584121585121586121587121588121589121590121591121592121593121594121595121596121597121598121599121600121601121602121603121604121605121606121607121608121609121610121611121612121613121614121615121616121617121618121619121620121621121622121623121624121625121626121627121628121629121630121631121632121633121634121635121636121637121638121639121640121641121642121643121644121645121646121647121648121649121650121651121652121653121654121655121656121657121658121659121660121661121662121663121664121665121666121667121668121669121670121671121672121673121674121675121676121677121678121679121680121681121682121683121684121685121686121687121688121689121690121691121692121693121694121695121696121697121698121699121700121701121702121703121704121705121706121707121708121709121710121711121712121713121714121715121716121717121718121719121720121721121722121723121724121725121726121727121728121729121730121731121732121733121734121735121736121737121738121739121740121741121742121743121744121745121746121747121748121749121750121751121752121753121754121755121756121757121758121759121760121761121762121763121764121765121766121767121768121769121770121771121772121773121774121775121776121777121778121779121780121781121782121783121784121785121786121787121788121789121790121791121792121793121794121795121796121797121798121799121800121801121802121803121804121805121806121807121808121809121810121811121812121813121814121815121816121817121818121819121820121821121822121823121824121825121826121827121828121829121830121831121832121833121834121835121836121837121838121839121840121841121842121843121844121845121846121847121848121849121850121851121852121853121854121855121856121857121858121859121860121861121862121863121864121865121866121867121868121869121870121871121872121873121874121875121876121877121878121879121880121881121882121883121884121885121886121887121888121889121890121891121892121893121894121895121896121897121898121899121900121901121902121903121904121905121906121907121908121909121910121911121912121913121914121915121916121917121918121919121920121921121922121923121924121925121926121927121928121929121930121931121932121933121934121935121936121937121938121939121940121941121942121943121944121945121946121947121948121949121950121951121952121953121954121955121956121957121958121959121960121961121962121963121964121965121966121967121968121969121970121971121972121973121974121975121976121977121978121979121980121981121982121983121984121985121986121987121988121989121990121991121992121993121994121995121996121997121998121999122000122001122002122003122004122005122006122007122008122009122010122011122012122013122014122015122016122017122018122019122020122021122022122023122024122025122026122027122028122029122030122031122032122033122034122035122036122037122038122039122040122041122042122043122044122045122046122047122048122049122050122051122052122053122054122055122056122057122058122059122060122061122062122063122064122065122066122067122068122069122070122071122072122073122074122075122076122077122078122079122080122081122082122083122084122085122086122087122088122089122090122091122092122093122094122095122096122097122098122099122100122101122102122103122104122105122106122107122108122109122110122111122112122113122114122115122116122117122118122119122120122121122122122123122124122125122126122127122128122129122130122131122132122133122134122135122136122137122138122139122140122141122142122143122144122145122146122147122148122149122150122151122152122153122154122155122156122157122158122159122160122161122162122163122164122165122166122167122168122169122170122171122172122173122174122175122176122177122178122179122180122181122182122183122184122185122186122187122188122189122190122191122192122193122194122195122196122197122198122199122200122201122202122203122204122205122206122207122208122209122210122211122212122213122214122215122216122217122218122219122220122221122222122223122224122225122226122227122228122229122230122231122232122233122234122235122236122237122238122239122240122241122242122243122244122245122246122247122248122249122250122251122252122253122254122255122256122257122258122259122260122261122262122263122264122265122266122267122268122269122270122271122272122273122274122275122276122277122278122279122280122281122282122283122284122285122286122287122288122289122290122291122292122293122294122295122296122297122298122299122300122301122302122303122304122305122306122307122308122309122310122311122312122313122314122315122316122317122318122319122320122321122322122323122324122325122326122327122328122329122330122331122332122333122334122335122336122337122338122339122340122341122342122343122344122345122346122347122348122349122350122351122352122353122354122355122356122357122358122359122360122361122362122363122364122365122366122367122368122369122370122371122372122373122374122375122376122377122378122379122380122381122382122383122384122385122386122387122388122389122390122391122392122393122394122395122396122397122398122399122400122401122402122403122404122405122406122407122408122409122410122411122412122413122414122415122416122417122418122419122420122421122422122423122424122425122426122427122428122429122430122431122432122433122434122435122436122437122438122439122440122441122442122443122444122445122446122447122448122449122450122451122452122453122454122455122456122457122458122459122460122461122462122463122464122465122466122467122468122469122470122471122472122473122474122475122476122477122478122479122480122481122482122483122484122485122486122487122488122489122490122491122492122493122494122495122496122497122498122499122500122501122502122503122504122505122506122507122508122509122510122511122512122513122514122515122516122517122518122519122520122521122522122523122524122525122526122527122528122529122530122531122532122533122534122535122536122537122538122539122540122541122542122543122544122545122546122547122548122549122550122551122552122553122554122555122556122557122558122559122560122561122562122563122564122565122566122567122568122569122570122571122572122573122574122575122576122577122578122579122580122581122582122583122584122585122586122587122588122589122590122591122592122593122594122595122596122597122598122599122600122601122602122603122604122605122606122607122608122609122610122611122612122613122614122615122616122617122618122619122620122621122622122623122624122625122626122627122628122629122630122631122632122633122634122635122636122637122638122639122640122641122642122643122644122645122646122647122648122649122650122651122652122653122654122655122656122657122658122659122660122661122662122663122664122665122666122667122668122669122670122671122672122673122674122675122676122677122678122679122680122681122682122683122684122685122686122687122688122689122690122691122692122693122694122695122696122697122698122699122700122701122702122703122704122705122706122707122708122709122710122711122712122713122714122715122716122717122718122719122720122721122722122723122724122725122726122727122728122729122730122731122732122733122734122735122736122737122738122739122740122741122742122743122744122745122746122747122748122749122750122751122752122753122754122755122756122757122758122759122760122761122762122763122764122765122766122767122768122769122770122771122772122773122774122775122776122777122778122779122780122781122782122783122784122785122786122787122788122789122790122791122792122793122794122795122796122797122798122799122800122801122802122803122804122805122806122807122808122809122810122811122812122813122814122815122816122817122818122819122820122821122822122823122824122825122826122827122828122829122830122831122832122833122834122835122836122837122838122839122840122841122842122843122844122845122846122847122848122849122850122851122852122853122854122855122856122857122858122859122860122861122862122863122864122865122866122867122868122869122870122871122872122873122874122875122876122877122878122879122880122881122882122883122884122885122886122887122888122889122890122891122892122893122894122895122896122897122898122899122900122901122902122903122904122905122906122907122908122909122910122911122912122913122914122915122916122917122918122919122920122921122922122923122924122925122926122927122928122929122930122931122932122933122934122935122936122937122938122939122940122941122942122943122944122945122946122947122948122949122950122951122952122953122954122955122956122957122958122959122960122961122962122963122964122965122966122967122968122969122970122971122972122973122974122975122976122977122978122979122980122981122982122983122984122985122986122987122988122989122990122991122992122993122994122995122996122997122998122999123000123001123002123003123004123005123006123007123008123009123010123011123012123013123014123015123016123017123018123019123020123021123022123023123024123025123026123027123028123029123030123031123032123033123034123035123036123037123038123039123040123041123042123043123044123045123046123047123048123049123050123051123052123053123054123055123056123057123058123059123060123061123062123063123064123065123066123067123068123069123070123071123072123073123074123075123076123077123078123079123080123081123082123083123084123085123086123087123088123089123090123091123092123093123094123095123096123097123098123099123100123101123102123103123104123105123106123107123108123109123110123111123112123113123114123115123116123117123118123119123120123121123122123123123124123125123126123127123128123129123130123131123132123133123134123135123136123137123138123139123140123141123142123143123144123145123146123147123148123149123150123151123152123153123154123155123156123157123158123159123160123161123162123163123164123165123166123167123168123169123170123171123172123173123174123175123176123177123178123179123180123181123182123183123184123185123186123187123188123189123190123191123192123193123194123195123196123197123198123199123200123201123202123203123204123205123206123207123208123209123210123211123212123213123214123215123216123217123218123219123220123221123222123223123224123225123226123227123228123229123230123231123232123233123234123235123236123237123238123239123240123241123242123243123244123245123246123247123248123249123250123251123252123253123254123255123256123257123258123259123260123261123262123263123264123265123266123267123268123269123270123271123272123273123274123275123276123277123278123279123280123281123282123283123284123285123286123287123288123289123290123291123292123293123294123295123296123297123298123299123300123301123302123303123304123305123306123307123308123309123310123311123312123313123314123315123316123317123318123319123320123321123322123323123324123325123326123327123328123329123330123331123332123333123334123335123336123337123338123339123340123341123342123343123344123345123346123347123348123349123350123351123352123353123354123355123356123357123358123359123360123361123362123363123364123365123366123367123368123369123370123371123372123373123374123375123376123377123378123379123380123381123382123383123384123385123386123387123388123389123390123391123392123393123394123395123396123397123398123399123400123401123402123403123404123405123406123407123408123409123410123411123412123413123414123415123416123417123418123419123420123421123422123423123424123425123426123427123428123429123430123431123432123433123434123435123436123437123438123439123440123441123442123443123444123445123446123447123448123449123450123451123452123453123454123455123456123457123458123459123460123461123462123463123464123465123466123467123468123469123470123471123472123473123474123475123476123477123478123479123480123481123482123483123484123485123486123487123488123489123490123491123492123493123494123495123496123497123498123499123500123501123502123503123504123505123506123507123508123509123510123511123512123513123514123515123516123517123518123519123520123521123522123523123524123525123526123527123528123529123530123531123532123533123534123535123536123537123538123539123540123541123542123543123544123545123546123547123548123549123550123551123552123553123554123555123556123557123558123559123560123561123562123563123564123565123566123567123568123569123570123571123572123573123574123575123576123577123578123579123580123581123582123583123584123585123586123587123588123589123590123591123592123593123594123595123596123597123598123599123600123601123602123603123604123605123606123607123608123609123610123611123612123613123614123615123616123617123618123619123620123621123622123623123624123625123626123627123628123629123630123631123632123633123634123635123636123637123638123639123640123641123642123643123644123645123646123647123648123649123650123651123652123653123654123655123656123657123658123659123660123661123662123663123664123665123666123667123668123669123670123671123672123673123674123675123676123677123678123679123680123681123682123683123684123685123686123687123688123689123690123691123692123693123694123695123696123697123698123699123700123701123702123703123704123705123706123707123708123709123710123711123712123713123714123715123716123717123718123719123720123721123722123723123724123725123726123727123728123729123730123731123732123733123734123735123736123737123738123739123740123741123742123743123744123745123746123747123748123749123750123751123752123753123754123755123756123757123758123759123760123761123762123763123764123765123766123767123768123769123770123771123772123773123774123775123776123777123778123779123780123781123782123783123784123785123786123787123788123789123790123791123792123793123794123795123796123797123798123799123800123801123802123803123804123805123806123807123808123809123810123811123812123813123814123815123816123817123818123819123820123821123822123823123824123825123826123827123828123829123830123831123832123833123834123835123836123837123838123839123840123841123842123843123844123845123846123847123848123849123850123851123852123853123854123855123856123857123858123859123860123861123862123863123864123865123866123867123868123869123870123871123872123873123874123875123876123877123878123879123880123881123882123883123884123885123886123887123888123889123890123891123892123893123894123895123896123897123898123899123900123901123902123903123904123905123906123907123908123909123910123911123912123913123914123915123916123917123918123919123920123921123922123923123924123925123926123927123928123929123930123931123932123933123934123935123936123937123938123939123940123941123942123943123944123945123946123947123948123949123950123951123952123953123954123955123956123957123958123959123960123961123962123963123964123965123966123967123968123969123970123971123972123973123974123975123976123977123978123979123980123981123982123983123984123985123986123987123988123989123990123991123992123993123994123995123996123997123998123999124000124001124002124003124004124005124006124007124008124009124010124011124012124013124014124015124016124017124018124019124020124021124022124023124024124025124026124027124028124029124030124031124032124033124034124035124036124037124038124039124040124041124042124043124044124045124046124047124048124049124050124051124052124053124054124055124056124057124058124059124060124061124062124063124064124065124066124067124068124069124070124071124072124073124074124075124076124077124078124079124080124081124082124083124084124085124086124087124088124089124090124091124092124093124094124095124096124097124098124099124100124101124102124103124104124105124106124107124108124109124110124111124112124113124114124115124116124117124118124119124120124121124122124123124124124125124126124127124128124129124130124131124132124133124134124135124136124137124138124139124140124141124142124143124144124145124146124147124148124149124150124151124152124153124154124155124156124157124158124159124160124161124162124163124164124165124166124167124168124169124170124171124172124173124174124175124176124177124178124179124180124181124182124183124184124185124186124187124188124189124190124191124192124193124194124195124196124197124198124199124200124201124202124203124204124205124206124207124208124209124210124211124212124213124214124215124216124217124218124219124220124221124222124223124224124225124226124227124228124229124230124231124232124233124234124235124236124237124238124239124240124241124242124243124244124245124246124247124248124249124250124251124252124253124254124255124256124257124258124259124260124261124262124263124264124265124266124267124268124269124270124271124272124273124274124275124276124277124278124279124280124281124282124283124284124285124286124287124288124289124290124291124292124293124294124295124296124297124298124299124300124301124302124303124304124305124306124307124308124309124310124311124312124313124314124315124316124317124318124319124320124321124322124323124324124325124326124327124328124329124330124331124332124333124334124335124336124337124338124339124340124341124342124343124344124345124346124347124348124349124350124351124352124353124354124355124356124357124358124359124360124361124362124363124364124365124366124367124368124369124370124371124372124373124374124375124376124377124378124379124380124381124382124383124384124385124386124387124388124389124390124391124392124393124394124395124396124397124398124399124400124401124402124403124404124405124406124407124408124409124410124411124412124413124414124415124416124417124418124419124420124421124422124423124424124425124426124427124428124429124430124431124432124433124434124435124436124437124438124439124440124441124442124443124444124445124446124447124448124449124450124451124452124453124454124455124456124457124458124459124460124461124462124463124464124465124466124467124468124469124470124471124472124473124474124475124476124477124478124479124480124481124482124483124484124485124486124487124488124489124490124491124492124493124494124495124496124497124498124499124500124501124502124503124504124505124506124507124508124509124510124511124512124513124514124515124516124517124518124519124520124521124522124523124524124525124526124527124528124529124530124531124532124533124534124535124536124537124538124539124540124541124542124543124544124545124546124547124548124549124550124551124552124553124554124555124556124557124558124559124560124561124562124563124564124565124566124567124568124569124570124571124572124573124574124575124576124577124578124579124580124581124582124583124584124585124586124587124588124589124590124591124592124593124594124595124596124597124598124599124600124601124602124603124604124605124606124607124608124609124610124611124612124613124614124615124616124617124618124619124620124621124622124623124624124625124626124627124628124629124630124631124632124633124634124635124636124637124638124639124640124641124642124643124644124645124646124647124648124649124650124651124652124653124654124655124656124657124658124659124660124661124662124663124664124665124666124667124668124669124670124671124672124673124674124675124676124677124678124679124680124681124682124683124684124685124686124687124688124689124690124691124692124693124694124695124696124697124698124699124700124701124702124703124704124705124706124707124708124709124710124711124712124713124714124715124716124717124718124719124720124721124722124723124724124725124726124727124728124729124730124731124732124733124734124735124736124737124738124739124740124741124742124743124744124745124746124747124748124749124750124751124752124753124754124755124756124757124758124759124760124761124762124763124764124765124766124767124768124769124770124771124772124773124774124775124776124777124778124779124780124781124782124783124784124785124786124787124788124789124790124791124792124793124794124795124796124797124798124799124800124801124802124803124804124805124806124807124808124809124810124811124812124813124814124815124816124817124818124819124820124821124822124823124824124825124826124827124828124829124830124831124832124833124834124835124836124837124838124839124840124841124842124843124844124845124846124847124848124849124850124851124852124853124854124855124856124857124858124859124860124861124862124863124864124865124866124867124868124869124870124871124872124873124874124875124876124877124878124879124880124881124882124883124884124885124886124887124888124889124890124891124892124893124894124895124896124897124898124899124900124901124902124903124904124905124906124907124908124909124910124911124912124913124914124915124916124917124918124919124920124921124922124923124924124925124926124927124928124929124930124931124932124933124934124935124936124937124938124939124940124941124942124943124944124945124946124947124948124949124950124951124952124953124954124955124956124957124958124959124960124961124962124963124964124965124966124967124968124969124970124971124972124973124974124975124976124977124978124979124980124981124982124983124984124985124986124987124988124989124990124991124992124993124994124995124996124997124998124999125000125001125002125003125004125005125006125007125008125009125010125011125012125013125014125015125016125017125018125019125020125021125022125023125024125025125026125027125028125029125030125031125032125033125034125035125036125037125038125039125040125041125042125043125044125045125046125047125048125049125050125051125052125053125054125055125056125057125058125059125060125061125062125063125064125065125066125067125068125069125070125071125072125073125074125075125076125077125078125079125080125081125082125083125084125085125086125087125088125089125090125091125092125093125094125095125096125097125098125099125100125101125102125103125104125105125106125107125108125109125110125111125112125113125114125115125116125117125118125119125120125121125122125123125124125125125126125127125128125129125130125131125132125133125134125135125136125137125138125139125140125141125142125143125144125145125146125147125148125149125150125151125152125153125154125155125156125157125158125159125160125161125162125163125164125165125166125167125168125169125170125171125172125173125174125175125176125177125178125179125180125181125182125183125184125185125186125187125188125189125190125191125192125193125194125195125196125197125198125199125200125201125202125203125204125205125206125207125208125209125210125211125212125213125214125215125216125217125218125219125220125221125222125223125224125225125226125227125228125229125230125231125232125233125234125235125236125237125238125239125240125241125242125243125244125245125246125247125248125249125250125251125252125253125254125255125256125257125258125259125260125261125262125263125264125265125266125267125268125269125270125271125272125273125274125275125276125277125278125279125280125281125282125283125284125285125286125287125288125289125290125291125292125293125294125295125296125297125298125299125300125301125302125303125304125305125306125307125308125309125310125311125312125313125314125315125316125317125318125319125320125321125322125323125324125325125326125327125328125329125330125331125332125333125334125335125336125337125338125339125340125341125342125343125344125345125346125347125348125349125350125351125352125353125354125355125356125357125358125359125360125361125362125363125364125365125366125367125368125369125370125371125372125373125374125375125376125377125378125379125380125381125382125383125384125385125386125387125388125389125390125391125392125393125394125395125396125397125398125399125400125401125402125403125404125405125406125407125408125409125410125411125412125413125414125415125416125417125418125419125420125421125422125423125424125425125426125427125428125429125430125431125432125433125434125435125436125437125438125439125440125441125442125443125444125445125446125447125448125449125450125451125452125453125454125455125456125457125458125459125460125461125462125463125464125465125466125467125468125469125470125471125472125473125474125475125476125477125478125479125480125481125482125483125484125485125486125487125488125489125490125491125492125493125494125495125496125497125498125499125500125501125502125503125504125505125506125507125508125509125510125511125512125513125514125515125516125517125518125519125520125521125522125523125524125525125526125527125528125529125530125531125532125533125534125535125536125537125538125539125540125541125542125543125544125545125546125547125548125549125550125551125552125553125554125555125556125557125558125559125560125561125562125563125564125565125566125567125568125569125570125571125572125573125574125575125576125577125578125579125580125581125582125583125584125585125586125587125588125589125590125591125592125593125594125595125596125597125598125599125600125601125602125603125604125605125606125607125608125609125610125611125612125613125614125615125616125617125618125619125620125621125622125623125624125625125626125627125628125629125630125631125632125633125634125635125636125637125638125639125640125641125642125643125644125645125646125647125648125649125650125651125652125653125654125655125656125657125658125659125660125661125662125663125664125665125666125667125668125669125670125671125672125673125674125675125676125677125678125679125680125681125682125683125684125685125686125687125688125689125690125691125692125693125694125695125696125697125698125699125700125701125702125703125704125705125706125707125708125709125710125711125712125713125714125715125716125717125718125719125720125721125722125723125724125725125726125727125728125729125730125731125732125733125734125735125736125737125738125739125740125741125742125743125744125745125746125747125748125749125750125751125752125753125754125755125756125757125758125759125760125761125762125763125764125765125766125767125768125769125770125771125772125773125774125775125776125777125778125779125780125781125782125783125784125785125786125787125788125789125790125791125792125793125794125795125796125797125798125799125800125801125802125803125804125805125806125807125808125809125810125811125812125813125814125815125816125817125818125819125820125821125822125823125824125825125826125827125828125829125830125831125832125833125834125835125836125837125838125839125840125841125842125843125844125845125846125847125848125849125850125851125852125853125854125855125856125857125858125859125860125861125862125863125864125865125866125867125868125869125870125871125872125873125874125875125876125877125878125879125880125881125882125883125884125885125886125887125888125889125890125891125892125893125894125895125896125897125898125899125900125901125902125903125904125905125906125907125908125909125910125911125912125913125914125915125916125917125918125919125920125921125922125923125924125925125926125927125928125929125930125931125932125933125934125935125936125937125938125939125940125941125942125943125944125945125946125947125948125949125950125951125952125953125954125955125956125957125958125959125960125961125962125963125964125965125966125967125968125969125970125971125972125973125974125975125976125977125978125979125980125981125982125983125984125985125986125987125988125989125990125991125992125993125994125995125996125997125998125999126000126001126002126003126004126005126006126007126008126009126010126011126012126013126014126015126016126017126018126019126020126021126022126023126024126025126026126027126028126029126030126031126032126033126034126035126036126037126038126039126040126041126042126043126044126045126046126047126048126049126050126051126052126053126054126055126056126057126058126059126060126061126062126063126064126065126066126067126068126069126070126071126072126073126074126075126076126077126078126079126080126081126082126083126084126085126086126087126088126089126090126091126092126093126094126095126096126097126098126099126100126101126102126103126104126105126106126107126108126109126110126111126112126113126114126115126116126117126118126119126120126121126122126123126124126125126126126127126128126129126130126131126132126133126134126135126136126137126138126139126140126141126142126143126144126145126146126147126148126149126150126151126152126153126154126155126156126157126158126159126160126161126162126163126164126165126166126167126168126169126170126171126172126173126174126175126176126177126178126179126180126181126182126183126184126185126186126187126188126189126190126191126192126193126194126195126196126197126198126199126200126201126202126203126204126205126206126207126208126209126210126211126212126213126214126215126216126217126218126219126220126221126222126223126224126225126226126227126228126229126230126231126232126233126234126235126236126237126238126239126240126241126242126243126244126245126246126247126248126249126250126251126252126253126254126255126256126257126258126259126260126261126262126263126264126265126266126267126268126269126270126271126272126273126274126275126276126277126278126279126280126281126282126283126284126285126286126287126288126289126290126291126292126293126294126295126296126297126298126299126300126301126302126303126304126305126306126307126308126309126310126311126312126313126314126315126316126317126318126319126320126321126322126323126324126325126326126327126328126329126330126331126332126333126334126335126336126337126338126339126340126341126342126343126344126345126346126347126348126349126350126351126352126353126354126355126356126357126358126359126360126361126362126363126364126365126366126367126368126369126370126371126372126373126374126375126376126377126378126379126380126381126382126383126384126385126386126387126388126389126390126391126392126393126394126395126396126397126398126399126400126401126402126403126404126405126406126407126408126409126410126411126412126413126414126415126416126417126418126419126420126421126422126423126424126425126426126427126428126429126430126431126432126433126434126435126436126437126438126439126440126441126442126443126444126445126446126447126448126449126450126451126452126453126454126455126456126457126458126459126460126461126462126463126464126465126466126467126468126469126470126471126472126473126474126475126476126477126478126479126480126481126482126483126484126485126486126487126488126489126490126491126492126493126494126495126496126497126498126499126500126501126502126503126504126505126506126507126508126509126510126511126512126513126514126515126516126517126518126519126520126521126522126523126524126525126526126527126528126529126530126531126532126533126534126535126536126537126538126539126540126541126542126543126544126545126546126547126548126549126550126551126552126553126554126555126556126557126558126559126560126561126562126563126564126565126566126567126568126569126570126571126572126573126574126575126576126577126578126579126580126581126582126583126584126585126586126587126588126589126590126591126592126593126594126595126596126597126598126599126600126601126602126603126604126605126606126607126608126609126610126611126612126613126614126615126616126617126618126619126620126621126622126623126624126625126626126627126628126629126630126631126632126633126634126635126636126637126638126639126640126641126642126643126644126645126646126647126648126649126650126651126652126653126654126655126656126657126658126659126660126661126662126663126664126665126666126667126668126669126670126671126672126673126674126675126676126677126678126679126680126681126682126683126684126685126686126687126688126689126690126691126692126693126694126695126696126697126698126699126700126701126702126703126704126705126706126707126708126709126710126711126712126713126714126715126716126717126718126719126720126721126722126723126724126725126726126727126728126729126730126731126732126733126734126735126736126737126738126739126740126741126742126743126744126745126746126747126748126749126750126751126752126753126754126755126756126757126758126759126760126761126762126763126764126765126766126767126768126769126770126771126772126773126774126775126776126777126778126779126780126781126782126783126784126785126786126787126788126789126790126791126792126793126794126795126796126797126798126799126800126801126802126803126804126805126806126807126808126809126810126811126812126813126814126815126816126817126818126819126820126821126822126823126824126825126826126827126828126829126830126831126832126833126834126835126836126837126838126839126840126841126842126843126844126845126846126847126848126849126850126851126852126853126854126855126856126857126858126859126860126861126862126863126864126865126866126867126868126869126870126871126872126873126874126875126876126877126878126879126880126881126882126883126884126885126886126887126888126889126890126891126892126893126894126895126896126897126898126899126900126901126902126903126904126905126906126907126908126909126910126911126912126913126914126915126916126917126918126919126920126921126922126923126924126925126926126927126928126929126930126931126932126933126934126935126936126937126938126939126940126941126942126943126944126945126946126947126948126949126950126951126952126953126954126955126956126957126958126959126960126961126962126963126964126965126966126967126968126969126970126971126972126973126974126975126976126977126978126979126980126981126982126983126984126985126986126987126988126989126990126991126992126993126994126995126996126997126998126999127000127001127002127003127004127005127006127007127008127009127010127011127012127013127014127015127016127017127018127019127020127021127022127023127024127025127026127027127028127029127030127031127032127033127034127035127036127037127038127039127040127041127042127043127044127045127046127047127048127049127050127051127052127053127054127055127056127057127058127059127060127061127062127063127064127065127066127067127068127069127070127071127072127073127074127075127076127077127078127079127080127081127082127083127084127085127086127087127088127089127090127091127092127093127094127095127096127097127098127099127100127101127102127103127104127105127106127107127108127109127110127111127112127113127114127115127116127117127118127119127120127121127122127123127124127125127126127127127128127129127130127131127132127133127134127135127136127137127138127139127140127141127142127143127144127145127146127147127148127149127150127151127152127153127154127155127156127157127158127159127160127161127162127163127164127165127166127167127168127169127170127171127172127173127174127175127176127177127178127179127180127181127182127183127184127185127186127187127188127189127190127191127192127193127194127195127196127197127198127199127200127201127202127203127204127205127206127207127208127209127210127211127212127213127214127215127216127217127218127219127220127221127222127223127224127225127226127227127228127229127230127231127232127233127234127235127236127237127238127239127240127241127242127243127244127245127246127247127248127249127250127251127252127253127254127255127256127257127258127259127260127261127262127263127264127265127266127267127268127269127270127271127272127273127274127275127276127277127278127279127280127281127282127283127284127285127286127287127288127289127290127291127292127293127294127295127296127297127298127299127300127301127302127303127304127305127306127307127308127309127310127311127312127313127314127315127316127317127318127319127320127321127322127323127324127325127326127327127328127329127330127331127332127333127334127335127336127337127338127339127340127341127342127343127344127345127346127347127348127349127350127351127352127353127354127355127356127357127358127359127360127361127362127363127364127365127366127367127368127369127370127371127372127373127374127375127376127377127378127379127380127381127382127383127384127385127386127387127388127389127390127391127392127393127394127395127396127397127398127399127400127401127402127403127404127405127406127407127408127409127410127411127412127413127414127415127416127417127418127419127420127421127422127423127424127425127426127427127428127429127430127431127432127433127434127435127436127437127438127439127440127441127442127443127444127445127446127447127448127449127450127451127452127453127454127455127456127457127458127459127460127461127462127463127464127465127466127467127468127469127470127471127472127473127474127475127476127477127478127479127480127481127482127483127484127485127486127487127488127489127490127491127492127493127494127495127496127497127498127499127500127501127502127503127504127505127506127507127508127509127510127511127512127513127514127515127516127517127518127519127520127521127522127523127524127525127526127527127528127529127530127531127532127533127534127535127536127537127538127539127540127541127542127543127544127545127546127547127548127549127550127551127552127553127554127555127556127557127558127559127560127561127562127563127564127565127566127567127568127569127570127571127572127573127574127575127576127577127578127579127580127581127582127583127584127585127586127587127588127589127590127591127592127593127594127595127596127597127598127599127600127601127602127603127604127605127606127607127608127609127610127611127612127613127614127615127616127617127618127619127620127621127622127623127624127625127626127627127628127629127630127631127632127633127634127635127636127637127638127639127640127641127642127643127644127645127646127647127648127649127650127651127652127653127654127655127656127657127658127659127660127661127662127663127664127665127666127667127668127669127670127671127672127673127674127675127676127677127678127679127680127681127682127683127684127685127686127687127688127689127690127691127692127693127694127695127696127697127698127699127700127701127702127703127704127705127706127707127708127709127710127711127712127713127714127715127716127717127718127719127720127721127722127723127724127725127726127727127728127729127730127731127732127733127734127735127736127737127738127739127740127741127742127743127744127745127746127747127748127749127750127751127752127753127754127755127756127757127758127759127760127761127762127763127764127765127766127767127768127769127770127771127772127773127774127775127776127777127778127779127780127781127782127783127784127785127786127787127788127789127790127791127792127793127794127795127796127797127798127799127800127801127802127803127804127805127806127807127808127809127810127811127812127813127814127815127816127817127818127819127820127821127822127823127824127825127826127827127828127829127830127831127832127833127834127835127836127837127838127839127840127841127842127843127844127845127846127847127848127849127850127851127852127853127854127855127856127857127858127859127860127861127862127863127864127865127866127867127868127869127870127871127872127873127874127875127876127877127878127879127880127881127882127883127884127885127886127887127888127889127890127891127892127893127894127895127896127897127898127899127900127901127902127903127904127905127906127907127908127909127910127911127912127913127914127915127916127917127918127919127920127921127922127923127924127925127926127927127928127929127930127931127932127933127934127935127936127937127938127939127940127941127942127943127944127945127946127947127948127949127950127951127952127953127954127955127956127957127958127959127960127961127962127963127964127965127966127967127968127969127970127971127972127973127974127975127976127977127978127979127980127981127982127983127984127985127986127987127988127989127990127991127992127993127994127995127996127997127998127999128000128001128002128003128004128005128006128007128008128009128010128011128012128013128014128015128016128017128018128019128020128021128022128023128024128025128026128027128028128029128030128031128032128033128034128035128036128037128038128039128040128041128042128043128044128045128046128047128048128049128050128051128052128053128054128055128056128057128058128059128060128061128062128063128064128065128066128067128068128069128070128071128072128073128074128075128076128077128078128079128080128081128082128083128084128085128086128087128088128089128090128091128092128093128094128095128096128097128098128099128100128101128102128103128104128105128106128107128108128109128110128111128112128113128114128115128116128117128118128119128120128121128122128123128124128125128126128127128128128129128130128131128132128133128134128135128136128137128138128139128140128141128142128143128144128145128146128147128148128149128150128151128152128153128154128155128156128157128158128159128160128161128162128163128164128165128166128167128168128169128170128171128172128173128174128175128176128177128178128179128180128181128182128183128184128185128186128187128188128189128190128191128192128193128194128195128196128197128198128199128200128201128202128203128204128205128206128207128208128209128210128211128212128213128214128215128216128217128218128219128220128221128222128223128224128225128226128227128228128229128230128231128232128233128234128235128236128237128238128239128240128241128242128243128244128245128246128247128248128249128250128251128252128253128254128255128256128257128258128259128260128261128262128263128264128265128266128267128268128269128270128271128272128273128274128275128276128277128278128279128280128281128282128283128284128285128286128287128288128289128290128291128292128293128294128295128296128297128298128299128300128301128302128303128304128305128306128307128308128309128310128311128312128313128314128315128316128317128318128319128320128321128322128323128324128325128326128327128328128329128330128331128332128333128334128335128336128337128338128339128340128341128342128343128344128345128346128347128348128349128350128351128352128353128354128355128356128357128358128359128360128361128362128363128364128365128366128367128368128369128370128371128372128373128374128375128376128377128378128379128380128381128382128383128384128385128386128387128388128389128390128391128392128393128394128395128396128397128398128399128400128401128402128403128404128405128406128407128408128409128410128411128412128413128414128415128416128417128418128419128420128421128422128423128424128425128426128427128428128429128430128431128432128433128434128435128436128437128438128439128440128441128442128443128444128445128446128447128448128449128450128451128452128453128454128455128456128457128458128459128460128461128462128463128464128465128466128467128468128469128470128471128472128473128474128475128476128477128478128479128480128481128482128483128484128485128486128487128488128489128490128491128492128493128494128495128496128497128498128499128500128501128502128503128504128505128506128507128508128509128510128511128512128513128514128515128516128517128518128519128520128521128522128523128524128525128526128527128528128529128530128531128532128533128534128535128536128537128538128539128540128541128542128543128544128545128546128547128548128549128550128551128552128553128554128555128556128557128558128559128560128561128562128563128564128565128566128567128568128569128570128571128572128573128574128575128576128577128578128579128580128581128582128583128584128585128586128587128588128589128590128591128592128593128594128595128596128597128598128599128600128601128602128603128604128605128606128607128608128609128610128611128612128613128614128615128616128617128618128619128620128621128622128623128624128625128626128627128628128629128630128631128632128633128634128635128636128637128638128639128640128641128642128643128644128645128646128647128648128649128650128651128652128653128654128655128656128657128658128659128660128661128662128663128664128665128666128667128668128669128670128671128672128673128674128675128676128677128678128679128680128681128682128683128684128685128686128687128688128689128690128691128692128693128694128695128696128697128698128699128700128701128702128703128704128705128706128707128708128709128710128711128712128713128714128715128716128717128718128719128720128721128722128723128724128725128726128727128728128729128730128731128732128733128734128735128736128737128738128739128740128741128742128743128744128745128746128747128748128749128750128751128752128753128754128755128756128757128758128759128760128761128762128763128764128765128766128767128768128769128770128771128772128773128774128775128776128777128778128779128780128781128782128783128784128785128786128787128788128789128790128791128792128793128794128795128796128797128798128799128800128801128802128803128804128805128806128807128808128809128810128811128812128813128814128815128816128817128818128819128820128821128822128823128824128825128826128827128828128829128830128831128832128833128834128835128836128837128838128839128840128841128842128843128844128845128846128847128848128849128850128851128852128853128854128855128856128857128858128859128860128861128862128863128864128865128866128867128868128869128870128871128872128873128874128875128876128877128878128879128880128881128882128883128884128885128886128887128888128889128890128891128892128893128894128895128896128897128898128899128900128901128902128903128904128905128906128907128908128909128910128911128912128913128914128915128916128917128918128919128920128921128922128923128924128925128926128927128928128929128930128931128932128933128934128935128936128937128938128939128940128941128942128943128944128945128946128947128948128949128950128951128952128953128954128955128956128957128958128959128960128961128962128963128964128965128966128967128968128969128970128971128972128973128974128975128976128977128978128979128980128981128982128983128984128985128986128987128988128989128990128991128992128993128994128995128996128997128998128999129000129001129002129003129004129005129006129007129008129009129010129011129012129013129014129015129016129017129018129019129020129021129022129023129024129025129026129027129028129029129030129031129032129033129034129035129036129037129038129039129040129041129042129043129044129045129046129047129048129049129050129051129052129053129054129055129056129057129058129059129060129061129062129063129064129065129066129067129068129069129070129071129072129073129074129075129076129077129078129079129080129081129082129083129084129085129086129087129088129089129090129091129092129093129094129095129096129097129098129099129100129101129102129103129104129105129106129107129108129109129110129111129112129113129114129115129116129117129118129119129120129121129122129123129124129125129126129127129128129129129130129131129132129133129134129135129136129137129138129139129140129141129142129143129144129145129146129147129148129149129150129151129152129153129154129155129156129157129158129159129160129161129162129163129164129165129166129167129168129169129170129171129172129173129174129175129176129177129178129179129180129181129182129183129184129185129186129187129188129189129190129191129192129193129194129195129196129197129198129199129200129201129202129203129204129205129206129207129208129209129210129211129212129213129214129215129216129217129218129219129220129221129222129223129224129225129226129227129228129229129230129231129232129233129234129235129236129237129238129239129240129241129242129243129244129245129246129247129248129249129250129251129252129253129254129255129256129257129258129259129260129261129262129263129264129265129266129267129268129269129270129271129272129273129274129275129276129277129278129279129280129281129282129283129284129285129286129287129288129289129290129291129292129293129294129295129296129297129298129299129300129301129302129303129304129305129306129307129308129309129310129311129312129313129314129315129316129317129318129319129320129321129322129323129324129325129326129327129328129329129330129331129332129333129334129335129336129337129338129339129340129341129342129343129344129345129346129347129348129349129350129351129352129353129354129355129356129357129358129359129360129361129362129363129364129365129366129367129368129369129370129371129372129373129374129375129376129377129378129379129380129381129382129383129384129385129386129387129388129389129390129391129392129393129394129395129396129397129398129399129400129401129402129403129404129405129406129407129408129409129410129411129412129413129414129415129416129417129418129419129420129421129422129423129424129425129426129427129428129429129430129431129432129433129434129435129436129437129438129439129440129441129442129443129444129445129446129447129448129449129450129451129452129453129454129455129456129457129458129459129460129461129462129463129464129465129466129467129468129469129470129471129472129473129474129475129476129477129478129479129480129481129482129483129484129485129486129487129488129489129490129491129492129493129494129495129496129497129498129499129500129501129502129503129504129505129506129507129508129509129510129511129512129513129514129515129516129517129518129519129520129521129522129523129524129525129526129527129528129529129530129531129532129533129534129535129536129537129538129539129540129541129542129543129544129545129546129547129548129549129550129551129552129553129554129555129556129557129558129559129560129561129562129563129564129565129566129567129568129569129570129571129572129573129574129575129576129577129578129579129580129581129582129583129584129585129586129587129588129589129590129591129592129593129594129595129596129597129598129599129600129601129602129603129604129605129606129607129608129609129610129611129612129613129614129615129616129617129618129619129620129621129622129623129624129625129626129627129628129629129630129631129632129633129634129635129636129637129638129639129640129641129642129643129644129645129646129647129648129649129650129651129652129653129654129655129656129657129658129659129660129661129662129663129664129665129666129667129668129669129670129671129672129673129674129675129676129677129678129679129680129681129682129683129684129685129686129687129688129689129690129691129692129693129694129695129696129697129698129699129700129701129702129703129704129705129706129707129708129709129710129711129712129713129714129715129716129717129718129719129720129721129722129723129724129725129726129727129728129729129730129731129732129733129734129735129736129737129738129739129740129741129742129743129744129745129746129747129748129749129750129751129752129753129754129755129756129757129758129759129760129761129762129763129764129765129766129767129768129769129770129771129772129773129774129775129776129777129778129779129780129781129782129783129784129785129786129787129788129789129790129791129792129793129794129795129796129797129798129799129800129801129802129803129804129805129806129807129808129809129810129811129812129813129814129815129816129817129818129819129820129821129822129823129824129825129826129827129828129829129830129831129832129833129834129835129836129837129838129839129840129841129842129843129844129845129846129847129848129849129850129851129852129853129854129855129856129857129858129859129860129861129862129863129864129865129866129867129868129869129870129871129872129873129874129875129876129877129878129879129880129881129882129883129884129885129886129887129888129889129890129891129892129893129894129895129896129897129898129899129900129901129902129903129904129905129906129907129908129909129910129911129912129913129914129915129916129917129918129919129920129921129922129923129924129925129926129927129928129929129930129931129932129933129934129935129936129937129938129939129940129941129942129943129944129945129946129947129948129949129950129951129952129953129954129955129956129957129958129959129960129961129962129963129964129965129966129967129968129969129970129971129972129973129974129975129976129977129978129979129980129981129982129983129984129985129986129987129988129989129990129991129992129993129994129995129996129997129998129999130000130001130002130003130004130005130006130007130008130009130010130011130012130013130014130015130016130017130018130019130020130021130022130023130024130025130026130027130028130029130030130031130032130033130034130035130036130037130038130039130040130041130042130043130044130045130046130047130048130049130050130051130052130053130054130055130056130057130058130059130060130061130062130063130064130065130066130067130068130069130070130071130072130073130074130075130076130077130078130079130080130081130082130083130084130085130086130087130088130089130090130091130092130093130094130095130096130097130098130099130100130101130102130103130104130105130106130107130108130109130110130111130112130113130114130115130116130117130118130119130120130121130122130123130124130125130126130127130128130129130130130131130132130133130134130135130136130137130138130139130140130141130142130143130144130145130146130147130148130149130150130151130152130153130154130155130156130157130158130159130160130161130162130163130164130165130166130167130168130169130170130171130172130173130174130175130176130177130178130179130180130181130182130183130184130185130186130187130188130189130190130191130192130193130194130195130196130197130198130199130200130201130202130203130204130205130206130207130208130209130210130211130212130213130214130215130216130217130218130219130220130221130222130223130224130225130226130227130228130229130230130231130232130233130234130235130236130237130238130239130240130241130242130243130244130245130246130247130248130249130250130251130252130253130254130255130256130257130258130259130260130261130262130263130264130265130266130267130268130269130270130271130272130273130274130275130276130277130278130279130280130281130282130283130284130285130286130287130288130289130290130291130292130293130294130295130296130297130298130299130300130301130302130303130304130305130306130307130308130309130310130311130312130313130314130315130316130317130318130319130320130321130322130323130324130325130326130327130328130329130330130331130332130333130334130335130336130337130338130339130340130341130342130343130344130345130346130347130348130349130350130351130352130353130354130355130356130357130358130359130360130361130362130363130364130365130366130367130368130369130370130371130372130373130374130375130376130377130378130379130380130381130382130383130384130385130386130387130388130389130390130391130392130393130394130395130396130397130398130399130400130401130402130403130404130405130406130407130408130409130410130411130412130413130414130415130416130417130418130419130420130421130422130423130424130425130426130427130428130429130430130431130432130433130434130435130436130437130438130439130440130441130442130443130444130445130446130447130448130449130450130451130452130453130454130455130456130457130458130459130460130461130462130463130464130465130466130467130468130469130470130471130472130473130474130475130476130477130478130479130480130481130482130483130484130485130486130487130488130489130490130491130492130493130494130495130496130497130498130499130500130501130502130503130504130505130506130507130508130509130510130511130512130513130514130515130516130517130518130519130520130521130522130523130524130525130526130527130528130529130530130531130532130533130534130535130536130537130538130539130540130541130542130543130544130545130546130547130548130549130550130551130552130553130554130555130556130557130558130559130560130561130562130563130564130565130566130567130568130569130570130571130572130573130574130575130576130577130578130579130580130581130582130583130584130585130586130587130588130589130590130591130592130593130594130595130596130597130598130599130600130601130602130603130604130605130606130607130608130609130610130611130612130613130614130615130616130617130618130619130620130621130622130623130624130625130626130627130628130629130630130631130632130633130634130635130636130637130638130639130640130641130642130643130644130645130646130647130648130649130650130651130652130653130654130655130656130657130658130659130660130661130662130663130664130665130666130667130668130669130670130671130672130673130674130675130676130677130678130679130680130681130682130683130684130685130686130687130688130689130690130691130692130693130694130695130696130697130698130699130700130701130702130703130704130705130706130707130708130709130710130711130712130713130714130715130716130717130718130719130720130721130722130723130724130725130726130727130728130729130730130731130732130733130734130735130736130737130738130739130740130741130742130743130744130745130746130747130748130749130750130751130752130753130754130755130756130757130758130759130760130761130762130763130764130765130766130767130768130769130770130771130772130773130774130775130776130777130778130779130780130781130782130783130784130785130786130787130788130789130790130791130792130793130794130795130796130797130798130799130800130801130802130803130804130805130806130807130808130809130810130811130812130813130814130815130816130817130818130819130820130821130822130823130824130825130826130827130828130829130830130831130832130833130834130835130836130837130838130839130840130841130842130843130844130845130846130847130848130849130850130851130852130853130854130855130856130857130858130859130860130861130862130863130864130865130866130867130868130869130870130871130872130873130874130875130876130877130878130879130880130881130882130883130884130885130886130887130888130889130890130891130892130893130894130895130896130897130898130899130900130901130902130903130904130905130906130907130908130909130910130911130912130913130914130915130916130917130918130919130920130921130922130923130924130925130926130927130928130929130930130931130932130933130934130935130936130937130938130939130940130941130942130943130944130945130946130947130948130949130950130951130952130953130954130955130956130957130958130959130960130961130962130963130964130965130966130967130968130969130970130971130972130973130974130975130976130977130978130979130980130981130982130983130984130985130986130987130988130989130990130991130992130993130994130995130996130997130998130999131000131001131002131003131004131005131006131007131008131009131010131011131012131013131014131015131016131017131018131019131020131021131022131023131024131025131026131027131028131029131030131031131032131033131034131035131036131037131038131039131040131041131042131043131044131045131046131047131048131049131050131051131052131053131054131055131056131057131058131059131060131061131062131063131064131065131066131067131068131069131070131071131072131073131074131075131076131077131078131079131080131081131082131083131084131085131086131087131088131089131090131091131092131093131094131095131096131097131098131099131100131101131102131103131104131105131106131107131108131109131110131111131112131113131114131115131116131117131118131119131120131121131122131123131124131125131126131127131128131129131130131131131132131133131134131135131136131137131138131139131140131141131142131143131144131145131146131147131148131149131150131151131152131153131154131155131156131157131158131159131160131161131162131163131164131165131166131167131168131169131170131171131172131173131174131175131176131177131178131179131180131181131182131183131184131185131186131187131188131189131190131191131192131193131194131195131196131197131198131199131200131201131202131203131204131205131206131207131208131209131210131211131212131213131214131215131216131217131218131219131220131221131222131223131224131225131226131227131228131229131230131231131232131233131234131235131236131237131238131239131240131241131242131243131244131245131246131247131248131249131250131251131252131253131254131255131256131257131258131259131260131261131262131263131264131265131266131267131268131269131270131271131272131273131274131275131276131277131278131279131280131281131282131283131284131285131286131287131288131289131290131291131292131293131294131295131296131297131298131299131300131301131302131303131304131305131306131307131308131309131310131311131312131313131314131315131316131317131318131319131320131321131322131323131324131325131326131327131328131329131330131331131332131333131334131335131336131337131338131339131340131341131342131343131344131345131346131347131348131349131350131351131352131353131354131355131356131357131358131359131360131361131362131363131364131365131366131367131368131369131370131371131372131373131374131375131376131377131378131379131380131381131382131383131384131385131386131387131388131389131390131391131392131393131394131395131396131397131398131399131400131401131402131403131404131405131406131407131408131409131410131411131412131413131414131415131416131417131418131419131420131421131422131423131424131425131426131427131428131429131430131431131432131433131434131435131436131437131438131439131440131441131442131443131444131445131446131447131448131449131450131451131452131453131454131455131456131457131458131459131460131461131462131463131464131465131466131467131468131469131470131471131472131473131474131475131476131477131478131479131480131481131482131483131484131485131486131487131488131489131490131491131492131493131494131495131496131497131498131499131500131501131502131503131504131505131506131507131508131509131510131511131512131513131514131515131516131517131518131519131520131521131522131523131524131525131526131527131528131529131530131531131532131533131534131535131536131537131538131539131540131541131542131543131544131545131546131547131548131549131550131551131552131553131554131555131556131557131558131559131560131561131562131563131564131565131566131567131568131569131570131571131572131573131574131575131576131577131578131579131580131581131582131583131584131585131586131587131588131589131590131591131592131593131594131595131596131597131598131599131600131601131602131603131604131605131606131607131608131609131610131611131612131613131614131615131616131617131618131619131620131621131622131623131624131625131626131627131628131629131630131631131632131633131634131635131636131637131638131639131640131641131642131643131644131645131646131647131648131649131650131651131652131653131654131655131656131657131658131659131660131661131662131663131664131665131666131667131668131669131670131671131672131673131674131675131676131677131678131679131680131681131682131683131684131685131686131687131688131689131690131691131692131693131694131695131696131697131698131699131700131701131702131703131704131705131706131707131708131709131710131711131712131713131714131715131716131717131718131719131720131721131722131723131724131725131726131727131728131729131730131731131732131733131734131735131736131737131738131739131740131741131742131743131744131745131746131747131748131749131750131751131752131753131754131755131756131757131758131759131760131761131762131763131764131765131766131767131768131769131770131771131772131773131774131775131776131777131778131779131780131781131782131783131784131785131786131787131788131789131790131791131792131793131794131795131796131797131798131799131800131801131802131803131804131805131806131807131808131809131810131811131812131813131814131815131816131817131818131819131820131821131822131823131824131825131826131827131828131829131830131831131832131833131834131835131836131837131838131839131840131841131842131843131844131845131846131847131848131849131850131851131852131853131854131855131856131857131858131859131860131861131862131863131864131865131866131867131868131869131870131871131872131873131874131875131876131877131878131879131880131881131882131883131884131885131886131887131888131889131890131891131892131893131894131895131896131897131898131899131900131901131902131903131904131905131906131907131908131909131910131911131912131913131914131915131916131917131918131919131920131921131922131923131924131925131926131927131928131929131930131931131932131933131934131935131936131937131938131939131940131941131942131943131944131945131946131947131948131949131950131951131952131953131954131955131956131957131958131959131960131961131962131963131964131965131966131967131968131969131970131971131972131973131974131975131976131977131978131979131980131981131982131983131984131985131986131987131988131989131990131991131992131993131994131995131996131997131998131999132000132001132002132003132004132005132006132007132008132009132010132011132012132013132014132015132016132017132018132019132020132021132022132023132024132025132026132027132028132029132030132031132032132033132034132035132036132037132038132039132040132041132042132043132044132045132046132047132048132049132050132051132052132053132054132055132056132057132058132059132060132061132062132063132064132065132066132067132068132069132070132071132072132073132074132075132076132077132078132079132080132081132082132083132084132085132086132087132088132089132090132091132092132093132094132095132096132097132098132099132100132101132102132103132104132105132106132107132108132109132110132111132112132113132114132115132116132117132118132119132120132121132122132123132124132125132126132127132128132129132130132131132132132133132134132135132136132137132138132139132140132141132142132143132144132145132146132147132148132149132150132151132152132153132154132155132156132157132158132159132160132161132162132163132164132165132166132167132168132169132170132171132172132173132174132175132176132177132178132179132180132181132182132183132184132185132186132187132188132189132190132191132192132193132194132195132196132197132198132199132200132201132202132203132204132205132206132207132208132209132210132211132212132213132214132215132216132217132218132219132220132221132222132223132224132225132226132227132228132229132230132231132232132233132234132235132236132237132238132239132240132241132242132243132244132245132246132247132248132249132250132251132252132253132254132255132256132257132258132259132260132261132262132263132264132265132266132267132268132269132270132271132272132273132274132275132276132277132278132279132280132281132282132283132284132285132286132287132288132289132290132291132292132293132294132295132296132297132298132299132300132301132302132303132304132305132306132307132308132309132310132311132312132313132314132315132316132317132318132319132320132321132322132323132324132325132326132327132328132329132330132331132332132333132334132335132336132337132338132339132340132341132342132343132344132345132346132347132348132349132350132351132352132353132354132355132356132357132358132359132360132361132362132363132364132365132366132367132368132369132370132371132372132373132374132375132376132377132378132379132380132381132382132383132384132385132386132387132388132389132390132391132392132393132394132395132396132397132398132399132400132401132402132403132404132405132406132407132408132409132410132411132412132413132414132415132416132417132418132419132420132421132422132423132424132425132426132427132428132429132430132431132432132433132434132435132436132437132438132439132440132441132442132443132444132445132446132447132448132449132450132451132452132453132454132455132456132457132458132459132460132461132462132463132464132465132466132467132468132469132470132471132472132473132474132475132476132477132478132479132480132481132482132483132484132485132486132487132488132489132490132491132492132493132494132495132496132497132498132499132500132501132502132503132504132505132506132507132508132509132510132511132512132513132514132515132516132517132518132519132520132521132522132523132524132525132526132527132528132529132530132531132532132533132534132535132536132537132538132539132540132541132542132543132544132545132546132547132548132549132550132551132552132553132554132555132556132557132558132559132560132561132562132563132564132565132566132567132568132569132570132571132572132573132574132575132576132577132578132579132580132581132582132583132584132585132586132587132588132589132590132591132592132593132594132595132596132597132598132599132600132601132602132603132604132605132606132607132608132609132610132611132612132613132614132615132616132617132618132619132620132621132622132623132624132625132626132627132628132629132630132631132632132633132634132635132636132637132638132639132640132641132642132643132644132645132646132647132648132649132650132651132652132653132654132655132656132657132658132659132660132661132662132663132664132665132666132667132668132669132670132671132672132673132674132675132676132677132678132679132680132681132682132683132684132685132686132687132688132689132690132691132692132693132694132695132696132697132698132699132700132701132702132703132704132705132706132707132708132709132710132711132712132713132714132715132716132717132718132719132720132721132722132723132724132725132726132727132728132729132730132731132732132733132734132735132736132737132738132739132740132741132742132743132744132745132746132747132748132749132750132751132752132753132754132755132756132757132758132759132760132761132762132763132764132765132766132767132768132769132770132771132772132773132774132775132776132777132778132779132780132781132782132783132784132785132786132787132788132789132790132791132792132793132794132795132796132797132798132799132800132801132802132803132804132805132806132807132808132809132810132811132812132813132814132815132816132817132818132819132820132821132822132823132824132825132826132827132828132829132830132831132832132833132834132835132836132837132838132839132840132841132842132843132844132845132846132847132848132849132850132851132852132853132854132855132856132857132858132859132860132861132862132863132864132865132866132867132868132869132870132871132872132873132874132875132876132877132878132879132880132881132882132883132884132885132886132887132888132889132890132891132892132893132894132895132896132897132898132899132900132901132902132903132904132905132906132907132908132909132910132911132912132913132914132915132916132917132918132919132920132921132922132923132924132925132926132927132928132929132930132931132932132933132934132935132936132937132938132939132940132941132942132943132944132945132946132947132948132949132950132951132952132953132954132955132956132957132958132959132960132961132962132963132964132965132966132967132968132969132970132971132972132973132974132975132976132977132978132979132980132981132982132983132984132985132986132987132988132989132990132991132992132993132994132995132996132997132998132999133000133001133002133003133004133005133006133007133008133009133010133011133012133013133014133015133016133017133018133019133020133021133022133023133024133025133026133027133028133029133030133031133032133033133034133035133036133037133038133039133040133041133042133043133044133045133046133047133048133049133050133051133052133053133054133055133056133057133058133059133060133061133062133063133064133065133066133067133068133069133070133071133072133073133074133075133076133077133078133079133080133081133082133083133084133085133086133087133088133089133090133091133092133093133094133095133096133097133098133099133100133101133102133103133104133105133106133107133108133109133110133111133112133113133114133115133116133117133118133119133120133121133122133123133124133125133126133127133128133129133130133131133132133133133134133135133136133137133138133139133140133141133142133143133144133145133146133147133148133149133150133151133152133153133154133155133156133157133158133159133160133161133162133163133164133165133166133167133168133169133170133171133172133173133174133175133176133177133178133179133180133181133182133183133184133185133186133187133188133189133190133191133192133193133194133195133196133197133198133199133200133201133202133203133204133205133206133207133208133209133210133211133212133213133214133215133216133217133218133219133220133221133222133223133224133225133226133227133228133229133230133231133232133233133234133235133236133237133238133239133240133241133242133243133244133245133246133247133248133249133250133251133252133253133254133255133256133257133258133259133260133261133262133263133264133265133266133267133268133269133270133271133272133273133274133275133276133277133278133279133280133281133282133283133284133285133286133287133288133289133290133291133292133293133294133295133296133297133298133299133300133301133302133303133304133305133306133307133308133309133310133311133312133313133314133315133316133317133318133319133320133321133322133323133324133325133326133327133328133329133330133331133332133333133334133335133336133337133338133339133340133341133342133343133344133345133346133347133348133349133350133351133352133353133354133355133356133357133358133359133360133361133362133363133364133365133366133367133368133369133370133371133372133373133374133375133376133377133378133379133380133381133382133383133384133385133386133387133388133389133390133391133392133393133394133395133396133397133398133399133400133401133402133403133404133405133406133407133408133409133410133411133412133413133414133415133416133417133418133419133420133421133422133423133424133425133426133427133428133429133430133431133432133433133434133435133436133437133438133439133440133441133442133443133444133445133446133447133448133449133450133451133452133453133454133455133456133457133458133459133460133461133462133463133464133465133466133467133468133469133470133471133472133473133474133475133476133477133478133479133480133481133482133483133484133485133486133487133488133489133490133491133492133493133494133495133496133497133498133499133500133501133502133503133504133505133506133507133508133509133510133511133512133513133514133515133516133517133518133519133520133521133522133523133524133525133526133527133528133529133530133531133532133533133534133535133536133537133538133539133540133541133542133543133544133545133546133547133548133549133550133551133552133553133554133555133556133557133558133559133560133561133562133563133564133565133566133567133568133569133570133571133572133573133574133575133576133577133578133579133580133581133582133583133584133585133586133587133588133589133590133591133592133593133594133595133596133597133598133599133600133601133602133603133604133605133606133607133608133609133610133611133612133613133614133615133616133617133618133619133620133621133622133623133624133625133626133627133628133629133630133631133632133633133634133635133636133637133638133639133640133641133642133643133644133645133646133647133648133649133650133651133652133653133654133655133656133657133658133659133660133661133662133663133664133665133666133667133668133669133670133671133672133673133674133675133676133677133678133679133680133681133682133683133684133685133686133687133688133689133690133691133692133693133694133695133696133697133698133699133700133701133702133703133704133705133706133707133708133709133710133711133712133713133714133715133716133717133718133719133720133721133722133723133724133725133726133727133728133729133730133731133732133733133734133735133736133737133738133739133740133741133742133743133744133745133746133747133748133749133750133751133752133753133754133755133756133757133758133759133760133761133762133763133764133765133766133767133768133769133770133771133772133773133774133775133776133777133778133779133780133781133782133783133784133785133786133787133788133789133790133791133792133793133794133795133796133797133798133799133800133801133802133803133804133805133806133807133808133809133810133811133812133813133814133815133816133817133818133819133820133821133822133823133824133825133826133827133828133829133830133831133832133833133834133835133836133837133838133839133840133841133842133843133844133845133846133847133848133849133850133851133852133853133854133855133856133857133858133859133860133861133862133863133864133865133866133867133868133869133870133871133872133873133874133875133876133877133878133879133880133881133882133883133884133885133886133887133888133889133890133891133892133893133894133895133896133897133898133899133900133901133902133903133904133905133906133907133908133909133910133911133912133913133914133915133916133917133918133919133920133921133922133923133924133925133926133927133928133929133930133931133932133933133934133935133936133937133938133939133940133941133942133943133944133945133946133947133948133949133950133951133952133953133954133955133956133957133958133959133960133961133962133963133964133965133966133967133968133969133970133971133972133973133974133975133976133977133978133979133980133981133982133983133984133985133986133987133988133989133990133991133992133993133994133995133996133997133998133999134000134001134002134003134004134005134006134007134008134009134010134011134012134013134014134015134016134017134018134019134020134021134022134023134024134025134026134027134028134029134030134031134032134033134034134035134036134037134038134039134040134041134042134043134044134045134046134047134048134049134050134051134052134053134054134055134056134057134058134059134060134061134062134063134064134065134066134067134068134069134070134071134072134073134074134075134076134077134078134079134080134081134082134083134084134085134086134087134088134089134090134091134092134093134094134095134096134097134098134099134100134101134102134103134104134105134106134107134108134109134110134111134112134113134114134115134116134117134118134119134120134121134122134123134124134125134126134127134128134129134130134131134132134133134134134135134136134137134138134139134140134141134142134143134144134145134146134147134148134149134150134151134152134153134154134155134156134157134158134159134160134161134162134163134164134165134166134167134168134169134170134171134172134173134174134175134176134177134178134179134180134181134182134183134184134185134186134187134188134189134190134191134192134193134194134195134196134197134198134199134200134201134202134203134204134205134206134207134208134209134210134211134212134213134214134215134216134217134218134219134220134221134222134223134224134225134226134227134228134229134230134231134232134233134234134235134236134237134238134239134240134241134242134243134244134245134246134247134248134249134250134251134252134253134254134255134256134257134258134259134260134261134262134263134264134265134266134267134268134269134270134271134272134273134274134275134276134277134278134279134280134281134282134283134284134285134286134287134288134289134290134291134292134293134294134295134296134297134298134299134300134301134302134303134304134305134306134307134308134309134310134311134312134313134314134315134316134317134318134319134320134321134322134323134324134325134326134327134328134329134330134331134332134333134334134335134336134337134338134339134340134341134342134343134344134345134346134347134348134349134350134351134352134353134354134355134356134357134358134359134360134361134362134363134364134365134366134367134368134369134370134371134372134373134374134375134376134377134378134379134380134381134382134383134384134385134386134387134388134389134390134391134392134393134394134395134396134397134398134399134400134401134402134403134404134405134406134407134408134409134410134411134412134413134414134415134416134417134418134419134420134421134422134423134424134425134426134427134428134429134430134431134432134433134434134435134436134437134438134439134440134441134442134443134444134445134446134447134448134449134450134451134452134453134454134455134456134457134458134459134460134461134462134463134464134465134466134467134468134469134470134471134472134473134474134475134476134477134478134479134480134481134482134483134484134485134486134487134488134489134490134491134492134493134494134495134496134497134498134499134500134501134502134503134504134505134506134507134508134509134510134511134512134513134514134515134516134517134518134519134520134521134522134523134524134525134526134527134528134529134530134531134532134533134534134535134536134537134538134539134540134541134542134543134544134545134546134547134548134549134550134551134552134553134554134555134556134557134558134559134560134561134562134563134564134565134566134567134568134569134570134571134572134573134574134575134576134577134578134579134580134581134582134583134584134585134586134587134588134589134590134591134592134593134594134595134596134597134598134599134600134601134602134603134604134605134606134607134608134609134610134611134612134613134614134615134616134617134618134619134620134621134622134623134624134625134626134627134628134629134630134631134632134633134634134635134636134637134638134639134640134641134642134643134644134645134646134647134648134649134650134651134652134653134654134655134656134657134658134659134660134661134662134663134664134665134666134667134668134669134670134671134672134673134674134675134676134677134678134679134680134681134682134683134684134685134686134687134688134689134690134691134692134693134694134695134696134697134698134699134700134701134702134703134704134705134706134707134708134709134710134711134712134713134714134715134716134717134718134719134720134721134722134723134724134725134726134727134728134729134730134731134732134733134734134735134736134737134738134739134740134741134742134743134744134745134746134747134748134749134750134751134752134753134754134755134756134757134758134759134760134761134762134763134764134765134766134767134768134769134770134771134772134773134774134775134776134777134778134779134780134781134782134783134784134785134786134787134788134789134790134791134792134793134794134795134796134797134798134799134800134801134802134803134804134805134806134807134808134809134810134811134812134813134814134815134816134817134818134819134820134821134822134823134824134825134826134827134828134829134830134831134832134833134834134835134836134837134838134839134840134841134842134843134844134845134846134847134848134849134850134851134852134853134854134855134856134857134858134859134860134861134862134863134864134865134866134867134868134869134870134871134872134873134874134875134876134877134878134879134880134881134882134883134884134885134886134887134888134889134890134891134892134893134894134895134896134897134898134899134900134901134902134903134904134905134906134907134908134909134910134911134912134913134914134915134916134917134918134919134920134921134922134923134924134925134926134927134928134929134930134931134932134933134934134935134936134937134938134939134940134941134942134943134944134945134946134947134948134949134950134951134952134953134954134955134956134957134958134959134960134961134962134963134964134965134966134967134968134969134970134971134972134973134974134975134976134977134978134979134980134981134982134983134984134985134986134987134988134989134990134991134992134993134994134995134996134997134998134999135000135001135002135003135004135005135006135007135008135009135010135011135012135013135014135015135016135017135018135019135020135021135022135023135024135025135026135027135028135029135030135031135032135033135034135035135036135037135038135039135040135041135042135043135044135045135046135047135048135049135050135051135052135053135054135055135056135057135058135059135060135061135062135063135064135065135066135067135068135069135070135071135072135073135074135075135076135077135078135079135080135081135082135083135084135085135086135087135088135089135090135091135092135093135094135095135096135097135098135099135100135101135102135103135104135105135106135107135108135109135110135111135112135113135114135115135116135117135118135119135120135121135122135123135124135125135126135127135128135129135130135131135132135133135134135135135136135137135138135139135140135141135142135143135144135145135146135147135148135149135150135151135152135153135154135155135156135157135158135159135160135161135162135163135164135165135166135167135168135169135170135171135172135173135174135175135176135177135178135179135180135181135182135183135184135185135186135187135188135189135190135191135192135193135194135195135196135197135198135199135200135201135202135203135204135205135206135207135208135209135210135211135212135213135214135215135216135217135218135219135220135221135222135223135224135225135226135227135228135229135230135231135232135233135234135235135236135237135238135239135240135241135242135243135244135245135246135247135248135249135250135251135252135253135254135255135256135257135258135259135260135261135262135263135264135265135266135267135268135269135270135271135272135273135274135275135276135277135278135279135280135281135282135283135284135285135286135287135288135289135290135291135292135293135294135295135296135297135298135299135300135301135302135303135304135305135306135307135308135309135310135311135312135313135314135315135316135317135318135319135320135321135322135323135324135325135326135327135328135329135330135331135332135333135334135335135336135337135338135339135340135341135342135343135344135345135346135347135348135349135350135351135352135353135354135355135356135357135358135359135360135361135362135363135364135365135366135367135368135369135370135371135372135373135374135375135376135377135378135379135380135381135382135383135384135385135386135387135388135389135390135391135392135393135394135395135396135397135398135399135400135401135402135403135404135405135406135407135408135409135410135411135412135413135414135415135416135417135418135419135420135421135422135423135424135425135426135427135428135429135430135431135432135433135434135435135436135437135438135439135440135441135442135443135444135445135446135447135448135449135450135451135452135453135454135455135456135457135458135459135460135461135462135463135464135465135466135467135468135469135470135471135472135473135474135475135476135477135478135479135480135481135482135483135484135485135486135487135488135489135490135491135492135493135494135495135496135497135498135499135500135501135502135503135504135505135506135507135508135509135510135511135512135513135514135515135516135517135518135519135520135521135522135523135524135525135526135527135528135529135530135531135532135533135534135535135536135537135538135539135540135541135542135543135544135545135546135547135548135549135550135551135552135553135554135555135556135557135558135559135560135561135562135563135564135565135566135567135568135569135570135571135572135573135574135575135576135577135578135579135580135581135582135583135584135585135586135587135588135589135590135591135592135593135594135595135596135597135598135599135600135601135602135603135604135605135606135607135608135609135610135611135612135613135614135615135616135617135618135619135620135621135622135623135624135625135626135627135628135629135630135631135632135633135634135635135636135637135638135639135640135641135642135643135644135645135646135647135648135649135650135651135652135653135654135655135656135657135658135659135660135661135662135663135664135665135666135667135668135669135670135671135672135673135674135675135676135677135678135679135680135681135682135683135684135685135686135687135688135689135690135691135692135693135694135695135696135697135698135699135700135701135702135703135704135705135706135707135708135709135710135711135712135713135714135715135716135717135718135719135720135721135722135723135724135725135726135727135728135729135730135731135732135733135734135735135736135737135738135739135740135741135742135743135744135745135746135747135748135749135750135751135752135753135754135755135756135757135758135759135760135761135762135763135764135765135766135767135768135769135770135771135772135773135774135775135776135777135778135779135780135781135782135783135784135785135786135787135788135789135790135791135792135793135794135795135796135797135798135799135800135801135802135803135804135805135806135807135808135809135810135811135812135813135814135815135816135817135818135819135820135821135822135823135824135825135826135827135828135829135830135831135832135833135834135835135836135837135838135839135840135841135842135843135844135845135846135847135848135849135850135851135852135853135854135855135856135857135858135859135860135861135862135863135864135865135866135867135868135869135870135871135872135873135874135875135876135877135878135879135880135881135882135883135884135885135886135887135888135889135890135891135892135893135894135895135896135897135898135899135900135901135902135903135904135905135906135907135908135909135910135911135912135913135914135915135916135917135918135919135920135921135922135923135924135925135926135927135928135929135930135931135932135933135934135935135936135937135938135939135940135941135942135943135944135945135946135947135948135949135950135951135952135953135954135955135956135957135958135959135960135961135962135963135964135965135966135967135968135969135970135971135972135973135974135975135976135977135978135979135980135981135982135983135984135985135986135987135988135989135990135991135992135993135994135995135996135997135998135999136000136001136002136003136004136005136006136007136008136009136010136011136012136013136014136015136016136017136018136019136020136021136022136023136024136025136026136027136028136029136030136031136032136033136034136035136036136037136038136039136040136041136042136043136044136045136046136047136048136049136050136051136052136053136054136055136056136057136058136059136060136061136062136063136064136065136066136067136068136069136070136071136072136073136074136075136076136077136078136079136080136081136082136083136084136085136086136087136088136089136090136091136092136093136094136095136096136097136098136099136100136101136102136103136104136105136106136107136108136109136110136111136112136113136114136115136116136117136118136119136120136121136122136123136124136125136126136127136128136129136130136131136132136133136134136135136136136137136138136139136140136141136142136143136144136145136146136147136148136149136150136151136152136153136154136155136156136157136158136159136160136161136162136163136164136165136166136167136168136169136170136171136172136173136174136175136176136177136178136179136180136181136182136183136184136185136186136187136188136189136190136191136192136193136194136195136196136197136198136199136200136201136202136203136204136205136206136207136208136209136210136211136212136213136214136215136216136217136218136219136220136221136222136223136224136225136226136227136228136229136230136231136232136233136234136235136236136237136238136239136240136241136242136243136244136245136246136247136248136249136250136251136252136253136254136255136256136257136258136259136260136261136262136263136264136265136266136267136268136269136270136271136272136273136274136275136276136277136278136279136280136281136282136283136284136285136286136287136288136289136290136291136292136293136294136295136296136297136298136299136300136301136302136303136304136305136306136307136308136309136310136311136312136313136314136315136316136317136318136319136320136321136322136323136324136325136326136327136328136329136330136331136332136333136334136335136336136337136338136339136340136341136342136343136344136345136346136347136348136349136350136351136352136353136354136355136356136357136358136359136360136361136362136363136364136365136366136367136368136369136370136371136372136373136374136375136376136377136378136379136380136381136382136383136384136385136386136387136388136389136390136391136392136393136394136395136396136397136398136399136400136401136402136403136404136405136406136407136408136409136410136411136412136413136414136415136416136417136418136419136420136421136422136423136424136425136426136427136428136429136430136431136432136433136434136435136436136437136438136439136440136441136442136443136444136445136446136447136448136449136450136451136452136453136454136455136456136457136458136459136460136461136462136463136464136465136466136467136468136469136470136471136472136473136474136475136476136477136478136479136480136481136482136483136484136485136486136487136488136489136490136491136492136493136494136495136496136497136498136499136500136501136502136503136504136505136506136507136508136509136510136511136512136513136514136515136516136517136518136519136520136521136522136523136524136525136526136527136528136529136530136531136532136533136534136535136536136537136538136539136540136541136542136543136544136545136546136547136548136549136550136551136552136553136554136555136556136557136558136559136560136561136562136563136564136565136566136567136568136569136570136571136572136573136574136575136576136577136578136579136580136581136582136583136584136585136586136587136588136589136590136591136592136593136594136595136596136597136598136599136600136601136602136603136604136605136606136607136608136609136610136611136612136613136614136615136616136617136618136619136620136621136622136623136624136625136626136627136628136629136630136631136632136633136634136635136636136637136638136639136640136641136642136643136644136645136646136647136648136649136650136651136652136653136654136655136656136657136658136659136660136661136662136663136664136665136666136667136668136669136670136671136672136673136674136675136676136677136678136679136680136681136682136683136684136685136686136687136688136689136690136691136692136693136694136695136696136697136698136699136700136701136702136703136704136705136706136707136708136709136710136711136712136713136714136715136716136717136718136719136720136721136722136723136724136725136726136727136728136729136730136731136732136733136734136735136736136737136738136739136740136741136742136743136744136745136746136747136748136749136750136751136752136753136754136755136756136757136758136759136760136761136762136763136764136765136766136767136768136769136770136771136772136773136774136775136776136777136778136779136780136781136782136783136784136785136786136787136788136789136790136791136792136793136794136795136796136797136798136799136800136801136802136803136804136805136806136807136808136809136810136811136812136813136814136815136816136817136818136819136820136821136822136823136824136825136826136827136828136829136830136831136832136833136834136835136836136837136838136839136840136841136842136843136844136845136846136847136848136849136850136851136852136853136854136855136856136857136858136859136860136861136862136863136864136865136866136867136868136869136870136871136872136873136874136875136876136877136878136879136880136881136882136883136884136885136886136887136888136889136890136891136892136893136894136895136896136897136898136899136900136901136902136903136904136905136906136907136908136909136910136911136912136913136914136915136916136917136918136919136920136921136922136923136924136925136926136927136928136929136930136931136932136933136934136935136936136937136938136939136940136941136942136943136944136945136946136947136948136949136950136951136952136953136954136955136956136957136958136959136960136961136962136963136964136965136966136967136968136969136970136971136972136973136974136975136976136977136978136979136980136981136982136983136984136985136986136987136988136989136990136991136992136993136994136995136996136997136998136999137000137001137002137003137004137005137006137007137008137009137010137011137012137013137014137015137016137017137018137019137020137021137022137023137024137025137026137027137028137029137030137031137032137033137034137035137036137037137038137039137040137041137042137043137044137045137046137047137048137049137050137051137052137053137054137055137056137057137058137059137060137061137062137063137064137065137066137067137068137069137070137071137072137073137074137075137076137077137078137079137080137081137082137083137084137085137086137087137088137089137090137091137092137093137094137095137096137097137098137099137100137101137102137103137104137105137106137107137108137109137110137111137112137113137114137115137116137117137118137119137120137121137122137123137124137125137126137127137128137129137130137131137132137133137134137135137136137137137138137139137140137141137142137143137144137145137146137147137148137149137150137151137152137153137154137155137156137157137158137159137160137161137162137163137164137165137166137167137168137169137170137171137172137173137174137175137176137177137178137179137180137181137182137183137184137185137186137187137188137189137190137191137192137193137194137195137196137197137198137199137200137201137202137203137204137205137206137207137208137209137210137211137212137213137214137215137216137217137218137219137220137221137222137223137224137225137226137227137228137229137230137231137232137233137234137235137236137237137238137239137240137241137242137243137244137245137246137247137248137249137250137251137252137253137254137255137256137257137258137259137260137261137262137263137264137265137266137267137268137269137270137271137272137273137274137275137276137277137278137279137280137281137282137283137284137285137286137287137288137289137290137291137292137293137294137295137296137297137298137299137300137301137302137303137304137305137306137307137308137309137310137311137312137313137314137315137316137317137318137319137320137321137322137323137324137325137326137327137328137329137330137331137332137333137334137335137336137337137338137339137340137341137342137343137344137345137346137347137348137349137350137351137352137353137354137355137356137357137358137359137360137361137362137363137364137365137366137367137368137369137370137371137372137373137374137375137376137377137378137379137380137381137382137383137384137385137386137387137388137389137390137391137392137393137394137395137396137397137398137399137400137401137402137403137404137405137406137407137408137409137410137411137412137413137414137415137416137417137418137419137420137421137422137423137424137425137426137427137428137429137430137431137432137433137434137435137436137437137438137439137440137441137442137443137444137445137446137447137448137449137450137451137452137453137454137455137456137457137458137459137460137461137462137463137464137465137466137467137468137469137470137471137472137473137474137475137476137477137478137479137480137481137482137483137484137485137486137487137488137489137490137491137492137493137494137495137496137497137498137499137500137501137502137503137504137505137506137507137508137509137510137511137512137513137514137515137516137517137518137519137520137521137522137523137524137525137526137527137528137529137530137531137532137533137534137535137536137537137538137539137540137541137542137543137544137545137546137547137548137549137550137551137552137553137554137555137556137557137558137559137560137561137562137563137564137565137566137567137568137569137570137571137572137573137574137575137576137577137578137579137580137581137582137583137584137585137586137587137588137589137590137591137592137593137594137595137596137597137598137599137600137601137602137603137604137605137606137607137608137609137610137611137612137613137614137615137616137617137618137619137620137621137622137623137624137625137626137627137628137629137630137631137632137633137634137635137636137637137638137639137640137641137642137643137644137645137646137647137648137649137650137651137652137653137654137655137656137657137658137659137660137661137662137663137664137665137666137667137668137669137670137671137672137673137674137675137676137677137678137679137680137681137682137683137684137685137686137687137688137689137690137691137692137693137694137695137696137697137698137699137700137701137702137703137704137705137706137707137708137709137710137711137712137713137714137715137716137717137718137719137720137721137722137723137724137725137726137727137728137729137730137731137732137733137734137735137736137737137738137739137740137741137742137743137744137745137746137747137748137749137750137751137752137753137754137755137756137757137758137759137760137761137762137763137764137765137766137767137768137769137770137771137772137773137774137775137776137777137778137779137780137781137782137783137784137785137786137787137788137789137790137791137792137793137794137795137796137797137798137799137800137801137802137803137804137805137806137807137808137809137810137811137812137813137814137815137816137817137818137819137820137821137822137823137824137825137826137827137828137829137830137831137832137833137834137835137836137837137838137839137840137841137842137843137844137845137846137847137848137849137850137851137852137853137854137855137856137857137858137859137860137861137862137863137864137865137866137867137868137869137870137871137872137873137874137875137876137877137878137879137880137881137882137883137884137885137886137887137888137889137890137891137892137893137894137895137896137897137898137899137900137901137902137903137904137905137906137907137908137909137910137911137912137913137914137915137916137917137918137919137920137921137922137923137924137925137926137927137928137929137930137931137932137933137934137935137936137937137938137939137940137941137942137943137944137945137946137947137948137949137950137951137952137953137954137955137956137957137958137959137960137961137962137963137964137965137966137967137968137969137970137971137972137973137974137975137976137977137978137979137980137981137982137983137984137985137986137987137988137989137990137991137992137993137994137995137996137997137998137999138000138001138002138003138004138005138006138007138008138009138010138011138012138013138014138015138016138017138018138019138020138021138022138023138024138025138026138027138028138029138030138031138032138033138034138035138036138037138038138039138040138041138042138043138044138045138046138047138048138049138050138051138052138053138054138055138056138057138058138059138060138061138062138063138064138065138066138067138068138069138070138071138072138073138074138075138076138077138078138079138080138081138082138083138084138085138086138087138088138089138090138091138092138093138094138095138096138097138098138099138100138101138102138103138104138105138106138107138108138109138110138111138112138113138114138115138116138117138118138119138120138121138122138123138124138125138126138127138128138129138130138131138132138133138134138135138136138137138138138139138140138141138142138143138144138145138146138147138148138149138150138151138152138153138154138155138156138157138158138159138160138161138162138163138164138165138166138167138168138169138170138171138172138173138174138175138176138177138178138179138180138181138182138183138184138185138186138187138188138189138190138191138192138193138194138195138196138197138198138199138200138201138202138203138204138205138206138207138208138209138210138211138212138213138214138215138216138217138218138219138220138221138222138223138224138225138226138227138228138229138230138231138232138233138234138235138236138237138238138239138240138241138242138243138244138245138246138247138248138249138250138251138252138253138254138255138256138257138258138259138260138261138262138263138264138265138266138267138268138269138270138271138272138273138274138275138276138277138278138279138280138281138282138283138284138285138286138287138288138289138290138291138292138293138294138295138296138297138298138299138300138301138302138303138304138305138306138307138308138309138310138311138312138313138314138315138316138317138318138319138320138321138322138323138324138325138326138327138328138329138330138331138332138333138334138335138336138337138338138339138340138341138342138343138344138345138346138347138348138349138350138351138352138353138354138355138356138357138358138359138360138361138362138363138364138365138366138367138368138369138370138371138372138373138374138375138376138377138378138379138380138381138382138383138384138385138386138387138388138389138390138391138392138393138394138395138396138397138398138399138400138401138402138403138404138405138406138407138408138409138410138411138412138413138414138415138416138417138418138419138420138421138422138423138424138425138426138427138428138429138430138431138432138433138434138435138436138437138438138439138440138441138442138443138444138445138446138447138448138449138450138451138452138453138454138455138456138457138458138459138460138461138462138463138464138465138466138467138468138469138470138471138472138473138474138475138476138477138478138479138480138481138482138483138484138485138486138487138488138489138490138491138492138493138494138495138496138497138498138499138500138501138502138503138504138505138506138507138508138509138510138511138512138513138514138515138516138517138518138519138520138521138522138523138524138525138526138527138528138529138530138531138532138533138534138535138536138537138538138539138540138541138542138543138544138545138546138547138548138549138550138551138552138553138554138555138556138557138558138559138560138561138562138563138564138565138566138567138568138569138570138571138572138573138574138575138576138577138578138579138580138581138582138583138584138585138586138587138588138589138590138591138592138593138594138595138596138597138598138599138600138601138602138603138604138605138606138607138608138609138610138611138612138613138614138615138616138617138618138619138620138621138622138623138624138625138626138627138628138629138630138631138632138633138634138635138636138637138638138639138640138641138642138643138644138645138646138647138648138649138650138651138652138653138654138655138656138657138658138659138660138661138662138663138664138665138666138667138668138669138670138671138672138673138674138675138676138677138678138679138680138681138682138683138684138685138686138687138688138689138690138691138692138693138694138695138696138697138698138699138700138701138702138703138704138705138706138707138708138709138710138711138712138713138714138715138716138717138718138719138720138721138722138723138724138725138726138727138728138729138730138731138732138733138734138735138736138737138738138739138740138741138742138743138744138745138746138747138748138749138750138751138752138753138754138755138756138757138758138759138760138761138762138763138764138765138766138767138768138769138770138771138772138773138774138775138776138777138778138779138780138781138782138783138784138785138786138787138788138789138790138791138792138793138794138795138796138797138798138799138800138801138802138803138804138805138806138807138808138809138810138811138812138813138814138815138816138817138818138819138820138821138822138823138824138825138826138827138828138829138830138831138832138833138834138835138836138837138838138839138840138841138842138843138844138845138846138847138848138849138850138851138852138853138854138855138856138857138858138859138860138861138862138863138864138865138866138867138868138869138870138871138872138873138874138875138876138877138878138879138880138881138882138883138884138885138886138887138888138889138890138891138892138893138894138895138896138897138898138899138900138901138902138903138904138905138906138907138908138909138910138911138912138913138914138915138916138917138918138919138920138921138922138923138924138925138926138927138928138929138930138931138932138933138934138935138936138937138938138939138940138941138942138943138944138945138946138947138948138949138950138951138952138953138954138955138956138957138958138959138960138961138962138963138964138965138966138967138968138969138970138971138972138973138974138975138976138977138978138979138980138981138982138983138984138985138986138987138988138989138990138991138992138993138994138995138996138997138998138999139000139001139002139003139004139005139006139007139008139009139010139011139012139013139014139015139016139017139018139019139020139021139022139023139024139025139026139027139028139029139030139031139032139033139034139035139036139037139038139039139040139041139042139043139044139045139046139047139048139049139050139051139052139053139054139055139056139057139058139059139060139061139062139063139064139065139066139067139068139069139070139071139072139073139074139075139076139077139078139079139080139081139082139083139084139085139086139087139088139089139090139091139092139093139094139095139096139097139098139099139100139101139102139103139104139105139106139107139108139109139110139111139112139113139114139115139116139117139118139119139120139121139122139123139124139125139126139127139128139129139130139131139132139133139134139135139136139137139138139139139140139141139142139143139144139145139146139147139148139149139150139151139152139153139154139155139156139157139158139159139160139161139162139163139164139165139166139167139168139169139170139171139172139173139174139175139176139177139178139179139180139181139182139183139184139185139186139187139188139189139190139191139192139193139194139195139196139197139198139199139200139201139202139203139204139205139206139207139208139209139210139211139212139213139214139215139216139217139218139219139220139221139222139223139224139225139226139227139228139229139230139231139232139233139234139235139236139237139238139239139240139241139242139243139244139245139246139247139248139249139250139251139252139253139254139255139256139257139258139259139260139261139262139263139264139265139266139267139268139269139270139271139272139273139274139275139276139277139278139279139280139281139282139283139284139285139286139287139288139289139290139291139292139293139294139295139296139297139298139299139300139301139302139303139304139305139306139307139308139309139310139311139312139313139314139315139316139317139318139319139320139321139322139323139324139325139326139327139328139329139330139331139332139333139334139335139336139337139338139339139340139341139342139343139344139345139346139347139348139349139350139351139352139353139354139355139356139357139358139359139360139361139362139363139364139365139366139367139368139369139370139371139372139373139374139375139376139377139378139379139380139381139382139383139384139385139386139387139388139389139390139391139392139393139394139395139396139397139398139399139400139401139402139403139404139405139406139407139408139409139410139411139412139413139414139415139416139417139418139419139420139421139422139423139424139425139426139427139428139429139430139431139432139433139434139435139436139437139438139439139440139441139442139443139444139445139446139447139448139449139450139451139452139453139454139455139456139457139458139459139460139461139462139463139464139465139466139467139468139469139470139471139472139473139474139475139476139477139478139479139480139481139482139483139484139485139486139487139488139489139490139491139492139493139494139495139496139497139498139499139500139501139502139503139504139505139506139507139508139509139510139511139512139513139514139515139516139517139518139519139520139521139522139523139524139525139526139527139528139529139530139531139532139533139534139535139536139537139538139539139540139541139542139543139544139545139546139547139548139549139550139551139552139553139554139555139556139557139558139559139560139561139562139563139564139565139566139567139568139569139570139571139572139573139574139575139576139577139578139579139580139581139582139583139584139585139586139587139588139589139590139591139592139593139594139595139596139597139598139599139600139601139602139603139604139605139606139607139608139609139610139611139612139613139614139615139616139617139618139619139620139621139622139623139624139625139626139627139628139629139630139631139632139633139634139635139636139637139638139639139640139641139642139643139644139645139646139647139648139649139650139651139652139653139654139655139656139657139658139659139660139661139662139663139664139665139666139667139668139669139670139671139672139673139674139675139676139677139678139679139680139681139682139683139684139685139686139687139688139689139690139691139692139693139694139695139696139697139698139699139700139701139702139703139704139705139706139707139708139709139710139711139712139713139714139715139716139717139718139719139720139721139722139723139724139725139726139727139728139729139730139731139732139733139734139735139736139737139738139739139740139741139742139743139744139745139746139747139748139749139750139751139752139753139754139755139756139757139758139759139760139761139762139763139764139765139766139767139768139769139770139771139772139773139774139775139776139777139778139779139780139781139782139783139784139785139786139787139788139789139790139791139792139793139794139795139796139797139798139799139800139801139802139803139804139805139806139807139808139809139810139811139812139813139814139815139816139817139818139819139820139821139822139823139824139825139826139827139828139829139830139831139832139833139834139835139836139837139838139839139840139841139842139843139844139845139846139847139848139849139850139851139852139853139854139855139856139857139858139859139860139861139862139863139864139865139866139867139868139869139870139871139872139873139874139875139876139877139878139879139880139881139882139883139884139885139886139887139888139889139890139891139892139893139894139895139896139897139898139899139900139901139902139903139904139905139906139907139908139909139910139911139912139913139914139915139916139917139918139919139920139921139922139923139924139925139926139927139928139929139930139931139932139933139934139935139936139937139938139939139940139941139942139943139944139945139946139947139948139949139950139951139952139953139954139955139956139957139958139959139960139961139962139963139964139965139966139967139968139969139970139971139972139973139974139975139976139977139978139979139980139981139982139983139984139985139986139987139988139989139990139991139992139993139994139995139996139997139998139999140000140001140002140003140004140005140006140007140008140009140010140011140012140013140014140015140016140017140018140019140020140021140022140023140024140025140026140027140028140029140030140031140032140033140034140035140036140037140038140039140040140041140042140043140044140045140046140047140048140049140050140051140052140053140054140055140056140057140058140059140060140061140062140063140064140065140066140067140068140069140070140071140072140073140074140075140076140077140078140079140080140081140082140083140084140085140086140087140088140089140090140091140092140093140094140095140096140097140098140099140100140101140102140103140104140105140106140107140108140109140110140111140112140113140114140115140116140117140118140119140120140121140122140123140124140125140126140127140128140129140130140131140132140133140134140135140136140137140138140139140140140141140142140143140144140145140146140147140148140149140150140151140152140153140154140155140156140157140158140159140160140161140162140163140164140165140166140167140168140169140170140171140172140173140174140175140176140177140178140179140180140181140182140183140184140185140186140187140188140189140190140191140192140193140194140195140196140197140198140199140200140201140202140203140204140205140206140207140208140209140210140211140212140213140214140215140216140217140218140219140220140221140222140223140224140225140226140227140228140229140230140231140232140233140234140235140236140237140238140239140240140241140242140243140244140245140246140247140248140249140250140251140252140253140254140255140256140257140258140259140260140261140262140263140264140265140266140267140268140269140270140271140272140273140274140275140276140277140278140279140280140281140282140283140284140285140286140287140288140289140290140291140292140293140294140295140296140297140298140299140300140301140302140303140304140305140306140307140308140309140310140311140312140313140314140315140316140317140318140319140320140321140322140323140324140325140326140327140328140329140330140331140332140333140334140335140336140337140338140339140340140341140342140343140344140345140346140347140348140349140350140351140352140353140354140355140356140357140358140359140360140361140362140363140364140365140366140367140368140369140370140371140372140373140374140375140376140377140378140379140380140381140382140383140384140385140386140387140388140389140390140391140392140393140394140395140396140397140398140399140400140401140402140403140404140405140406140407140408140409140410140411140412140413140414140415140416140417140418140419140420140421140422140423140424140425140426140427140428140429140430140431140432140433140434140435140436140437140438140439140440140441140442140443140444140445140446140447140448140449140450140451140452140453140454140455140456140457140458140459140460140461140462140463140464140465140466140467140468140469140470140471140472140473140474140475140476140477140478140479140480140481140482140483140484140485140486140487140488140489140490140491140492140493140494140495140496140497140498140499140500140501140502140503140504140505140506140507140508140509140510140511140512140513140514140515140516140517140518140519140520140521140522140523140524140525140526140527140528140529140530140531140532140533140534140535140536140537140538140539140540140541140542140543140544140545140546140547140548140549140550140551140552140553140554140555140556140557140558140559140560140561140562140563140564140565140566140567140568140569140570140571140572140573140574140575140576140577140578140579140580140581140582140583140584140585140586140587140588140589140590140591140592140593140594140595140596140597140598140599140600140601140602140603140604140605140606140607140608140609140610140611140612140613140614140615140616140617140618140619140620140621140622140623140624140625140626140627140628140629140630140631140632140633140634140635140636140637140638140639140640140641140642140643140644140645140646140647140648140649140650140651140652140653140654140655140656140657140658140659140660140661140662140663140664140665140666140667140668140669140670140671140672140673140674140675140676140677140678140679140680140681140682140683140684140685140686140687140688140689140690140691140692140693140694140695140696140697140698140699140700140701140702140703140704140705140706140707140708140709140710140711140712140713140714140715140716140717140718140719140720140721140722140723140724140725140726140727140728140729140730140731140732140733140734140735140736140737140738140739140740140741140742140743140744140745140746140747140748140749140750140751140752140753140754140755140756140757140758140759140760140761140762140763140764140765140766140767140768140769140770140771140772140773140774140775140776140777140778140779140780140781140782140783140784140785140786140787140788140789140790140791140792140793140794140795140796140797140798140799140800140801140802140803140804140805140806140807140808140809140810140811140812140813140814140815140816140817140818140819140820140821140822140823140824140825140826140827140828140829140830140831140832140833140834140835140836140837140838140839140840140841140842140843140844140845140846140847140848140849140850140851140852140853140854140855140856140857140858140859140860140861140862140863140864140865140866140867140868140869140870140871140872140873140874140875140876140877140878140879140880140881140882140883140884140885140886140887140888140889140890140891140892140893140894140895140896140897140898140899140900140901140902140903140904140905140906140907140908140909140910140911140912140913140914140915140916140917140918140919140920140921140922140923140924140925140926140927140928140929140930140931140932140933140934140935140936140937140938140939140940140941140942140943140944140945140946140947140948140949140950140951140952140953140954140955140956140957140958140959140960140961140962140963140964140965140966140967140968140969140970140971140972140973140974140975140976140977140978140979140980140981140982140983140984140985140986140987140988140989140990140991140992140993140994140995140996140997140998140999141000141001141002141003141004141005141006141007141008141009141010141011141012141013141014141015141016141017141018141019141020141021141022141023141024141025141026141027141028141029141030141031141032141033141034141035141036141037141038141039141040141041141042141043141044141045141046141047141048141049141050141051141052141053141054141055141056141057141058141059141060141061141062141063141064141065141066141067141068141069141070141071141072141073141074141075141076141077141078141079141080141081141082141083141084141085141086141087141088141089141090141091141092141093141094141095141096141097141098141099141100141101141102141103141104141105141106141107141108141109141110141111141112141113141114141115141116141117141118141119141120141121141122141123141124141125141126141127141128141129141130141131141132141133141134141135141136141137141138141139141140141141141142141143141144141145141146141147141148141149141150141151141152141153141154141155141156141157141158141159141160141161141162141163141164141165141166141167141168141169141170141171141172141173141174141175141176141177141178141179141180141181141182141183141184141185141186141187141188141189141190141191141192141193141194141195141196141197141198141199141200141201141202141203141204141205141206141207141208141209141210141211141212141213141214141215141216141217141218141219141220141221141222141223141224141225141226141227141228141229141230141231141232141233141234141235141236141237141238141239141240141241141242141243141244141245141246141247141248141249141250141251141252141253141254141255141256141257141258141259141260141261141262141263141264141265141266141267141268141269141270141271141272141273141274141275141276141277141278141279141280141281141282141283141284141285141286141287141288141289141290141291141292141293141294141295141296141297141298141299141300141301141302141303141304141305141306141307141308141309141310141311141312141313141314141315141316141317141318141319141320141321141322141323141324141325141326141327141328141329141330141331141332141333141334141335141336141337141338141339141340141341141342141343141344141345141346141347141348141349141350141351141352141353141354141355141356141357141358141359141360141361141362141363141364141365141366141367141368141369141370141371141372141373141374141375141376141377141378141379141380141381141382141383141384141385141386141387141388141389141390141391141392141393141394141395141396141397141398141399141400141401141402141403141404141405141406141407141408141409141410141411141412141413141414141415141416141417141418141419141420141421141422141423141424141425141426141427141428141429141430141431141432141433141434141435141436141437141438141439141440141441141442141443141444141445141446141447141448141449141450141451141452141453141454141455141456141457141458141459141460141461141462141463141464141465141466141467141468141469141470141471141472141473141474141475141476141477141478141479141480141481141482141483141484141485141486141487141488141489141490141491141492141493141494141495141496141497141498141499141500141501141502141503141504141505141506141507141508141509141510141511141512141513141514141515141516141517141518141519141520141521141522141523141524141525141526141527141528141529141530141531141532141533141534141535141536141537141538141539141540141541141542141543141544141545141546141547141548141549141550141551141552141553141554141555141556141557141558141559141560141561141562141563141564141565141566141567141568141569141570141571141572141573141574141575141576141577141578141579141580141581141582141583141584141585141586141587141588141589141590141591141592141593141594141595141596141597141598141599141600141601141602141603141604141605141606141607141608141609141610141611141612141613141614141615141616141617141618141619141620141621141622141623141624141625141626141627141628141629141630141631141632141633141634141635141636141637141638141639141640141641141642141643141644141645141646141647141648141649141650141651141652141653141654141655141656141657141658141659141660141661141662141663141664141665141666141667141668141669141670141671141672141673141674141675141676141677141678141679141680141681141682141683141684141685141686141687141688141689141690141691141692141693141694141695141696141697141698141699141700141701141702141703141704141705141706141707141708141709141710141711141712141713141714141715141716141717141718141719141720141721141722141723141724141725141726141727141728141729141730141731141732141733141734141735141736141737141738141739141740141741141742141743141744141745141746141747141748141749141750141751141752141753141754141755141756141757141758141759141760141761141762141763141764141765141766141767141768141769141770141771141772141773141774141775141776141777141778141779141780141781141782141783141784141785141786141787141788141789141790141791141792141793141794141795141796141797141798141799141800141801141802141803141804141805141806141807141808141809141810141811141812141813141814141815141816141817141818141819141820141821141822141823141824141825141826141827141828141829141830141831141832141833141834141835141836141837141838141839141840141841141842141843141844141845141846141847141848141849141850141851141852141853141854141855141856141857141858141859141860141861141862141863141864141865141866141867141868141869141870141871141872141873141874141875141876141877141878141879141880141881141882141883141884141885141886141887141888141889141890141891141892141893141894141895141896141897141898141899141900141901141902141903141904141905141906141907141908141909141910141911141912141913141914141915141916141917141918141919141920141921141922141923141924141925141926141927141928141929141930141931141932141933141934141935141936141937141938141939141940141941141942141943141944141945141946141947141948141949141950141951141952141953141954141955141956141957141958141959141960141961141962141963141964141965141966141967141968141969141970141971141972141973141974141975141976141977141978141979141980141981141982141983141984141985141986141987141988141989141990141991141992141993141994141995141996141997141998141999142000142001142002142003142004142005142006142007142008142009142010142011142012142013142014142015142016142017142018142019142020142021142022142023142024142025142026142027142028142029142030142031142032142033142034142035142036142037142038142039142040142041142042142043142044142045142046142047142048142049142050142051142052142053142054142055142056142057142058142059142060142061142062142063142064142065142066142067142068142069142070142071142072142073142074142075142076142077142078142079142080142081142082142083142084142085142086142087142088142089142090142091142092142093142094142095142096142097142098142099142100142101142102142103142104142105142106142107142108142109142110142111142112142113142114142115142116142117142118142119142120142121142122142123142124142125142126142127142128142129142130142131142132142133142134142135142136142137142138142139142140142141142142142143142144142145142146142147142148142149142150142151142152142153142154142155142156142157142158142159142160142161142162142163142164142165142166142167142168142169142170142171142172142173142174142175142176142177142178142179142180142181142182142183142184142185142186142187142188142189142190142191142192142193142194142195142196142197142198142199142200142201142202142203142204142205142206142207142208142209142210142211142212142213142214142215142216142217142218142219142220142221142222142223142224142225142226142227142228142229142230142231142232142233142234142235142236142237142238142239142240142241142242142243142244142245142246142247142248142249142250142251142252142253142254142255142256142257142258142259142260142261142262142263142264142265142266142267142268142269142270142271142272142273142274142275142276142277142278142279142280142281142282142283142284142285142286142287142288142289142290142291142292142293142294142295142296142297142298142299142300142301142302142303142304142305142306142307142308142309142310142311142312142313142314142315142316142317142318142319142320142321142322142323142324142325142326142327142328142329142330142331142332142333142334142335142336142337142338142339142340142341142342142343142344142345142346142347142348142349142350142351142352142353142354142355142356142357142358142359142360142361142362142363142364142365142366142367142368142369142370142371142372142373142374142375142376142377142378142379142380142381142382142383142384142385142386142387142388142389142390142391142392142393142394142395142396142397142398142399142400142401142402142403142404142405142406142407142408142409142410142411142412142413142414142415142416142417142418142419142420142421142422142423142424142425142426142427142428142429142430142431142432142433142434142435142436142437142438142439142440142441142442142443142444142445142446142447142448142449142450142451142452142453142454142455142456142457142458142459142460142461142462142463142464142465142466142467142468142469142470142471142472142473142474142475142476142477142478142479142480142481142482142483142484142485142486142487142488142489142490142491142492142493142494142495142496142497142498142499142500142501142502142503142504142505142506142507142508142509142510142511142512142513142514142515142516142517142518142519142520142521142522142523142524142525142526142527142528142529142530142531142532142533142534142535142536142537142538142539142540142541142542142543142544142545142546142547142548142549142550142551142552142553142554142555142556142557142558142559142560142561142562142563142564142565142566142567142568142569142570142571142572142573142574142575142576142577142578142579142580142581142582142583142584142585142586142587142588142589142590142591142592142593142594142595142596142597142598142599142600142601142602142603142604142605142606142607142608142609142610142611142612142613142614142615142616142617142618142619142620142621142622142623142624142625142626142627142628142629142630142631142632142633142634142635142636142637142638142639142640142641142642142643142644142645142646142647142648142649142650142651142652142653142654142655142656142657142658142659142660142661142662142663142664142665142666142667142668142669142670142671142672142673142674142675142676142677142678142679142680142681142682142683142684142685142686142687142688142689142690142691142692142693142694142695142696142697142698142699142700142701142702142703142704142705142706142707142708142709142710142711142712142713142714142715142716142717142718142719142720142721142722142723142724142725142726142727142728142729142730142731142732142733142734142735142736142737142738142739142740142741142742142743142744142745142746142747142748142749142750142751142752142753142754142755142756142757142758142759142760142761142762142763142764142765142766142767142768142769142770142771142772142773142774142775142776142777142778142779142780142781142782142783142784142785142786142787142788142789142790142791142792142793142794142795142796142797142798142799142800142801142802142803142804142805142806142807142808142809142810142811142812142813142814142815142816142817142818142819142820142821142822142823142824142825142826142827142828142829142830142831142832142833142834142835142836142837142838142839142840142841142842142843142844142845142846142847142848142849142850142851142852142853142854142855142856142857142858142859142860142861142862142863142864142865142866142867142868142869142870142871142872142873142874142875142876142877142878142879142880142881142882142883142884142885142886142887142888142889142890142891142892142893142894142895142896142897142898142899142900142901142902142903142904142905142906142907142908142909142910142911142912142913142914142915142916142917142918142919142920142921142922142923142924142925142926142927142928142929142930142931142932142933142934142935142936142937142938142939142940142941142942142943142944142945142946142947142948142949142950142951142952142953142954142955142956142957142958142959142960142961142962142963142964142965142966142967142968142969142970142971142972142973142974142975142976142977142978142979142980142981142982142983142984142985142986142987142988142989142990142991142992142993142994142995142996142997142998142999143000143001143002143003143004143005143006143007143008143009143010143011143012143013143014143015143016143017143018143019143020143021143022143023143024143025143026143027143028143029143030143031143032143033143034143035143036143037143038143039143040143041143042143043143044143045143046143047143048143049143050143051143052143053143054143055143056143057143058143059143060143061143062143063143064143065143066143067143068143069143070143071143072143073143074143075143076143077143078143079143080143081143082143083143084143085143086143087143088143089143090143091143092143093143094143095143096143097143098143099143100143101143102143103143104143105143106143107143108143109143110143111143112143113143114143115143116143117143118143119143120143121143122143123143124143125143126143127143128143129143130143131143132143133143134143135143136143137143138143139143140143141143142143143143144143145143146143147143148143149143150143151143152143153143154143155143156143157143158143159143160143161143162143163143164143165143166143167143168143169143170143171143172143173143174143175143176143177143178143179143180143181143182143183143184143185143186143187143188143189143190143191143192143193143194143195143196143197143198143199143200143201143202143203143204143205143206143207143208143209143210143211143212143213143214143215143216143217143218143219143220143221143222143223143224143225143226143227143228143229143230143231143232143233143234143235143236143237143238143239143240143241143242143243143244143245143246143247143248143249143250143251143252143253143254143255143256143257143258143259143260143261143262143263143264143265143266143267143268143269143270143271143272143273143274143275143276143277143278143279143280143281143282143283143284143285143286143287143288143289143290143291143292143293143294143295143296143297143298143299143300143301143302143303143304143305143306143307143308143309143310143311143312143313143314143315143316143317143318143319143320143321143322143323143324143325143326143327143328143329143330143331143332143333143334143335143336143337143338143339143340143341143342143343143344143345143346143347143348143349143350143351143352143353143354143355143356143357143358143359143360143361143362143363143364143365143366143367143368143369143370143371143372143373143374143375143376143377143378143379143380143381143382143383143384143385143386143387143388143389143390143391143392143393143394143395143396143397143398143399143400143401143402143403143404143405143406143407143408143409143410143411143412143413143414143415143416143417143418143419143420143421143422143423143424143425143426143427143428143429143430143431143432143433143434143435143436143437143438143439143440143441143442143443143444143445143446143447143448143449143450143451143452143453143454143455143456143457143458143459143460143461143462143463143464143465143466143467143468143469143470143471143472143473143474143475143476143477143478143479143480143481143482143483143484143485143486143487143488143489143490143491143492143493143494143495143496143497143498143499143500143501143502143503143504143505143506143507143508143509143510143511143512143513143514143515143516143517143518143519143520143521143522143523143524143525143526143527143528143529143530143531143532143533143534143535143536143537143538143539143540143541143542143543143544143545143546143547143548143549143550143551143552143553143554143555143556143557143558143559143560143561143562143563143564143565143566143567143568143569143570143571143572143573143574143575143576143577143578143579143580143581143582143583143584143585143586143587143588143589143590143591143592143593143594143595143596143597143598143599143600143601143602143603143604143605143606143607143608143609143610143611143612143613143614143615143616143617143618143619143620143621143622143623143624143625143626143627143628143629143630143631143632143633143634143635143636143637143638143639143640143641143642143643143644143645143646143647143648143649143650143651143652143653143654143655143656143657143658143659143660143661143662143663143664143665143666143667143668143669143670143671143672143673143674143675143676143677143678143679143680143681143682143683143684143685143686143687143688143689143690143691143692143693143694143695143696143697143698143699143700143701143702143703143704143705143706143707143708143709143710143711143712143713143714143715143716143717143718143719143720143721143722143723143724143725143726143727143728143729143730143731143732143733143734143735143736143737143738143739143740143741143742143743143744143745143746143747143748143749143750143751143752143753143754143755143756143757143758143759143760143761143762143763143764143765143766143767143768143769143770143771143772143773143774143775143776143777143778143779143780143781143782143783143784143785143786143787143788143789143790143791143792143793143794143795143796143797143798143799143800143801143802143803143804143805143806143807143808143809143810143811143812143813143814143815143816143817143818143819143820143821143822143823143824143825143826143827143828143829143830143831143832143833143834143835143836143837143838143839143840143841143842143843143844143845143846143847143848143849143850143851143852143853143854143855143856143857143858143859143860143861143862143863143864143865143866143867143868143869143870143871143872143873143874143875143876143877143878143879143880143881143882143883143884143885143886143887143888143889143890143891143892143893143894143895143896143897143898143899143900143901143902143903143904143905143906143907143908143909143910143911143912143913143914143915143916143917143918143919143920143921143922143923143924143925143926143927143928143929143930143931143932143933143934143935143936143937143938143939143940143941143942143943143944143945143946143947143948143949143950143951143952143953143954143955143956143957143958143959143960143961143962143963143964143965143966143967143968143969143970143971143972143973143974143975143976143977143978143979143980143981143982143983143984143985143986143987143988143989143990143991143992143993143994143995143996143997143998143999144000144001144002144003144004144005144006144007144008144009144010144011144012144013144014144015144016144017144018144019144020144021144022144023144024144025144026144027144028144029144030144031144032144033144034144035144036144037144038144039144040144041144042144043144044144045144046144047144048144049144050144051144052144053144054144055144056144057144058144059144060144061144062144063144064144065144066144067144068144069144070144071144072144073144074144075144076144077144078144079144080144081144082144083144084144085144086144087144088144089144090144091144092144093144094144095144096144097144098144099144100144101144102144103144104144105144106144107144108144109144110144111144112144113144114144115144116144117144118144119144120144121144122144123144124144125144126144127144128144129144130144131144132144133144134144135144136144137144138144139144140144141144142144143144144144145144146144147144148144149144150144151144152144153144154144155144156144157144158144159144160144161144162144163144164144165144166144167144168144169144170144171144172144173144174144175144176144177144178144179144180144181144182144183144184144185144186144187144188144189144190144191144192144193144194144195144196144197144198144199144200144201144202144203144204144205144206144207144208144209144210144211144212144213144214144215144216144217144218144219144220144221144222144223144224144225144226144227144228144229144230144231144232144233144234144235144236144237144238144239144240144241144242144243144244144245144246144247144248144249144250144251144252144253144254144255144256144257144258144259144260144261144262144263144264144265144266144267144268144269144270144271144272144273144274144275144276144277144278144279144280144281144282144283144284144285144286144287144288144289144290144291144292144293144294144295144296144297144298144299144300144301144302144303144304144305144306144307144308144309144310144311144312144313144314144315144316144317144318144319144320144321144322144323144324144325144326144327144328144329144330144331144332144333144334144335144336144337144338144339144340144341144342144343144344144345144346144347144348144349144350144351144352144353144354144355144356144357144358144359144360144361144362144363144364144365144366144367144368144369144370144371144372144373144374144375144376144377144378144379144380144381144382144383144384144385144386144387144388144389144390144391144392144393144394144395144396144397144398144399144400144401144402144403144404144405144406144407144408144409144410144411144412144413144414144415144416144417144418144419144420144421144422144423144424144425144426144427144428144429144430144431144432144433144434144435144436144437144438144439144440144441144442144443144444144445144446144447144448144449144450144451144452144453144454144455144456144457144458144459144460144461144462144463144464144465144466144467144468144469144470144471144472144473144474144475144476144477144478144479144480144481144482144483144484144485144486144487144488144489144490144491144492144493144494144495144496144497144498144499144500144501144502144503144504144505144506144507144508144509144510144511144512144513144514144515144516144517144518144519144520144521144522144523144524144525144526144527144528144529144530144531144532144533144534144535144536144537144538144539144540144541144542144543144544144545144546144547144548144549144550144551144552144553144554144555144556144557144558144559144560144561144562144563144564144565144566144567144568144569144570144571144572144573144574144575144576144577144578144579144580144581144582144583144584144585144586144587144588144589144590144591144592144593144594144595144596144597144598144599144600144601144602144603144604144605144606144607144608144609144610144611144612144613144614144615144616144617144618144619144620144621144622144623144624144625144626144627144628144629144630144631144632144633144634144635144636144637144638144639144640144641144642144643144644144645144646144647144648144649144650144651144652144653144654144655144656144657144658144659144660144661144662144663144664144665144666144667144668144669144670144671144672144673144674144675144676144677144678144679144680144681144682144683144684144685144686144687144688144689144690144691144692144693144694144695144696144697144698144699144700144701144702144703144704144705144706144707144708144709144710144711144712144713144714144715144716144717144718144719144720144721144722144723144724144725144726144727144728144729144730144731144732144733144734144735144736144737144738144739144740144741144742144743144744144745144746144747144748144749144750144751144752144753144754144755144756144757144758144759144760144761144762144763144764144765144766144767144768144769144770144771144772144773144774144775144776144777144778144779144780144781144782144783144784144785144786144787144788144789144790144791144792144793144794144795144796144797144798144799144800144801144802144803144804144805144806144807144808144809144810144811144812144813144814144815144816144817144818144819144820144821144822144823144824144825144826144827144828144829144830144831144832144833144834144835144836144837144838144839144840144841144842144843144844144845144846144847144848144849144850144851144852144853144854144855144856144857144858144859144860144861144862144863144864144865144866144867144868144869144870144871144872144873144874144875144876144877144878144879144880144881144882144883144884144885144886144887144888144889144890144891144892144893144894144895144896144897144898144899144900144901144902144903144904144905144906144907144908144909144910144911144912144913144914144915144916144917144918144919144920144921144922144923144924144925144926144927144928144929144930144931144932144933144934144935144936144937144938144939144940144941144942144943144944144945144946144947144948144949144950144951144952144953144954144955144956144957144958144959144960144961144962144963144964144965144966144967144968144969144970144971144972144973144974144975144976144977144978144979144980144981144982144983144984144985144986144987144988144989144990144991144992144993144994144995144996144997144998144999145000145001145002145003145004145005145006145007145008145009145010145011145012145013145014145015145016145017145018145019145020145021145022145023145024145025145026145027145028145029145030145031145032145033145034145035145036145037145038145039145040145041145042145043145044145045145046145047145048145049145050145051145052145053145054145055145056145057145058145059145060145061145062145063145064145065145066145067145068145069145070145071145072145073145074145075145076145077145078145079145080145081145082145083145084145085145086145087145088145089145090145091145092145093145094145095145096145097145098145099145100145101145102145103145104145105145106145107145108145109145110145111145112145113145114145115145116145117145118145119145120145121145122145123145124145125145126145127145128145129145130145131145132145133145134145135145136145137145138145139145140145141145142145143145144145145145146145147145148145149145150145151145152145153145154145155145156145157145158145159145160145161145162145163145164145165145166145167145168145169145170145171145172145173145174145175145176145177145178145179145180145181145182145183145184145185145186145187145188145189145190145191145192145193145194145195145196145197145198145199145200145201145202145203145204145205145206145207145208145209145210145211145212145213145214145215145216145217145218145219145220145221145222145223145224145225145226145227145228145229145230145231145232145233145234145235145236145237145238145239145240145241145242145243145244145245145246145247145248145249145250145251145252145253145254145255145256145257145258145259145260145261145262145263145264145265145266145267145268145269145270145271145272145273145274145275145276145277145278145279145280145281145282145283145284145285145286145287145288145289145290145291145292145293145294145295145296145297145298145299145300145301145302145303145304145305145306145307145308145309145310145311145312145313145314145315145316145317145318145319145320145321145322145323145324145325145326145327145328145329145330145331145332145333145334145335145336145337145338145339145340145341145342145343145344145345145346145347145348145349145350145351145352145353145354145355145356145357145358145359145360145361145362145363145364145365145366145367145368145369145370145371145372145373145374145375145376145377145378145379145380145381145382145383145384145385145386145387145388145389145390145391145392145393145394145395145396145397145398145399145400145401145402145403145404145405145406145407145408145409145410145411145412145413145414145415145416145417145418145419145420145421145422145423145424145425145426145427145428145429145430145431145432145433145434145435145436145437145438145439145440145441145442145443145444145445145446145447145448145449145450145451145452145453145454145455145456145457145458145459145460145461145462145463145464145465145466145467145468145469145470145471145472145473145474145475145476145477145478145479145480145481145482145483145484145485145486145487145488145489145490145491145492145493145494145495145496145497145498145499145500145501145502145503145504145505145506145507145508145509145510145511145512145513145514145515145516145517145518145519145520145521145522145523145524145525145526145527145528145529145530145531145532145533145534145535145536145537145538145539145540145541145542145543145544145545145546145547145548145549145550145551145552145553145554145555145556145557145558145559145560145561145562145563145564145565145566145567145568145569145570145571145572145573145574145575145576145577145578145579145580145581145582145583145584145585145586145587145588145589145590145591145592145593145594145595145596145597145598145599145600145601145602145603145604145605145606145607145608145609145610145611145612145613145614145615145616145617145618145619145620145621145622145623145624145625145626145627145628145629145630145631145632145633145634145635145636145637145638145639145640145641145642145643145644145645145646145647145648145649145650145651145652145653145654145655145656145657145658145659145660145661145662145663145664145665145666145667145668145669145670145671145672145673145674145675145676145677145678145679145680145681145682145683145684145685145686145687145688145689145690145691145692145693145694145695145696145697145698145699145700145701145702145703145704145705145706145707145708145709145710145711145712145713145714145715145716145717145718145719145720145721145722145723145724145725145726145727145728145729145730145731145732145733145734145735145736145737145738145739145740145741145742145743145744145745145746145747145748145749145750145751145752145753145754145755145756145757145758145759145760145761145762145763145764145765145766145767145768145769145770145771145772145773145774145775145776145777145778145779145780145781145782145783145784145785145786145787145788145789145790145791145792145793145794145795145796145797145798145799145800145801145802145803145804145805145806145807145808145809145810145811145812145813145814145815145816145817145818145819145820145821145822145823145824145825145826145827145828145829145830145831145832145833145834145835145836145837145838145839145840145841145842145843145844145845145846145847145848145849145850145851145852145853145854145855145856145857145858145859145860145861145862145863145864145865145866145867145868145869145870145871145872145873145874145875145876145877145878145879145880145881145882145883145884145885145886145887145888145889145890145891145892145893145894145895145896145897145898145899145900145901145902145903145904145905145906145907145908145909145910145911145912145913145914145915145916145917145918145919145920145921145922145923145924145925145926145927145928145929145930145931145932145933145934145935145936145937145938145939145940145941145942145943145944145945145946145947145948145949145950145951145952145953145954145955145956145957145958145959145960145961145962145963145964145965145966145967145968145969145970145971145972145973145974145975145976145977145978145979145980145981145982145983145984145985145986145987145988145989145990145991145992145993145994145995145996145997145998145999146000146001146002146003146004146005146006146007146008146009146010146011146012146013146014146015146016146017146018146019146020146021146022146023146024146025146026146027146028146029146030146031146032146033146034146035146036146037146038146039146040146041146042146043146044146045146046146047146048146049146050146051146052146053146054146055146056146057146058146059146060146061146062146063146064146065146066146067146068146069146070146071146072146073146074146075146076146077146078146079146080146081146082146083146084146085146086146087146088146089146090146091146092146093146094146095146096146097146098146099146100146101146102146103146104146105146106146107146108146109146110146111146112146113146114146115146116146117146118146119146120146121146122146123146124146125146126146127146128146129146130146131146132146133146134146135146136146137146138146139146140146141146142146143146144146145146146146147146148146149146150146151146152146153146154146155146156146157146158146159146160146161146162146163146164146165146166146167146168146169146170146171146172146173146174146175146176146177146178146179146180146181146182146183146184146185146186146187146188146189146190146191146192146193146194146195146196146197146198146199146200146201146202146203146204146205146206146207146208146209146210146211146212146213146214146215146216146217146218146219146220146221146222146223146224146225146226146227146228146229146230146231146232146233146234146235146236146237146238146239146240146241146242146243146244146245146246146247146248146249146250146251146252146253146254146255146256146257146258146259146260146261146262146263146264146265146266146267146268146269146270146271146272146273146274146275146276146277146278146279146280146281146282146283146284146285146286146287146288146289146290146291146292146293146294146295146296146297146298146299146300146301146302146303146304146305146306146307146308146309146310146311146312146313146314146315146316146317146318146319146320146321146322146323146324146325146326146327146328146329146330146331146332146333146334146335146336146337146338146339146340146341146342146343146344146345146346146347146348146349146350146351146352146353146354146355146356146357146358146359146360146361146362146363146364146365146366146367146368146369146370146371146372146373146374146375146376146377146378146379146380146381146382146383146384146385146386146387146388146389146390146391146392146393146394146395146396146397146398146399146400146401146402146403146404146405146406146407146408146409146410146411146412146413146414146415146416146417146418146419146420146421146422146423146424146425146426146427146428146429146430146431146432146433146434146435146436146437146438146439146440146441146442146443146444146445146446146447146448146449146450146451146452146453146454146455146456146457146458146459146460146461146462146463146464146465146466146467146468146469146470146471146472146473146474146475146476146477146478146479146480146481146482146483146484146485146486146487146488146489146490146491146492146493146494146495146496146497146498146499146500146501146502146503146504146505146506146507146508146509146510146511146512146513146514146515146516146517146518146519146520146521146522146523146524146525146526146527146528146529146530146531146532146533146534146535146536146537146538146539146540146541146542146543146544146545146546146547146548146549146550146551146552146553146554146555146556146557146558146559146560146561146562146563146564146565146566146567146568146569146570146571146572146573146574146575146576146577146578146579146580146581146582146583146584146585146586146587146588146589146590146591146592146593146594146595146596146597146598146599146600146601146602146603146604146605146606146607146608146609146610146611146612146613146614146615146616146617146618146619146620146621146622146623146624146625146626146627146628146629146630146631146632146633146634146635146636146637146638146639146640146641146642146643146644146645146646146647146648146649146650146651146652146653146654146655146656146657146658146659146660146661146662146663146664146665146666146667146668146669146670146671146672146673146674146675146676146677146678146679146680146681146682146683146684146685146686146687146688146689146690146691146692146693146694146695146696146697146698146699146700146701146702146703146704146705146706146707146708146709146710146711146712146713146714146715146716146717146718146719146720146721146722146723146724146725146726146727146728146729146730146731146732146733146734146735146736146737146738146739146740146741146742146743146744146745146746146747146748146749146750146751146752146753146754146755146756146757146758146759146760146761146762146763146764146765146766146767146768146769146770146771146772146773146774146775146776146777146778146779146780146781146782146783146784146785146786146787146788146789146790146791146792146793146794146795146796146797146798146799146800146801146802146803146804146805146806146807146808146809146810146811146812146813146814146815146816146817146818146819146820146821146822146823146824146825146826146827146828146829146830146831146832146833146834146835146836146837146838146839146840146841146842146843146844146845146846146847146848146849146850146851146852146853146854146855146856146857146858146859146860146861146862146863146864146865146866146867146868146869146870146871146872146873146874146875146876146877146878146879146880146881146882146883146884146885146886146887146888146889146890146891146892146893146894146895146896146897146898146899146900146901146902146903146904146905146906146907146908146909146910146911146912146913146914146915146916146917146918146919146920146921146922146923146924146925146926146927146928146929146930146931146932146933146934146935146936146937146938146939146940146941146942146943146944146945146946146947146948146949146950146951146952146953146954146955146956146957146958146959146960146961146962146963146964146965146966146967146968146969146970146971146972146973146974146975146976146977146978146979146980146981146982146983146984146985146986146987146988146989146990146991146992146993146994146995146996146997146998146999147000147001147002147003147004147005147006147007147008147009147010147011147012147013147014147015147016147017147018147019147020147021147022147023147024147025147026147027147028147029147030147031147032147033147034147035147036147037147038147039147040147041147042147043147044147045147046147047147048147049147050147051147052147053147054147055147056147057147058147059147060147061147062147063147064147065147066147067147068147069147070147071147072147073147074147075147076147077147078147079147080147081147082147083147084147085147086147087147088147089147090147091147092147093147094147095147096147097147098147099147100147101147102147103147104147105147106147107147108147109147110147111147112147113147114147115147116147117147118147119147120147121147122147123147124147125147126147127147128147129147130147131147132147133147134147135147136147137147138147139147140147141147142147143147144147145147146147147147148147149147150147151147152147153147154147155147156147157147158147159147160147161147162147163147164147165147166147167147168147169147170147171147172147173147174147175147176147177147178147179147180147181147182147183147184147185147186147187147188147189147190147191147192147193147194147195147196147197147198147199147200147201147202147203147204147205147206147207147208147209147210147211147212147213147214147215147216147217147218147219147220147221147222147223147224147225147226147227147228147229147230147231147232147233147234147235147236147237147238147239147240147241147242147243147244147245147246147247147248147249147250147251147252147253147254147255147256147257147258147259147260147261147262147263147264147265147266147267147268147269147270147271147272147273147274147275147276147277147278147279147280147281147282147283147284147285147286147287147288147289147290147291147292147293147294147295147296147297147298147299147300147301147302147303147304147305147306147307147308147309147310147311147312147313147314147315147316147317147318147319147320147321147322147323147324147325147326147327147328147329147330147331147332147333147334147335147336147337147338147339147340147341147342147343147344147345147346147347147348147349147350147351147352147353147354147355147356147357147358147359147360147361147362147363147364147365147366147367147368147369147370147371147372147373147374147375147376147377147378147379147380147381147382147383147384147385147386147387147388147389147390147391147392147393147394147395147396147397147398147399147400147401147402147403147404147405147406147407147408147409147410147411147412147413147414147415147416147417147418147419147420147421147422147423147424147425147426147427147428147429147430147431147432147433147434147435147436147437147438147439147440147441147442147443147444147445147446147447147448147449147450147451147452147453147454147455147456147457147458147459147460147461147462147463147464147465147466147467147468147469147470147471147472147473147474147475147476147477147478147479147480147481147482147483147484147485147486147487147488147489147490147491147492147493147494147495147496147497147498147499147500147501147502147503147504147505147506147507147508147509147510147511147512147513147514147515147516147517147518147519147520147521147522147523147524147525147526147527147528147529147530147531147532147533147534147535147536147537147538147539147540147541147542147543147544147545147546147547147548147549147550147551147552147553147554147555147556147557147558147559147560147561147562147563147564147565147566147567147568147569147570147571147572147573147574147575147576147577147578147579147580147581147582147583147584147585147586147587147588147589147590147591147592147593147594147595147596147597147598147599147600147601147602147603147604147605147606147607147608147609147610147611147612147613147614147615147616147617147618147619147620147621147622147623147624147625147626147627147628147629147630147631147632147633147634147635147636147637147638147639147640147641147642147643147644147645147646147647147648147649147650147651147652147653147654147655147656147657147658147659147660147661147662147663147664147665147666147667147668147669147670147671147672147673147674147675147676147677147678147679147680147681147682147683147684147685147686147687147688147689147690147691147692147693147694147695147696147697147698147699147700147701147702147703147704147705147706147707147708147709147710147711147712147713147714147715147716147717147718147719147720147721147722147723147724147725147726147727147728147729147730147731147732147733147734147735147736147737147738147739147740147741147742147743147744147745147746147747147748147749147750147751147752147753147754147755147756147757147758147759147760147761147762147763147764147765147766147767147768147769147770147771147772147773147774147775147776147777147778147779147780147781147782147783147784147785147786147787147788147789147790147791147792147793147794147795147796147797147798147799147800147801147802147803147804147805147806147807147808147809147810147811147812147813147814147815147816147817147818147819147820147821147822147823147824147825147826147827147828147829147830147831147832147833147834147835147836147837147838147839147840147841147842147843147844147845147846147847147848147849147850147851147852147853147854147855147856147857147858147859147860147861147862147863147864147865147866147867147868147869147870147871147872147873147874147875147876147877147878147879147880147881147882147883147884147885147886147887147888147889147890147891147892147893147894147895147896147897147898147899147900147901147902147903147904147905147906147907147908147909147910147911147912147913147914147915147916147917147918147919147920147921147922147923147924147925147926147927147928147929147930147931147932147933147934147935147936147937147938147939147940147941147942147943147944147945147946147947147948147949147950147951147952147953147954147955147956147957147958147959147960147961147962147963147964147965147966147967147968147969147970147971147972147973147974147975147976147977147978147979147980147981147982147983147984147985147986147987147988147989147990147991147992147993147994147995147996147997147998147999148000148001148002148003148004148005148006148007148008148009148010148011148012148013148014148015148016148017148018148019148020148021148022148023148024148025148026148027148028148029148030148031148032148033148034148035148036148037148038148039148040148041148042148043148044148045148046148047148048148049148050148051148052148053148054148055148056148057148058148059148060148061148062148063148064148065148066148067148068148069148070148071148072148073148074148075148076148077148078148079148080148081148082148083148084148085148086148087148088148089148090148091148092148093148094148095148096148097148098148099148100148101148102148103148104148105148106148107148108148109148110148111148112148113148114148115148116148117148118148119148120148121148122148123148124148125148126148127148128148129148130148131148132148133148134148135148136148137148138148139148140148141148142148143148144148145148146148147148148148149148150148151148152148153148154148155148156148157148158148159148160148161148162148163148164148165148166148167148168148169148170148171148172148173148174148175148176148177148178148179148180148181148182148183148184148185148186148187148188148189148190148191148192148193148194148195148196148197148198148199148200148201148202148203148204148205148206148207148208148209148210148211148212148213148214148215148216148217148218148219148220148221148222148223148224148225148226148227148228148229148230148231148232148233148234148235148236148237148238148239148240148241148242148243148244148245148246148247148248148249148250148251148252148253148254148255148256148257148258148259148260148261148262148263148264148265148266148267148268148269148270148271148272148273148274148275148276148277148278148279148280148281148282148283148284148285148286148287148288148289148290148291148292148293148294148295148296148297148298148299148300148301148302148303148304148305148306148307148308148309148310148311148312148313148314148315148316148317148318148319148320148321148322148323148324148325148326148327148328148329148330148331148332148333148334148335148336148337148338148339148340148341148342148343148344148345148346148347148348148349148350148351148352148353148354148355148356148357148358148359148360148361148362148363148364148365148366148367148368148369148370148371148372148373148374148375148376148377148378148379148380148381148382148383148384148385148386148387148388148389148390148391148392148393148394148395148396148397148398148399148400148401148402148403148404148405148406148407148408148409148410148411148412148413148414148415148416148417148418148419148420148421148422148423148424148425148426148427148428148429148430148431148432148433148434148435148436148437148438148439148440148441148442148443148444148445148446148447148448148449148450148451148452148453148454148455148456148457148458148459148460148461148462148463148464148465148466148467148468148469148470148471148472148473148474148475148476148477148478148479148480148481148482148483148484148485148486148487148488148489148490148491148492148493148494148495148496148497148498148499148500148501148502148503148504148505148506148507148508148509148510148511148512148513148514148515148516148517148518148519148520148521148522148523148524148525148526148527148528148529148530148531148532148533148534148535148536148537148538148539148540148541148542148543148544148545148546148547148548148549148550148551148552148553148554148555148556148557148558148559148560148561148562148563148564148565148566148567148568148569148570148571148572148573148574148575148576148577148578148579148580148581148582148583148584148585148586148587148588148589148590148591148592148593148594148595148596148597148598148599148600148601148602148603148604148605148606148607148608148609148610148611148612148613148614148615148616148617148618148619148620148621148622148623148624148625148626148627148628148629148630148631148632148633148634148635148636148637148638148639148640148641148642148643148644148645148646148647148648148649148650148651148652148653148654148655148656148657148658148659148660148661148662148663148664148665148666148667148668148669148670148671148672148673148674148675148676148677148678148679148680148681148682148683148684148685148686148687148688148689148690148691148692148693148694148695148696148697148698148699148700148701148702148703148704148705148706148707148708148709148710148711148712148713148714148715148716148717148718148719148720148721148722148723148724148725148726148727148728148729148730148731148732148733148734148735148736148737148738148739148740148741148742148743148744148745148746148747148748148749148750148751148752148753148754148755148756148757148758148759148760148761148762148763148764148765148766148767148768148769148770148771148772148773148774148775148776148777148778148779148780148781148782148783148784148785148786148787148788148789148790148791148792148793148794148795148796148797148798148799148800148801148802148803148804148805148806148807148808148809148810148811148812148813148814148815148816148817148818148819148820148821148822148823148824148825148826148827148828148829148830148831148832148833148834148835148836148837148838148839148840148841148842148843148844148845148846148847148848148849148850148851148852148853148854148855148856148857148858148859148860148861148862148863148864148865148866148867148868148869148870148871148872148873148874148875148876148877148878148879148880148881148882148883148884148885148886148887148888148889148890148891148892148893148894148895148896148897148898148899148900148901148902148903148904148905148906148907148908148909148910148911148912148913148914148915148916148917148918148919148920148921148922148923148924148925148926148927148928148929148930148931148932148933148934148935148936148937148938148939148940148941148942148943148944148945148946148947148948148949148950148951148952148953148954148955148956148957148958148959148960148961148962148963148964148965148966148967148968148969148970148971148972148973148974148975148976148977148978148979148980148981148982148983148984148985148986148987148988148989148990148991148992148993148994148995148996148997148998148999149000149001149002149003149004149005149006149007149008149009149010149011149012149013149014149015149016149017149018149019149020149021149022149023149024149025149026149027149028149029149030149031149032149033149034149035149036149037149038149039149040149041149042149043149044149045149046149047149048149049149050149051149052149053149054149055149056149057149058149059149060149061149062149063149064149065149066149067149068149069149070149071149072149073149074149075149076149077149078149079149080149081149082149083149084149085149086149087149088149089149090149091149092149093149094149095149096149097149098149099149100149101149102149103149104149105149106149107149108149109149110149111149112149113149114149115149116149117149118149119149120149121149122149123149124149125149126149127149128149129149130149131149132149133149134149135149136149137149138149139149140149141149142149143149144149145149146149147149148149149149150149151149152149153149154149155149156149157149158149159149160149161149162149163149164149165149166149167149168149169149170149171149172149173149174149175149176149177149178149179149180149181149182149183149184149185149186149187149188149189149190149191149192149193149194149195149196149197149198149199149200149201149202149203149204149205149206149207149208149209149210149211149212149213149214149215149216149217149218149219149220149221149222149223149224149225149226149227149228149229149230149231149232149233149234149235149236149237149238149239149240149241149242149243149244149245149246149247149248149249149250149251149252149253149254149255149256149257149258149259149260149261149262149263149264149265149266149267149268149269149270149271149272149273149274149275149276149277149278149279149280149281149282149283149284149285149286149287149288149289149290149291149292149293149294149295149296149297149298149299149300149301149302149303149304149305149306149307149308149309149310149311149312149313149314149315149316149317149318149319149320149321149322149323149324149325149326149327149328149329149330149331149332149333149334149335149336149337149338149339149340149341149342149343149344149345149346149347149348149349149350149351149352149353149354149355149356149357149358149359149360149361149362149363149364149365149366149367149368149369149370149371149372149373149374149375149376149377149378149379149380149381149382149383149384149385149386149387149388149389149390149391149392149393149394149395149396149397149398149399149400149401149402149403149404149405149406149407149408149409149410149411149412149413149414149415149416149417149418149419149420149421149422149423149424149425149426149427149428149429149430149431149432149433149434149435149436149437149438149439149440149441149442149443149444149445149446149447149448149449149450149451149452149453149454149455149456149457149458149459149460149461149462149463149464149465149466149467149468149469149470149471149472149473149474149475149476149477149478149479149480149481149482149483149484149485149486149487149488149489149490149491149492149493149494149495149496149497149498149499149500149501149502149503149504149505149506149507149508149509149510149511149512149513149514149515149516149517149518149519149520149521149522149523149524149525149526149527149528149529149530149531149532149533149534149535149536149537149538149539149540149541149542149543149544149545149546149547149548149549149550149551149552149553149554149555149556149557149558149559149560149561149562149563149564149565149566149567149568149569149570149571149572149573149574149575149576149577149578149579149580149581149582149583149584149585149586149587149588149589149590149591149592149593149594149595149596149597149598149599149600149601149602149603149604149605149606149607149608149609149610149611149612149613149614149615149616149617149618149619149620149621149622149623149624149625149626149627149628149629149630149631149632149633149634149635149636149637149638149639149640149641149642149643149644149645149646149647149648149649149650149651149652149653149654149655149656149657149658149659149660149661149662149663149664149665149666149667149668149669149670149671149672149673149674149675149676149677149678149679149680149681149682149683149684149685149686149687149688149689149690149691149692149693149694149695149696149697149698149699149700149701149702149703149704149705149706149707149708149709149710149711149712149713149714149715149716149717149718149719149720149721149722149723149724149725149726149727149728149729149730149731149732149733149734149735149736149737149738149739149740149741149742149743149744149745149746149747149748149749149750149751149752149753149754149755149756149757149758149759149760149761149762149763149764149765149766149767149768149769149770149771149772149773149774149775149776149777149778149779149780149781149782149783149784149785149786149787149788149789149790149791149792149793149794149795149796149797149798149799149800149801149802149803149804149805149806149807149808149809149810149811149812149813149814149815149816149817149818149819149820149821149822149823149824149825149826149827149828149829149830149831149832149833149834149835149836149837149838149839149840149841149842149843149844149845149846149847149848149849149850149851149852149853149854149855149856149857149858149859149860149861149862149863149864149865149866149867149868149869149870149871149872149873149874149875149876149877149878149879149880149881149882149883149884149885149886149887149888149889149890149891149892149893149894149895149896149897149898149899149900149901149902149903149904149905149906149907149908149909149910149911149912149913149914149915149916149917149918149919149920149921149922149923149924149925149926149927149928149929149930149931149932149933149934149935149936149937149938149939149940149941149942149943149944149945149946149947149948149949149950149951149952149953149954149955149956149957149958149959149960149961149962149963149964149965149966149967149968149969149970149971149972149973149974149975149976149977149978149979149980149981149982149983149984149985149986149987149988149989149990149991149992149993149994149995149996149997149998149999150000150001150002150003150004150005150006150007150008150009150010150011150012150013150014150015150016150017150018150019150020150021150022150023150024150025150026150027150028150029150030150031150032150033150034150035150036150037150038150039150040150041150042150043150044150045150046150047150048150049150050150051150052150053150054150055150056150057150058150059150060150061150062150063150064150065150066150067150068150069150070150071150072150073150074150075150076150077150078150079150080150081150082150083150084150085150086150087150088150089150090150091150092150093150094150095150096150097150098150099150100150101150102150103150104150105150106150107150108150109150110150111150112150113150114150115150116150117150118150119150120150121150122150123150124150125150126150127150128150129150130150131150132150133150134150135150136150137150138150139150140150141150142150143150144150145150146150147150148150149150150150151150152150153150154150155150156150157150158150159150160150161150162150163150164150165150166150167150168150169150170150171150172150173150174150175150176150177150178150179150180150181150182150183150184150185150186150187150188150189150190150191150192150193150194150195150196150197150198150199150200150201150202150203150204150205150206150207150208150209150210150211150212150213150214150215150216150217150218150219150220150221150222150223150224150225150226150227150228150229150230150231150232150233150234150235150236150237150238150239150240150241150242150243150244150245150246150247150248150249150250150251150252150253150254150255150256150257150258150259150260150261150262150263150264150265150266150267150268150269150270150271150272150273150274150275150276150277150278150279150280150281150282150283150284150285150286150287150288150289150290150291150292150293150294150295150296150297150298150299150300150301150302150303150304150305150306150307150308150309150310150311150312150313150314150315150316150317150318150319150320150321150322150323150324150325150326150327150328150329150330150331150332150333150334150335150336150337150338150339150340150341150342150343150344150345150346150347150348150349150350150351150352150353150354150355150356150357150358150359150360150361150362150363150364150365150366150367150368150369150370150371150372150373150374150375150376150377150378150379150380150381150382150383150384150385150386150387150388150389150390150391150392150393150394150395150396150397150398150399150400150401150402150403150404150405150406150407150408150409150410150411150412150413150414150415150416150417150418150419150420150421150422150423150424150425150426150427150428150429150430150431150432150433150434150435150436150437150438150439150440150441150442150443150444150445150446150447150448150449150450150451150452150453150454150455150456150457150458150459150460150461150462150463150464150465150466150467150468150469150470150471150472150473150474150475150476150477150478150479150480150481150482150483150484150485150486150487150488150489150490150491150492150493150494150495150496150497150498150499150500150501150502150503150504150505150506150507150508150509150510150511150512150513150514150515150516150517150518150519150520150521150522150523150524150525150526150527150528150529150530150531150532150533150534150535150536150537150538150539150540150541150542150543150544150545150546150547150548150549150550150551150552150553150554150555150556150557150558150559150560150561150562150563150564150565150566150567150568150569150570150571150572150573150574150575150576150577150578150579150580150581150582150583150584150585150586150587150588150589150590150591150592150593150594150595150596150597150598150599150600150601150602150603150604150605150606150607150608150609150610150611150612150613150614150615150616150617150618150619150620150621150622150623150624150625150626150627150628150629150630150631150632150633150634150635150636150637150638150639150640150641150642150643150644150645150646150647150648150649150650150651150652150653150654150655150656150657150658150659150660150661150662150663150664150665150666150667150668150669150670150671150672150673150674150675150676150677150678150679150680150681150682150683150684150685150686150687150688150689150690150691150692150693150694150695150696150697150698150699150700150701150702150703150704150705150706150707150708150709150710150711150712150713150714150715150716150717150718150719150720150721150722150723150724150725150726150727150728150729150730150731150732150733150734150735150736150737150738150739150740150741150742150743150744150745150746150747150748150749150750150751150752150753150754150755150756150757150758150759150760150761150762150763150764150765150766150767150768150769150770150771150772150773150774150775150776150777150778150779150780150781150782150783150784150785150786150787150788150789150790150791150792150793150794150795150796150797150798150799150800150801150802150803150804150805150806150807150808150809150810150811150812150813150814150815150816150817150818150819150820150821150822150823150824150825150826150827150828150829150830150831150832150833150834150835150836150837150838150839150840150841150842150843150844150845150846150847150848150849150850150851150852150853150854150855150856150857150858150859150860150861150862150863150864150865150866150867150868150869150870150871150872150873150874150875150876150877150878150879150880150881150882150883150884150885150886150887150888150889150890150891150892150893150894150895150896150897150898150899150900150901150902150903150904150905150906150907150908150909150910150911150912150913150914150915150916150917150918150919150920150921150922150923150924150925150926150927150928150929150930150931150932150933150934150935150936150937150938150939150940150941150942150943150944150945150946150947150948150949150950150951150952150953150954150955150956150957150958150959150960150961150962150963150964150965150966150967150968150969150970150971150972150973150974150975150976150977150978150979150980150981150982150983150984150985150986150987150988150989150990150991150992150993150994150995150996150997150998150999151000151001151002151003151004151005151006151007151008151009151010151011151012151013151014151015151016151017151018151019151020151021151022151023151024151025151026151027151028151029151030151031151032151033151034151035151036151037151038151039151040151041151042151043151044151045151046151047151048151049151050151051151052151053151054151055151056151057151058151059151060151061151062151063151064151065151066151067151068151069151070151071151072151073151074151075151076151077151078151079151080151081151082151083151084151085151086151087151088151089151090151091151092151093151094151095151096151097151098151099151100151101151102151103151104151105151106151107151108151109151110151111151112151113151114151115151116151117151118151119151120151121151122151123151124151125151126151127151128151129151130151131151132151133151134151135151136151137151138151139151140151141151142151143151144151145151146151147151148151149151150151151151152151153151154151155151156151157151158151159151160151161151162151163151164151165151166151167151168151169151170151171151172151173151174151175151176151177151178151179151180151181151182151183151184151185151186151187151188151189151190151191151192151193151194151195151196151197151198151199151200151201151202151203151204151205151206151207151208151209151210151211151212151213151214151215151216151217151218151219151220151221151222151223151224151225151226151227151228151229151230151231151232151233151234151235151236151237151238151239151240151241151242151243151244151245151246151247151248151249151250151251151252151253151254151255151256151257151258151259151260151261151262151263151264151265151266151267151268151269151270151271151272151273151274151275151276151277151278151279151280151281151282151283151284151285151286151287151288151289151290151291151292151293151294151295151296151297151298151299151300151301151302151303151304151305151306151307151308151309151310151311151312151313151314151315151316151317151318151319151320151321151322151323151324151325151326151327151328151329151330151331151332151333151334151335151336151337151338151339151340151341151342151343151344151345151346151347151348151349151350151351151352151353151354151355151356151357151358151359151360151361151362151363151364151365151366151367151368151369151370151371151372151373151374151375151376151377151378151379151380151381151382151383151384151385151386151387151388151389151390151391151392151393151394151395151396151397151398151399151400151401151402151403151404151405151406151407151408151409151410151411151412151413151414151415151416151417151418151419151420151421151422151423151424151425151426151427151428151429151430151431151432151433151434151435151436151437151438151439151440151441151442151443151444151445151446151447151448151449151450151451151452151453151454151455151456151457151458151459151460151461151462151463151464151465151466151467151468151469151470151471151472151473151474151475151476151477151478151479151480151481151482151483151484151485151486151487151488151489151490151491151492151493151494151495151496151497151498151499151500151501151502151503151504151505151506151507151508151509151510151511151512151513151514151515151516151517151518151519151520151521151522151523151524151525151526151527151528151529151530151531151532151533151534151535151536151537151538151539151540151541151542151543151544151545151546151547151548151549151550151551151552151553151554151555151556151557151558151559151560151561151562151563151564151565151566151567151568151569151570151571151572151573151574151575151576151577151578151579151580151581151582151583151584151585151586151587151588151589151590151591151592151593151594151595151596151597151598151599151600151601151602151603151604151605151606151607151608151609151610151611151612151613151614151615151616151617151618151619151620151621151622151623151624151625151626151627151628151629151630151631151632151633151634151635151636151637151638151639151640151641151642151643151644151645151646151647151648151649151650151651151652151653151654151655151656151657151658151659151660151661151662151663151664151665151666151667151668151669151670151671151672151673151674151675151676151677151678151679151680151681151682151683151684151685151686151687151688151689151690151691151692151693151694151695151696151697151698151699151700151701151702151703151704151705151706151707151708151709151710151711151712151713151714151715151716151717151718151719151720151721151722151723151724151725151726151727151728151729151730151731151732151733151734151735151736151737151738151739151740151741151742151743151744151745151746151747151748151749151750151751151752151753151754151755151756151757151758151759151760151761151762151763151764151765151766151767151768151769151770151771151772151773151774151775151776151777151778151779151780151781151782151783151784151785151786151787151788151789151790151791151792151793151794151795151796151797151798151799151800151801151802151803151804151805151806151807151808151809151810151811151812151813151814151815151816151817151818151819151820151821151822151823151824151825151826151827151828151829151830151831151832151833151834151835151836151837151838151839151840151841151842151843151844151845151846151847151848151849151850151851151852151853151854151855151856151857151858151859151860151861151862151863151864151865151866151867151868151869151870151871151872151873151874151875151876151877151878151879151880151881151882151883151884151885151886151887151888151889151890151891151892151893151894151895151896151897151898151899151900151901151902151903151904151905151906151907151908151909151910151911151912151913151914151915151916151917151918151919151920151921151922151923151924151925151926151927151928151929151930151931151932151933151934151935151936151937151938151939151940151941151942151943151944151945151946151947151948151949151950151951151952151953151954151955151956151957151958151959151960151961151962151963151964151965151966151967151968151969151970151971151972151973151974151975151976151977151978151979151980151981151982151983151984151985151986151987151988151989151990151991151992151993151994151995151996151997151998151999152000152001152002152003152004152005152006152007152008152009152010152011152012152013152014152015152016152017152018152019152020152021152022152023152024152025152026152027152028152029152030152031152032152033152034152035152036152037152038152039152040152041152042152043152044152045152046152047152048152049152050152051152052152053152054152055152056152057152058152059152060152061152062152063152064152065152066152067152068152069152070152071152072152073152074152075152076152077152078152079152080152081152082152083152084152085152086152087152088152089152090152091152092152093152094152095152096152097152098152099152100152101152102152103152104152105152106152107152108152109152110152111152112152113152114152115152116152117152118152119152120152121152122152123152124152125152126152127152128152129152130152131152132152133152134152135152136152137152138152139152140152141152142152143152144152145152146152147152148152149152150152151152152152153152154152155152156152157152158152159152160152161152162152163152164152165152166152167152168152169152170152171152172152173152174152175152176152177152178152179152180152181152182152183152184152185152186152187152188152189152190152191152192152193152194152195152196152197152198152199152200152201152202152203152204152205152206152207152208152209152210152211152212152213152214152215152216152217152218152219152220152221152222152223152224152225152226152227152228152229152230152231152232152233152234152235152236152237152238152239152240152241152242152243152244152245152246152247152248152249152250152251152252152253152254152255152256152257152258152259152260152261152262152263152264152265152266152267152268152269152270152271152272152273152274152275152276152277152278152279152280152281152282152283152284152285152286152287152288152289152290152291152292152293152294152295152296152297152298152299152300152301152302152303152304152305152306152307152308152309152310152311152312152313152314152315152316152317152318152319152320152321152322152323152324152325152326152327152328152329152330152331152332152333152334152335152336152337152338152339152340152341152342152343152344152345152346152347152348152349152350152351152352152353152354152355152356152357152358152359152360152361152362152363152364152365152366152367152368152369152370152371152372152373152374152375152376152377152378152379152380152381152382152383152384152385152386152387152388152389152390152391152392152393152394152395152396152397152398152399152400152401152402152403152404152405152406152407152408152409152410152411152412152413152414152415152416152417152418152419152420152421152422152423152424152425152426152427152428152429152430152431152432152433152434152435152436152437152438152439152440152441152442152443152444152445152446152447152448152449152450152451152452152453152454152455152456152457152458152459152460152461152462152463152464152465152466152467152468152469152470152471152472152473152474152475152476152477152478152479152480152481152482152483152484152485152486152487152488152489152490152491152492152493152494152495152496152497152498152499152500152501152502152503152504152505152506152507152508152509152510152511152512152513152514152515152516152517152518152519152520152521152522152523152524152525152526152527152528152529152530152531152532152533152534152535152536152537152538152539152540152541152542152543152544152545152546152547152548152549152550152551152552152553152554152555152556152557152558152559152560152561152562152563152564152565152566152567152568152569152570152571152572152573152574152575152576152577152578152579152580152581152582152583152584152585152586152587152588152589152590152591152592152593152594152595152596152597152598152599152600152601152602152603152604152605152606152607152608152609152610152611152612152613152614152615152616152617152618152619152620152621152622152623152624152625152626152627152628152629152630152631152632152633152634152635152636152637152638152639152640152641152642152643152644152645152646152647152648152649152650152651152652152653152654152655152656152657152658152659152660152661152662152663152664152665152666152667152668152669152670152671152672152673152674152675152676152677152678152679152680152681152682152683152684152685152686152687152688152689152690152691152692152693152694152695152696152697152698152699152700152701152702152703152704152705152706152707152708152709152710152711152712152713152714152715152716152717152718152719152720152721152722152723152724152725152726152727152728152729152730152731152732152733152734152735152736152737152738152739152740152741152742152743152744152745152746152747152748152749152750152751152752152753152754152755152756152757152758152759152760152761152762152763152764152765152766152767152768152769152770152771152772152773152774152775152776152777152778152779152780152781152782152783152784152785152786152787152788152789152790152791152792152793152794152795152796152797152798152799152800152801152802152803152804152805152806152807152808152809152810152811152812152813152814152815152816152817152818152819152820152821152822152823152824152825152826152827152828152829152830152831152832152833152834152835152836152837152838152839152840152841152842152843152844152845152846152847152848152849152850152851152852152853152854152855152856152857152858152859152860152861152862152863152864152865152866152867152868152869152870152871152872152873152874152875152876152877152878152879152880152881152882152883152884152885152886152887152888152889152890152891152892152893152894152895152896152897152898152899152900152901152902152903152904152905152906152907152908152909152910152911152912152913152914152915152916152917152918152919152920152921152922152923152924152925152926152927152928152929152930152931152932152933152934152935152936152937152938152939152940152941152942152943152944152945152946152947152948152949152950152951152952152953152954152955152956152957152958152959152960152961152962152963152964152965152966152967152968152969152970152971152972152973152974152975152976152977152978152979152980152981152982152983152984152985152986152987152988152989152990152991152992152993152994152995152996152997152998152999153000153001153002153003153004153005153006153007153008153009153010153011153012153013153014153015153016153017153018153019153020153021153022153023153024153025153026153027153028153029153030153031153032153033153034153035153036153037153038153039153040153041153042153043153044153045153046153047153048153049153050153051153052153053153054153055153056153057153058153059153060153061153062153063153064153065153066153067153068153069153070153071153072153073153074153075153076153077153078153079153080153081153082153083153084153085153086153087153088153089153090153091153092153093153094153095153096153097153098153099153100153101153102153103153104153105153106153107153108153109153110153111153112153113153114153115153116153117153118153119153120153121153122153123153124153125153126153127153128153129153130153131153132153133153134153135153136153137153138153139153140153141153142153143153144153145153146153147153148153149153150153151153152153153153154153155153156153157153158153159153160153161153162153163153164153165153166153167153168153169153170153171153172153173153174153175153176153177153178153179153180153181153182153183153184153185153186153187153188153189153190153191153192153193153194153195153196153197153198153199153200153201153202153203153204153205153206153207153208153209153210153211153212153213153214153215153216153217153218153219153220153221153222153223153224153225153226153227153228153229153230153231153232153233153234153235153236153237153238153239153240153241153242153243153244153245153246153247153248153249153250153251153252153253153254153255153256153257153258153259153260153261153262153263153264153265153266153267153268153269153270153271153272153273153274153275153276153277153278153279153280153281153282153283153284153285153286153287153288153289153290153291153292153293153294153295153296153297153298153299153300153301153302153303153304153305153306153307153308153309153310153311153312153313153314153315153316153317153318153319153320153321153322153323153324153325153326153327153328153329153330153331153332153333153334153335153336153337153338153339153340153341153342153343153344153345153346153347153348153349153350153351153352153353153354153355153356153357153358153359153360153361153362153363153364153365153366153367153368153369153370153371153372153373153374153375153376153377153378153379153380153381153382153383153384153385153386153387153388153389153390153391153392153393153394153395153396153397153398153399153400153401153402153403153404153405153406153407153408153409153410153411153412153413153414153415153416153417153418153419153420153421153422153423153424153425153426153427153428153429153430153431153432153433153434153435153436153437153438153439153440153441153442153443153444153445153446153447153448153449153450153451153452153453153454153455153456153457153458153459153460153461153462153463153464153465153466153467153468153469153470153471153472153473153474153475153476153477153478153479153480153481153482153483153484153485153486153487153488153489153490153491153492153493153494153495153496153497153498153499153500153501153502153503153504153505153506153507153508153509153510153511153512153513153514153515153516153517153518153519153520153521153522153523153524153525153526153527153528153529153530153531153532153533153534153535153536153537153538153539153540153541153542153543153544153545153546153547153548153549153550153551153552153553153554153555153556153557153558153559153560153561153562153563153564153565153566153567153568153569153570153571153572153573153574153575153576153577153578153579153580153581153582153583153584153585153586153587153588153589153590153591153592153593153594153595153596153597153598153599153600153601153602153603153604153605153606153607153608153609153610153611153612153613153614153615153616153617153618153619153620153621153622153623153624153625153626153627153628153629153630153631153632153633153634153635153636153637153638153639153640153641153642153643153644153645153646153647153648153649153650153651153652153653153654153655153656153657153658153659153660153661153662153663153664153665153666153667153668153669153670153671153672153673153674153675153676153677153678153679153680153681153682153683153684153685153686153687153688153689153690153691153692153693153694153695153696153697153698153699153700153701153702153703153704153705153706153707153708153709153710153711153712153713153714153715153716153717153718153719153720153721153722153723153724153725153726153727153728153729153730153731153732153733153734153735153736153737153738153739153740153741153742153743153744153745153746153747153748153749153750153751153752153753153754153755153756153757153758153759153760153761153762153763153764153765153766153767153768153769153770153771153772153773153774153775153776153777153778153779153780153781153782153783153784153785153786153787153788153789153790153791153792153793153794153795153796153797153798153799153800153801153802153803153804153805153806153807153808153809153810153811153812153813153814153815153816153817153818153819153820153821153822153823153824153825153826153827153828153829153830153831153832153833153834153835153836153837153838153839153840153841153842153843153844153845153846153847153848153849153850153851153852153853153854153855153856153857153858153859153860153861153862153863153864153865153866153867153868153869153870153871153872153873153874153875153876153877153878153879153880153881153882153883153884153885153886153887153888153889153890153891153892153893153894153895153896153897153898153899153900153901153902153903153904153905153906153907153908153909153910153911153912153913153914153915153916153917153918153919153920153921153922153923153924153925153926153927153928153929153930153931153932153933153934153935153936153937153938153939153940153941153942153943153944153945153946153947153948153949153950153951153952153953153954153955153956153957153958153959153960153961153962153963153964153965153966153967153968153969153970153971153972153973153974153975153976153977153978153979153980153981153982153983153984153985153986153987153988153989153990153991153992153993153994153995153996153997153998153999154000154001154002154003154004154005154006154007154008154009154010154011154012154013154014154015154016154017154018154019154020154021154022154023154024154025154026154027154028154029154030154031154032154033154034154035154036154037154038154039154040154041154042154043154044154045154046154047154048154049154050154051154052154053154054154055154056154057154058154059154060154061154062154063154064154065154066154067154068154069154070154071154072154073154074154075154076154077154078154079154080154081154082154083154084154085154086154087154088154089154090154091154092154093154094154095154096154097154098154099154100154101154102154103154104154105154106154107154108154109154110154111154112154113154114154115154116154117154118154119154120154121154122154123154124154125154126154127154128154129154130154131154132154133154134154135154136154137154138154139154140154141154142154143154144154145154146154147154148154149154150154151154152154153154154154155154156154157154158154159154160154161154162154163154164154165154166154167154168154169154170154171154172154173154174154175154176154177154178154179154180154181154182154183154184154185154186154187154188154189154190154191154192154193154194154195154196154197154198154199154200154201154202154203154204154205154206154207154208154209154210154211154212154213154214154215154216154217154218154219154220154221154222154223154224154225154226154227154228154229154230154231154232154233154234154235154236154237154238154239154240154241154242154243154244154245154246154247154248154249154250154251154252154253154254154255154256154257154258154259154260154261154262154263154264154265154266154267154268154269154270154271154272154273154274154275154276154277154278154279154280154281154282154283154284154285154286154287154288154289154290154291154292154293154294154295154296154297154298154299154300154301154302154303154304154305154306154307154308154309154310154311154312154313154314154315154316154317154318154319154320154321154322154323154324154325154326154327154328154329154330154331154332154333154334154335154336154337154338154339154340154341154342154343154344154345154346154347154348154349154350154351154352154353154354154355154356154357154358154359154360154361154362154363154364154365154366154367154368154369154370154371154372154373154374154375154376154377154378154379154380154381154382154383154384154385154386154387154388154389154390154391154392154393154394154395154396154397154398154399154400154401154402154403154404154405154406154407154408154409154410154411154412154413154414154415154416154417154418154419154420154421154422154423154424154425154426154427154428154429154430154431154432154433154434154435154436154437154438154439154440154441154442154443154444154445154446154447154448154449154450154451154452154453154454154455154456154457154458154459154460154461154462154463154464154465154466154467154468154469154470154471154472154473154474154475154476154477154478154479154480154481154482154483154484154485154486154487154488154489154490154491154492154493154494154495154496154497154498154499154500154501154502154503154504154505154506154507154508154509154510154511154512154513154514154515154516154517154518154519154520154521154522154523154524154525154526154527154528154529154530154531154532154533154534154535154536154537154538154539154540154541154542154543154544154545154546154547154548154549154550154551154552154553154554154555154556154557154558154559154560154561154562154563154564154565154566154567154568154569154570154571154572154573154574154575154576154577154578154579154580154581154582154583154584154585154586154587154588154589154590154591154592154593154594154595154596154597154598154599154600154601154602154603154604154605154606154607154608154609154610154611154612154613154614154615154616154617154618154619154620154621154622154623154624154625154626154627154628154629154630154631154632154633154634154635154636154637154638154639154640154641154642154643154644154645154646154647154648154649154650154651154652154653154654154655154656154657154658154659154660154661154662154663154664154665154666154667154668154669154670154671154672154673154674154675154676154677154678154679154680154681154682154683154684154685154686154687154688154689154690154691154692154693154694154695154696154697154698154699154700154701154702154703154704154705154706154707154708154709154710154711154712154713154714154715154716154717154718154719154720154721154722154723154724154725154726154727154728154729154730154731154732154733154734154735154736154737154738154739154740154741154742154743154744154745154746154747154748154749154750154751154752154753154754154755154756154757154758154759154760154761154762154763154764154765154766154767154768154769154770154771154772154773154774154775154776154777154778154779154780154781154782154783154784154785154786154787154788154789154790154791154792154793154794154795154796154797154798154799154800154801154802154803154804154805154806154807154808154809154810154811154812154813154814154815154816154817154818154819154820154821154822154823154824154825154826154827154828154829154830154831154832154833154834154835154836154837154838154839154840154841154842154843154844154845154846154847154848154849154850154851154852154853154854154855154856154857154858154859154860154861154862154863154864154865154866154867154868154869154870154871154872154873154874154875154876154877154878154879154880154881154882154883154884154885154886154887154888154889154890154891154892154893154894154895154896154897154898154899154900154901154902154903154904154905154906154907154908154909154910154911154912154913154914154915154916154917154918154919154920154921154922154923154924154925154926154927154928154929154930154931154932154933154934154935154936154937154938154939154940154941154942154943154944154945154946154947154948154949154950154951154952154953154954154955154956154957154958154959154960154961154962154963154964154965154966154967154968154969154970154971154972154973154974154975154976154977154978154979154980154981154982154983154984154985154986154987154988154989154990154991154992154993154994154995154996154997154998154999155000155001155002155003155004155005155006155007155008155009155010155011155012155013155014155015155016155017155018155019155020155021155022155023155024155025155026155027155028155029155030155031155032155033155034155035155036155037155038155039155040155041155042155043155044155045155046155047155048155049155050155051155052155053155054155055155056155057155058155059155060155061155062155063155064155065155066155067155068155069155070155071155072155073155074155075155076155077155078155079155080155081155082155083155084155085155086155087155088155089155090155091155092155093155094155095155096155097155098155099155100155101155102155103155104155105155106155107155108155109155110155111155112155113155114155115155116155117155118155119155120155121155122155123155124155125155126155127155128155129155130155131155132155133155134155135155136155137155138155139155140155141155142155143155144155145155146155147155148155149155150155151155152155153155154155155155156155157155158155159155160155161155162155163155164155165155166155167155168155169155170155171155172155173155174155175155176155177155178155179155180155181155182155183155184155185155186155187155188155189155190155191155192155193155194155195155196155197155198155199155200155201155202155203155204155205155206155207155208155209155210155211155212155213155214155215155216155217155218155219155220155221155222155223155224155225155226155227155228155229155230155231155232155233155234155235155236155237155238155239155240155241155242155243155244155245155246155247155248155249155250155251155252155253155254155255155256155257155258155259155260155261155262155263155264155265155266155267155268155269155270155271155272155273155274155275155276155277155278155279155280155281155282155283155284155285155286155287155288155289155290155291155292155293155294155295155296155297155298155299155300155301155302155303155304155305155306155307155308155309155310155311155312155313155314155315155316155317155318155319155320155321155322155323155324155325155326155327155328155329155330155331155332155333155334155335155336155337155338155339155340155341155342155343155344155345155346155347155348155349155350155351155352155353155354155355155356155357155358155359155360155361155362155363155364155365155366155367155368155369155370155371155372155373155374155375155376155377155378155379155380155381155382155383155384155385155386155387155388155389155390155391155392155393155394155395155396155397155398155399155400155401155402155403155404155405155406155407155408155409155410155411155412155413155414155415155416155417155418155419155420155421155422155423155424155425155426155427155428155429155430155431155432155433155434155435155436155437155438155439155440155441155442155443155444155445155446155447155448155449155450155451155452155453155454155455155456155457155458155459155460155461155462155463155464155465155466155467155468155469155470155471155472155473155474155475155476155477155478155479155480155481155482155483155484155485155486155487155488155489155490155491155492155493155494155495155496155497155498155499155500155501155502155503155504155505155506155507155508155509155510155511155512155513155514155515155516155517155518155519155520155521155522155523155524155525155526155527155528155529155530155531155532155533155534155535155536155537155538155539155540155541155542155543155544155545155546155547155548155549155550155551155552155553155554155555155556155557155558155559155560155561155562155563155564155565155566155567155568155569155570155571155572155573155574155575155576155577155578155579155580155581155582155583155584155585155586155587155588155589155590155591155592155593155594155595155596155597155598155599155600155601155602155603155604155605155606155607155608155609155610155611155612155613155614155615155616155617155618155619155620155621155622155623155624155625155626155627155628155629155630155631155632155633155634155635155636155637155638155639155640155641155642155643155644155645155646155647155648155649155650155651155652155653155654155655155656155657155658155659155660155661155662155663155664155665155666155667155668155669155670155671155672155673155674155675155676155677155678155679155680155681155682155683155684155685155686155687155688155689155690155691155692155693155694155695155696155697155698155699155700155701155702155703155704155705155706155707155708155709155710155711155712155713155714155715155716155717155718155719155720155721155722155723155724155725155726155727155728155729155730155731155732155733155734155735155736155737155738155739155740155741155742155743155744155745155746155747155748155749155750155751155752155753155754155755155756155757155758155759155760155761155762155763155764155765155766155767155768155769155770155771155772155773155774155775155776155777155778155779155780155781155782155783155784155785155786155787155788155789155790155791155792155793155794155795155796155797155798155799155800155801155802155803155804155805155806155807155808155809155810155811155812155813155814155815155816155817155818155819155820155821155822155823155824155825155826155827155828155829155830155831155832155833155834155835155836155837155838155839155840155841155842155843155844155845155846155847155848155849155850155851155852155853155854155855155856155857155858155859155860155861155862155863155864155865155866155867155868155869155870155871155872155873155874155875155876155877155878155879155880155881155882155883155884155885155886155887155888155889155890155891155892155893155894155895155896155897155898155899155900155901155902155903155904155905155906155907155908155909155910155911155912155913155914155915155916155917155918155919155920155921155922155923155924155925155926155927155928155929155930155931155932155933155934155935155936155937155938155939155940155941155942155943155944155945155946155947155948155949155950155951155952155953155954155955155956155957155958155959155960155961155962155963155964155965155966155967155968155969155970155971155972155973155974155975155976155977155978155979155980155981155982155983155984155985155986155987155988155989155990155991155992155993155994155995155996155997155998155999156000156001156002156003156004156005156006156007156008156009156010156011156012156013156014156015156016156017156018156019156020156021156022156023156024156025156026156027156028156029156030156031156032156033156034156035156036156037156038156039156040156041156042156043156044156045156046156047156048156049156050156051156052156053156054156055156056156057156058156059156060156061156062156063156064156065156066156067156068156069156070156071156072156073156074156075156076156077156078156079156080156081156082156083156084156085156086156087156088156089156090156091156092156093156094156095156096156097156098156099156100156101156102156103156104156105156106156107156108156109156110156111156112156113156114156115156116156117156118156119156120156121156122156123156124156125156126156127156128156129156130156131156132156133156134156135156136156137156138156139156140156141156142156143156144156145156146156147156148156149156150156151156152156153156154156155156156156157156158156159156160156161156162156163156164156165156166156167156168156169156170156171156172156173156174156175156176156177156178156179156180156181156182156183156184156185156186156187156188156189156190156191156192156193156194156195156196156197156198156199156200156201156202156203156204156205156206156207156208156209156210156211156212156213156214156215156216156217156218156219156220156221156222156223156224156225156226156227156228156229156230156231156232156233156234156235156236156237156238156239156240156241156242156243156244156245156246156247156248156249156250156251156252156253156254156255156256156257156258156259156260156261156262156263156264156265156266156267156268156269156270156271156272156273156274156275156276156277156278156279156280156281156282156283156284156285156286156287156288156289156290156291156292156293156294156295156296156297156298156299156300156301156302156303156304156305156306156307156308156309156310156311156312156313156314156315156316156317156318156319156320156321156322156323156324156325156326156327156328156329156330156331156332156333156334156335156336156337156338156339156340156341156342156343156344156345156346156347156348156349156350156351156352156353156354156355156356156357156358156359156360156361156362156363156364156365156366156367156368156369156370156371156372156373156374156375156376156377156378156379156380156381156382156383156384156385156386156387156388156389156390156391156392156393156394156395156396156397156398156399156400156401156402156403156404156405156406156407156408156409156410156411156412156413156414156415156416156417156418156419156420156421156422156423156424156425156426156427156428156429156430156431156432156433156434156435156436156437156438156439156440156441156442156443156444156445156446156447156448156449156450156451156452156453156454156455156456156457156458156459156460156461156462156463156464156465156466156467156468156469156470156471156472156473156474156475156476156477156478156479156480156481156482156483156484156485156486156487156488156489156490156491156492156493156494156495156496156497156498156499156500156501156502156503156504156505156506156507156508156509156510156511156512156513156514156515156516156517156518156519156520156521156522156523156524156525156526156527156528156529156530156531156532156533156534156535156536156537156538156539156540156541156542156543156544156545156546156547156548156549156550156551156552156553156554156555156556156557156558156559156560156561156562156563156564156565156566156567156568156569156570156571156572156573156574156575156576156577156578156579156580156581156582156583156584156585156586156587156588156589156590156591156592156593156594156595156596156597156598156599156600156601156602156603156604156605156606156607156608156609156610156611156612156613156614156615156616156617156618156619156620156621156622156623156624156625156626156627156628156629156630156631156632156633156634156635156636156637156638156639156640156641156642156643156644156645156646156647156648156649156650156651156652156653156654156655156656156657156658156659156660156661156662156663156664156665156666156667156668156669156670156671156672156673156674156675156676156677156678156679156680156681156682156683156684156685156686156687156688156689156690156691156692156693156694156695156696156697156698156699156700156701156702156703156704156705156706156707156708156709156710156711156712156713156714156715156716156717156718156719156720156721156722156723156724156725156726156727156728156729156730156731156732156733156734156735156736156737156738156739156740156741156742156743156744156745156746156747156748156749156750156751156752156753156754156755156756156757156758156759156760156761156762156763156764156765156766156767156768156769156770156771156772156773156774156775156776156777156778156779156780156781156782156783156784156785156786156787156788156789156790156791156792156793156794156795156796156797156798156799156800156801156802156803156804156805156806156807156808156809156810156811156812156813156814156815156816156817156818156819156820156821156822156823156824156825156826156827156828156829156830156831156832156833156834156835156836156837156838156839156840156841156842156843156844156845156846156847156848156849156850156851156852156853156854156855156856156857156858156859156860156861156862156863156864156865156866156867156868156869156870156871156872156873156874156875156876156877156878156879156880156881156882156883156884156885156886156887156888156889156890156891156892156893156894156895156896156897156898156899156900156901156902156903156904156905156906156907156908156909156910156911156912156913156914156915156916156917156918156919156920156921156922156923156924156925156926156927156928156929156930156931156932156933156934156935156936156937156938156939156940156941156942156943156944156945156946156947156948156949156950156951156952156953156954156955156956156957156958156959156960156961156962156963156964156965156966156967156968156969156970156971156972156973156974156975156976156977156978156979156980156981156982156983156984156985156986156987156988156989156990156991156992156993156994156995156996156997156998156999157000157001157002157003157004157005157006157007157008157009157010157011157012157013157014157015157016157017157018157019157020157021157022157023157024157025157026157027157028157029157030157031157032157033157034157035157036157037157038157039157040157041157042157043157044157045157046157047157048157049157050157051157052157053157054157055157056157057157058157059157060157061157062157063157064157065157066157067157068157069157070157071157072157073157074157075157076157077157078157079157080157081157082157083157084157085157086157087157088157089157090157091157092157093157094157095157096157097157098157099157100157101157102157103157104157105157106157107157108157109157110157111157112157113157114157115157116157117157118157119157120157121157122157123157124157125157126157127157128157129157130157131157132157133157134157135157136157137157138157139157140157141157142157143157144157145157146157147157148157149157150157151157152157153157154157155157156157157157158157159157160157161157162157163157164157165157166157167157168157169157170157171157172157173157174157175157176157177157178157179157180157181157182157183157184157185157186157187157188157189157190157191157192157193157194157195157196157197157198157199157200157201157202157203157204157205157206157207157208157209157210157211157212157213157214157215157216157217157218157219157220157221157222157223157224157225157226157227157228157229157230157231157232157233157234157235157236157237157238157239157240157241157242157243157244157245157246157247157248157249157250157251157252157253157254157255157256157257157258157259157260157261157262157263157264157265157266157267157268157269157270157271157272157273157274157275157276157277157278157279157280157281157282157283157284157285157286157287157288157289157290157291157292157293157294157295157296157297157298157299157300157301157302157303157304157305157306157307157308157309157310157311157312157313157314157315157316157317157318157319157320157321157322157323157324157325157326157327157328157329157330157331157332157333157334157335157336157337157338157339157340157341157342157343157344157345157346157347157348157349157350157351157352157353157354157355157356157357157358157359157360157361157362157363157364157365157366157367157368157369157370157371157372157373157374157375157376157377157378157379157380157381157382157383157384157385157386157387157388157389157390157391157392157393157394157395157396157397157398157399157400157401157402157403157404157405157406157407157408157409157410157411157412157413157414157415157416157417157418157419157420157421157422157423157424157425157426157427157428157429157430157431157432157433157434157435157436157437157438157439157440157441157442157443157444157445157446157447157448157449157450157451157452157453157454157455157456157457157458157459157460157461157462157463157464157465157466157467157468157469157470157471157472157473157474157475157476157477157478157479157480157481157482157483157484157485157486157487157488157489157490157491157492157493157494157495157496157497157498157499157500157501157502157503157504157505157506157507157508157509157510157511157512157513157514157515157516157517157518157519157520157521157522157523157524157525157526157527157528157529157530157531157532157533157534157535157536157537157538157539157540157541157542157543157544157545157546157547157548157549157550157551157552157553157554157555157556157557157558157559157560157561157562157563157564157565157566157567157568157569157570157571157572157573157574157575157576157577157578157579157580157581157582157583157584157585157586157587157588157589157590157591157592157593157594157595157596157597157598157599157600157601157602157603157604157605157606157607157608157609157610157611157612157613157614157615157616157617157618157619157620157621157622157623157624157625157626157627157628157629157630157631157632157633157634157635157636157637157638157639157640157641157642157643157644157645157646157647157648157649157650157651157652157653157654157655157656157657157658157659157660157661157662157663157664157665157666157667157668157669157670157671157672157673157674157675157676157677157678157679157680157681157682157683157684157685157686157687157688157689157690157691157692157693157694157695157696157697157698157699157700157701157702157703157704157705157706157707157708157709157710157711157712157713157714157715157716157717157718157719157720157721157722157723157724157725157726157727157728157729157730157731157732157733157734157735157736157737157738157739157740157741157742157743157744157745157746157747157748157749157750157751157752157753157754157755157756157757157758157759157760157761157762157763157764157765157766157767157768157769157770157771157772157773157774157775157776157777157778157779157780157781157782157783157784157785157786157787157788157789157790157791157792157793157794157795157796157797157798157799157800157801157802157803157804157805157806157807157808157809157810157811157812157813157814157815157816157817157818157819157820157821157822157823157824157825157826157827157828157829157830157831157832157833157834157835157836157837157838157839157840157841157842157843157844157845157846157847157848157849157850157851157852157853157854157855157856157857157858157859157860157861157862157863157864157865157866157867157868157869157870157871157872157873157874157875157876157877157878157879157880157881157882157883157884157885157886157887157888157889157890157891157892157893157894157895157896157897157898157899157900157901157902157903157904157905157906157907157908157909157910157911157912157913157914157915157916157917157918157919157920157921157922157923157924157925157926157927157928157929157930157931157932157933157934157935157936157937157938157939157940157941157942157943157944157945157946157947157948157949157950157951157952157953157954157955157956157957157958157959157960157961157962157963157964157965157966157967157968157969157970157971157972157973157974157975157976157977157978157979157980157981157982157983157984157985157986157987157988157989157990157991157992157993157994157995157996157997157998157999158000158001158002158003158004158005158006158007158008158009158010158011158012158013158014158015158016158017158018158019158020158021158022158023158024158025158026158027158028158029158030158031158032158033158034158035158036158037158038158039158040158041158042158043158044158045158046158047158048158049158050158051158052158053158054158055158056158057158058158059158060158061158062158063158064158065158066158067158068158069158070158071158072158073158074158075158076158077158078158079158080158081158082158083158084158085158086158087158088158089158090158091158092158093158094158095158096158097158098158099158100158101158102158103158104158105158106158107158108158109158110158111158112158113158114158115158116158117158118158119158120158121158122158123158124158125158126158127158128158129158130158131158132158133158134158135158136158137158138158139158140158141158142158143158144158145158146158147158148158149158150158151158152158153158154158155158156158157158158158159158160158161158162158163158164158165158166158167158168158169158170158171158172158173158174158175158176158177158178158179158180158181158182158183158184158185158186158187158188158189158190158191158192158193158194158195158196158197158198158199158200158201158202158203158204158205158206158207158208158209158210158211158212158213158214158215158216158217158218158219158220158221158222158223158224158225158226158227158228158229158230158231158232158233158234158235158236158237158238158239158240158241158242158243158244158245158246158247158248158249158250158251158252158253158254158255158256158257158258158259158260158261158262158263158264158265158266158267158268158269158270158271158272158273158274158275158276158277158278158279158280158281158282158283158284158285158286158287158288158289158290158291158292158293158294158295158296158297158298158299158300158301158302158303158304158305158306158307158308158309158310158311158312158313158314158315158316158317158318158319158320158321158322158323158324158325158326158327158328158329158330158331158332158333158334158335158336158337158338158339158340158341158342158343158344158345158346158347158348158349158350158351158352158353158354158355158356158357158358158359158360158361158362158363158364158365158366158367158368158369158370158371158372158373158374158375158376158377158378158379158380158381158382158383158384158385158386158387158388158389158390158391158392158393158394158395158396158397158398158399158400158401158402158403158404158405158406158407158408158409158410158411158412158413158414158415158416158417158418158419158420158421158422158423158424158425158426158427158428158429158430158431158432158433158434158435158436158437158438158439158440158441158442158443158444158445158446158447158448158449158450158451158452158453158454158455158456158457158458158459158460158461158462158463158464158465158466158467158468158469158470158471158472158473158474158475158476158477158478158479158480158481158482158483158484158485158486158487158488158489158490158491158492158493158494158495158496158497158498158499158500158501158502158503158504158505158506158507158508158509158510158511158512158513158514158515158516158517158518158519158520158521158522158523158524158525158526158527158528158529158530158531158532158533158534158535158536158537158538158539158540158541158542158543158544158545158546158547158548158549158550158551158552158553158554158555158556158557158558158559158560158561158562158563158564158565158566158567158568158569158570158571158572158573158574158575158576158577158578158579158580158581158582158583158584158585158586158587158588158589158590158591158592158593158594158595158596158597158598158599158600158601158602158603158604158605158606158607158608158609158610158611158612158613158614158615158616158617158618158619158620158621158622158623158624158625158626158627158628158629158630158631158632158633158634158635158636158637158638158639158640158641158642158643158644158645158646158647158648158649158650158651158652158653158654158655158656158657158658158659158660158661158662158663158664158665158666158667158668158669158670158671158672158673158674158675158676158677158678158679158680158681158682158683158684158685158686158687158688158689158690158691158692158693158694158695158696158697158698158699158700158701158702158703158704158705158706158707158708158709158710158711158712158713158714158715158716158717158718158719158720158721158722158723158724158725158726158727158728158729158730158731158732158733158734158735158736158737158738158739158740158741158742158743158744158745158746158747158748158749158750158751158752158753158754158755158756158757158758158759158760158761158762158763158764158765158766158767158768158769158770158771158772158773158774158775158776158777158778158779158780158781158782158783158784158785158786158787158788158789158790158791158792158793158794158795158796158797158798158799158800158801158802158803158804158805158806158807158808158809158810158811158812158813158814158815158816158817158818158819158820158821158822158823158824158825158826158827158828158829158830158831158832158833158834158835158836158837158838158839158840158841158842158843158844158845158846158847158848158849158850158851158852158853158854158855158856158857158858158859158860158861158862158863158864158865158866158867158868158869158870158871158872158873158874158875158876158877158878158879158880158881158882158883158884158885158886158887158888158889158890158891158892158893158894158895158896158897158898158899158900158901158902158903158904158905158906158907158908158909158910158911158912158913158914158915158916158917158918158919158920158921158922158923158924158925158926158927158928158929158930158931158932158933158934158935158936158937158938158939158940158941158942158943158944158945158946158947158948158949158950158951158952158953158954158955158956158957158958158959158960158961158962158963158964158965158966158967158968158969158970158971158972158973158974158975158976158977158978158979158980158981158982158983158984158985158986158987158988158989158990158991158992158993158994158995158996158997158998158999159000159001159002159003159004159005159006159007159008159009159010159011159012159013159014159015159016159017159018159019159020159021159022159023159024159025159026159027159028159029159030159031159032159033159034159035159036159037159038159039159040159041159042159043159044159045159046159047159048159049159050159051159052159053159054159055159056159057159058159059159060159061159062159063159064159065159066159067159068159069159070159071159072159073159074159075159076159077159078159079159080159081159082159083159084159085159086159087159088159089159090159091159092159093159094159095159096159097159098159099159100159101159102159103159104159105159106159107159108159109159110159111159112159113159114159115159116159117159118159119159120159121159122159123159124159125159126159127159128159129159130159131159132159133159134159135159136159137159138159139159140159141159142159143159144159145159146159147159148159149159150159151159152159153159154159155159156159157159158159159159160159161159162159163159164159165159166159167159168159169159170159171159172159173159174159175159176159177159178159179159180159181159182159183159184159185159186159187159188159189159190159191159192159193159194159195159196159197159198159199159200159201159202159203159204159205159206159207159208159209159210159211159212159213159214159215159216159217159218159219159220159221159222159223159224159225159226159227159228159229159230159231159232159233159234159235159236159237159238159239159240159241159242159243159244159245159246159247159248159249159250159251159252159253159254159255159256159257159258159259159260159261159262159263159264159265159266159267159268159269159270159271159272159273159274159275159276159277159278159279159280159281159282159283159284159285159286159287159288159289159290159291159292159293159294159295159296159297159298159299159300159301159302159303159304159305159306159307159308159309159310159311159312159313159314159315159316159317159318159319159320159321159322159323159324159325159326159327159328159329159330159331159332159333159334159335159336159337159338159339159340159341159342159343159344159345159346159347159348159349159350159351159352159353159354159355159356159357159358159359159360159361159362159363159364159365159366159367159368159369159370159371159372159373159374159375159376159377159378159379159380159381159382159383159384159385159386159387159388159389159390159391159392159393159394159395159396159397159398159399159400159401159402159403159404159405159406159407159408159409159410159411159412159413159414159415159416159417159418159419159420159421159422159423159424159425159426159427159428159429159430159431159432159433159434159435159436159437159438159439159440159441159442159443159444159445159446159447159448159449159450159451159452159453159454159455159456159457159458159459159460159461159462159463159464159465159466159467159468159469159470159471159472159473159474159475159476159477159478159479159480159481159482159483159484159485159486159487159488159489159490159491159492159493159494159495159496159497159498159499159500159501159502159503159504159505159506159507159508159509159510159511159512159513159514159515159516159517159518159519159520159521159522159523159524159525159526159527159528159529159530159531159532159533159534159535159536159537159538159539159540159541159542159543159544159545159546159547159548159549159550159551159552159553159554159555159556159557159558159559159560159561159562159563159564159565159566159567159568159569159570159571159572159573159574159575159576159577159578159579159580159581159582159583159584159585159586159587159588159589159590159591159592159593159594159595159596159597159598159599159600159601159602159603159604159605159606159607159608159609159610159611159612159613159614159615159616159617159618159619159620159621159622159623159624159625159626159627159628159629159630159631159632159633159634159635159636159637159638159639159640159641159642159643159644159645159646159647159648159649159650159651159652159653159654159655159656159657159658159659159660159661159662159663159664159665159666159667159668159669159670159671159672159673159674159675159676159677159678159679159680159681159682159683159684159685159686159687159688159689159690159691159692159693159694159695159696159697159698159699159700159701159702159703159704159705159706159707159708159709159710159711159712159713159714159715159716159717159718159719159720159721159722159723159724159725159726159727159728159729159730159731159732159733159734159735159736159737159738159739159740159741159742159743159744159745159746159747159748159749159750159751159752159753159754159755159756159757159758159759159760159761159762159763159764159765159766159767159768159769159770159771159772159773159774159775159776159777159778159779159780159781159782159783159784159785159786159787159788159789159790159791159792159793159794159795159796159797159798159799159800159801159802159803159804159805159806159807159808159809159810159811159812159813159814159815159816159817159818159819159820159821159822159823159824159825159826159827159828159829159830159831159832159833159834159835159836159837159838159839159840159841159842159843159844159845159846159847159848159849159850159851159852159853159854159855159856159857159858159859159860159861159862159863159864159865159866159867159868159869159870159871159872159873159874159875159876159877159878159879159880159881159882159883159884159885159886159887159888159889159890159891159892159893159894159895159896159897159898159899159900159901159902159903159904159905159906159907159908159909159910159911159912159913159914159915159916159917159918159919159920159921159922159923159924159925159926159927159928159929159930159931159932159933159934159935159936159937159938159939159940159941159942159943159944159945159946159947159948159949159950159951159952159953159954159955159956159957159958159959159960159961159962159963159964159965159966159967159968159969159970159971159972159973159974159975159976159977159978159979159980159981159982159983159984159985159986159987159988159989159990159991159992159993159994159995159996159997159998159999160000160001160002160003160004160005160006160007160008160009160010160011160012160013160014160015160016160017160018160019160020160021160022160023160024160025160026160027160028160029160030160031160032160033160034160035160036160037160038160039160040160041160042160043160044160045160046160047160048160049160050160051160052160053160054160055160056160057160058160059160060160061160062160063160064160065160066160067160068160069160070160071160072160073160074160075160076160077160078160079160080160081160082160083160084160085160086160087160088160089160090160091160092160093160094160095160096160097160098160099160100160101160102160103160104160105160106160107160108160109160110160111160112160113160114160115160116160117160118160119160120160121160122160123160124160125160126160127160128160129160130160131160132160133160134160135160136160137160138160139160140160141160142160143160144160145160146160147160148160149160150160151160152160153160154160155160156160157160158160159160160160161160162160163160164160165160166160167160168160169160170160171160172160173160174160175160176160177160178160179160180160181160182160183160184160185160186160187160188160189160190160191160192160193160194160195160196160197160198160199160200160201160202160203160204160205160206160207160208160209160210160211160212160213160214160215160216160217160218160219160220160221160222160223160224160225160226160227160228160229160230160231160232160233160234160235160236160237160238160239160240160241160242160243160244160245160246160247160248160249160250160251160252160253160254160255160256160257160258160259160260160261160262160263160264160265160266160267160268160269160270160271160272160273160274160275160276160277160278160279160280160281160282160283160284160285160286160287160288160289160290160291160292160293160294160295160296160297160298160299160300160301160302160303160304160305160306160307160308160309160310160311160312160313160314160315160316160317160318160319160320160321160322160323160324160325160326160327160328160329160330160331160332160333160334160335160336160337160338160339160340160341160342160343160344160345160346160347160348160349160350160351160352160353160354160355160356160357160358160359160360160361160362160363160364160365160366160367160368160369160370160371160372160373160374160375160376160377160378160379160380160381160382160383160384160385160386160387160388160389160390160391160392160393160394160395160396160397160398160399160400160401160402160403160404160405160406160407160408160409160410160411160412160413160414160415160416160417160418160419160420160421160422160423160424160425160426160427160428160429160430160431160432160433160434160435160436160437160438160439160440160441160442160443160444160445160446160447160448160449160450160451160452160453160454160455160456160457160458160459160460160461160462160463160464160465160466160467160468160469160470160471160472160473160474160475160476160477160478160479160480160481160482160483160484160485160486160487160488160489160490160491160492160493160494160495160496160497160498160499160500160501160502160503160504160505160506160507160508160509160510160511160512160513160514160515160516160517160518160519160520160521160522160523160524160525160526160527160528160529160530160531160532160533160534160535160536160537160538160539160540160541160542160543160544160545160546160547160548160549160550160551160552160553160554160555160556160557160558160559160560160561160562160563160564160565160566160567160568160569160570160571160572160573160574160575160576160577160578160579160580160581160582160583160584160585160586160587160588160589160590160591160592160593160594160595160596160597160598160599160600160601160602160603160604160605160606160607160608160609160610160611160612160613160614160615160616160617160618160619160620160621160622160623160624160625160626160627160628160629160630160631160632160633160634160635160636160637160638160639160640160641160642160643160644160645160646160647160648160649160650160651160652160653160654160655160656160657160658160659160660160661160662160663160664160665160666160667160668160669160670160671160672160673160674160675160676160677160678160679160680160681160682160683160684160685160686160687160688160689160690160691160692160693160694160695160696160697160698160699160700160701160702160703160704160705160706160707160708160709160710160711160712160713160714160715160716160717160718160719160720160721160722160723160724160725160726160727160728160729160730160731160732160733160734160735160736160737160738160739160740160741160742160743160744160745160746160747160748160749160750160751160752160753160754160755160756160757160758160759
  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, {
  50. /******/ configurable: false,
  51. /******/ enumerable: true,
  52. /******/ get: getter
  53. /******/ });
  54. /******/ }
  55. /******/ };
  56. /******/
  57. /******/ // define __esModule on exports
  58. /******/ __webpack_require__.r = function(exports) {
  59. /******/ Object.defineProperty(exports, '__esModule', { value: true });
  60. /******/ };
  61. /******/
  62. /******/ // getDefaultExport function for compatibility with non-harmony modules
  63. /******/ __webpack_require__.n = function(module) {
  64. /******/ var getter = module && module.__esModule ?
  65. /******/ function getDefault() { return module['default']; } :
  66. /******/ function getModuleExports() { return module; };
  67. /******/ __webpack_require__.d(getter, 'a', getter);
  68. /******/ return getter;
  69. /******/ };
  70. /******/
  71. /******/ // Object.prototype.hasOwnProperty.call
  72. /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  73. /******/
  74. /******/ // __webpack_public_path__
  75. /******/ __webpack_require__.p = "";
  76. /******/
  77. /******/
  78. /******/ // Load entry module and return exports
  79. /******/ return __webpack_require__(__webpack_require__.s = 1075);
  80. /******/ })
  81. /************************************************************************/
  82. /******/ ([
  83. /* 0 */
  84. /***/ (function(module, exports) {
  85. /**
  86. * @author Richard Davey <rich@photonstorm.com>
  87. * @copyright 2018 Photon Storm Ltd.
  88. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89. */
  90. // Taken from klasse by mattdesl https://github.com/mattdesl/klasse
  91. function hasGetterOrSetter (def)
  92. {
  93. return (!!def.get && typeof def.get === 'function') || (!!def.set && typeof def.set === 'function');
  94. }
  95. function getProperty (definition, k, isClassDescriptor)
  96. {
  97. // This may be a lightweight object, OR it might be a property that was defined previously.
  98. // For simple class descriptors we can just assume its NOT previously defined.
  99. var def = (isClassDescriptor) ? definition[k] : Object.getOwnPropertyDescriptor(definition, k);
  100. if (!isClassDescriptor && def.value && typeof def.value === 'object')
  101. {
  102. def = def.value;
  103. }
  104. // This might be a regular property, or it may be a getter/setter the user defined in a class.
  105. if (def && hasGetterOrSetter(def))
  106. {
  107. if (typeof def.enumerable === 'undefined')
  108. {
  109. def.enumerable = true;
  110. }
  111. if (typeof def.configurable === 'undefined')
  112. {
  113. def.configurable = true;
  114. }
  115. return def;
  116. }
  117. else
  118. {
  119. return false;
  120. }
  121. }
  122. function hasNonConfigurable (obj, k)
  123. {
  124. var prop = Object.getOwnPropertyDescriptor(obj, k);
  125. if (!prop)
  126. {
  127. return false;
  128. }
  129. if (prop.value && typeof prop.value === 'object')
  130. {
  131. prop = prop.value;
  132. }
  133. if (prop.configurable === false)
  134. {
  135. return true;
  136. }
  137. return false;
  138. }
  139. function extend (ctor, definition, isClassDescriptor, extend)
  140. {
  141. for (var k in definition)
  142. {
  143. if (!definition.hasOwnProperty(k))
  144. {
  145. continue;
  146. }
  147. var def = getProperty(definition, k, isClassDescriptor);
  148. if (def !== false)
  149. {
  150. // If Extends is used, we will check its prototype to see if the final variable exists.
  151. var parent = extend || ctor;
  152. if (hasNonConfigurable(parent.prototype, k))
  153. {
  154. // Just skip the final property
  155. if (Class.ignoreFinals)
  156. {
  157. continue;
  158. }
  159. // We cannot re-define a property that is configurable=false.
  160. // So we will consider them final and throw an error. This is by
  161. // default so it is clear to the developer what is happening.
  162. // You can set ignoreFinals to true if you need to extend a class
  163. // which has configurable=false; it will simply not re-define final properties.
  164. throw new Error('cannot override final property \'' + k + '\', set Class.ignoreFinals = true to skip');
  165. }
  166. Object.defineProperty(ctor.prototype, k, def);
  167. }
  168. else
  169. {
  170. ctor.prototype[k] = definition[k];
  171. }
  172. }
  173. }
  174. function mixin (myClass, mixins)
  175. {
  176. if (!mixins)
  177. {
  178. return;
  179. }
  180. if (!Array.isArray(mixins))
  181. {
  182. mixins = [ mixins ];
  183. }
  184. for (var i = 0; i < mixins.length; i++)
  185. {
  186. extend(myClass, mixins[i].prototype || mixins[i]);
  187. }
  188. }
  189. /**
  190. * Creates a new class with the given descriptor.
  191. * The constructor, defined by the name `initialize`,
  192. * is an optional function. If unspecified, an anonymous
  193. * function will be used which calls the parent class (if
  194. * one exists).
  195. *
  196. * You can also use `Extends` and `Mixins` to provide subclassing
  197. * and inheritance.
  198. *
  199. * @class Class
  200. * @constructor
  201. * @param {Object} definition a dictionary of functions for the class
  202. * @example
  203. *
  204. * var MyClass = new Phaser.Class({
  205. *
  206. * initialize: function() {
  207. * this.foo = 2.0;
  208. * },
  209. *
  210. * bar: function() {
  211. * return this.foo + 5;
  212. * }
  213. * });
  214. */
  215. function Class (definition)
  216. {
  217. if (!definition)
  218. {
  219. definition = {};
  220. }
  221. // The variable name here dictates what we see in Chrome debugger
  222. var initialize;
  223. var Extends;
  224. if (definition.initialize)
  225. {
  226. if (typeof definition.initialize !== 'function')
  227. {
  228. throw new Error('initialize must be a function');
  229. }
  230. initialize = definition.initialize;
  231. // Usually we should avoid 'delete' in V8 at all costs.
  232. // However, its unlikely to make any performance difference
  233. // here since we only call this on class creation (i.e. not object creation).
  234. delete definition.initialize;
  235. }
  236. else if (definition.Extends)
  237. {
  238. var base = definition.Extends;
  239. initialize = function ()
  240. {
  241. base.apply(this, arguments);
  242. };
  243. }
  244. else
  245. {
  246. initialize = function () {};
  247. }
  248. if (definition.Extends)
  249. {
  250. initialize.prototype = Object.create(definition.Extends.prototype);
  251. initialize.prototype.constructor = initialize;
  252. // For getOwnPropertyDescriptor to work, we need to act directly on the Extends (or Mixin)
  253. Extends = definition.Extends;
  254. delete definition.Extends;
  255. }
  256. else
  257. {
  258. initialize.prototype.constructor = initialize;
  259. }
  260. // Grab the mixins, if they are specified...
  261. var mixins = null;
  262. if (definition.Mixins)
  263. {
  264. mixins = definition.Mixins;
  265. delete definition.Mixins;
  266. }
  267. // First, mixin if we can.
  268. mixin(initialize, mixins);
  269. // Now we grab the actual definition which defines the overrides.
  270. extend(initialize, definition, true, Extends);
  271. return initialize;
  272. }
  273. Class.extend = extend;
  274. Class.mixin = mixin;
  275. Class.ignoreFinals = false;
  276. module.exports = Class;
  277. /***/ }),
  278. /* 1 */
  279. /***/ (function(module, exports) {
  280. /**
  281. * @author Richard Davey <rich@photonstorm.com>
  282. * @copyright 2018 Photon Storm Ltd.
  283. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  284. */
  285. /**
  286. * Finds the key within the top level of the {@link source} object, or returns {@link defaultValue}
  287. *
  288. * @function Phaser.Utils.Object.GetFastValue
  289. * @since 3.0.0
  290. *
  291. * @param {object} source - The object to search
  292. * @param {string} key - The key for the property on source. Must exist at the top level of the source object (no periods)
  293. * @param {*} [defaultValue] - The default value to use if the key does not exist.
  294. *
  295. * @return {*} The value if found; otherwise, defaultValue (null if none provided)
  296. */
  297. var GetFastValue = function (source, key, defaultValue)
  298. {
  299. var t = typeof(source);
  300. if (!source || t === 'number' || t === 'string')
  301. {
  302. return defaultValue;
  303. }
  304. else if (source.hasOwnProperty(key) && source[key] !== undefined)
  305. {
  306. return source[key];
  307. }
  308. else
  309. {
  310. return defaultValue;
  311. }
  312. };
  313. module.exports = GetFastValue;
  314. /***/ }),
  315. /* 2 */
  316. /***/ (function(module, exports, __webpack_require__) {
  317. /**
  318. * @author Richard Davey <rich@photonstorm.com>
  319. * @copyright 2018 Photon Storm Ltd.
  320. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  321. */
  322. var Class = __webpack_require__(0);
  323. var Components = __webpack_require__(17);
  324. var DataManager = __webpack_require__(81);
  325. var EventEmitter = __webpack_require__(9);
  326. /**
  327. * @classdesc
  328. * The base class that all Game Objects extend.
  329. * You don't create GameObjects directly and they cannot be added to the display list.
  330. * Instead, use them as the base for your own custom classes.
  331. *
  332. * @class GameObject
  333. * @memberOf Phaser.GameObjects
  334. * @extends Phaser.Events.EventEmitter
  335. * @constructor
  336. * @since 3.0.0
  337. *
  338. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs.
  339. * @param {string} type - A textual representation of the type of Game Object, i.e. `sprite`.
  340. */
  341. var GameObject = new Class({
  342. Extends: EventEmitter,
  343. initialize:
  344. function GameObject (scene, type)
  345. {
  346. EventEmitter.call(this);
  347. /**
  348. * The Scene to which this Game Object belongs.
  349. * Game Objects can only belong to one Scene.
  350. *
  351. * @name Phaser.GameObjects.GameObject#scene
  352. * @type {Phaser.Scene}
  353. * @protected
  354. * @since 3.0.0
  355. */
  356. this.scene = scene;
  357. /**
  358. * A textual representation of this Game Object, i.e. `sprite`.
  359. * Used internally by Phaser but is available for your own custom classes to populate.
  360. *
  361. * @name Phaser.GameObjects.GameObject#type
  362. * @type {string}
  363. * @since 3.0.0
  364. */
  365. this.type = type;
  366. /**
  367. * The parent Container of this Game Object, if it has one.
  368. *
  369. * @name Phaser.GameObjects.GameObject#parentContainer
  370. * @type {Phaser.GameObjects.Container}
  371. * @since 3.4.0
  372. */
  373. this.parentContainer = null;
  374. /**
  375. * The name of this Game Object.
  376. * Empty by default and never populated by Phaser, this is left for developers to use.
  377. *
  378. * @name Phaser.GameObjects.GameObject#name
  379. * @type {string}
  380. * @default ''
  381. * @since 3.0.0
  382. */
  383. this.name = '';
  384. /**
  385. * The active state of this Game Object.
  386. * A Game Object with an active state of `true` is processed by the Scenes UpdateList, if added to it.
  387. * An active object is one which is having its logic and internal systems updated.
  388. *
  389. * @name Phaser.GameObjects.GameObject#active
  390. * @type {boolean}
  391. * @default true
  392. * @since 3.0.0
  393. */
  394. this.active = true;
  395. /**
  396. * The Tab Index of the Game Object.
  397. * Reserved for future use by plugins and the Input Manager.
  398. *
  399. * @name Phaser.GameObjects.GameObject#tabIndex
  400. * @type {integer}
  401. * @default -1
  402. * @since 3.0.0
  403. */
  404. this.tabIndex = -1;
  405. /**
  406. * A Data Manager.
  407. * It allows you to store, query and get key/value paired information specific to this Game Object.
  408. * `null` by default. Automatically created if you use `getData` or `setData` or `setDataEnabled`.
  409. *
  410. * @name Phaser.GameObjects.GameObject#data
  411. * @type {Phaser.Data.DataManager}
  412. * @default null
  413. * @since 3.0.0
  414. */
  415. this.data = null;
  416. /**
  417. * The flags that are compared against `RENDER_MASK` to determine if this Game Object will render or not.
  418. * The bits are 0001 | 0010 | 0100 | 1000 set by the components Visible, Alpha, Transform and Texture respectively.
  419. * If those components are not used by your custom class then you can use this bitmask as you wish.
  420. *
  421. * @name Phaser.GameObjects.GameObject#renderFlags
  422. * @type {integer}
  423. * @default 15
  424. * @since 3.0.0
  425. */
  426. this.renderFlags = 15;
  427. /**
  428. * A bitmask that controls if this Game Object is drawn by a Camera or not.
  429. * Not usually set directly, instead call `Camera.ignore`, however you can
  430. * set this property directly using the Camera.id property:
  431. *
  432. * @example
  433. * this.cameraFilter |= camera.id
  434. *
  435. * @name Phaser.GameObjects.GameObject#cameraFilter
  436. * @type {number}
  437. * @default 0
  438. * @since 3.0.0
  439. */
  440. this.cameraFilter = 0;
  441. /**
  442. * If this Game Object is enabled for input then this property will contain an InteractiveObject instance.
  443. * Not usually set directly. Instead call `GameObject.setInteractive()`.
  444. *
  445. * @name Phaser.GameObjects.GameObject#input
  446. * @type {?Phaser.Input.InteractiveObject}
  447. * @default null
  448. * @since 3.0.0
  449. */
  450. this.input = null;
  451. /**
  452. * If this Game Object is enabled for physics then this property will contain a reference to a Physics Body.
  453. *
  454. * @name Phaser.GameObjects.GameObject#body
  455. * @type {?(object|Phaser.Physics.Arcade.Body|Phaser.Physics.Impact.Body)}
  456. * @default null
  457. * @since 3.0.0
  458. */
  459. this.body = null;
  460. /**
  461. * This Game Object will ignore all calls made to its destroy method if this flag is set to `true`.
  462. * This includes calls that may come from a Group, Container or the Scene itself.
  463. * While it allows you to persist a Game Object across Scenes, please understand you are entirely
  464. * responsible for managing references to and from this Game Object.
  465. *
  466. * @name Phaser.GameObjects.GameObject#ignoreDestroy
  467. * @type {boolean}
  468. * @default false
  469. * @since 3.5.0
  470. */
  471. this.ignoreDestroy = false;
  472. // Tell the Scene to re-sort the children
  473. scene.sys.queueDepthSort();
  474. scene.sys.events.once('shutdown', this.destroy, this);
  475. },
  476. /**
  477. * Sets the `active` property of this Game Object and returns this Game Object for further chaining.
  478. * A Game Object with its `active` property set to `true` will be updated by the Scenes UpdateList.
  479. *
  480. * @method Phaser.GameObjects.GameObject#setActive
  481. * @since 3.0.0
  482. *
  483. * @param {boolean} value - True if this Game Object should be set as active, false if not.
  484. *
  485. * @return {this} This GameObject.
  486. */
  487. setActive: function (value)
  488. {
  489. this.active = value;
  490. return this;
  491. },
  492. /**
  493. * Sets the `name` property of this Game Object and returns this Game Object for further chaining.
  494. * The `name` property is not populated by Phaser and is presented for your own use.
  495. *
  496. * @method Phaser.GameObjects.GameObject#setName
  497. * @since 3.0.0
  498. *
  499. * @param {string} value - The name to be given to this Game Object.
  500. *
  501. * @return {this} This GameObject.
  502. */
  503. setName: function (value)
  504. {
  505. this.name = value;
  506. return this;
  507. },
  508. /**
  509. * Adds a Data Manager component to this Game Object.
  510. *
  511. * @method Phaser.GameObjects.GameObject#setDataEnabled
  512. * @since 3.0.0
  513. * @see Phaser.Data.DataManager
  514. *
  515. * @return {this} This GameObject.
  516. */
  517. setDataEnabled: function ()
  518. {
  519. if (!this.data)
  520. {
  521. this.data = new DataManager(this);
  522. }
  523. return this;
  524. },
  525. /**
  526. * Allows you to store a key value pair within this Game Objects Data Manager.
  527. *
  528. * If the Game Object has not been enabled for data (via `setDataEnabled`) then it will be enabled
  529. * before setting the value.
  530. *
  531. * If the key doesn't already exist in the Data Manager then it is created.
  532. *
  533. * ```javascript
  534. * sprite.setData('name', 'Red Gem Stone');
  535. * ```
  536. *
  537. * You can also pass in an object of key value pairs as the first argument:
  538. *
  539. * ```javascript
  540. * sprite.setData({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 });
  541. * ```
  542. *
  543. * To get a value back again you can call `getData`:
  544. *
  545. * ```javascript
  546. * sprite.getData('gold');
  547. * ```
  548. *
  549. * Or you can access the value directly via the `values` property, where it works like any other variable:
  550. *
  551. * ```javascript
  552. * sprite.data.values.gold += 50;
  553. * ```
  554. *
  555. * When the value is first set, a `setdata` event is emitted from this Game Object.
  556. *
  557. * If the key already exists, a `changedata` event is emitted instead, along an event named after the key.
  558. * For example, if you updated an existing key called `PlayerLives` then it would emit the event `changedata_PlayerLives`.
  559. * These events will be emitted regardless if you use this method to set the value, or the direct `values` setter.
  560. *
  561. * Please note that the data keys are case-sensitive and must be valid JavaScript Object property strings.
  562. * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager.
  563. *
  564. * @method Phaser.GameObjects.GameObject#setData
  565. * @since 3.0.0
  566. *
  567. * @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.
  568. * @param {*} data - The value to set for the given key. If an object is provided as the key this argument is ignored.
  569. *
  570. * @return {this} This GameObject.
  571. */
  572. setData: function (key, value)
  573. {
  574. if (!this.data)
  575. {
  576. this.data = new DataManager(this);
  577. }
  578. this.data.set(key, value);
  579. return this;
  580. },
  581. /**
  582. * Retrieves the value for the given key in this Game Objects Data Manager, or undefined if it doesn't exist.
  583. *
  584. * You can also access values via the `values` object. For example, if you had a key called `gold` you can do either:
  585. *
  586. * ```javascript
  587. * sprite.getData('gold');
  588. * ```
  589. *
  590. * Or access the value directly:
  591. *
  592. * ```javascript
  593. * sprite.data.values.gold;
  594. * ```
  595. *
  596. * You can also pass in an array of keys, in which case an array of values will be returned:
  597. *
  598. * ```javascript
  599. * sprite.getData([ 'gold', 'armor', 'health' ]);
  600. * ```
  601. *
  602. * This approach is useful for destructuring arrays in ES6.
  603. *
  604. * @method Phaser.GameObjects.GameObject#getData
  605. * @since 3.0.0
  606. *
  607. * @param {(string|string[])} key - The key of the value to retrieve, or an array of keys.
  608. *
  609. * @return {*} The value belonging to the given key, or an array of values, the order of which will match the input array.
  610. */
  611. getData: function (key)
  612. {
  613. if (!this.data)
  614. {
  615. this.data = new DataManager(this);
  616. }
  617. return this.data.get(key);
  618. },
  619. /**
  620. * Pass this Game Object to the Input Manager to enable it for Input.
  621. *
  622. * Input works by using hit areas, these are nearly always geometric shapes, such as rectangles or circles, that act as the hit area
  623. * for the Game Object. However, you can provide your own hit area shape and callback, should you wish to handle some more advanced
  624. * input detection.
  625. *
  626. * 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
  627. * 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
  628. * shape for it to use.
  629. *
  630. * You can also provide an Input Configuration Object as the only argument to this method.
  631. *
  632. * @method Phaser.GameObjects.GameObject#setInteractive
  633. * @since 3.0.0
  634. *
  635. * @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.
  636. * @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.
  637. * @param {boolean} [dropZone=false] - Should this Game Object be treated as a drop zone target?
  638. *
  639. * @return {this} This GameObject.
  640. */
  641. setInteractive: function (shape, callback, dropZone)
  642. {
  643. this.scene.sys.input.enable(this, shape, callback, dropZone);
  644. return this;
  645. },
  646. /**
  647. * If this Game Object has previously been enabled for input, this will disable it.
  648. *
  649. * An object that is disabled for input stops processing or being considered for
  650. * input events, but can be turned back on again at any time by simply calling
  651. * `setInteractive()` with no arguments provided.
  652. *
  653. * If want to completely remove interaction from this Game Object then use `removeInteractive` instead.
  654. *
  655. * @method Phaser.GameObjects.GameObject#disableInteractive
  656. * @since 3.7.0
  657. *
  658. * @return {this} This GameObject.
  659. */
  660. disableInteractive: function ()
  661. {
  662. if (this.input)
  663. {
  664. this.input.enabled = false;
  665. }
  666. return this;
  667. },
  668. /**
  669. * If this Game Object has previously been enabled for input, this will remove it.
  670. *
  671. * The Interactive Object that was assigned to this Game Object will be destroyed,
  672. * removed from the Input Manager and cleared from this Game Object.
  673. *
  674. * If you wish to re-enable this Game Object at a later date you will need to
  675. * re-create its InteractiveOobject by calling `setInteractive` again.
  676. *
  677. * If you wish to only temporarily stop an object from receiving input then use
  678. * `disableInteractive` instead, as that toggles the interactive state, where-as
  679. * this erases it completely.
  680. *
  681. * @method Phaser.GameObjects.GameObject#removeInteractive
  682. * @since 3.7.0
  683. *
  684. * @return {this} This GameObject.
  685. */
  686. removeInteractive: function ()
  687. {
  688. this.scene.sys.input.clear(this);
  689. this.input = undefined;
  690. return this;
  691. },
  692. /**
  693. * To be overridden by custom GameObjects. Allows base objects to be used in a Pool.
  694. *
  695. * @method Phaser.GameObjects.GameObject#update
  696. * @since 3.0.0
  697. */
  698. update: function ()
  699. {
  700. },
  701. /**
  702. * Returns a JSON representation of the Game Object.
  703. *
  704. * @method Phaser.GameObjects.GameObject#toJSON
  705. * @since 3.0.0
  706. *
  707. * @return {JSONGameObject} A JSON representation of the Game Object.
  708. */
  709. toJSON: function ()
  710. {
  711. return Components.ToJSON(this);
  712. },
  713. /**
  714. * Compares the renderMask with the renderFlags to see if this Game Object will render or not.
  715. *
  716. * @method Phaser.GameObjects.GameObject#willRender
  717. * @since 3.0.0
  718. *
  719. * @return {boolean} True if the Game Object should be rendered, otherwise false.
  720. */
  721. willRender: function ()
  722. {
  723. return (GameObject.RENDER_MASK === this.renderFlags);
  724. },
  725. /**
  726. * Returns an array containing the display list index of either this Game Object, or if it has one,
  727. * its parent Container. It then iterates up through all of the parent containers until it hits the
  728. * root of the display list (which is index 0 in the returned array).
  729. *
  730. * Used internally by the InputPlugin but also useful if you wish to find out the display depth of
  731. * this Game Object and all of its ancestors.
  732. *
  733. * @method Phaser.GameObjects.GameObject#getIndexList
  734. * @since 3.4.0
  735. *
  736. * @return {integer[]} An array of display list position indexes.
  737. */
  738. getIndexList: function ()
  739. {
  740. // eslint-disable-next-line consistent-this
  741. var child = this;
  742. var parent = this.parentContainer;
  743. var indexes = [];
  744. while (parent)
  745. {
  746. // indexes.unshift([parent.getIndex(child), parent.name]);
  747. indexes.unshift(parent.getIndex(child));
  748. child = parent;
  749. if (!parent.parentContainer)
  750. {
  751. break;
  752. }
  753. else
  754. {
  755. parent = parent.parentContainer;
  756. }
  757. }
  758. // indexes.unshift([this.scene.sys.displayList.getIndex(child), 'root']);
  759. indexes.unshift(this.scene.sys.displayList.getIndex(child));
  760. return indexes;
  761. },
  762. /**
  763. * Destroys this Game Object removing it from the Display List and Update List and
  764. * severing all ties to parent resources.
  765. *
  766. * Also removes itself from the Input Manager and Physics Manager if previously enabled.
  767. *
  768. * Use this to remove a Game Object from your game if you don't ever plan to use it again.
  769. * As long as no reference to it exists within your own code it should become free for
  770. * garbage collection by the browser.
  771. *
  772. * If you just want to temporarily disable an object then look at using the
  773. * Game Object Pool instead of destroying it, as destroyed objects cannot be resurrected.
  774. *
  775. * @method Phaser.GameObjects.GameObject#destroy
  776. * @since 3.0.0
  777. */
  778. destroy: function ()
  779. {
  780. // This Game Object had already been destroyed
  781. if (!this.scene || this.ignoreDestroy)
  782. {
  783. return;
  784. }
  785. if (this.preDestroy)
  786. {
  787. this.preDestroy.call(this);
  788. }
  789. this.emit('destroy', this);
  790. var sys = this.scene.sys;
  791. sys.displayList.remove(this);
  792. sys.updateList.remove(this);
  793. if (this.input)
  794. {
  795. sys.input.clear(this);
  796. this.input = undefined;
  797. }
  798. if (this.data)
  799. {
  800. this.data.destroy();
  801. this.data = undefined;
  802. }
  803. if (this.body)
  804. {
  805. this.body.destroy();
  806. this.body = undefined;
  807. }
  808. // Tell the Scene to re-sort the children
  809. sys.queueDepthSort();
  810. this.active = false;
  811. this.visible = false;
  812. this.scene = undefined;
  813. this.parentContainer = undefined;
  814. this.removeAllListeners();
  815. }
  816. });
  817. /**
  818. * The bitmask that `GameObject.renderFlags` is compared against to determine if the Game Object will render or not.
  819. *
  820. * @constant {integer} RENDER_MASK
  821. * @memberOf Phaser.GameObjects.GameObject
  822. * @default
  823. */
  824. GameObject.RENDER_MASK = 15;
  825. module.exports = GameObject;
  826. /***/ }),
  827. /* 3 */
  828. /***/ (function(module, exports) {
  829. /**
  830. * @author Richard Davey <rich@photonstorm.com>
  831. * @copyright 2018 Photon Storm Ltd.
  832. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  833. */
  834. /**
  835. * A NOOP (No Operation) callback function.
  836. *
  837. * Used internally by Phaser when it's more expensive to determine if a callback exists
  838. * than it is to just invoke an empty function.
  839. *
  840. * @function Phaser.Utils.NOOP
  841. * @since 3.0.0
  842. */
  843. var NOOP = function ()
  844. {
  845. // NOOP
  846. };
  847. module.exports = NOOP;
  848. /***/ }),
  849. /* 4 */
  850. /***/ (function(module, exports) {
  851. /**
  852. * @author Richard Davey <rich@photonstorm.com>
  853. * @copyright 2018 Photon Storm Ltd.
  854. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  855. */
  856. // Source object
  857. // The key as a string, or an array of keys, i.e. 'banner', or 'banner.hideBanner'
  858. // The default value to use if the key doesn't exist
  859. /**
  860. * [description]
  861. *
  862. * @function Phaser.Utils.Object.GetValue
  863. * @since 3.0.0
  864. *
  865. * @param {object} source - [description]
  866. * @param {string} key - [description]
  867. * @param {*} defaultValue - [description]
  868. *
  869. * @return {*} [description]
  870. */
  871. var GetValue = function (source, key, defaultValue)
  872. {
  873. if (!source || typeof source === 'number')
  874. {
  875. return defaultValue;
  876. }
  877. else if (source.hasOwnProperty(key))
  878. {
  879. return source[key];
  880. }
  881. else if (key.indexOf('.'))
  882. {
  883. var keys = key.split('.');
  884. var parent = source;
  885. var value = defaultValue;
  886. // Use for loop here so we can break early
  887. for (var i = 0; i < keys.length; i++)
  888. {
  889. if (parent.hasOwnProperty(keys[i]))
  890. {
  891. // Yes it has a key property, let's carry on down
  892. value = parent[keys[i]];
  893. parent = parent[keys[i]];
  894. }
  895. else
  896. {
  897. // Can't go any further, so reset to default
  898. value = defaultValue;
  899. break;
  900. }
  901. }
  902. return value;
  903. }
  904. else
  905. {
  906. return defaultValue;
  907. }
  908. };
  909. module.exports = GetValue;
  910. /***/ }),
  911. /* 5 */
  912. /***/ (function(module, exports, __webpack_require__) {
  913. /**
  914. * @author Richard Davey <rich@photonstorm.com>
  915. * @copyright 2018 Photon Storm Ltd.
  916. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  917. */
  918. var Class = __webpack_require__(0);
  919. /**
  920. * @classdesc
  921. * Defines a Point in 2D space, with an x and y component.
  922. *
  923. * @class Point
  924. * @memberOf Phaser.Geom
  925. * @constructor
  926. * @since 3.0.0
  927. *
  928. * @param {number} [x=0] - The x coordinate of this Point.
  929. * @param {number} [y=x] - The y coordinate of this Point.
  930. */
  931. var Point = new Class({
  932. initialize:
  933. function Point (x, y)
  934. {
  935. if (x === undefined) { x = 0; }
  936. if (y === undefined) { y = x; }
  937. /**
  938. * The x coordinate of this Point.
  939. *
  940. * @name Phaser.Geom.Point#x
  941. * @type {number}
  942. * @default 0
  943. * @since 3.0.0
  944. */
  945. this.x = x;
  946. /**
  947. * The y coordinate of this Point.
  948. *
  949. * @name Phaser.Geom.Point#y
  950. * @type {number}
  951. * @default 0
  952. * @since 3.0.0
  953. */
  954. this.y = y;
  955. },
  956. /**
  957. * Set the x and y coordinates of the point to the given values.
  958. *
  959. * @method Phaser.Geom.Point#setTo
  960. * @since 3.0.0
  961. *
  962. * @param {number} [x=0] - The x coordinate of this Point.
  963. * @param {number} [y=x] - The y coordinate of this Point.
  964. *
  965. * @return {Phaser.Geom.Point} This Point object.
  966. */
  967. setTo: function (x, y)
  968. {
  969. if (x === undefined) { x = 0; }
  970. if (y === undefined) { y = x; }
  971. this.x = x;
  972. this.y = y;
  973. return this;
  974. }
  975. });
  976. module.exports = Point;
  977. /***/ }),
  978. /* 6 */
  979. /***/ (function(module, exports, __webpack_require__) {
  980. /**
  981. * @author Richard Davey <rich@photonstorm.com>
  982. * @copyright 2018 Photon Storm Ltd.
  983. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  984. */
  985. // Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji
  986. // and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl
  987. var Class = __webpack_require__(0);
  988. /**
  989. * @typedef {object} Vector2Like
  990. *
  991. * @property {number} x - The x component.
  992. * @property {number} y - The y component.
  993. */
  994. /**
  995. * @classdesc
  996. * A representation of a vector in 2D space.
  997. *
  998. * A two-component vector.
  999. *
  1000. * @class Vector2
  1001. * @memberOf Phaser.Math
  1002. * @constructor
  1003. * @since 3.0.0
  1004. *
  1005. * @param {number} [x] - The x component.
  1006. * @param {number} [y] - The y component.
  1007. */
  1008. var Vector2 = new Class({
  1009. initialize:
  1010. function Vector2 (x, y)
  1011. {
  1012. /**
  1013. * The x component of this Vector.
  1014. *
  1015. * @name Phaser.Math.Vector2#x
  1016. * @type {number}
  1017. * @default 0
  1018. * @since 3.0.0
  1019. */
  1020. this.x = 0;
  1021. /**
  1022. * The y component of this Vector.
  1023. *
  1024. * @name Phaser.Math.Vector2#y
  1025. * @type {number}
  1026. * @default 0
  1027. * @since 3.0.0
  1028. */
  1029. this.y = 0;
  1030. if (typeof x === 'object')
  1031. {
  1032. this.x = x.x || 0;
  1033. this.y = x.y || 0;
  1034. }
  1035. else
  1036. {
  1037. if (y === undefined) { y = x; }
  1038. this.x = x || 0;
  1039. this.y = y || 0;
  1040. }
  1041. },
  1042. /**
  1043. * Make a clone of this Vector2.
  1044. *
  1045. * @method Phaser.Math.Vector2#clone
  1046. * @since 3.0.0
  1047. *
  1048. * @return {Phaser.Math.Vector2} A clone of this Vector2.
  1049. */
  1050. clone: function ()
  1051. {
  1052. return new Vector2(this.x, this.y);
  1053. },
  1054. /**
  1055. * Copy the components of a given Vector into this Vector.
  1056. *
  1057. * @method Phaser.Math.Vector2#copy
  1058. * @since 3.0.0
  1059. *
  1060. * @param {Phaser.Math.Vector2} src - The Vector to copy the components from.
  1061. *
  1062. * @return {Phaser.Math.Vector2} This Vector2.
  1063. */
  1064. copy: function (src)
  1065. {
  1066. this.x = src.x || 0;
  1067. this.y = src.y || 0;
  1068. return this;
  1069. },
  1070. /**
  1071. * Set the component values of this Vector from a given Vector2Like object.
  1072. *
  1073. * @method Phaser.Math.Vector2#setFromObject
  1074. * @since 3.0.0
  1075. *
  1076. * @param {Vector2Like} obj - The object containing the component values to set for this Vector.
  1077. *
  1078. * @return {Phaser.Math.Vector2} This Vector2.
  1079. */
  1080. setFromObject: function (obj)
  1081. {
  1082. this.x = obj.x || 0;
  1083. this.y = obj.y || 0;
  1084. return this;
  1085. },
  1086. /**
  1087. * Set the `x` and `y` components of the this Vector to the given `x` and `y` values.
  1088. *
  1089. * @method Phaser.Math.Vector2#set
  1090. * @since 3.0.0
  1091. *
  1092. * @param {number} x - The x value to set for this Vector.
  1093. * @param {number} [y=x] - The y value to set for this Vector.
  1094. *
  1095. * @return {Phaser.Math.Vector2} This Vector2.
  1096. */
  1097. set: function (x, y)
  1098. {
  1099. if (y === undefined) { y = x; }
  1100. this.x = x;
  1101. this.y = y;
  1102. return this;
  1103. },
  1104. /**
  1105. * This method is an alias for `Vector2.set`.
  1106. *
  1107. * @method Phaser.Math.Vector2#setTo
  1108. * @since 3.4.0
  1109. *
  1110. * @param {number} x - The x value to set for this Vector.
  1111. * @param {number} [y=x] - The y value to set for this Vector.
  1112. *
  1113. * @return {Phaser.Math.Vector2} This Vector2.
  1114. */
  1115. setTo: function (x, y)
  1116. {
  1117. return this.set(x, y);
  1118. },
  1119. /**
  1120. * Sets the `x` and `y` values of this object from a given polar coordinate.
  1121. *
  1122. * @method Phaser.Math.Vector2#setToPolar
  1123. * @since 3.0.0
  1124. *
  1125. * @param {number} azimuth - The angular coordinate, in radians.
  1126. * @param {number} [radius=1] - The radial coordinate (length).
  1127. *
  1128. * @return {Phaser.Math.Vector2} This Vector2.
  1129. */
  1130. setToPolar: function (azimuth, radius)
  1131. {
  1132. if (radius == null) { radius = 1; }
  1133. this.x = Math.cos(azimuth) * radius;
  1134. this.y = Math.sin(azimuth) * radius;
  1135. return this;
  1136. },
  1137. /**
  1138. * Check whether this Vector is equal to a given Vector.
  1139. *
  1140. * Performs a strict equality check against each Vector's components.
  1141. *
  1142. * @method Phaser.Math.Vector2#equals
  1143. * @since 3.0.0
  1144. *
  1145. * @param {Phaser.Math.Vector2} v - The vector to compare with this Vector.
  1146. *
  1147. * @return {boolean} Whether the given Vector is equal to this Vector.
  1148. */
  1149. equals: function (v)
  1150. {
  1151. return ((this.x === v.x) && (this.y === v.y));
  1152. },
  1153. /**
  1154. * Calculate the angle between this Vector and the positive x-axis, in radians.
  1155. *
  1156. * @method Phaser.Math.Vector2#angle
  1157. * @since 3.0.0
  1158. *
  1159. * @return {number} The angle between this Vector, and the positive x-axis, given in radians.
  1160. */
  1161. angle: function ()
  1162. {
  1163. // computes the angle in radians with respect to the positive x-axis
  1164. var angle = Math.atan2(this.y, this.x);
  1165. if (angle < 0)
  1166. {
  1167. angle += 2 * Math.PI;
  1168. }
  1169. return angle;
  1170. },
  1171. /**
  1172. * Add a given Vector to this Vector. Addition is component-wise.
  1173. *
  1174. * @method Phaser.Math.Vector2#add
  1175. * @since 3.0.0
  1176. *
  1177. * @param {Phaser.Math.Vector2} src - The Vector to add to this Vector.
  1178. *
  1179. * @return {Phaser.Math.Vector2} This Vector2.
  1180. */
  1181. add: function (src)
  1182. {
  1183. this.x += src.x;
  1184. this.y += src.y;
  1185. return this;
  1186. },
  1187. /**
  1188. * Subtract the given Vector from this Vector. Subtraction is component-wise.
  1189. *
  1190. * @method Phaser.Math.Vector2#subtract
  1191. * @since 3.0.0
  1192. *
  1193. * @param {Phaser.Math.Vector2} src - The Vector to subtract from this Vector.
  1194. *
  1195. * @return {Phaser.Math.Vector2} This Vector2.
  1196. */
  1197. subtract: function (src)
  1198. {
  1199. this.x -= src.x;
  1200. this.y -= src.y;
  1201. return this;
  1202. },
  1203. /**
  1204. * Perform a component-wise multiplication between this Vector and the given Vector.
  1205. *
  1206. * Multiplies this Vector by the given Vector.
  1207. *
  1208. * @method Phaser.Math.Vector2#multiply
  1209. * @since 3.0.0
  1210. *
  1211. * @param {Phaser.Math.Vector2} src - The Vector to multiply this Vector by.
  1212. *
  1213. * @return {Phaser.Math.Vector2} This Vector2.
  1214. */
  1215. multiply: function (src)
  1216. {
  1217. this.x *= src.x;
  1218. this.y *= src.y;
  1219. return this;
  1220. },
  1221. /**
  1222. * Scale this Vector by the given value.
  1223. *
  1224. * @method Phaser.Math.Vector2#scale
  1225. * @since 3.0.0
  1226. *
  1227. * @param {number} value - The value to scale this Vector by.
  1228. *
  1229. * @return {Phaser.Math.Vector2} This Vector2.
  1230. */
  1231. scale: function (value)
  1232. {
  1233. if (isFinite(value))
  1234. {
  1235. this.x *= value;
  1236. this.y *= value;
  1237. }
  1238. else
  1239. {
  1240. this.x = 0;
  1241. this.y = 0;
  1242. }
  1243. return this;
  1244. },
  1245. /**
  1246. * Perform a component-wise division between this Vector and the given Vector.
  1247. *
  1248. * Divides this Vector by the given Vector.
  1249. *
  1250. * @method Phaser.Math.Vector2#divide
  1251. * @since 3.0.0
  1252. *
  1253. * @param {Phaser.Math.Vector2} src - The Vector to divide this Vector by.
  1254. *
  1255. * @return {Phaser.Math.Vector2} This Vector2.
  1256. */
  1257. divide: function (src)
  1258. {
  1259. this.x /= src.x;
  1260. this.y /= src.y;
  1261. return this;
  1262. },
  1263. /**
  1264. * Negate the `x` and `y` components of this Vector.
  1265. *
  1266. * @method Phaser.Math.Vector2#negate
  1267. * @since 3.0.0
  1268. *
  1269. * @return {Phaser.Math.Vector2} This Vector2.
  1270. */
  1271. negate: function ()
  1272. {
  1273. this.x = -this.x;
  1274. this.y = -this.y;
  1275. return this;
  1276. },
  1277. /**
  1278. * Calculate the distance between this Vector and the given Vector.
  1279. *
  1280. * @method Phaser.Math.Vector2#distance
  1281. * @since 3.0.0
  1282. *
  1283. * @param {Phaser.Math.Vector2} src - The Vector to calculate the distance to.
  1284. *
  1285. * @return {number} The distance from this Vector to the given Vector.
  1286. */
  1287. distance: function (src)
  1288. {
  1289. var dx = src.x - this.x;
  1290. var dy = src.y - this.y;
  1291. return Math.sqrt(dx * dx + dy * dy);
  1292. },
  1293. /**
  1294. * Calculate the distance between this Vector and the given Vector, squared.
  1295. *
  1296. * @method Phaser.Math.Vector2#distanceSq
  1297. * @since 3.0.0
  1298. *
  1299. * @param {Phaser.Math.Vector2} src - The Vector to calculate the distance to.
  1300. *
  1301. * @return {number} The distance from this Vector to the given Vector, squared.
  1302. */
  1303. distanceSq: function (src)
  1304. {
  1305. var dx = src.x - this.x;
  1306. var dy = src.y - this.y;
  1307. return dx * dx + dy * dy;
  1308. },
  1309. /**
  1310. * Calculate the length (or magnitude) of this Vector.
  1311. *
  1312. * @method Phaser.Math.Vector2#length
  1313. * @since 3.0.0
  1314. *
  1315. * @return {number} The length of this Vector.
  1316. */
  1317. length: function ()
  1318. {
  1319. var x = this.x;
  1320. var y = this.y;
  1321. return Math.sqrt(x * x + y * y);
  1322. },
  1323. /**
  1324. * Calculate the length of this Vector squared.
  1325. *
  1326. * @method Phaser.Math.Vector2#lengthSq
  1327. * @since 3.0.0
  1328. *
  1329. * @return {number} The length of this Vector, squared.
  1330. */
  1331. lengthSq: function ()
  1332. {
  1333. var x = this.x;
  1334. var y = this.y;
  1335. return x * x + y * y;
  1336. },
  1337. /**
  1338. * Normalize this Vector.
  1339. *
  1340. * Makes the vector a unit length vector (magnitude of 1) in the same direction.
  1341. *
  1342. * @method Phaser.Math.Vector2#normalize
  1343. * @since 3.0.0
  1344. *
  1345. * @return {Phaser.Math.Vector2} This Vector2.
  1346. */
  1347. normalize: function ()
  1348. {
  1349. var x = this.x;
  1350. var y = this.y;
  1351. var len = x * x + y * y;
  1352. if (len > 0)
  1353. {
  1354. len = 1 / Math.sqrt(len);
  1355. this.x = x * len;
  1356. this.y = y * len;
  1357. }
  1358. return this;
  1359. },
  1360. /**
  1361. * Right-hand normalize (make unit length) this Vector.
  1362. *
  1363. * @method Phaser.Math.Vector2#normalizeRightHand
  1364. * @since 3.0.0
  1365. *
  1366. * @return {Phaser.Math.Vector2} This Vector2.
  1367. */
  1368. normalizeRightHand: function ()
  1369. {
  1370. var x = this.x;
  1371. this.x = this.y * -1;
  1372. this.y = x;
  1373. return this;
  1374. },
  1375. /**
  1376. * Calculate the dot product of this Vector and the given Vector.
  1377. *
  1378. * @method Phaser.Math.Vector2#dot
  1379. * @since 3.0.0
  1380. *
  1381. * @param {Phaser.Math.Vector2} src - The Vector2 to dot product with this Vector2.
  1382. *
  1383. * @return {number} The dot product of this Vector and the given Vector.
  1384. */
  1385. dot: function (src)
  1386. {
  1387. return this.x * src.x + this.y * src.y;
  1388. },
  1389. /**
  1390. * [description]
  1391. *
  1392. * @method Phaser.Math.Vector2#cross
  1393. * @since 3.0.0
  1394. *
  1395. * @param {Phaser.Math.Vector2} src - [description]
  1396. *
  1397. * @return {number} [description]
  1398. */
  1399. cross: function (src)
  1400. {
  1401. return this.x * src.y - this.y * src.x;
  1402. },
  1403. /**
  1404. * Linearly interpolate between this Vector and the given Vector.
  1405. *
  1406. * Interpolates this Vector towards the given Vector.
  1407. *
  1408. * @method Phaser.Math.Vector2#lerp
  1409. * @since 3.0.0
  1410. *
  1411. * @param {Phaser.Math.Vector2} src - The Vector2 to interpolate towards.
  1412. * @param {number} [t=0] - The interpolation percentage, between 0 and 1.
  1413. *
  1414. * @return {Phaser.Math.Vector2} This Vector2.
  1415. */
  1416. lerp: function (src, t)
  1417. {
  1418. if (t === undefined) { t = 0; }
  1419. var ax = this.x;
  1420. var ay = this.y;
  1421. this.x = ax + t * (src.x - ax);
  1422. this.y = ay + t * (src.y - ay);
  1423. return this;
  1424. },
  1425. /**
  1426. * Transform this Vector with the given Matrix.
  1427. *
  1428. * @method Phaser.Math.Vector2#transformMat3
  1429. * @since 3.0.0
  1430. *
  1431. * @param {Phaser.Math.Matrix3} mat - The Matrix3 to transform this Vector2 with.
  1432. *
  1433. * @return {Phaser.Math.Vector2} This Vector2.
  1434. */
  1435. transformMat3: function (mat)
  1436. {
  1437. var x = this.x;
  1438. var y = this.y;
  1439. var m = mat.val;
  1440. this.x = m[0] * x + m[3] * y + m[6];
  1441. this.y = m[1] * x + m[4] * y + m[7];
  1442. return this;
  1443. },
  1444. /**
  1445. * Transform this Vector with the given Matrix.
  1446. *
  1447. * @method Phaser.Math.Vector2#transformMat4
  1448. * @since 3.0.0
  1449. *
  1450. * @param {Phaser.Math.Matrix4} mat - The Matrix4 to transform this Vector2 with.
  1451. *
  1452. * @return {Phaser.Math.Vector2} This Vector2.
  1453. */
  1454. transformMat4: function (mat)
  1455. {
  1456. var x = this.x;
  1457. var y = this.y;
  1458. var m = mat.val;
  1459. this.x = m[0] * x + m[4] * y + m[12];
  1460. this.y = m[1] * x + m[5] * y + m[13];
  1461. return this;
  1462. },
  1463. /**
  1464. * Make this Vector the zero vector (0, 0).
  1465. *
  1466. * @method Phaser.Math.Vector2#reset
  1467. * @since 3.0.0
  1468. *
  1469. * @return {Phaser.Math.Vector2} This Vector2.
  1470. */
  1471. reset: function ()
  1472. {
  1473. this.x = 0;
  1474. this.y = 0;
  1475. return this;
  1476. }
  1477. });
  1478. /**
  1479. * A static zero Vector2 for use by reference.
  1480. *
  1481. * @method Phaser.Math.Vector2.ZERO
  1482. * @since 3.1.0
  1483. */
  1484. Vector2.ZERO = new Vector2();
  1485. module.exports = Vector2;
  1486. /***/ }),
  1487. /* 7 */
  1488. /***/ (function(module, exports) {
  1489. /**
  1490. * @author Richard Davey <rich@photonstorm.com>
  1491. * @copyright 2018 Photon Storm Ltd.
  1492. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  1493. */
  1494. var types = {};
  1495. var FileTypesManager = {
  1496. /**
  1497. * Static method called when a LoaderPlugin is created.
  1498. *
  1499. * Loops through the local types object and injects all of them as
  1500. * properties into the LoaderPlugin instance.
  1501. *
  1502. * @method Phaser.Loader.FileTypesManager.register
  1503. * @since 3.0.0
  1504. *
  1505. * @param {Phaser.Loader.LoaderPlugin} loader - The LoaderPlugin to install the types into.
  1506. */
  1507. install: function (loader)
  1508. {
  1509. for (var key in types)
  1510. {
  1511. loader[key] = types[key];
  1512. }
  1513. },
  1514. /**
  1515. * Static method called directly by the File Types.
  1516. *
  1517. * The key is a reference to the function used to load the files via the Loader, i.e. `image`.
  1518. *
  1519. * @method Phaser.Loader.FileTypesManager.register
  1520. * @since 3.0.0
  1521. *
  1522. * @param {string} key - The key that will be used as the method name in the LoaderPlugin.
  1523. * @param {function} factoryFunction - The function that will be called when LoaderPlugin.key is invoked.
  1524. */
  1525. register: function (key, factoryFunction)
  1526. {
  1527. types[key] = factoryFunction;
  1528. },
  1529. /**
  1530. * Removed all associated file types.
  1531. *
  1532. * @method Phaser.Loader.FileTypesManager.destroy
  1533. * @since 3.0.0
  1534. */
  1535. destroy: function ()
  1536. {
  1537. types = {};
  1538. }
  1539. };
  1540. module.exports = FileTypesManager;
  1541. /***/ }),
  1542. /* 8 */
  1543. /***/ (function(module, exports) {
  1544. /**
  1545. * @author Richard Davey <rich@photonstorm.com>
  1546. * @copyright 2018 Photon Storm Ltd.
  1547. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  1548. */
  1549. /**
  1550. * This is a slightly modified version of jQuery.isPlainObject.
  1551. * A plain object is an object whose internal class property is [object Object].
  1552. *
  1553. * @function Phaser.Utils.Object.IsPlainObject
  1554. * @since 3.0.0
  1555. *
  1556. * @param {object} obj - The object to inspect.
  1557. *
  1558. * @return {boolean} `true` if the object is plain, otherwise `false`.
  1559. */
  1560. var IsPlainObject = function (obj)
  1561. {
  1562. // Not plain objects:
  1563. // - Any object or value whose internal [[Class]] property is not "[object Object]"
  1564. // - DOM nodes
  1565. // - window
  1566. if (typeof(obj) !== 'object' || obj.nodeType || obj === obj.window)
  1567. {
  1568. return false;
  1569. }
  1570. // Support: Firefox <20
  1571. // The try/catch suppresses exceptions thrown when attempting to access
  1572. // the "constructor" property of certain host objects, ie. |window.location|
  1573. // https://bugzilla.mozilla.org/show_bug.cgi?id=814622
  1574. try
  1575. {
  1576. if (obj.constructor && !({}).hasOwnProperty.call(obj.constructor.prototype, 'isPrototypeOf'))
  1577. {
  1578. return false;
  1579. }
  1580. }
  1581. catch (e)
  1582. {
  1583. return false;
  1584. }
  1585. // If the function hasn't returned already, we're confident that
  1586. // |obj| is a plain object, created by {} or constructed with new Object
  1587. return true;
  1588. };
  1589. module.exports = IsPlainObject;
  1590. /***/ }),
  1591. /* 9 */
  1592. /***/ (function(module, exports, __webpack_require__) {
  1593. "use strict";
  1594. var has = Object.prototype.hasOwnProperty
  1595. , prefix = '~';
  1596. /**
  1597. * Constructor to create a storage for our `EE` objects.
  1598. * An `Events` instance is a plain object whose properties are event names.
  1599. *
  1600. * @constructor
  1601. * @private
  1602. */
  1603. function Events() {}
  1604. //
  1605. // We try to not inherit from `Object.prototype`. In some engines creating an
  1606. // instance in this way is faster than calling `Object.create(null)` directly.
  1607. // If `Object.create(null)` is not supported we prefix the event names with a
  1608. // character to make sure that the built-in object properties are not
  1609. // overridden or used as an attack vector.
  1610. //
  1611. if (Object.create) {
  1612. Events.prototype = Object.create(null);
  1613. //
  1614. // This hack is needed because the `__proto__` property is still inherited in
  1615. // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
  1616. //
  1617. if (!new Events().__proto__) prefix = false;
  1618. }
  1619. /**
  1620. * Representation of a single event listener.
  1621. *
  1622. * @param {Function} fn The listener function.
  1623. * @param {*} context The context to invoke the listener with.
  1624. * @param {Boolean} [once=false] Specify if the listener is a one-time listener.
  1625. * @constructor
  1626. * @private
  1627. */
  1628. function EE(fn, context, once) {
  1629. this.fn = fn;
  1630. this.context = context;
  1631. this.once = once || false;
  1632. }
  1633. /**
  1634. * Add a listener for a given event.
  1635. *
  1636. * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
  1637. * @param {(String|Symbol)} event The event name.
  1638. * @param {Function} fn The listener function.
  1639. * @param {*} context The context to invoke the listener with.
  1640. * @param {Boolean} once Specify if the listener is a one-time listener.
  1641. * @returns {EventEmitter}
  1642. * @private
  1643. */
  1644. function addListener(emitter, event, fn, context, once) {
  1645. if (typeof fn !== 'function') {
  1646. throw new TypeError('The listener must be a function');
  1647. }
  1648. var listener = new EE(fn, context || emitter, once)
  1649. , evt = prefix ? prefix + event : event;
  1650. if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
  1651. else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
  1652. else emitter._events[evt] = [emitter._events[evt], listener];
  1653. return emitter;
  1654. }
  1655. /**
  1656. * Clear event by name.
  1657. *
  1658. * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
  1659. * @param {(String|Symbol)} evt The Event name.
  1660. * @private
  1661. */
  1662. function clearEvent(emitter, evt) {
  1663. if (--emitter._eventsCount === 0) emitter._events = new Events();
  1664. else delete emitter._events[evt];
  1665. }
  1666. /**
  1667. * Minimal `EventEmitter` interface that is molded against the Node.js
  1668. * `EventEmitter` interface.
  1669. *
  1670. * @constructor
  1671. * @public
  1672. */
  1673. function EventEmitter() {
  1674. this._events = new Events();
  1675. this._eventsCount = 0;
  1676. }
  1677. /**
  1678. * Return an array listing the events for which the emitter has registered
  1679. * listeners.
  1680. *
  1681. * @returns {Array}
  1682. * @public
  1683. */
  1684. EventEmitter.prototype.eventNames = function eventNames() {
  1685. var names = []
  1686. , events
  1687. , name;
  1688. if (this._eventsCount === 0) return names;
  1689. for (name in (events = this._events)) {
  1690. if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
  1691. }
  1692. if (Object.getOwnPropertySymbols) {
  1693. return names.concat(Object.getOwnPropertySymbols(events));
  1694. }
  1695. return names;
  1696. };
  1697. /**
  1698. * Return the listeners registered for a given event.
  1699. *
  1700. * @param {(String|Symbol)} event The event name.
  1701. * @returns {Array} The registered listeners.
  1702. * @public
  1703. */
  1704. EventEmitter.prototype.listeners = function listeners(event) {
  1705. var evt = prefix ? prefix + event : event
  1706. , handlers = this._events[evt];
  1707. if (!handlers) return [];
  1708. if (handlers.fn) return [handlers.fn];
  1709. for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
  1710. ee[i] = handlers[i].fn;
  1711. }
  1712. return ee;
  1713. };
  1714. /**
  1715. * Return the number of listeners listening to a given event.
  1716. *
  1717. * @param {(String|Symbol)} event The event name.
  1718. * @returns {Number} The number of listeners.
  1719. * @public
  1720. */
  1721. EventEmitter.prototype.listenerCount = function listenerCount(event) {
  1722. var evt = prefix ? prefix + event : event
  1723. , listeners = this._events[evt];
  1724. if (!listeners) return 0;
  1725. if (listeners.fn) return 1;
  1726. return listeners.length;
  1727. };
  1728. /**
  1729. * Calls each of the listeners registered for a given event.
  1730. *
  1731. * @param {(String|Symbol)} event The event name.
  1732. * @returns {Boolean} `true` if the event had listeners, else `false`.
  1733. * @public
  1734. */
  1735. EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
  1736. var evt = prefix ? prefix + event : event;
  1737. if (!this._events[evt]) return false;
  1738. var listeners = this._events[evt]
  1739. , len = arguments.length
  1740. , args
  1741. , i;
  1742. if (listeners.fn) {
  1743. if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
  1744. switch (len) {
  1745. case 1: return listeners.fn.call(listeners.context), true;
  1746. case 2: return listeners.fn.call(listeners.context, a1), true;
  1747. case 3: return listeners.fn.call(listeners.context, a1, a2), true;
  1748. case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
  1749. case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
  1750. case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
  1751. }
  1752. for (i = 1, args = new Array(len -1); i < len; i++) {
  1753. args[i - 1] = arguments[i];
  1754. }
  1755. listeners.fn.apply(listeners.context, args);
  1756. } else {
  1757. var length = listeners.length
  1758. , j;
  1759. for (i = 0; i < length; i++) {
  1760. if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
  1761. switch (len) {
  1762. case 1: listeners[i].fn.call(listeners[i].context); break;
  1763. case 2: listeners[i].fn.call(listeners[i].context, a1); break;
  1764. case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
  1765. case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
  1766. default:
  1767. if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
  1768. args[j - 1] = arguments[j];
  1769. }
  1770. listeners[i].fn.apply(listeners[i].context, args);
  1771. }
  1772. }
  1773. }
  1774. return true;
  1775. };
  1776. /**
  1777. * Add a listener for a given event.
  1778. *
  1779. * @param {(String|Symbol)} event The event name.
  1780. * @param {Function} fn The listener function.
  1781. * @param {*} [context=this] The context to invoke the listener with.
  1782. * @returns {EventEmitter} `this`.
  1783. * @public
  1784. */
  1785. EventEmitter.prototype.on = function on(event, fn, context) {
  1786. return addListener(this, event, fn, context, false);
  1787. };
  1788. /**
  1789. * Add a one-time listener for a given event.
  1790. *
  1791. * @param {(String|Symbol)} event The event name.
  1792. * @param {Function} fn The listener function.
  1793. * @param {*} [context=this] The context to invoke the listener with.
  1794. * @returns {EventEmitter} `this`.
  1795. * @public
  1796. */
  1797. EventEmitter.prototype.once = function once(event, fn, context) {
  1798. return addListener(this, event, fn, context, true);
  1799. };
  1800. /**
  1801. * Remove the listeners of a given event.
  1802. *
  1803. * @param {(String|Symbol)} event The event name.
  1804. * @param {Function} fn Only remove the listeners that match this function.
  1805. * @param {*} context Only remove the listeners that have this context.
  1806. * @param {Boolean} once Only remove one-time listeners.
  1807. * @returns {EventEmitter} `this`.
  1808. * @public
  1809. */
  1810. EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
  1811. var evt = prefix ? prefix + event : event;
  1812. if (!this._events[evt]) return this;
  1813. if (!fn) {
  1814. clearEvent(this, evt);
  1815. return this;
  1816. }
  1817. var listeners = this._events[evt];
  1818. if (listeners.fn) {
  1819. if (
  1820. listeners.fn === fn &&
  1821. (!once || listeners.once) &&
  1822. (!context || listeners.context === context)
  1823. ) {
  1824. clearEvent(this, evt);
  1825. }
  1826. } else {
  1827. for (var i = 0, events = [], length = listeners.length; i < length; i++) {
  1828. if (
  1829. listeners[i].fn !== fn ||
  1830. (once && !listeners[i].once) ||
  1831. (context && listeners[i].context !== context)
  1832. ) {
  1833. events.push(listeners[i]);
  1834. }
  1835. }
  1836. //
  1837. // Reset the array, or remove it completely if we have no more listeners.
  1838. //
  1839. if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
  1840. else clearEvent(this, evt);
  1841. }
  1842. return this;
  1843. };
  1844. /**
  1845. * Remove all listeners, or those of the specified event.
  1846. *
  1847. * @param {(String|Symbol)} [event] The event name.
  1848. * @returns {EventEmitter} `this`.
  1849. * @public
  1850. */
  1851. EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
  1852. var evt;
  1853. if (event) {
  1854. evt = prefix ? prefix + event : event;
  1855. if (this._events[evt]) clearEvent(this, evt);
  1856. } else {
  1857. this._events = new Events();
  1858. this._eventsCount = 0;
  1859. }
  1860. return this;
  1861. };
  1862. //
  1863. // Alias methods names because people roll like that.
  1864. //
  1865. EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
  1866. EventEmitter.prototype.addListener = EventEmitter.prototype.on;
  1867. //
  1868. // Expose the prefix.
  1869. //
  1870. EventEmitter.prefixed = prefix;
  1871. //
  1872. // Allow `EventEmitter` to be imported as module namespace.
  1873. //
  1874. EventEmitter.EventEmitter = EventEmitter;
  1875. //
  1876. // Expose the module.
  1877. //
  1878. if (true) {
  1879. module.exports = EventEmitter;
  1880. }
  1881. /***/ }),
  1882. /* 10 */
  1883. /***/ (function(module, exports, __webpack_require__) {
  1884. /**
  1885. * @author Richard Davey <rich@photonstorm.com>
  1886. * @copyright 2018 Photon Storm Ltd.
  1887. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  1888. */
  1889. var MATH = __webpack_require__(15);
  1890. var GetValue = __webpack_require__(4);
  1891. // Allowed types:
  1892. // Implicit
  1893. // {
  1894. // x: 4
  1895. // }
  1896. //
  1897. // From function
  1898. // {
  1899. // x: function ()
  1900. // }
  1901. //
  1902. // Randomly pick one element from the array
  1903. // {
  1904. // x: [a, b, c, d, e, f]
  1905. // }
  1906. //
  1907. // Random integer between min and max:
  1908. // {
  1909. // x: { randInt: [min, max] }
  1910. // }
  1911. //
  1912. // Random float between min and max:
  1913. // {
  1914. // x: { randFloat: [min, max] }
  1915. // }
  1916. /**
  1917. * [description]
  1918. *
  1919. * @function Phaser.Utils.Object.GetAdvancedValue
  1920. * @since 3.0.0
  1921. *
  1922. * @param {object} source - [description]
  1923. * @param {string} key - [description]
  1924. * @param {*} defaultValue - [description]
  1925. *
  1926. * @return {*} [description]
  1927. */
  1928. var GetAdvancedValue = function (source, key, defaultValue)
  1929. {
  1930. var value = GetValue(source, key, null);
  1931. if (value === null)
  1932. {
  1933. return defaultValue;
  1934. }
  1935. else if (Array.isArray(value))
  1936. {
  1937. return MATH.RND.pick(value);
  1938. }
  1939. else if (typeof value === 'object')
  1940. {
  1941. if (value.hasOwnProperty('randInt'))
  1942. {
  1943. return MATH.RND.integerInRange(value.randInt[0], value.randInt[1]);
  1944. }
  1945. else if (value.hasOwnProperty('randFloat'))
  1946. {
  1947. return MATH.RND.realInRange(value.randFloat[0], value.randFloat[1]);
  1948. }
  1949. }
  1950. else if (typeof value === 'function')
  1951. {
  1952. return value(key);
  1953. }
  1954. return value;
  1955. };
  1956. module.exports = GetAdvancedValue;
  1957. /***/ }),
  1958. /* 11 */
  1959. /***/ (function(module, exports, __webpack_require__) {
  1960. /**
  1961. * @author Richard Davey <rich@photonstorm.com>
  1962. * @copyright 2018 Photon Storm Ltd.
  1963. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  1964. */
  1965. var Class = __webpack_require__(0);
  1966. var PluginCache = __webpack_require__(12);
  1967. /**
  1968. * @classdesc
  1969. * The Game Object Factory is a Scene plugin that allows you to quickly create many common
  1970. * types of Game Objects and have them automatically registered with the Scene.
  1971. *
  1972. * Game Objects directly register themselves with the Factory and inject their own creation
  1973. * methods into the class.
  1974. *
  1975. * @class GameObjectFactory
  1976. * @memberOf Phaser.GameObjects
  1977. * @constructor
  1978. * @since 3.0.0
  1979. *
  1980. * @param {Phaser.Scene} scene - The Scene to which this Game Object Factory belongs.
  1981. */
  1982. var GameObjectFactory = new Class({
  1983. initialize:
  1984. function GameObjectFactory (scene)
  1985. {
  1986. /**
  1987. * The Scene to which this Game Object Factory belongs.
  1988. *
  1989. * @name Phaser.GameObjects.GameObjectFactory#scene
  1990. * @type {Phaser.Scene}
  1991. * @protected
  1992. * @since 3.0.0
  1993. */
  1994. this.scene = scene;
  1995. /**
  1996. * A reference to the Scene.Systems.
  1997. *
  1998. * @name Phaser.GameObjects.GameObjectFactory#systems
  1999. * @type {Phaser.Scenes.Systems}
  2000. * @protected
  2001. * @since 3.0.0
  2002. */
  2003. this.systems = scene.sys;
  2004. /**
  2005. * A reference to the Scene Display List.
  2006. *
  2007. * @name Phaser.GameObjects.GameObjectFactory#displayList
  2008. * @type {Phaser.GameObjects.DisplayList}
  2009. * @protected
  2010. * @since 3.0.0
  2011. */
  2012. this.displayList;
  2013. /**
  2014. * A reference to the Scene Update List.
  2015. *
  2016. * @name Phaser.GameObjects.GameObjectFactory#updateList;
  2017. * @type {Phaser.GameObjects.UpdateList}
  2018. * @protected
  2019. * @since 3.0.0
  2020. */
  2021. this.updateList;
  2022. scene.sys.events.once('boot', this.boot, this);
  2023. scene.sys.events.on('start', this.start, this);
  2024. },
  2025. /**
  2026. * This method is called automatically, only once, when the Scene is first created.
  2027. * Do not invoke it directly.
  2028. *
  2029. * @method Phaser.GameObjects.GameObjectFactory#boot
  2030. * @private
  2031. * @since 3.5.1
  2032. */
  2033. boot: function ()
  2034. {
  2035. this.displayList = this.systems.displayList;
  2036. this.updateList = this.systems.updateList;
  2037. this.systems.events.once('destroy', this.destroy, this);
  2038. },
  2039. /**
  2040. * This method is called automatically by the Scene when it is starting up.
  2041. * It is responsible for creating local systems, properties and listening for Scene events.
  2042. * Do not invoke it directly.
  2043. *
  2044. * @method Phaser.GameObjects.GameObjectFactory#start
  2045. * @private
  2046. * @since 3.5.0
  2047. */
  2048. start: function ()
  2049. {
  2050. this.systems.events.once('shutdown', this.shutdown, this);
  2051. },
  2052. /**
  2053. * Adds an existing Game Object to this Scene.
  2054. *
  2055. * If the Game Object renders, it will be added to the Display List.
  2056. * If it has a `preUpdate` method, it will be added to the Update List.
  2057. *
  2058. * @method Phaser.GameObjects.GameObjectFactory#existing
  2059. * @since 3.0.0
  2060. *
  2061. * @param {Phaser.GameObjects.GameObject} child - The child to be added to this Scene.
  2062. *
  2063. * @return {Phaser.GameObjects.GameObject} The Game Object that was added.
  2064. */
  2065. existing: function (child)
  2066. {
  2067. if (child.renderCanvas || child.renderWebGL)
  2068. {
  2069. this.displayList.add(child);
  2070. }
  2071. if (child.preUpdate)
  2072. {
  2073. this.updateList.add(child);
  2074. }
  2075. return child;
  2076. },
  2077. /**
  2078. * The Scene that owns this plugin is shutting down.
  2079. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  2080. *
  2081. * @method Phaser.GameObjects.GameObjectFactory#shutdown
  2082. * @private
  2083. * @since 3.0.0
  2084. */
  2085. shutdown: function ()
  2086. {
  2087. this.systems.events.off('shutdown', this.shutdown, this);
  2088. },
  2089. /**
  2090. * The Scene that owns this plugin is being destroyed.
  2091. * We need to shutdown and then kill off all external references.
  2092. *
  2093. * @method Phaser.GameObjects.GameObjectFactory#destroy
  2094. * @private
  2095. * @since 3.0.0
  2096. */
  2097. destroy: function ()
  2098. {
  2099. this.shutdown();
  2100. this.scene.sys.events.off('start', this.start, this);
  2101. this.scene = null;
  2102. this.systems = null;
  2103. this.displayList = null;
  2104. this.updateList = null;
  2105. }
  2106. });
  2107. // Static method called directly by the Game Object factory functions
  2108. GameObjectFactory.register = function (factoryType, factoryFunction)
  2109. {
  2110. if (!GameObjectFactory.prototype.hasOwnProperty(factoryType))
  2111. {
  2112. GameObjectFactory.prototype[factoryType] = factoryFunction;
  2113. }
  2114. };
  2115. PluginCache.register('GameObjectFactory', GameObjectFactory, 'add');
  2116. module.exports = GameObjectFactory;
  2117. /***/ }),
  2118. /* 12 */
  2119. /***/ (function(module, exports) {
  2120. /**
  2121. * @author Richard Davey <rich@photonstorm.com>
  2122. * @copyright 2018 Photon Storm Ltd.
  2123. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2124. */
  2125. // Contains the plugins that Phaser uses globally and locally.
  2126. // These are the source objects, not instantiated.
  2127. var corePlugins = {};
  2128. // Contains the plugins that the dev has loaded into their game
  2129. // These are the source objects, not instantiated.
  2130. var customPlugins = {};
  2131. /**
  2132. * @typedef {object} CorePluginContainer
  2133. *
  2134. * @property {string} key - The unique name of this plugin in the core plugin cache.
  2135. * @property {function} plugin - The plugin to be stored. Should be the source object, not instantiated.
  2136. * @property {string} [mapping] - If this plugin is to be injected into the Scene Systems, this is the property key map used.
  2137. * @property {boolean} [custom=false] - Core Scene plugin or a Custom Scene plugin?
  2138. */
  2139. /**
  2140. * @typedef {object} CustomPluginContainer
  2141. *
  2142. * @property {string} key - The unique name of this plugin in the custom plugin cache.
  2143. * @property {function} plugin - The plugin to be stored. Should be the source object, not instantiated.
  2144. */
  2145. var PluginCache = {};
  2146. /**
  2147. * Static method called directly by the Core internal Plugins.
  2148. * Key is a reference used to get the plugin from the plugins object (i.e. InputPlugin)
  2149. * Plugin is the object to instantiate to create the plugin
  2150. * Mapping is what the plugin is injected into the Scene.Systems as (i.e. input)
  2151. *
  2152. * @method Phaser.Plugins.PluginCache.register
  2153. * @since 3.8.0
  2154. *
  2155. * @param {string} key - A reference used to get this plugin from the plugin cache.
  2156. * @param {function} plugin - The plugin to be stored. Should be the core object, not instantiated.
  2157. * @param {string} mapping - If this plugin is to be injected into the Scene Systems, this is the property key map used.
  2158. * @param {boolean} [custom=false] - Core Scene plugin or a Custom Scene plugin?
  2159. */
  2160. PluginCache.register = function (key, plugin, mapping, custom)
  2161. {
  2162. if (custom === undefined) { custom = false; }
  2163. corePlugins[key] = { plugin: plugin, mapping: mapping, custom: custom };
  2164. };
  2165. /**
  2166. * Stores a custom plugin in the global plugin cache.
  2167. * The key must be unique, within the scope of the cache.
  2168. *
  2169. * @method Phaser.Plugins.PluginCache.registerCustom
  2170. * @since 3.8.0
  2171. *
  2172. * @param {string} key - A reference used to get this plugin from the plugin cache.
  2173. * @param {function} plugin - The plugin to be stored. Should be the core object, not instantiated.
  2174. * @param {string} mapping - If this plugin is to be injected into the Scene Systems, this is the property key map used.
  2175. */
  2176. PluginCache.registerCustom = function (key, plugin, mapping)
  2177. {
  2178. customPlugins[key] = { plugin: plugin, mapping: mapping };
  2179. };
  2180. /**
  2181. * Checks if the given key is already being used in the core plugin cache.
  2182. *
  2183. * @method Phaser.Plugins.PluginCache.hasCore
  2184. * @since 3.8.0
  2185. *
  2186. * @param {string} key - The key to check for.
  2187. *
  2188. * @return {boolean} `true` if the key is already in use in the core cache, otherwise `false`.
  2189. */
  2190. PluginCache.hasCore = function (key)
  2191. {
  2192. return corePlugins.hasOwnProperty(key);
  2193. };
  2194. /**
  2195. * Checks if the given key is already being used in the custom plugin cache.
  2196. *
  2197. * @method Phaser.Plugins.PluginCache.hasCustom
  2198. * @since 3.8.0
  2199. *
  2200. * @param {string} key - The key to check for.
  2201. *
  2202. * @return {boolean} `true` if the key is already in use in the custom cache, otherwise `false`.
  2203. */
  2204. PluginCache.hasCustom = function (key)
  2205. {
  2206. return customPlugins.hasOwnProperty(key);
  2207. };
  2208. /**
  2209. * Returns the core plugin object from the cache based on the given key.
  2210. *
  2211. * @method Phaser.Plugins.PluginCache.getCore
  2212. * @since 3.8.0
  2213. *
  2214. * @param {string} key - The key of the core plugin to get.
  2215. *
  2216. * @return {CorePluginContainer} The core plugin object.
  2217. */
  2218. PluginCache.getCore = function (key)
  2219. {
  2220. return corePlugins[key];
  2221. };
  2222. /**
  2223. * Returns the custom plugin object from the cache based on the given key.
  2224. *
  2225. * @method Phaser.Plugins.PluginCache.getCustom
  2226. * @since 3.8.0
  2227. *
  2228. * @param {string} key - The key of the custom plugin to get.
  2229. *
  2230. * @return {CustomPluginContainer} The custom plugin object.
  2231. */
  2232. PluginCache.getCustom = function (key)
  2233. {
  2234. return customPlugins[key];
  2235. };
  2236. /**
  2237. * Returns an object from the custom cache based on the given key that can be instantiated.
  2238. *
  2239. * @method Phaser.Plugins.PluginCache.getCustomClass
  2240. * @since 3.8.0
  2241. *
  2242. * @param {string} key - The key of the custom plugin to get.
  2243. *
  2244. * @return {function} The custom plugin object.
  2245. */
  2246. PluginCache.getCustomClass = function (key)
  2247. {
  2248. return (customPlugins.hasOwnProperty(key)) ? customPlugins[key].plugin : null;
  2249. };
  2250. /**
  2251. * Removes a core plugin based on the given key.
  2252. *
  2253. * @method Phaser.Plugins.PluginCache.remove
  2254. * @since 3.8.0
  2255. *
  2256. * @param {string} key - The key of the core plugin to remove.
  2257. */
  2258. PluginCache.remove = function (key)
  2259. {
  2260. if (corePlugins.hasOwnProperty(key))
  2261. {
  2262. delete corePlugins[key];
  2263. }
  2264. };
  2265. /**
  2266. * Removes a custom plugin based on the given key.
  2267. *
  2268. * @method Phaser.Plugins.PluginCache.removeCustom
  2269. * @since 3.8.0
  2270. *
  2271. * @param {string} key - The key of the custom plugin to remove.
  2272. */
  2273. PluginCache.removeCustom = function (key)
  2274. {
  2275. if (customPlugins.hasOwnProperty(key))
  2276. {
  2277. delete customPlugins[key];
  2278. }
  2279. };
  2280. module.exports = PluginCache;
  2281. /***/ }),
  2282. /* 13 */
  2283. /***/ (function(module, exports, __webpack_require__) {
  2284. /**
  2285. * @author Richard Davey <rich@photonstorm.com>
  2286. * @copyright 2018 Photon Storm Ltd.
  2287. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2288. */
  2289. var Class = __webpack_require__(0);
  2290. var Contains = __webpack_require__(31);
  2291. var GetPoint = __webpack_require__(136);
  2292. var GetPoints = __webpack_require__(299);
  2293. var Line = __webpack_require__(96);
  2294. var Random = __webpack_require__(159);
  2295. /**
  2296. * @classdesc
  2297. * Encapsulates a 2D rectangle defined by its corner point in the top-left and its extends in x (width) and y (height)
  2298. *
  2299. * @class Rectangle
  2300. * @memberOf Phaser.Geom
  2301. * @constructor
  2302. * @since 3.0.0
  2303. *
  2304. * @param {number} [x=0] - [description]
  2305. * @param {number} [y=0] - [description]
  2306. * @param {number} [width=0] - [description]
  2307. * @param {number} [height=0] - [description]
  2308. */
  2309. var Rectangle = new Class({
  2310. initialize:
  2311. function Rectangle (x, y, width, height)
  2312. {
  2313. if (x === undefined) { x = 0; }
  2314. if (y === undefined) { y = 0; }
  2315. if (width === undefined) { width = 0; }
  2316. if (height === undefined) { height = 0; }
  2317. /**
  2318. * [description]
  2319. *
  2320. * @name Phaser.Geom.Rectangle#x
  2321. * @type {number}
  2322. * @default 0
  2323. * @since 3.0.0
  2324. */
  2325. this.x = x;
  2326. /**
  2327. * [description]
  2328. *
  2329. * @name Phaser.Geom.Rectangle#y
  2330. * @type {number}
  2331. * @default 0
  2332. * @since 3.0.0
  2333. */
  2334. this.y = y;
  2335. /**
  2336. * [description]
  2337. *
  2338. * @name Phaser.Geom.Rectangle#width
  2339. * @type {number}
  2340. * @default 0
  2341. * @since 3.0.0
  2342. */
  2343. this.width = width;
  2344. /**
  2345. * [description]
  2346. *
  2347. * @name Phaser.Geom.Rectangle#height
  2348. * @type {number}
  2349. * @default 0
  2350. * @since 3.0.0
  2351. */
  2352. this.height = height;
  2353. },
  2354. /**
  2355. * [description]
  2356. *
  2357. * @method Phaser.Geom.Rectangle#contains
  2358. * @since 3.0.0
  2359. *
  2360. * @param {number} x - [description]
  2361. * @param {number} y - [description]
  2362. *
  2363. * @return {boolean} [description]
  2364. */
  2365. contains: function (x, y)
  2366. {
  2367. return Contains(this, x, y);
  2368. },
  2369. /**
  2370. * [description]
  2371. *
  2372. * @method Phaser.Geom.Rectangle#getPoint
  2373. * @since 3.0.0
  2374. *
  2375. * @generic {Phaser.Geom.Point} O - [output,$return]
  2376. *
  2377. * @param {number} position - [description]
  2378. * @param {(Phaser.Geom.Point|object)} [output] - [description]
  2379. *
  2380. * @return {(Phaser.Geom.Point|object)} [description]
  2381. */
  2382. getPoint: function (position, output)
  2383. {
  2384. return GetPoint(this, position, output);
  2385. },
  2386. /**
  2387. * [description]
  2388. *
  2389. * @method Phaser.Geom.Rectangle#getPoints
  2390. * @since 3.0.0
  2391. *
  2392. * @generic {Phaser.Geom.Point[]} O - [output,$return]
  2393. *
  2394. * @param {integer} quantity - [description]
  2395. * @param {number} [stepRate] - [description]
  2396. * @param {(array|Phaser.Geom.Point[])} [output] - [description]
  2397. *
  2398. * @return {(array|Phaser.Geom.Point[])} [description]
  2399. */
  2400. getPoints: function (quantity, stepRate, output)
  2401. {
  2402. return GetPoints(this, quantity, stepRate, output);
  2403. },
  2404. /**
  2405. * [description]
  2406. *
  2407. * @method Phaser.Geom.Rectangle#getRandomPoint
  2408. * @since 3.0.0
  2409. *
  2410. * @generic {Phaser.Geom.Point} O - [point,$return]
  2411. *
  2412. * @param {Phaser.Geom.Point} [point] - [description]
  2413. *
  2414. * @return {Phaser.Geom.Point} [description]
  2415. */
  2416. getRandomPoint: function (point)
  2417. {
  2418. return Random(this, point);
  2419. },
  2420. /**
  2421. * [description]
  2422. *
  2423. * @method Phaser.Geom.Rectangle#setTo
  2424. * @since 3.0.0
  2425. *
  2426. * @param {number} x - [description]
  2427. * @param {number} y - [description]
  2428. * @param {number} width - [description]
  2429. * @param {number} height - [description]
  2430. *
  2431. * @return {Phaser.Geom.Rectangle} This Rectangle object.
  2432. */
  2433. setTo: function (x, y, width, height)
  2434. {
  2435. this.x = x;
  2436. this.y = y;
  2437. this.width = width;
  2438. this.height = height;
  2439. return this;
  2440. },
  2441. /**
  2442. * [description]
  2443. *
  2444. * @method Phaser.Geom.Rectangle#setEmpty
  2445. * @since 3.0.0
  2446. *
  2447. * @return {Phaser.Geom.Rectangle} This Rectangle object.
  2448. */
  2449. setEmpty: function ()
  2450. {
  2451. return this.setTo(0, 0, 0, 0);
  2452. },
  2453. /**
  2454. * [description]
  2455. *
  2456. * @method Phaser.Geom.Rectangle#setPosition
  2457. * @since 3.0.0
  2458. *
  2459. * @param {number} x - [description]
  2460. * @param {number} [y=x] - [description]
  2461. *
  2462. * @return {Phaser.Geom.Rectangle} This Rectangle object.
  2463. */
  2464. setPosition: function (x, y)
  2465. {
  2466. if (y === undefined) { y = x; }
  2467. this.x = x;
  2468. this.y = y;
  2469. return this;
  2470. },
  2471. /**
  2472. * [description]
  2473. *
  2474. * @method Phaser.Geom.Rectangle#setSize
  2475. * @since 3.0.0
  2476. *
  2477. * @param {number} width - [description]
  2478. * @param {number} [height=width] - [description]
  2479. *
  2480. * @return {Phaser.Geom.Rectangle} This Rectangle object.
  2481. */
  2482. setSize: function (width, height)
  2483. {
  2484. if (height === undefined) { height = width; }
  2485. this.width = width;
  2486. this.height = height;
  2487. return this;
  2488. },
  2489. /**
  2490. * [description]
  2491. *
  2492. * @method Phaser.Geom.Rectangle#isEmpty
  2493. * @since 3.0.0
  2494. *
  2495. * @return {boolean} [description]
  2496. */
  2497. isEmpty: function ()
  2498. {
  2499. return (this.width <= 0 || this.height <= 0);
  2500. },
  2501. /**
  2502. * Returns a Line object that corresponds to the top of this Rectangle.
  2503. *
  2504. * @method Phaser.Geom.Rectangle#getLineA
  2505. * @since 3.0.0
  2506. *
  2507. * @generic {Phaser.Geom.Line} O - [line,$return]
  2508. *
  2509. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  2510. *
  2511. * @return {Phaser.Geom.Line} A Line object that corresponds to the top of this Rectangle.
  2512. */
  2513. getLineA: function (line)
  2514. {
  2515. if (line === undefined) { line = new Line(); }
  2516. line.setTo(this.x, this.y, this.right, this.y);
  2517. return line;
  2518. },
  2519. /**
  2520. * Returns a Line object that corresponds to the right of this Rectangle.
  2521. *
  2522. * @method Phaser.Geom.Rectangle#getLineB
  2523. * @since 3.0.0
  2524. *
  2525. * @generic {Phaser.Geom.Line} O - [line,$return]
  2526. *
  2527. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  2528. *
  2529. * @return {Phaser.Geom.Line} A Line object that corresponds to the right of this Rectangle.
  2530. */
  2531. getLineB: function (line)
  2532. {
  2533. if (line === undefined) { line = new Line(); }
  2534. line.setTo(this.right, this.y, this.right, this.bottom);
  2535. return line;
  2536. },
  2537. /**
  2538. * Returns a Line object that corresponds to the bottom of this Rectangle.
  2539. *
  2540. * @method Phaser.Geom.Rectangle#getLineC
  2541. * @since 3.0.0
  2542. *
  2543. * @generic {Phaser.Geom.Line} O - [line,$return]
  2544. *
  2545. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  2546. *
  2547. * @return {Phaser.Geom.Line} A Line object that corresponds to the bottom of this Rectangle.
  2548. */
  2549. getLineC: function (line)
  2550. {
  2551. if (line === undefined) { line = new Line(); }
  2552. line.setTo(this.right, this.bottom, this.x, this.bottom);
  2553. return line;
  2554. },
  2555. /**
  2556. * Returns a Line object that corresponds to the left of this Rectangle.
  2557. *
  2558. * @method Phaser.Geom.Rectangle#getLineD
  2559. * @since 3.0.0
  2560. *
  2561. * @generic {Phaser.Geom.Line} O - [line,$return]
  2562. *
  2563. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  2564. *
  2565. * @return {Phaser.Geom.Line} A Line object that corresponds to the left of this Rectangle.
  2566. */
  2567. getLineD: function (line)
  2568. {
  2569. if (line === undefined) { line = new Line(); }
  2570. line.setTo(this.x, this.bottom, this.x, this.y);
  2571. return line;
  2572. },
  2573. /**
  2574. * [description]
  2575. *
  2576. * @name Phaser.Geom.Rectangle#left
  2577. * @type {number}
  2578. * @since 3.0.0
  2579. */
  2580. left: {
  2581. get: function ()
  2582. {
  2583. return this.x;
  2584. },
  2585. set: function (value)
  2586. {
  2587. if (value >= this.right)
  2588. {
  2589. this.width = 0;
  2590. }
  2591. else
  2592. {
  2593. this.width = this.right - value;
  2594. }
  2595. this.x = value;
  2596. }
  2597. },
  2598. /**
  2599. * [description]
  2600. *
  2601. * @name Phaser.Geom.Rectangle#right
  2602. * @type {number}
  2603. * @since 3.0.0
  2604. */
  2605. right: {
  2606. get: function ()
  2607. {
  2608. return this.x + this.width;
  2609. },
  2610. set: function (value)
  2611. {
  2612. if (value <= this.x)
  2613. {
  2614. this.width = 0;
  2615. }
  2616. else
  2617. {
  2618. this.width = value - this.x;
  2619. }
  2620. }
  2621. },
  2622. /**
  2623. * [description]
  2624. *
  2625. * @name Phaser.Geom.Rectangle#top
  2626. * @type {number}
  2627. * @since 3.0.0
  2628. */
  2629. top: {
  2630. get: function ()
  2631. {
  2632. return this.y;
  2633. },
  2634. set: function (value)
  2635. {
  2636. if (value >= this.bottom)
  2637. {
  2638. this.height = 0;
  2639. }
  2640. else
  2641. {
  2642. this.height = (this.bottom - value);
  2643. }
  2644. this.y = value;
  2645. }
  2646. },
  2647. /**
  2648. * [description]
  2649. *
  2650. * @name Phaser.Geom.Rectangle#bottom
  2651. * @type {number}
  2652. * @since 3.0.0
  2653. */
  2654. bottom: {
  2655. get: function ()
  2656. {
  2657. return this.y + this.height;
  2658. },
  2659. set: function (value)
  2660. {
  2661. if (value <= this.y)
  2662. {
  2663. this.height = 0;
  2664. }
  2665. else
  2666. {
  2667. this.height = value - this.y;
  2668. }
  2669. }
  2670. },
  2671. /**
  2672. * [description]
  2673. *
  2674. * @name Phaser.Geom.Rectangle#centerX
  2675. * @type {number}
  2676. * @since 3.0.0
  2677. */
  2678. centerX: {
  2679. get: function ()
  2680. {
  2681. return this.x + (this.width / 2);
  2682. },
  2683. set: function (value)
  2684. {
  2685. this.x = value - (this.width / 2);
  2686. }
  2687. },
  2688. /**
  2689. * [description]
  2690. *
  2691. * @name Phaser.Geom.Rectangle#centerY
  2692. * @type {number}
  2693. * @since 3.0.0
  2694. */
  2695. centerY: {
  2696. get: function ()
  2697. {
  2698. return this.y + (this.height / 2);
  2699. },
  2700. set: function (value)
  2701. {
  2702. this.y = value - (this.height / 2);
  2703. }
  2704. }
  2705. });
  2706. module.exports = Rectangle;
  2707. /***/ }),
  2708. /* 14 */
  2709. /***/ (function(module, exports, __webpack_require__) {
  2710. /**
  2711. * @author Richard Davey <rich@photonstorm.com>
  2712. * @copyright 2018 Photon Storm Ltd.
  2713. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2714. */
  2715. var Class = __webpack_require__(0);
  2716. var PluginCache = __webpack_require__(12);
  2717. /**
  2718. * @classdesc
  2719. * The Game Object Creator is a Scene plugin that allows you to quickly create many common
  2720. * types of Game Objects and return them. Unlike the Game Object Factory, they are not automatically
  2721. * added to the Scene.
  2722. *
  2723. * Game Objects directly register themselves with the Creator and inject their own creation
  2724. * methods into the class.
  2725. *
  2726. * @class GameObjectCreator
  2727. * @memberOf Phaser.GameObjects
  2728. * @constructor
  2729. * @since 3.0.0
  2730. *
  2731. * @param {Phaser.Scene} scene - The Scene to which this Game Object Factory belongs.
  2732. */
  2733. var GameObjectCreator = new Class({
  2734. initialize:
  2735. function GameObjectCreator (scene)
  2736. {
  2737. /**
  2738. * The Scene to which this Game Object Creator belongs.
  2739. *
  2740. * @name Phaser.GameObjects.GameObjectCreator#scene
  2741. * @type {Phaser.Scene}
  2742. * @protected
  2743. * @since 3.0.0
  2744. */
  2745. this.scene = scene;
  2746. /**
  2747. * A reference to the Scene.Systems.
  2748. *
  2749. * @name Phaser.GameObjects.GameObjectCreator#systems
  2750. * @type {Phaser.Scenes.Systems}
  2751. * @protected
  2752. * @since 3.0.0
  2753. */
  2754. this.systems = scene.sys;
  2755. /**
  2756. * A reference to the Scene Display List.
  2757. *
  2758. * @name Phaser.GameObjects.GameObjectCreator#displayList
  2759. * @type {Phaser.GameObjects.DisplayList}
  2760. * @protected
  2761. * @since 3.0.0
  2762. */
  2763. this.displayList;
  2764. /**
  2765. * A reference to the Scene Update List.
  2766. *
  2767. * @name Phaser.GameObjects.GameObjectCreator#updateList;
  2768. * @type {Phaser.GameObjects.UpdateList}
  2769. * @protected
  2770. * @since 3.0.0
  2771. */
  2772. this.updateList;
  2773. scene.sys.events.once('boot', this.boot, this);
  2774. scene.sys.events.on('start', this.start, this);
  2775. },
  2776. /**
  2777. * This method is called automatically, only once, when the Scene is first created.
  2778. * Do not invoke it directly.
  2779. *
  2780. * @method Phaser.GameObjects.GameObjectCreator#boot
  2781. * @private
  2782. * @since 3.5.1
  2783. */
  2784. boot: function ()
  2785. {
  2786. this.displayList = this.systems.displayList;
  2787. this.updateList = this.systems.updateList;
  2788. this.systems.events.once('destroy', this.destroy, this);
  2789. },
  2790. /**
  2791. * This method is called automatically by the Scene when it is starting up.
  2792. * It is responsible for creating local systems, properties and listening for Scene events.
  2793. * Do not invoke it directly.
  2794. *
  2795. * @method Phaser.GameObjects.GameObjectCreator#start
  2796. * @private
  2797. * @since 3.5.0
  2798. */
  2799. start: function ()
  2800. {
  2801. this.systems.events.once('shutdown', this.shutdown, this);
  2802. },
  2803. /**
  2804. * The Scene that owns this plugin is shutting down.
  2805. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  2806. *
  2807. * @method Phaser.GameObjects.GameObjectCreator#shutdown
  2808. * @private
  2809. * @since 3.0.0
  2810. */
  2811. shutdown: function ()
  2812. {
  2813. this.systems.events.off('shutdown', this.shutdown, this);
  2814. },
  2815. /**
  2816. * The Scene that owns this plugin is being destroyed.
  2817. * We need to shutdown and then kill off all external references.
  2818. *
  2819. * @method Phaser.GameObjects.GameObjectCreator#destroy
  2820. * @private
  2821. * @since 3.0.0
  2822. */
  2823. destroy: function ()
  2824. {
  2825. this.shutdown();
  2826. this.scene.sys.events.off('start', this.start, this);
  2827. this.scene = null;
  2828. this.systems = null;
  2829. this.displayList = null;
  2830. this.updateList = null;
  2831. }
  2832. });
  2833. // Static method called directly by the Game Object creator functions
  2834. GameObjectCreator.register = function (factoryType, factoryFunction)
  2835. {
  2836. if (!GameObjectCreator.prototype.hasOwnProperty(factoryType))
  2837. {
  2838. GameObjectCreator.prototype[factoryType] = factoryFunction;
  2839. }
  2840. };
  2841. PluginCache.register('GameObjectCreator', GameObjectCreator, 'make');
  2842. module.exports = GameObjectCreator;
  2843. /***/ }),
  2844. /* 15 */
  2845. /***/ (function(module, exports, __webpack_require__) {
  2846. /**
  2847. * @author Richard Davey <rich@photonstorm.com>
  2848. * @copyright 2018 Photon Storm Ltd.
  2849. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2850. */
  2851. var RND = __webpack_require__(302);
  2852. var MATH_CONST = {
  2853. /**
  2854. * The value of PI * 2.
  2855. *
  2856. * @name Phaser.Math.PI2
  2857. * @type {number}
  2858. * @since 3.0.0
  2859. */
  2860. PI2: Math.PI * 2,
  2861. /**
  2862. * The value of PI * 0.5.
  2863. *
  2864. * @name Phaser.Math.TAU
  2865. * @type {number}
  2866. * @since 3.0.0
  2867. */
  2868. TAU: Math.PI * 0.5,
  2869. /**
  2870. * An epsilon value (1.0e-6)
  2871. *
  2872. * @name Phaser.Math.EPSILON
  2873. * @type {number}
  2874. * @since 3.0.0
  2875. */
  2876. EPSILON: 1.0e-6,
  2877. /**
  2878. * For converting degrees to radians (PI / 180)
  2879. *
  2880. * @name Phaser.Math.DEG_TO_RAD
  2881. * @type {number}
  2882. * @since 3.0.0
  2883. */
  2884. DEG_TO_RAD: Math.PI / 180,
  2885. /**
  2886. * For converting radians to degrees (180 / PI)
  2887. *
  2888. * @name Phaser.Math.RAD_TO_DEG
  2889. * @type {number}
  2890. * @since 3.0.0
  2891. */
  2892. RAD_TO_DEG: 180 / Math.PI,
  2893. /**
  2894. * An instance of the Random Number Generator.
  2895. *
  2896. * @name Phaser.Math.RND
  2897. * @type {Phaser.Math.RandomDataGenerator}
  2898. * @since 3.0.0
  2899. */
  2900. RND: new RND()
  2901. };
  2902. module.exports = MATH_CONST;
  2903. /***/ }),
  2904. /* 16 */
  2905. /***/ (function(module, exports, __webpack_require__) {
  2906. /**
  2907. * @author Richard Davey <rich@photonstorm.com>
  2908. * @copyright 2018 Photon Storm Ltd.
  2909. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2910. */
  2911. var IsPlainObject = __webpack_require__(8);
  2912. // @param {boolean} deep - Perform a deep copy?
  2913. // @param {object} target - The target object to copy to.
  2914. // @return {object} The extended object.
  2915. /**
  2916. * This is a slightly modified version of http://api.jquery.com/jQuery.extend/
  2917. *
  2918. * @function Phaser.Utils.Object.Extend
  2919. * @since 3.0.0
  2920. *
  2921. * @return {object} [description]
  2922. */
  2923. var Extend = function ()
  2924. {
  2925. var options, name, src, copy, copyIsArray, clone,
  2926. target = arguments[0] || {},
  2927. i = 1,
  2928. length = arguments.length,
  2929. deep = false;
  2930. // Handle a deep copy situation
  2931. if (typeof target === 'boolean')
  2932. {
  2933. deep = target;
  2934. target = arguments[1] || {};
  2935. // skip the boolean and the target
  2936. i = 2;
  2937. }
  2938. // extend Phaser if only one argument is passed
  2939. if (length === i)
  2940. {
  2941. target = this;
  2942. --i;
  2943. }
  2944. for (; i < length; i++)
  2945. {
  2946. // Only deal with non-null/undefined values
  2947. if ((options = arguments[i]) != null)
  2948. {
  2949. // Extend the base object
  2950. for (name in options)
  2951. {
  2952. src = target[name];
  2953. copy = options[name];
  2954. // Prevent never-ending loop
  2955. if (target === copy)
  2956. {
  2957. continue;
  2958. }
  2959. // Recurse if we're merging plain objects or arrays
  2960. if (deep && copy && (IsPlainObject(copy) || (copyIsArray = Array.isArray(copy))))
  2961. {
  2962. if (copyIsArray)
  2963. {
  2964. copyIsArray = false;
  2965. clone = src && Array.isArray(src) ? src : [];
  2966. }
  2967. else
  2968. {
  2969. clone = src && IsPlainObject(src) ? src : {};
  2970. }
  2971. // Never move original objects, clone them
  2972. target[name] = Extend(deep, clone, copy);
  2973. // Don't bring in undefined values
  2974. }
  2975. else if (copy !== undefined)
  2976. {
  2977. target[name] = copy;
  2978. }
  2979. }
  2980. }
  2981. }
  2982. // Return the modified object
  2983. return target;
  2984. };
  2985. module.exports = Extend;
  2986. /***/ }),
  2987. /* 17 */
  2988. /***/ (function(module, exports, __webpack_require__) {
  2989. /**
  2990. * @author Richard Davey <rich@photonstorm.com>
  2991. * @copyright 2018 Photon Storm Ltd.
  2992. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  2993. */
  2994. /**
  2995. * @namespace Phaser.GameObjects.Components
  2996. */
  2997. module.exports = {
  2998. Alpha: __webpack_require__(592),
  2999. Animation: __webpack_require__(307),
  3000. BlendMode: __webpack_require__(591),
  3001. ComputedSize: __webpack_require__(590),
  3002. Depth: __webpack_require__(589),
  3003. Flip: __webpack_require__(588),
  3004. GetBounds: __webpack_require__(587),
  3005. Mask: __webpack_require__(586),
  3006. MatrixStack: __webpack_require__(585),
  3007. Origin: __webpack_require__(584),
  3008. Pipeline: __webpack_require__(296),
  3009. ScaleMode: __webpack_require__(583),
  3010. ScrollFactor: __webpack_require__(582),
  3011. Size: __webpack_require__(581),
  3012. Texture: __webpack_require__(580),
  3013. TextureCrop: __webpack_require__(579),
  3014. Tint: __webpack_require__(578),
  3015. ToJSON: __webpack_require__(577),
  3016. Transform: __webpack_require__(576),
  3017. TransformMatrix: __webpack_require__(32),
  3018. Visible: __webpack_require__(575)
  3019. };
  3020. /***/ }),
  3021. /* 18 */
  3022. /***/ (function(module, exports) {
  3023. /**
  3024. * @author Richard Davey <rich@photonstorm.com>
  3025. * @copyright 2018 Photon Storm Ltd.
  3026. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  3027. */
  3028. var FILE_CONST = {
  3029. /**
  3030. * The Loader is idle.
  3031. *
  3032. * @name Phaser.Loader.LOADER_IDLE
  3033. * @type {integer}
  3034. * @since 3.0.0
  3035. */
  3036. LOADER_IDLE: 0,
  3037. /**
  3038. * The Loader is actively loading.
  3039. *
  3040. * @name Phaser.Loader.LOADER_LOADING
  3041. * @type {integer}
  3042. * @since 3.0.0
  3043. */
  3044. LOADER_LOADING: 1,
  3045. /**
  3046. * The Loader is processing files is has loaded.
  3047. *
  3048. * @name Phaser.Loader.LOADER_PROCESSING
  3049. * @type {integer}
  3050. * @since 3.0.0
  3051. */
  3052. LOADER_PROCESSING: 2,
  3053. /**
  3054. * The Loader has completed loading and processing.
  3055. *
  3056. * @name Phaser.Loader.LOADER_COMPLETE
  3057. * @type {integer}
  3058. * @since 3.0.0
  3059. */
  3060. LOADER_COMPLETE: 3,
  3061. /**
  3062. * The Loader is shutting down.
  3063. *
  3064. * @name Phaser.Loader.LOADER_SHUTDOWN
  3065. * @type {integer}
  3066. * @since 3.0.0
  3067. */
  3068. LOADER_SHUTDOWN: 4,
  3069. /**
  3070. * The Loader has been destroyed.
  3071. *
  3072. * @name Phaser.Loader.LOADER_DESTROYED
  3073. * @type {integer}
  3074. * @since 3.0.0
  3075. */
  3076. LOADER_DESTROYED: 5,
  3077. /**
  3078. * File is in the load queue but not yet started
  3079. *
  3080. * @name Phaser.Loader.FILE_PENDING
  3081. * @type {integer}
  3082. * @since 3.0.0
  3083. */
  3084. FILE_PENDING: 10,
  3085. /**
  3086. * File has been started to load by the loader (onLoad called)
  3087. *
  3088. * @name Phaser.Loader.FILE_LOADING
  3089. * @type {integer}
  3090. * @since 3.0.0
  3091. */
  3092. FILE_LOADING: 11,
  3093. /**
  3094. * File has loaded successfully, awaiting processing
  3095. *
  3096. * @name Phaser.Loader.FILE_LOADED
  3097. * @type {integer}
  3098. * @since 3.0.0
  3099. */
  3100. FILE_LOADED: 12,
  3101. /**
  3102. * File failed to load
  3103. *
  3104. * @name Phaser.Loader.FILE_FAILED
  3105. * @type {integer}
  3106. * @since 3.0.0
  3107. */
  3108. FILE_FAILED: 13,
  3109. /**
  3110. * File is being processed (onProcess callback)
  3111. *
  3112. * @name Phaser.Loader.FILE_PROCESSING
  3113. * @type {integer}
  3114. * @since 3.0.0
  3115. */
  3116. FILE_PROCESSING: 14,
  3117. /**
  3118. * The File has errored somehow during processing.
  3119. *
  3120. * @name Phaser.Loader.FILE_ERRORED
  3121. * @type {integer}
  3122. * @since 3.0.0
  3123. */
  3124. FILE_ERRORED: 16,
  3125. /**
  3126. * File has finished processing.
  3127. *
  3128. * @name Phaser.Loader.FILE_COMPLETE
  3129. * @type {integer}
  3130. * @since 3.0.0
  3131. */
  3132. FILE_COMPLETE: 17,
  3133. /**
  3134. * File has been destroyed
  3135. *
  3136. * @name Phaser.Loader.FILE_DESTROYED
  3137. * @type {integer}
  3138. * @since 3.0.0
  3139. */
  3140. FILE_DESTROYED: 18,
  3141. /**
  3142. * File was populated from local data and doesn't need an HTTP request
  3143. *
  3144. * @name Phaser.Loader.FILE_POPULATED
  3145. * @type {integer}
  3146. * @since 3.0.0
  3147. */
  3148. FILE_POPULATED: 19
  3149. };
  3150. module.exports = FILE_CONST;
  3151. /***/ }),
  3152. /* 19 */
  3153. /***/ (function(module, exports) {
  3154. /**
  3155. * @author Richard Davey <rich@photonstorm.com>
  3156. * @copyright 2018 Photon Storm Ltd.
  3157. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  3158. */
  3159. /**
  3160. * Force a value within the boundaries by clamping it to the range `min`, `max`.
  3161. *
  3162. * @function Phaser.Math.Clamp
  3163. * @since 3.0.0
  3164. *
  3165. * @param {number} value - The value to be clamped.
  3166. * @param {number} min - The minimum bounds.
  3167. * @param {number} max - The maximum bounds.
  3168. *
  3169. * @return {number} The clamped value.
  3170. */
  3171. var Clamp = function (value, min, max)
  3172. {
  3173. return Math.max(min, Math.min(max, value));
  3174. };
  3175. module.exports = Clamp;
  3176. /***/ }),
  3177. /* 20 */
  3178. /***/ (function(module, exports, __webpack_require__) {
  3179. /**
  3180. * @author Richard Davey <rich@photonstorm.com>
  3181. * @copyright 2018 Photon Storm Ltd.
  3182. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  3183. */
  3184. var Class = __webpack_require__(0);
  3185. var CONST = __webpack_require__(18);
  3186. var GetFastValue = __webpack_require__(1);
  3187. var GetURL = __webpack_require__(108);
  3188. var MergeXHRSettings = __webpack_require__(107);
  3189. var XHRLoader = __webpack_require__(174);
  3190. var XHRSettings = __webpack_require__(74);
  3191. /**
  3192. * @typedef {object} FileConfig
  3193. *
  3194. * @property {string} type - The file type string (image, json, etc) for sorting within the Loader.
  3195. * @property {string} key - Unique cache key (unique within its file type)
  3196. * @property {string} [url] - The URL of the file, not including baseURL.
  3197. * @property {string} [path] - The path of the file, not including the baseURL.
  3198. * @property {string} [extension] - The default extension this file uses.
  3199. * @property {XMLHttpRequestResponseType} [responseType] - The responseType to be used by the XHR request.
  3200. * @property {(XHRSettingsObject|false)} [xhrSettings=false] - Custom XHR Settings specific to this file and merged with the Loader defaults.
  3201. * @property {any} [config] - A config object that can be used by file types to store transitional data.
  3202. */
  3203. /**
  3204. * @classdesc
  3205. * The base File class used by all File Types that the Loader can support.
  3206. * 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.
  3207. *
  3208. * @class File
  3209. * @memberOf Phaser.Loader
  3210. * @constructor
  3211. * @since 3.0.0
  3212. *
  3213. * @param {Phaser.Loader.LoaderPlugin} loader - The Loader that is going to load this File.
  3214. * @param {FileConfig} fileConfig - The file configuration object, as created by the file type.
  3215. */
  3216. var File = new Class({
  3217. initialize:
  3218. function File (loader, fileConfig)
  3219. {
  3220. /**
  3221. * A reference to the Loader that is going to load this file.
  3222. *
  3223. * @name Phaser.Loader.File#loader
  3224. * @type {Phaser.Loader.LoaderPlugin}
  3225. * @since 3.0.0
  3226. */
  3227. this.loader = loader;
  3228. /**
  3229. * A reference to the Cache, or Texture Manager, that is going to store this file if it loads.
  3230. *
  3231. * @name Phaser.Loader.File#cache
  3232. * @type {(Phaser.Cache.BaseCache|Phaser.Textures.TextureManager)}
  3233. * @since 3.7.0
  3234. */
  3235. this.cache = GetFastValue(fileConfig, 'cache', false);
  3236. /**
  3237. * The file type string (image, json, etc) for sorting within the Loader.
  3238. *
  3239. * @name Phaser.Loader.File#type
  3240. * @type {string}
  3241. * @since 3.0.0
  3242. */
  3243. this.type = GetFastValue(fileConfig, 'type', false);
  3244. /**
  3245. * Unique cache key (unique within its file type)
  3246. *
  3247. * @name Phaser.Loader.File#key
  3248. * @type {string}
  3249. * @since 3.0.0
  3250. */
  3251. this.key = GetFastValue(fileConfig, 'key', false);
  3252. var loadKey = this.key;
  3253. if (loader.prefix && loader.prefix !== '')
  3254. {
  3255. this.key = loader.prefix + loadKey;
  3256. }
  3257. if (!this.type || !this.key)
  3258. {
  3259. throw new Error('Error calling \'Loader.' + this.type + '\' invalid key provided.');
  3260. }
  3261. /**
  3262. * The URL of the file, not including baseURL.
  3263. * Automatically has Loader.path prepended to it.
  3264. *
  3265. * @name Phaser.Loader.File#url
  3266. * @type {string}
  3267. * @since 3.0.0
  3268. */
  3269. this.url = GetFastValue(fileConfig, 'url');
  3270. if (this.url === undefined)
  3271. {
  3272. this.url = loader.path + loadKey + '.' + GetFastValue(fileConfig, 'extension', '');
  3273. }
  3274. else if (typeof(this.url) !== 'function')
  3275. {
  3276. this.url = loader.path + this.url;
  3277. }
  3278. /**
  3279. * The final URL this file will load from, including baseURL and path.
  3280. * Set automatically when the Loader calls 'load' on this file.
  3281. *
  3282. * @name Phaser.Loader.File#src
  3283. * @type {string}
  3284. * @since 3.0.0
  3285. */
  3286. this.src = '';
  3287. /**
  3288. * The merged XHRSettings for this file.
  3289. *
  3290. * @name Phaser.Loader.File#xhrSettings
  3291. * @type {XHRSettingsObject}
  3292. * @since 3.0.0
  3293. */
  3294. this.xhrSettings = XHRSettings(GetFastValue(fileConfig, 'responseType', undefined));
  3295. if (GetFastValue(fileConfig, 'xhrSettings', false))
  3296. {
  3297. this.xhrSettings = MergeXHRSettings(this.xhrSettings, GetFastValue(fileConfig, 'xhrSettings', {}));
  3298. }
  3299. /**
  3300. * The XMLHttpRequest instance (as created by XHR Loader) that is loading this File.
  3301. *
  3302. * @name Phaser.Loader.File#xhrLoader
  3303. * @type {?XMLHttpRequest}
  3304. * @since 3.0.0
  3305. */
  3306. this.xhrLoader = null;
  3307. /**
  3308. * The current state of the file. One of the FILE_CONST values.
  3309. *
  3310. * @name Phaser.Loader.File#state
  3311. * @type {integer}
  3312. * @since 3.0.0
  3313. */
  3314. this.state = (typeof(this.url) === 'function') ? CONST.FILE_POPULATED : CONST.FILE_PENDING;
  3315. /**
  3316. * The total size of this file.
  3317. * Set by onProgress and only if loading via XHR.
  3318. *
  3319. * @name Phaser.Loader.File#bytesTotal
  3320. * @type {number}
  3321. * @default 0
  3322. * @since 3.0.0
  3323. */
  3324. this.bytesTotal = 0;
  3325. /**
  3326. * Updated as the file loads.
  3327. * Only set if loading via XHR.
  3328. *
  3329. * @name Phaser.Loader.File#bytesLoaded
  3330. * @type {number}
  3331. * @default -1
  3332. * @since 3.0.0
  3333. */
  3334. this.bytesLoaded = -1;
  3335. /**
  3336. * A percentage value between 0 and 1 indicating how much of this file has loaded.
  3337. * Only set if loading via XHR.
  3338. *
  3339. * @name Phaser.Loader.File#percentComplete
  3340. * @type {number}
  3341. * @default -1
  3342. * @since 3.0.0
  3343. */
  3344. this.percentComplete = -1;
  3345. /**
  3346. * For CORs based loading.
  3347. * If this is undefined then the File will check BaseLoader.crossOrigin and use that (if set)
  3348. *
  3349. * @name Phaser.Loader.File#crossOrigin
  3350. * @type {(string|undefined)}
  3351. * @since 3.0.0
  3352. */
  3353. this.crossOrigin = undefined;
  3354. /**
  3355. * The processed file data, stored here after the file has loaded.
  3356. *
  3357. * @name Phaser.Loader.File#data
  3358. * @type {*}
  3359. * @since 3.0.0
  3360. */
  3361. this.data = undefined;
  3362. /**
  3363. * A config object that can be used by file types to store transitional data.
  3364. *
  3365. * @name Phaser.Loader.File#config
  3366. * @type {*}
  3367. * @since 3.0.0
  3368. */
  3369. this.config = GetFastValue(fileConfig, 'config', {});
  3370. /**
  3371. * If this is a multipart file, i.e. an atlas and its json together, then this is a reference
  3372. * to the parent MultiFile. Set and used internally by the Loader or specific file types.
  3373. *
  3374. * @name Phaser.Loader.File#multiFile
  3375. * @type {?Phaser.Loader.MultiFile}
  3376. * @since 3.7.0
  3377. */
  3378. this.multiFile;
  3379. /**
  3380. * Does this file have an associated linked file? Such as an image and a normal map.
  3381. * Atlases and Bitmap Fonts use the multiFile, because those files need loading together but aren't
  3382. * actually bound by data, where-as a linkFile is.
  3383. *
  3384. * @name Phaser.Loader.File#linkFile
  3385. * @type {?Phaser.Loader.File}
  3386. * @since 3.7.0
  3387. */
  3388. this.linkFile;
  3389. },
  3390. /**
  3391. * Links this File with another, so they depend upon each other for loading and processing.
  3392. *
  3393. * @method Phaser.Loader.File#setLink
  3394. * @since 3.7.0
  3395. *
  3396. * @param {Phaser.Loader.File} fileB - The file to link to this one.
  3397. */
  3398. setLink: function (fileB)
  3399. {
  3400. this.linkFile = fileB;
  3401. fileB.linkFile = this;
  3402. },
  3403. /**
  3404. * Resets the XHRLoader instance this file is using.
  3405. *
  3406. * @method Phaser.Loader.File#resetXHR
  3407. * @since 3.0.0
  3408. */
  3409. resetXHR: function ()
  3410. {
  3411. if (this.xhrLoader)
  3412. {
  3413. this.xhrLoader.onload = undefined;
  3414. this.xhrLoader.onerror = undefined;
  3415. this.xhrLoader.onprogress = undefined;
  3416. }
  3417. },
  3418. /**
  3419. * Called by the Loader, starts the actual file downloading.
  3420. * During the load the methods onLoad, onError and onProgress are called, based on the XHR events.
  3421. * You shouldn't normally call this method directly, it's meant to be invoked by the Loader.
  3422. *
  3423. * @method Phaser.Loader.File#load
  3424. * @since 3.0.0
  3425. */
  3426. load: function ()
  3427. {
  3428. if (this.state === CONST.FILE_POPULATED)
  3429. {
  3430. // Can happen for example in a JSONFile if they've provided a JSON object instead of a URL
  3431. this.loader.nextFile(this, true);
  3432. }
  3433. else
  3434. {
  3435. this.src = GetURL(this, this.loader.baseURL);
  3436. if (this.src.indexOf('data:') === 0)
  3437. {
  3438. console.warn('Local data URIs are not supported: ' + this.key);
  3439. }
  3440. else
  3441. {
  3442. // The creation of this XHRLoader starts the load process going.
  3443. // It will automatically call the following, based on the load outcome:
  3444. //
  3445. // xhr.onload = this.onLoad
  3446. // xhr.onerror = this.onError
  3447. // xhr.onprogress = this.onProgress
  3448. this.xhrLoader = XHRLoader(this, this.loader.xhr);
  3449. }
  3450. }
  3451. },
  3452. /**
  3453. * Called when the file finishes loading, is sent a DOM ProgressEvent.
  3454. *
  3455. * @method Phaser.Loader.File#onLoad
  3456. * @since 3.0.0
  3457. *
  3458. * @param {XMLHttpRequest} xhr - The XMLHttpRequest that caused this onload event.
  3459. * @param {ProgressEvent} event - The DOM ProgressEvent that resulted from this load.
  3460. */
  3461. onLoad: function (xhr, event)
  3462. {
  3463. var success = !(event.target && event.target.status !== 200);
  3464. // Handle HTTP status codes of 4xx and 5xx as errors, even if xhr.onerror was not called.
  3465. if (xhr.readyState === 4 && xhr.status >= 400 && xhr.status <= 599)
  3466. {
  3467. success = false;
  3468. }
  3469. this.resetXHR();
  3470. this.loader.nextFile(this, success);
  3471. },
  3472. /**
  3473. * Called if the file errors while loading, is sent a DOM ProgressEvent.
  3474. *
  3475. * @method Phaser.Loader.File#onError
  3476. * @since 3.0.0
  3477. *
  3478. * @param {ProgressEvent} event - The DOM ProgressEvent that resulted from this error.
  3479. */
  3480. onError: function ()
  3481. {
  3482. this.resetXHR();
  3483. this.loader.nextFile(this, false);
  3484. },
  3485. /**
  3486. * Called during the file load progress. Is sent a DOM ProgressEvent.
  3487. *
  3488. * @method Phaser.Loader.File#onProgress
  3489. * @since 3.0.0
  3490. *
  3491. * @param {ProgressEvent} event - The DOM ProgressEvent.
  3492. */
  3493. onProgress: function (event)
  3494. {
  3495. if (event.lengthComputable)
  3496. {
  3497. this.bytesLoaded = event.loaded;
  3498. this.bytesTotal = event.total;
  3499. this.percentComplete = Math.min((this.bytesLoaded / this.bytesTotal), 1);
  3500. this.loader.emit('fileprogress', this, this.percentComplete);
  3501. }
  3502. },
  3503. /**
  3504. * Usually overridden by the FileTypes and is called by Loader.nextFile.
  3505. * This method controls what extra work this File does with its loaded data, for example a JSON file will parse itself during this stage.
  3506. *
  3507. * @method Phaser.Loader.File#onProcess
  3508. * @since 3.0.0
  3509. */
  3510. onProcess: function ()
  3511. {
  3512. this.state = CONST.FILE_PROCESSING;
  3513. this.onProcessComplete();
  3514. },
  3515. /**
  3516. * Called when the File has completed processing.
  3517. * Checks on the state of its multifile, if set.
  3518. *
  3519. * @method Phaser.Loader.File#onProcessComplete
  3520. * @since 3.7.0
  3521. */
  3522. onProcessComplete: function ()
  3523. {
  3524. this.state = CONST.FILE_COMPLETE;
  3525. if (this.multiFile)
  3526. {
  3527. this.multiFile.onFileComplete(this);
  3528. }
  3529. this.loader.fileProcessComplete(this);
  3530. },
  3531. /**
  3532. * Called when the File has completed processing but it generated an error.
  3533. * Checks on the state of its multifile, if set.
  3534. *
  3535. * @method Phaser.Loader.File#onProcessError
  3536. * @since 3.7.0
  3537. */
  3538. onProcessError: function ()
  3539. {
  3540. this.state = CONST.FILE_ERRORED;
  3541. if (this.multiFile)
  3542. {
  3543. this.multiFile.onFileFailed(this);
  3544. }
  3545. this.loader.fileProcessComplete(this);
  3546. },
  3547. /**
  3548. * Checks if a key matching the one used by this file exists in the target Cache or not.
  3549. * This is called automatically by the LoaderPlugin to decide if the file can be safely
  3550. * loaded or will conflict.
  3551. *
  3552. * @method Phaser.Loader.File#hasCacheConflict
  3553. * @since 3.7.0
  3554. *
  3555. * @return {boolean} `true` if adding this file will cause a conflict, otherwise `false`.
  3556. */
  3557. hasCacheConflict: function ()
  3558. {
  3559. return (this.cache && this.cache.exists(this.key));
  3560. },
  3561. /**
  3562. * Adds this file to its target cache upon successful loading and processing.
  3563. * This method is often overridden by specific file types.
  3564. *
  3565. * @method Phaser.Loader.File#addToCache
  3566. * @since 3.7.0
  3567. */
  3568. addToCache: function ()
  3569. {
  3570. if (this.cache)
  3571. {
  3572. this.cache.add(this.key, this.data);
  3573. }
  3574. this.pendingDestroy();
  3575. },
  3576. /**
  3577. * You can listen for this event from the LoaderPlugin. It is dispatched _every time_
  3578. * a file loads and is sent 3 arguments, which allow you to identify the file:
  3579. *
  3580. * ```javascript
  3581. * this.load.on('filecomplete', function (key, type, data) {
  3582. * // Your handler code
  3583. * });
  3584. * ```
  3585. *
  3586. * @event Phaser.Loader.File#fileCompleteEvent
  3587. * @param {string} key - The key of the file that just loaded and finished processing.
  3588. * @param {string} type - The type of the file that just loaded and finished processing.
  3589. * @param {any} data - The data of the file.
  3590. */
  3591. /**
  3592. * You can listen for this event from the LoaderPlugin. It is dispatched only once per
  3593. * file and you have to use a special listener handle to pick it up.
  3594. *
  3595. * The string of the event is based on the file type and the key you gave it, split up
  3596. * using hyphens.
  3597. *
  3598. * For example, if you have loaded an image with a key of `monster`, you can listen for it
  3599. * using the following:
  3600. *
  3601. * ```javascript
  3602. * this.load.on('filecomplete-image-monster', function (key, type, data) {
  3603. * // Your handler code
  3604. * });
  3605. * ```
  3606. *
  3607. * Or, if you have loaded a texture atlas with a key of `Level1`:
  3608. *
  3609. * ```javascript
  3610. * this.load.on('filecomplete-atlas-Level1', function (key, type, data) {
  3611. * // Your handler code
  3612. * });
  3613. * ```
  3614. *
  3615. * Or, if you have loaded a sprite sheet with a key of `Explosion` and a prefix of `GAMEOVER`:
  3616. *
  3617. * ```javascript
  3618. * this.load.on('filecomplete-spritesheet-GAMEOVERExplosion', function (key, type, data) {
  3619. * // Your handler code
  3620. * });
  3621. * ```
  3622. *
  3623. * @event Phaser.Loader.File#singleFileCompleteEvent
  3624. * @param {any} data - The data of the file.
  3625. */
  3626. /**
  3627. * Called once the file has been added to its cache and is now ready for deletion from the Loader.
  3628. * It will emit a `filecomplete` event from the LoaderPlugin.
  3629. *
  3630. * @method Phaser.Loader.File#pendingDestroy
  3631. * @fires Phaser.Loader.File#fileCompleteEvent
  3632. * @fires Phaser.Loader.File#singleFileCompleteEvent
  3633. * @since 3.7.0
  3634. */
  3635. pendingDestroy: function (data)
  3636. {
  3637. if (data === undefined) { data = this.data; }
  3638. var key = this.key;
  3639. var type = this.type;
  3640. this.loader.emit('filecomplete', key, type, data);
  3641. this.loader.emit('filecomplete-' + type + '-' + key, key, type, data);
  3642. this.loader.flagForRemoval(this);
  3643. },
  3644. /**
  3645. * Destroy this File and any references it holds.
  3646. *
  3647. * @method Phaser.Loader.File#destroy
  3648. * @since 3.7.0
  3649. */
  3650. destroy: function ()
  3651. {
  3652. this.loader = null;
  3653. this.cache = null;
  3654. this.xhrSettings = null;
  3655. this.multiFile = null;
  3656. this.linkFile = null;
  3657. this.data = null;
  3658. }
  3659. });
  3660. /**
  3661. * Static method for creating object URL using URL API and setting it as image 'src' attribute.
  3662. * If URL API is not supported (usually on old browsers) it falls back to creating Base64 encoded url using FileReader.
  3663. *
  3664. * @method Phaser.Loader.File.createObjectURL
  3665. * @static
  3666. * @param {HTMLImageElement} image - Image object which 'src' attribute should be set to object URL.
  3667. * @param {Blob} blob - A Blob object to create an object URL for.
  3668. * @param {string} defaultType - Default mime type used if blob type is not available.
  3669. */
  3670. File.createObjectURL = function (image, blob, defaultType)
  3671. {
  3672. if (typeof URL === 'function')
  3673. {
  3674. image.src = URL.createObjectURL(blob);
  3675. }
  3676. else
  3677. {
  3678. var reader = new FileReader();
  3679. reader.onload = function ()
  3680. {
  3681. image.removeAttribute('crossOrigin');
  3682. image.src = 'data:' + (blob.type || defaultType) + ';base64,' + reader.result.split(',')[1];
  3683. };
  3684. reader.onerror = image.onerror;
  3685. reader.readAsDataURL(blob);
  3686. }
  3687. };
  3688. /**
  3689. * Static method for releasing an existing object URL which was previously created
  3690. * by calling {@link File#createObjectURL} method.
  3691. *
  3692. * @method Phaser.Loader.File.revokeObjectURL
  3693. * @static
  3694. * @param {HTMLImageElement} image - Image object which 'src' attribute should be revoked.
  3695. */
  3696. File.revokeObjectURL = function (image)
  3697. {
  3698. if (typeof URL === 'function')
  3699. {
  3700. URL.revokeObjectURL(image.src);
  3701. }
  3702. };
  3703. module.exports = File;
  3704. /***/ }),
  3705. /* 21 */
  3706. /***/ (function(module, exports) {
  3707. /**
  3708. * @author Richard Davey <rich@photonstorm.com>
  3709. * @author Felipe Alfonso <@bitnenfer>
  3710. * @copyright 2018 Photon Storm Ltd.
  3711. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  3712. */
  3713. /**
  3714. * @namespace Phaser.Renderer.WebGL.Utils
  3715. * @since 3.0.0
  3716. */
  3717. module.exports = {
  3718. /**
  3719. * Packs four floats on a range from 0.0 to 1.0 into a single Uint32
  3720. *
  3721. * @function Phaser.Renderer.WebGL.Utils.getTintFromFloats
  3722. * @since 3.0.0
  3723. *
  3724. * @param {number} r - Red component in a range from 0.0 to 1.0
  3725. * @param {number} g - [description]
  3726. * @param {number} b - [description]
  3727. * @param {number} a - Alpha component in a range from 0.0 to 1.0
  3728. *
  3729. * @return {number} [description]
  3730. */
  3731. getTintFromFloats: function (r, g, b, a)
  3732. {
  3733. var ur = ((r * 255.0)|0) & 0xFF;
  3734. var ug = ((g * 255.0)|0) & 0xFF;
  3735. var ub = ((b * 255.0)|0) & 0xFF;
  3736. var ua = ((a * 255.0)|0) & 0xFF;
  3737. return ((ua << 24) | (ur << 16) | (ug << 8) | ub) >>> 0;
  3738. },
  3739. /**
  3740. * Packs a Uint24, representing RGB components, with a Float32, representing
  3741. * the alpha component, with a range between 0.0 and 1.0 and return a Uint32
  3742. *
  3743. * @function Phaser.Renderer.WebGL.Utils.getTintAppendFloatAlpha
  3744. * @since 3.0.0
  3745. *
  3746. * @param {number} rgb - Uint24 representing RGB components
  3747. * @param {number} a - Float32 representing Alpha component
  3748. *
  3749. * @return {number} Packed RGBA as Uint32
  3750. */
  3751. getTintAppendFloatAlpha: function (rgb, a)
  3752. {
  3753. var ua = ((a * 255.0)|0) & 0xFF;
  3754. return ((ua << 24) | rgb) >>> 0;
  3755. },
  3756. /**
  3757. * Packs a Uint24, representing RGB components, with a Float32, representing
  3758. * the alpha component, with a range between 0.0 and 1.0 and return a
  3759. * swizzled Uint32
  3760. *
  3761. * @function Phaser.Renderer.WebGL.Utils.getTintAppendFloatAlphaAndSwap
  3762. * @since 3.0.0
  3763. *
  3764. * @param {number} rgb - Uint24 representing RGB components
  3765. * @param {number} a - Float32 representing Alpha component
  3766. *
  3767. * @return {number} Packed RGBA as Uint32
  3768. */
  3769. getTintAppendFloatAlphaAndSwap: function (rgb, a)
  3770. {
  3771. var ur = ((rgb >> 16)|0) & 0xff;
  3772. var ug = ((rgb >> 8)|0) & 0xff;
  3773. var ub = (rgb|0) & 0xff;
  3774. var ua = ((a * 255.0)|0) & 0xFF;
  3775. return ((ua << 24) | (ub << 16) | (ug << 8) | ur) >>> 0;
  3776. },
  3777. /**
  3778. * Unpacks a Uint24 RGB into an array of floats of ranges of 0.0 and 1.0
  3779. *
  3780. * @function Phaser.Renderer.WebGL.Utils.getFloatsFromUintRGB
  3781. * @since 3.0.0
  3782. *
  3783. * @param {number} rgb - RGB packed as a Uint24
  3784. *
  3785. * @return {array} Array of floats representing each component as a float
  3786. */
  3787. getFloatsFromUintRGB: function (rgb)
  3788. {
  3789. var ur = ((rgb >> 16)|0) & 0xff;
  3790. var ug = ((rgb >> 8)|0) & 0xff;
  3791. var ub = (rgb|0) & 0xff;
  3792. return [ ur / 255.0, ug / 255.0, ub / 255.0 ];
  3793. },
  3794. /**
  3795. * Counts how many attributes of 32 bits a vertex has
  3796. *
  3797. * @function Phaser.Renderer.WebGL.Utils.getComponentCount
  3798. * @since 3.0.0
  3799. *
  3800. * @param {array} attributes - Array of attributes
  3801. * @param {WebGLRenderingContext} glContext - WebGLContext used for check types
  3802. *
  3803. * @return {number} Count of 32 bit attributes in vertex
  3804. */
  3805. getComponentCount: function (attributes, glContext)
  3806. {
  3807. var count = 0;
  3808. for (var index = 0; index < attributes.length; ++index)
  3809. {
  3810. var element = attributes[index];
  3811. if (element.type === glContext.FLOAT)
  3812. {
  3813. count += element.size;
  3814. }
  3815. else
  3816. {
  3817. count += 1; // We'll force any other type to be 32 bit. for now
  3818. }
  3819. }
  3820. return count;
  3821. }
  3822. };
  3823. /***/ }),
  3824. /* 22 */
  3825. /***/ (function(module, exports, __webpack_require__) {
  3826. /**
  3827. * @author Richard Davey <rich@photonstorm.com>
  3828. * @copyright 2018 Photon Storm Ltd.
  3829. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  3830. */
  3831. /**
  3832. * Global consts.
  3833. *
  3834. * @ignore
  3835. */
  3836. var CONST = {
  3837. /**
  3838. * Phaser Release Version
  3839. *
  3840. * @name Phaser.VERSION
  3841. * @readOnly
  3842. * @type {string}
  3843. * @since 3.0.0
  3844. */
  3845. VERSION: '3.11',
  3846. BlendModes: __webpack_require__(52),
  3847. ScaleModes: __webpack_require__(59),
  3848. /**
  3849. * AUTO Detect Renderer.
  3850. *
  3851. * @name Phaser.AUTO
  3852. * @readOnly
  3853. * @type {integer}
  3854. * @since 3.0.0
  3855. */
  3856. AUTO: 0,
  3857. /**
  3858. * Canvas Renderer.
  3859. *
  3860. * @name Phaser.CANVAS
  3861. * @readOnly
  3862. * @type {integer}
  3863. * @since 3.0.0
  3864. */
  3865. CANVAS: 1,
  3866. /**
  3867. * WebGL Renderer.
  3868. *
  3869. * @name Phaser.WEBGL
  3870. * @readOnly
  3871. * @type {integer}
  3872. * @since 3.0.0
  3873. */
  3874. WEBGL: 2,
  3875. /**
  3876. * Headless Renderer.
  3877. *
  3878. * @name Phaser.HEADLESS
  3879. * @readOnly
  3880. * @type {integer}
  3881. * @since 3.0.0
  3882. */
  3883. HEADLESS: 3,
  3884. /**
  3885. * In Phaser the value -1 means 'forever' in lots of cases, this const allows you to use it instead
  3886. * to help you remember what the value is doing in your code.
  3887. *
  3888. * @name Phaser.FOREVER
  3889. * @readOnly
  3890. * @type {integer}
  3891. * @since 3.0.0
  3892. */
  3893. FOREVER: -1,
  3894. /**
  3895. * Direction constant.
  3896. *
  3897. * @name Phaser.NONE
  3898. * @readOnly
  3899. * @type {integer}
  3900. * @since 3.0.0
  3901. */
  3902. NONE: 4,
  3903. /**
  3904. * Direction constant.
  3905. *
  3906. * @name Phaser.UP
  3907. * @readOnly
  3908. * @type {integer}
  3909. * @since 3.0.0
  3910. */
  3911. UP: 5,
  3912. /**
  3913. * Direction constant.
  3914. *
  3915. * @name Phaser.DOWN
  3916. * @readOnly
  3917. * @type {integer}
  3918. * @since 3.0.0
  3919. */
  3920. DOWN: 6,
  3921. /**
  3922. * Direction constant.
  3923. *
  3924. * @name Phaser.LEFT
  3925. * @readOnly
  3926. * @type {integer}
  3927. * @since 3.0.0
  3928. */
  3929. LEFT: 7,
  3930. /**
  3931. * Direction constant.
  3932. *
  3933. * @name Phaser.RIGHT
  3934. * @readOnly
  3935. * @type {integer}
  3936. * @since 3.0.0
  3937. */
  3938. RIGHT: 8
  3939. };
  3940. module.exports = CONST;
  3941. /***/ }),
  3942. /* 23 */
  3943. /***/ (function(module, exports, __webpack_require__) {
  3944. /**
  3945. * @author Richard Davey <rich@photonstorm.com>
  3946. * @copyright 2018 Photon Storm Ltd.
  3947. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  3948. */
  3949. var GetFastValue = __webpack_require__(1);
  3950. /**
  3951. * @typedef {object} GetTilesWithinFilteringOptions
  3952. *
  3953. * @property {boolean} [isNotEmpty=false] - If true, only return tiles that don't have -1 for an index.
  3954. * @property {boolean} [isColliding=false] - If true, only return tiles that collide on at least one side.
  3955. * @property {boolean} [hasInterestingFace=false] - If true, only return tiles that have at least one interesting face.
  3956. */
  3957. /**
  3958. * Gets the tiles in the given rectangular area (in tile coordinates) of the layer.
  3959. *
  3960. * @function Phaser.Tilemaps.Components.GetTilesWithin
  3961. * @private
  3962. * @since 3.0.0
  3963. *
  3964. * @param {integer} tileX - [description]
  3965. * @param {integer} tileY - [description]
  3966. * @param {integer} width - [description]
  3967. * @param {integer} height - [description]
  3968. * @param {object} GetTilesWithinFilteringOptions - Optional filters to apply when getting the tiles.
  3969. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  3970. *
  3971. * @return {Phaser.Tilemaps.Tile[]} Array of Tile objects.
  3972. */
  3973. var GetTilesWithin = function (tileX, tileY, width, height, filteringOptions, layer)
  3974. {
  3975. if (tileX === undefined) { tileX = 0; }
  3976. if (tileY === undefined) { tileY = 0; }
  3977. if (width === undefined) { width = layer.width; }
  3978. if (height === undefined) { height = layer.height; }
  3979. var isNotEmpty = GetFastValue(filteringOptions, 'isNotEmpty', false);
  3980. var isColliding = GetFastValue(filteringOptions, 'isColliding', false);
  3981. var hasInterestingFace = GetFastValue(filteringOptions, 'hasInterestingFace', false);
  3982. // Clip x, y to top left of map, while shrinking width/height to match.
  3983. if (tileX < 0)
  3984. {
  3985. width += tileX;
  3986. tileX = 0;
  3987. }
  3988. if (tileY < 0)
  3989. {
  3990. height += tileY;
  3991. tileY = 0;
  3992. }
  3993. // Clip width and height to bottom right of map.
  3994. if (tileX + width > layer.width)
  3995. {
  3996. width = Math.max(layer.width - tileX, 0);
  3997. }
  3998. if (tileY + height > layer.height)
  3999. {
  4000. height = Math.max(layer.height - tileY, 0);
  4001. }
  4002. var results = [];
  4003. for (var ty = tileY; ty < tileY + height; ty++)
  4004. {
  4005. for (var tx = tileX; tx < tileX + width; tx++)
  4006. {
  4007. var tile = layer.data[ty][tx];
  4008. if (tile !== null)
  4009. {
  4010. if (isNotEmpty && tile.index === -1) { continue; }
  4011. if (isColliding && !tile.collides) { continue; }
  4012. if (hasInterestingFace && !tile.hasInterestingFace) { continue; }
  4013. results.push(tile);
  4014. }
  4015. }
  4016. }
  4017. return results;
  4018. };
  4019. module.exports = GetTilesWithin;
  4020. /***/ }),
  4021. /* 24 */
  4022. /***/ (function(module, exports, __webpack_require__) {
  4023. /**
  4024. * @author Richard Davey <rich@photonstorm.com>
  4025. * @copyright 2018 Photon Storm Ltd.
  4026. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4027. */
  4028. var CONST = __webpack_require__(22);
  4029. var Smoothing = __webpack_require__(132);
  4030. // The pool into which the canvas elements are placed.
  4031. var pool = [];
  4032. // Automatically apply smoothing(false) to created Canvas elements
  4033. var _disableContextSmoothing = false;
  4034. /**
  4035. * The CanvasPool is a global static object, that allows Phaser to recycle and pool 2D Context Canvas DOM elements.
  4036. * It does not pool WebGL Contexts, because once the context options are set they cannot be modified again,
  4037. * which is useless for some of the Phaser pipelines / renderer.
  4038. *
  4039. * This singleton is instantiated as soon as Phaser loads, before a Phaser.Game instance has even been created.
  4040. * Which means all instances of Phaser Games on the same page can share the one single pool.
  4041. *
  4042. * @namespace Phaser.Display.Canvas.CanvasPool
  4043. * @since 3.0.0
  4044. */
  4045. var CanvasPool = function ()
  4046. {
  4047. /**
  4048. * Creates a new Canvas DOM element, or pulls one from the pool if free.
  4049. *
  4050. * @function Phaser.Display.Canvas.CanvasPool.create
  4051. * @since 3.0.0
  4052. *
  4053. * @param {*} parent - The parent of the Canvas object.
  4054. * @param {integer} [width=1] - The width of the Canvas.
  4055. * @param {integer} [height=1] - The height of the Canvas.
  4056. * @param {integer} [canvasType=Phaser.CANVAS] - The type of the Canvas. Either `Phaser.CANVAS` or `Phaser.WEBGL`.
  4057. * @param {boolean} [selfParent=false] - Use the generated Canvas element as the parent?
  4058. *
  4059. * @return {HTMLCanvasElement} [description]
  4060. */
  4061. var create = function (parent, width, height, canvasType, selfParent)
  4062. {
  4063. if (width === undefined) { width = 1; }
  4064. if (height === undefined) { height = 1; }
  4065. if (canvasType === undefined) { canvasType = CONST.CANVAS; }
  4066. if (selfParent === undefined) { selfParent = false; }
  4067. var canvas;
  4068. var container = first(canvasType);
  4069. if (container === null)
  4070. {
  4071. container = {
  4072. parent: parent,
  4073. canvas: document.createElement('canvas'),
  4074. type: canvasType
  4075. };
  4076. if (canvasType === CONST.CANVAS)
  4077. {
  4078. pool.push(container);
  4079. }
  4080. canvas = container.canvas;
  4081. }
  4082. else
  4083. {
  4084. container.parent = parent;
  4085. canvas = container.canvas;
  4086. }
  4087. if (selfParent)
  4088. {
  4089. container.parent = canvas;
  4090. }
  4091. canvas.width = width;
  4092. canvas.height = height;
  4093. if (_disableContextSmoothing && canvasType === CONST.CANVAS)
  4094. {
  4095. Smoothing.disable(canvas.getContext('2d'));
  4096. }
  4097. return canvas;
  4098. };
  4099. /**
  4100. * Creates a new Canvas DOM element, or pulls one from the pool if free.
  4101. *
  4102. * @function Phaser.Display.Canvas.CanvasPool.create2D
  4103. * @since 3.0.0
  4104. *
  4105. * @param {*} parent - The parent of the Canvas object.
  4106. * @param {integer} [width=1] - The width of the Canvas.
  4107. * @param {integer} [height=1] - The height of the Canvas.
  4108. *
  4109. * @return {HTMLCanvasElement} [description]
  4110. */
  4111. var create2D = function (parent, width, height)
  4112. {
  4113. return create(parent, width, height, CONST.CANVAS);
  4114. };
  4115. /**
  4116. * Creates a new Canvas DOM element, or pulls one from the pool if free.
  4117. *
  4118. * @function Phaser.Display.Canvas.CanvasPool.createWebGL
  4119. * @since 3.0.0
  4120. *
  4121. * @param {*} parent - The parent of the Canvas object.
  4122. * @param {integer} [width=1] - The width of the Canvas.
  4123. * @param {integer} [height=1] - The height of the Canvas.
  4124. *
  4125. * @return {HTMLCanvasElement} [description]
  4126. */
  4127. var createWebGL = function (parent, width, height)
  4128. {
  4129. return create(parent, width, height, CONST.WEBGL);
  4130. };
  4131. /**
  4132. * Gets the first free canvas index from the pool.
  4133. *
  4134. * @function Phaser.Display.Canvas.CanvasPool.first
  4135. * @since 3.0.0
  4136. *
  4137. * @param {integer} [canvasType=Phaser.CANVAS] - The type of the Canvas. Either `Phaser.CANVAS` or `Phaser.WEBGL`.
  4138. *
  4139. * @return {HTMLCanvasElement} [description]
  4140. */
  4141. var first = function (canvasType)
  4142. {
  4143. if (canvasType === undefined) { canvasType = CONST.CANVAS; }
  4144. if (canvasType === CONST.WEBGL)
  4145. {
  4146. return null;
  4147. }
  4148. for (var i = 0; i < pool.length; i++)
  4149. {
  4150. var container = pool[i];
  4151. if (!container.parent && container.type === canvasType)
  4152. {
  4153. return container;
  4154. }
  4155. }
  4156. return null;
  4157. };
  4158. /**
  4159. * Looks up a canvas based on its parent, and if found puts it back in the pool, freeing it up for re-use.
  4160. * The canvas has its width and height set to 1, and its parent attribute nulled.
  4161. *
  4162. * @function Phaser.Display.Canvas.CanvasPool.remove
  4163. * @since 3.0.0
  4164. *
  4165. * @param {*} parent - [description]
  4166. */
  4167. var remove = function (parent)
  4168. {
  4169. // Check to see if the parent is a canvas object
  4170. var isCanvas = parent instanceof HTMLCanvasElement;
  4171. pool.forEach(function (container)
  4172. {
  4173. if ((isCanvas && container.canvas === parent) || (!isCanvas && container.parent === parent))
  4174. {
  4175. container.parent = null;
  4176. container.canvas.width = 1;
  4177. container.canvas.height = 1;
  4178. }
  4179. });
  4180. };
  4181. /**
  4182. * Gets the total number of used canvas elements in the pool.
  4183. *
  4184. * @function Phaser.Display.Canvas.CanvasPool.total
  4185. * @since 3.0.0
  4186. *
  4187. * @return {integer} [description]
  4188. */
  4189. var total = function ()
  4190. {
  4191. var c = 0;
  4192. pool.forEach(function (container)
  4193. {
  4194. if (container.parent)
  4195. {
  4196. c++;
  4197. }
  4198. });
  4199. return c;
  4200. };
  4201. /**
  4202. * Gets the total number of free canvas elements in the pool.
  4203. *
  4204. * @function Phaser.Display.Canvas.CanvasPool.free
  4205. * @since 3.0.0
  4206. *
  4207. * @return {integer} [description]
  4208. */
  4209. var free = function ()
  4210. {
  4211. return pool.length - total();
  4212. };
  4213. /**
  4214. * Disable context smoothing on any new Canvas element created.
  4215. *
  4216. * @function Phaser.Display.Canvas.CanvasPool.disableSmoothing
  4217. * @since 3.0.0
  4218. */
  4219. var disableSmoothing = function ()
  4220. {
  4221. _disableContextSmoothing = true;
  4222. };
  4223. /**
  4224. * Enable context smoothing on any new Canvas element created.
  4225. *
  4226. * @function Phaser.Display.Canvas.CanvasPool.enableSmoothing
  4227. * @since 3.0.0
  4228. */
  4229. var enableSmoothing = function ()
  4230. {
  4231. _disableContextSmoothing = false;
  4232. };
  4233. return {
  4234. create2D: create2D,
  4235. create: create,
  4236. createWebGL: createWebGL,
  4237. disableSmoothing: disableSmoothing,
  4238. enableSmoothing: enableSmoothing,
  4239. first: first,
  4240. free: free,
  4241. pool: pool,
  4242. remove: remove,
  4243. total: total
  4244. };
  4245. };
  4246. // If we export the called function here, it'll only be invoked once (not every time it's required).
  4247. module.exports = CanvasPool();
  4248. /***/ }),
  4249. /* 25 */
  4250. /***/ (function(module, exports, __webpack_require__) {
  4251. /**
  4252. * @author Richard Davey <rich@photonstorm.com>
  4253. * @copyright 2018 Photon Storm Ltd.
  4254. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4255. */
  4256. var BlendModes = __webpack_require__(52);
  4257. var GetAdvancedValue = __webpack_require__(10);
  4258. var ScaleModes = __webpack_require__(59);
  4259. /**
  4260. * @typedef {object} GameObjectConfig
  4261. *
  4262. * @property {number} [x=0] - The x position of the Game Object.
  4263. * @property {number} [y=0] - The y position of the Game Object.
  4264. * @property {number} [depth=0] - The depth of the GameObject.
  4265. * @property {boolean} [flipX=false] - The horizontally flipped state of the Game Object.
  4266. * @property {boolean} [flipY=false] - The vertically flipped state of the Game Object.
  4267. * @property {?(number|object)} [scale=null] - The scale of the GameObject.
  4268. * @property {?(number|object)} [scrollFactor=null] - The scroll factor of the GameObject.
  4269. * @property {number} [rotation=0] - The rotation angle of the Game Object, in radians.
  4270. * @property {?number} [angle=null] - The rotation angle of the Game Object, in degrees.
  4271. * @property {number} [alpha=1] - The alpha (opacity) of the Game Object.
  4272. * @property {?(number|object)} [origin=null] - The origin of the Game Object.
  4273. * @property {number} [scaleMode=ScaleModes.DEFAULT] - The scale mode of the GameObject.
  4274. * @property {number} [blendMode=BlendModes.DEFAULT] - The blend mode of the GameObject.
  4275. * @property {boolean} [visible=true] - The visible state of the Game Object.
  4276. * @property {boolean} [add=true] - Add the GameObject to the scene.
  4277. */
  4278. /**
  4279. * Builds a Game Object using the provided configuration object.
  4280. *
  4281. * @function Phaser.GameObjects.BuildGameObject
  4282. * @since 3.0.0
  4283. *
  4284. * @param {Phaser.Scene} scene - A reference to the Scene.
  4285. * @param {Phaser.GameObjects.GameObject} gameObject - The initial GameObject.
  4286. * @param {GameObjectConfig} config - The config to build the GameObject with.
  4287. *
  4288. * @return {Phaser.GameObjects.GameObject} The built Game Object.
  4289. */
  4290. var BuildGameObject = function (scene, gameObject, config)
  4291. {
  4292. // Position
  4293. gameObject.x = GetAdvancedValue(config, 'x', 0);
  4294. gameObject.y = GetAdvancedValue(config, 'y', 0);
  4295. gameObject.depth = GetAdvancedValue(config, 'depth', 0);
  4296. // Flip
  4297. gameObject.flipX = GetAdvancedValue(config, 'flipX', false);
  4298. gameObject.flipY = GetAdvancedValue(config, 'flipY', false);
  4299. // Scale
  4300. // Either: { scale: 2 } or { scale: { x: 2, y: 2 }}
  4301. var scale = GetAdvancedValue(config, 'scale', null);
  4302. if (typeof scale === 'number')
  4303. {
  4304. gameObject.setScale(scale);
  4305. }
  4306. else if (scale !== null)
  4307. {
  4308. gameObject.scaleX = GetAdvancedValue(scale, 'x', 1);
  4309. gameObject.scaleY = GetAdvancedValue(scale, 'y', 1);
  4310. }
  4311. // ScrollFactor
  4312. // Either: { scrollFactor: 2 } or { scrollFactor: { x: 2, y: 2 }}
  4313. var scrollFactor = GetAdvancedValue(config, 'scrollFactor', null);
  4314. if (typeof scrollFactor === 'number')
  4315. {
  4316. gameObject.setScrollFactor(scrollFactor);
  4317. }
  4318. else if (scrollFactor !== null)
  4319. {
  4320. gameObject.scrollFactorX = GetAdvancedValue(scrollFactor, 'x', 1);
  4321. gameObject.scrollFactorY = GetAdvancedValue(scrollFactor, 'y', 1);
  4322. }
  4323. // Rotation
  4324. gameObject.rotation = GetAdvancedValue(config, 'rotation', 0);
  4325. var angle = GetAdvancedValue(config, 'angle', null);
  4326. if (angle !== null)
  4327. {
  4328. gameObject.angle = angle;
  4329. }
  4330. // Alpha
  4331. gameObject.alpha = GetAdvancedValue(config, 'alpha', 1);
  4332. // Origin
  4333. // Either: { origin: 0.5 } or { origin: { x: 0.5, y: 0.5 }}
  4334. var origin = GetAdvancedValue(config, 'origin', null);
  4335. if (typeof origin === 'number')
  4336. {
  4337. gameObject.setOrigin(origin);
  4338. }
  4339. else if (origin !== null)
  4340. {
  4341. var ox = GetAdvancedValue(origin, 'x', 0.5);
  4342. var oy = GetAdvancedValue(origin, 'y', 0.5);
  4343. gameObject.setOrigin(ox, oy);
  4344. }
  4345. // ScaleMode
  4346. gameObject.scaleMode = GetAdvancedValue(config, 'scaleMode', ScaleModes.DEFAULT);
  4347. // BlendMode
  4348. gameObject.blendMode = GetAdvancedValue(config, 'blendMode', BlendModes.NORMAL);
  4349. // Visible
  4350. gameObject.visible = GetAdvancedValue(config, 'visible', true);
  4351. // Add to Scene
  4352. var add = GetAdvancedValue(config, 'add', true);
  4353. if (add)
  4354. {
  4355. scene.sys.displayList.add(gameObject);
  4356. }
  4357. if (gameObject.preUpdate)
  4358. {
  4359. scene.sys.updateList.add(gameObject);
  4360. }
  4361. return gameObject;
  4362. };
  4363. module.exports = BuildGameObject;
  4364. /***/ }),
  4365. /* 26 */
  4366. /***/ (function(module, exports) {
  4367. /**
  4368. * @author Richard Davey <rich@photonstorm.com>
  4369. * @copyright 2018 Photon Storm Ltd.
  4370. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4371. */
  4372. /**
  4373. * Takes an array of Game Objects, or any objects that have a public property as defined in `key`,
  4374. * and then sets it to the given value.
  4375. *
  4376. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  4377. *
  4378. * To use this with a Group: `PropertyValueSet(group.getChildren(), key, value, step)`
  4379. *
  4380. * @function Phaser.Actions.PropertyValueSet
  4381. * @since 3.3.0
  4382. *
  4383. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  4384. *
  4385. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  4386. * @param {string} key - The property to be updated.
  4387. * @param {number} value - The amount to set the property to.
  4388. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  4389. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  4390. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  4391. *
  4392. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  4393. */
  4394. var PropertyValueSet = function (items, key, value, step, index, direction)
  4395. {
  4396. if (step === undefined) { step = 0; }
  4397. if (index === undefined) { index = 0; }
  4398. if (direction === undefined) { direction = 1; }
  4399. var i;
  4400. var t = 0;
  4401. var end = items.length;
  4402. if (direction === 1)
  4403. {
  4404. // Start to End
  4405. for (i = index; i < end; i++)
  4406. {
  4407. items[i][key] = value + (t * step);
  4408. t++;
  4409. }
  4410. }
  4411. else
  4412. {
  4413. // End to Start
  4414. for (i = index; i >= 0; i--)
  4415. {
  4416. items[i][key] = value + (t * step);
  4417. t++;
  4418. }
  4419. }
  4420. return items;
  4421. };
  4422. module.exports = PropertyValueSet;
  4423. /***/ }),
  4424. /* 27 */
  4425. /***/ (function(module, exports) {
  4426. /**
  4427. * @author Richard Davey <rich@photonstorm.com>
  4428. * @copyright 2018 Photon Storm Ltd.
  4429. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4430. */
  4431. /**
  4432. * @namespace Phaser.Tilemaps.Formats
  4433. */
  4434. module.exports = {
  4435. /**
  4436. * CSV Map Type
  4437. *
  4438. * @name Phaser.Tilemaps.Formats.CSV
  4439. * @type {number}
  4440. * @since 3.0.0
  4441. */
  4442. CSV: 0,
  4443. /**
  4444. * Tiled JSON Map Type
  4445. *
  4446. * @name Phaser.Tilemaps.Formats.TILED_JSON
  4447. * @type {number}
  4448. * @since 3.0.0
  4449. */
  4450. TILED_JSON: 1,
  4451. /**
  4452. * 2D Array Map Type
  4453. *
  4454. * @name Phaser.Tilemaps.Formats.ARRAY_2D
  4455. * @type {number}
  4456. * @since 3.0.0
  4457. */
  4458. ARRAY_2D: 2,
  4459. /**
  4460. * Weltmeister (Impact.js) Map Type
  4461. *
  4462. * @name Phaser.Tilemaps.Formats.WELTMEISTER
  4463. * @type {number}
  4464. * @since 3.0.0
  4465. */
  4466. WELTMEISTER: 3
  4467. };
  4468. /***/ }),
  4469. /* 28 */
  4470. /***/ (function(module, exports, __webpack_require__) {
  4471. /**
  4472. * @author Richard Davey <rich@photonstorm.com>
  4473. * @copyright 2018 Photon Storm Ltd.
  4474. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4475. */
  4476. var Class = __webpack_require__(0);
  4477. var CONST = __webpack_require__(18);
  4478. var File = __webpack_require__(20);
  4479. var FileTypesManager = __webpack_require__(7);
  4480. var GetFastValue = __webpack_require__(1);
  4481. var GetValue = __webpack_require__(4);
  4482. var IsPlainObject = __webpack_require__(8);
  4483. /**
  4484. * @typedef {object} Phaser.Loader.FileTypes.JSONFileConfig
  4485. *
  4486. * @property {string} key - The key of the file. Must be unique within both the Loader and the JSON Cache.
  4487. * @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.
  4488. * @property {string} [extension='json'] - The default file extension to use if no url is provided.
  4489. * @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.
  4490. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  4491. */
  4492. /**
  4493. * @classdesc
  4494. * A single JSON File suitable for loading by the Loader.
  4495. *
  4496. * These are created when you use the Phaser.Loader.LoaderPlugin#json method and are not typically created directly.
  4497. *
  4498. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#json.
  4499. *
  4500. * @class JSONFile
  4501. * @extends Phaser.Loader.File
  4502. * @memberOf Phaser.Loader.FileTypes
  4503. * @constructor
  4504. * @since 3.0.0
  4505. *
  4506. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  4507. * @param {(string|Phaser.Loader.FileTypes.JSONFileConfig)} key - The key to use for this file, or a file configuration object.
  4508. * @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".
  4509. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  4510. * @param {string} [dataKey] - When the JSON file loads only this property will be stored in the Cache.
  4511. */
  4512. var JSONFile = new Class({
  4513. Extends: File,
  4514. initialize:
  4515. // 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
  4516. // dataKey allows you to pluck a specific object out of the JSON and put just that into the cache, rather than the whole thing
  4517. function JSONFile (loader, key, url, xhrSettings, dataKey)
  4518. {
  4519. var extension = 'json';
  4520. if (IsPlainObject(key))
  4521. {
  4522. var config = key;
  4523. key = GetFastValue(config, 'key');
  4524. url = GetFastValue(config, 'url');
  4525. xhrSettings = GetFastValue(config, 'xhrSettings');
  4526. extension = GetFastValue(config, 'extension', extension);
  4527. dataKey = GetFastValue(config, 'dataKey', dataKey);
  4528. }
  4529. var fileConfig = {
  4530. type: 'json',
  4531. cache: loader.cacheManager.json,
  4532. extension: extension,
  4533. responseType: 'text',
  4534. key: key,
  4535. url: url,
  4536. xhrSettings: xhrSettings,
  4537. config: dataKey
  4538. };
  4539. File.call(this, loader, fileConfig);
  4540. if (IsPlainObject(url))
  4541. {
  4542. // Object provided instead of a URL, so no need to actually load it (populate data with value)
  4543. if (dataKey)
  4544. {
  4545. this.data = GetValue(url, dataKey);
  4546. }
  4547. else
  4548. {
  4549. this.data = url;
  4550. }
  4551. this.state = CONST.FILE_POPULATED;
  4552. }
  4553. },
  4554. /**
  4555. * Called automatically by Loader.nextFile.
  4556. * This method controls what extra work this File does with its loaded data.
  4557. *
  4558. * @method Phaser.Loader.FileTypes.JSONFile#onProcess
  4559. * @since 3.7.0
  4560. */
  4561. onProcess: function ()
  4562. {
  4563. if (this.state !== CONST.FILE_POPULATED)
  4564. {
  4565. this.state = CONST.FILE_PROCESSING;
  4566. var json = JSON.parse(this.xhrLoader.responseText);
  4567. var key = this.config;
  4568. if (typeof key === 'string')
  4569. {
  4570. this.data = GetValue(json, key, json);
  4571. }
  4572. else
  4573. {
  4574. this.data = json;
  4575. }
  4576. }
  4577. this.onProcessComplete();
  4578. }
  4579. });
  4580. /**
  4581. * Adds a JSON file, or array of JSON files, to the current load queue.
  4582. *
  4583. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  4584. *
  4585. * ```javascript
  4586. * function preload ()
  4587. * {
  4588. * this.load.json('wavedata', 'files/AlienWaveData.json');
  4589. * }
  4590. * ```
  4591. *
  4592. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  4593. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  4594. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  4595. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  4596. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  4597. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  4598. * loaded.
  4599. *
  4600. * The key must be a unique String. It is used to add the file to the global JSON Cache upon a successful load.
  4601. * The key should be unique both in terms of files being loaded and files already present in the JSON Cache.
  4602. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  4603. * then remove it from the JSON Cache first, before loading a new one.
  4604. *
  4605. * Instead of passing arguments you can pass a configuration object, such as:
  4606. *
  4607. * ```javascript
  4608. * this.load.json({
  4609. * key: 'wavedata',
  4610. * url: 'files/AlienWaveData.json'
  4611. * });
  4612. * ```
  4613. *
  4614. * See the documentation for `Phaser.Loader.FileTypes.JSONFileConfig` for more details.
  4615. *
  4616. * Once the file has finished loading you can access it from its Cache using its key:
  4617. *
  4618. * ```javascript
  4619. * this.load.json('wavedata', 'files/AlienWaveData.json');
  4620. * // and later in your game ...
  4621. * var data = this.cache.json.get('wavedata');
  4622. * ```
  4623. *
  4624. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  4625. * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and
  4626. * this is what you would use to retrieve the text from the JSON Cache.
  4627. *
  4628. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  4629. *
  4630. * 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"
  4631. * 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
  4632. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  4633. *
  4634. * 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,
  4635. * rather than the whole file. For example, if your JSON data had a structure like this:
  4636. *
  4637. * ```json
  4638. * {
  4639. * "level1": {
  4640. * "baddies": {
  4641. * "aliens": {},
  4642. * "boss": {}
  4643. * }
  4644. * },
  4645. * "level2": {},
  4646. * "level3": {}
  4647. * }
  4648. * ```
  4649. *
  4650. * And you only wanted to store the `boss` data in the Cache, then you could pass `level1.baddies.boss`as the `dataKey`.
  4651. *
  4652. * Note: The ability to load this type of file will only be available if the JSON File type has been built into Phaser.
  4653. * It is available in the default build but can be excluded from custom builds.
  4654. *
  4655. * @method Phaser.Loader.LoaderPlugin#json
  4656. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  4657. * @since 3.0.0
  4658. *
  4659. * @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.
  4660. * @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".
  4661. * @param {string} [dataKey] - When the JSON file loads only this property will be stored in the Cache.
  4662. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  4663. *
  4664. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  4665. */
  4666. FileTypesManager.register('json', function (key, url, dataKey, xhrSettings)
  4667. {
  4668. if (Array.isArray(key))
  4669. {
  4670. for (var i = 0; i < key.length; i++)
  4671. {
  4672. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  4673. this.addFile(new JSONFile(this, key[i]));
  4674. }
  4675. }
  4676. else
  4677. {
  4678. this.addFile(new JSONFile(this, key, url, xhrSettings, dataKey));
  4679. }
  4680. return this;
  4681. });
  4682. module.exports = JSONFile;
  4683. /***/ }),
  4684. /* 29 */
  4685. /***/ (function(module, exports) {
  4686. /**
  4687. * @author Richard Davey <rich@photonstorm.com>
  4688. * @copyright 2018 Photon Storm Ltd.
  4689. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4690. */
  4691. /**
  4692. * Tests if the start and end indexes are a safe range for the given array.
  4693. *
  4694. * @function Phaser.Utils.Array.SafeRange
  4695. * @since 3.4.0
  4696. *
  4697. * @param {array} array - The array to check.
  4698. * @param {integer} startIndex - The start index.
  4699. * @param {integer} endIndex - The end index.
  4700. * @param {boolean} [throwError=true] - Throw an error if the range is out of bounds.
  4701. *
  4702. * @return {boolean} True if the range is safe, otherwise false.
  4703. */
  4704. var SafeRange = function (array, startIndex, endIndex, throwError)
  4705. {
  4706. var len = array.length;
  4707. if (startIndex < 0 ||
  4708. startIndex > len ||
  4709. startIndex >= endIndex ||
  4710. endIndex > len ||
  4711. startIndex + endIndex > len)
  4712. {
  4713. if (throwError)
  4714. {
  4715. throw new Error('Range Error: Values outside acceptable range');
  4716. }
  4717. return false;
  4718. }
  4719. else
  4720. {
  4721. return true;
  4722. }
  4723. };
  4724. module.exports = SafeRange;
  4725. /***/ }),
  4726. /* 30 */
  4727. /***/ (function(module, exports, __webpack_require__) {
  4728. /**
  4729. * @author Richard Davey <rich@photonstorm.com>
  4730. * @copyright 2018 Photon Storm Ltd.
  4731. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  4732. */
  4733. var Class = __webpack_require__(0);
  4734. var GetColor = __webpack_require__(155);
  4735. var GetColor32 = __webpack_require__(278);
  4736. /**
  4737. * @classdesc
  4738. * The Color class holds a single color value and allows for easy modification and reading of it.
  4739. *
  4740. * @class Color
  4741. * @memberOf Phaser.Display
  4742. * @constructor
  4743. * @since 3.0.0
  4744. *
  4745. * @param {integer} [red=0] - The red color value. A number between 0 and 255.
  4746. * @param {integer} [green=0] - The green color value. A number between 0 and 255.
  4747. * @param {integer} [blue=0] - The blue color value. A number between 0 and 255.
  4748. * @param {integer} [alpha=255] - The alpha value. A number between 0 and 255.
  4749. */
  4750. var Color = new Class({
  4751. initialize:
  4752. function Color (red, green, blue, alpha)
  4753. {
  4754. if (red === undefined) { red = 0; }
  4755. if (green === undefined) { green = 0; }
  4756. if (blue === undefined) { blue = 0; }
  4757. if (alpha === undefined) { alpha = 255; }
  4758. /**
  4759. * The internal red color value.
  4760. *
  4761. * @name Phaser.Display.Color#r
  4762. * @type {number}
  4763. * @private
  4764. * @default 0
  4765. * @since 3.0.0
  4766. */
  4767. this.r = 0;
  4768. /**
  4769. * The internal green color value.
  4770. *
  4771. * @name Phaser.Display.Color#g
  4772. * @type {number}
  4773. * @private
  4774. * @default 0
  4775. * @since 3.0.0
  4776. */
  4777. this.g = 0;
  4778. /**
  4779. * The internal blue color value.
  4780. *
  4781. * @name Phaser.Display.Color#b
  4782. * @type {number}
  4783. * @private
  4784. * @default 0
  4785. * @since 3.0.0
  4786. */
  4787. this.b = 0;
  4788. /**
  4789. * The internal alpha color value.
  4790. *
  4791. * @name Phaser.Display.Color#a
  4792. * @type {number}
  4793. * @private
  4794. * @default 255
  4795. * @since 3.0.0
  4796. */
  4797. this.a = 255;
  4798. /**
  4799. * An array containing the calculated color values for WebGL use.
  4800. *
  4801. * @name Phaser.Display.Color#gl
  4802. * @type {number[]}
  4803. * @since 3.0.0
  4804. */
  4805. this.gl = [ 0, 0, 0, 1 ];
  4806. /**
  4807. * Pre-calculated internal color value.
  4808. *
  4809. * @name Phaser.Display.Color#_color
  4810. * @type {number}
  4811. * @private
  4812. * @default 0
  4813. * @since 3.0.0
  4814. */
  4815. this._color = 0;
  4816. /**
  4817. * Pre-calculated internal color32 value.
  4818. *
  4819. * @name Phaser.Display.Color#_color32
  4820. * @type {number}
  4821. * @private
  4822. * @default 0
  4823. * @since 3.0.0
  4824. */
  4825. this._color32 = 0;
  4826. /**
  4827. * Pre-calculated internal color rgb string value.
  4828. *
  4829. * @name Phaser.Display.Color#_rgba
  4830. * @type {string}
  4831. * @private
  4832. * @default ''
  4833. * @since 3.0.0
  4834. */
  4835. this._rgba = '';
  4836. this.setTo(red, green, blue, alpha);
  4837. },
  4838. /**
  4839. * Sets this color to be transparent. Sets all values to zero.
  4840. *
  4841. * @method Phaser.Display.Color#transparent
  4842. * @since 3.0.0
  4843. *
  4844. * @return {Phaser.Display.Color} This Color object.
  4845. */
  4846. transparent: function ()
  4847. {
  4848. this.red = 0;
  4849. this.green = 0;
  4850. this.blue = 0;
  4851. this.alpha = 0;
  4852. return this.update();
  4853. },
  4854. /**
  4855. * Sets the color of this Color component.
  4856. *
  4857. * @method Phaser.Display.Color#setTo
  4858. * @since 3.0.0
  4859. *
  4860. * @param {integer} red - The red color value. A number between 0 and 255.
  4861. * @param {integer} green - The green color value. A number between 0 and 255.
  4862. * @param {integer} blue - The blue color value. A number between 0 and 255.
  4863. * @param {integer} [alpha=255] - The alpha value. A number between 0 and 255.
  4864. *
  4865. * @return {Phaser.Display.Color} This Color object.
  4866. */
  4867. setTo: function (red, green, blue, alpha)
  4868. {
  4869. if (alpha === undefined) { alpha = 255; }
  4870. this.red = red;
  4871. this.green = green;
  4872. this.blue = blue;
  4873. this.alpha = alpha;
  4874. return this.update();
  4875. },
  4876. /**
  4877. * Sets the red, green, blue and alpha GL values of this Color component.
  4878. *
  4879. * @method Phaser.Display.Color#setGLTo
  4880. * @since 3.0.0
  4881. *
  4882. * @param {number} red - The red color value. A number between 0 and 1.
  4883. * @param {number} green - The green color value. A number between 0 and 1.
  4884. * @param {number} blue - The blue color value. A number between 0 and 1.
  4885. * @param {number} [alpha=1] - The alpha value. A number between 0 and 1.
  4886. *
  4887. * @return {Phaser.Display.Color} This Color object.
  4888. */
  4889. setGLTo: function (red, green, blue, alpha)
  4890. {
  4891. if (alpha === undefined) { alpha = 1; }
  4892. this.redGL = red;
  4893. this.greenGL = green;
  4894. this.blueGL = blue;
  4895. this.alphaGL = alpha;
  4896. return this.update();
  4897. },
  4898. /**
  4899. * Sets the color based on the color object given.
  4900. *
  4901. * @method Phaser.Display.Color#setFromRGB
  4902. * @since 3.0.0
  4903. *
  4904. * @param {InputColorObject} color - An object containing `r`, `g`, `b` and optionally `a` values in the range 0 to 255.
  4905. *
  4906. * @return {Phaser.Display.Color} This Color object.
  4907. */
  4908. setFromRGB: function (color)
  4909. {
  4910. this.red = color.r;
  4911. this.green = color.g;
  4912. this.blue = color.b;
  4913. if (color.hasOwnProperty('a'))
  4914. {
  4915. this.alpha = color.a;
  4916. }
  4917. return this.update();
  4918. },
  4919. /**
  4920. * Updates the internal cache values.
  4921. *
  4922. * @method Phaser.Display.Color#update
  4923. * @since 3.0.0
  4924. *
  4925. * @return {Phaser.Display.Color} This Color object.
  4926. */
  4927. update: function ()
  4928. {
  4929. this._color = GetColor(this.r, this.g, this.b);
  4930. this._color32 = GetColor32(this.r, this.g, this.b, this.a);
  4931. this._rgba = 'rgba(' + this.r + ',' + this.g + ',' + this.b + ',' + (this.a / 255) + ')';
  4932. return this;
  4933. },
  4934. /**
  4935. * Returns a new Color component using the values from this one.
  4936. *
  4937. * @method Phaser.Display.Color#clone
  4938. * @since 3.0.0
  4939. *
  4940. * @return {Phaser.Display.Color} A new Color object.
  4941. */
  4942. clone: function ()
  4943. {
  4944. return new Color(this.r, this.g, this.b, this.a);
  4945. },
  4946. /**
  4947. * The color of this Color component, not including the alpha channel.
  4948. *
  4949. * @name Phaser.Display.Color#color
  4950. * @type {number}
  4951. * @readOnly
  4952. * @since 3.0.0
  4953. */
  4954. color: {
  4955. get: function ()
  4956. {
  4957. return this._color;
  4958. }
  4959. },
  4960. /**
  4961. * The color of this Color component, including the alpha channel.
  4962. *
  4963. * @name Phaser.Display.Color#color32
  4964. * @type {number}
  4965. * @readOnly
  4966. * @since 3.0.0
  4967. */
  4968. color32: {
  4969. get: function ()
  4970. {
  4971. return this._color32;
  4972. }
  4973. },
  4974. /**
  4975. * The color of this Color component as a string which can be used in CSS color values.
  4976. *
  4977. * @name Phaser.Display.Color#rgba
  4978. * @type {string}
  4979. * @readOnly
  4980. * @since 3.0.0
  4981. */
  4982. rgba: {
  4983. get: function ()
  4984. {
  4985. return this._rgba;
  4986. }
  4987. },
  4988. /**
  4989. * The red color value, normalized to the range 0 to 1.
  4990. *
  4991. * @name Phaser.Display.Color#redGL
  4992. * @type {number}
  4993. * @since 3.0.0
  4994. */
  4995. redGL: {
  4996. get: function ()
  4997. {
  4998. return this.gl[0];
  4999. },
  5000. set: function (value)
  5001. {
  5002. this.gl[0] = Math.min(Math.abs(value), 1);
  5003. this.r = Math.floor(this.gl[0] * 255);
  5004. this.update();
  5005. }
  5006. },
  5007. /**
  5008. * The green color value, normalized to the range 0 to 1.
  5009. *
  5010. * @name Phaser.Display.Color#greenGL
  5011. * @type {number}
  5012. * @since 3.0.0
  5013. */
  5014. greenGL: {
  5015. get: function ()
  5016. {
  5017. return this.gl[1];
  5018. },
  5019. set: function (value)
  5020. {
  5021. this.gl[1] = Math.min(Math.abs(value), 1);
  5022. this.g = Math.floor(this.gl[1] * 255);
  5023. this.update();
  5024. }
  5025. },
  5026. /**
  5027. * The blue color value, normalized to the range 0 to 1.
  5028. *
  5029. * @name Phaser.Display.Color#blueGL
  5030. * @type {number}
  5031. * @since 3.0.0
  5032. */
  5033. blueGL: {
  5034. get: function ()
  5035. {
  5036. return this.gl[2];
  5037. },
  5038. set: function (value)
  5039. {
  5040. this.gl[2] = Math.min(Math.abs(value), 1);
  5041. this.b = Math.floor(this.gl[2] * 255);
  5042. this.update();
  5043. }
  5044. },
  5045. /**
  5046. * The alpha color value, normalized to the range 0 to 1.
  5047. *
  5048. * @name Phaser.Display.Color#alphaGL
  5049. * @type {number}
  5050. * @since 3.0.0
  5051. */
  5052. alphaGL: {
  5053. get: function ()
  5054. {
  5055. return this.gl[3];
  5056. },
  5057. set: function (value)
  5058. {
  5059. this.gl[3] = Math.min(Math.abs(value), 1);
  5060. this.a = Math.floor(this.gl[3] * 255);
  5061. this.update();
  5062. }
  5063. },
  5064. /**
  5065. * The red color value, normalized to the range 0 to 255.
  5066. *
  5067. * @name Phaser.Display.Color#red
  5068. * @type {number}
  5069. * @since 3.0.0
  5070. */
  5071. red: {
  5072. get: function ()
  5073. {
  5074. return this.r;
  5075. },
  5076. set: function (value)
  5077. {
  5078. value = Math.floor(Math.abs(value));
  5079. this.r = Math.min(value, 255);
  5080. this.gl[0] = value / 255;
  5081. this.update();
  5082. }
  5083. },
  5084. /**
  5085. * The green color value, normalized to the range 0 to 255.
  5086. *
  5087. * @name Phaser.Display.Color#green
  5088. * @type {number}
  5089. * @since 3.0.0
  5090. */
  5091. green: {
  5092. get: function ()
  5093. {
  5094. return this.g;
  5095. },
  5096. set: function (value)
  5097. {
  5098. value = Math.floor(Math.abs(value));
  5099. this.g = Math.min(value, 255);
  5100. this.gl[1] = value / 255;
  5101. this.update();
  5102. }
  5103. },
  5104. /**
  5105. * The blue color value, normalized to the range 0 to 255.
  5106. *
  5107. * @name Phaser.Display.Color#blue
  5108. * @type {number}
  5109. * @since 3.0.0
  5110. */
  5111. blue: {
  5112. get: function ()
  5113. {
  5114. return this.b;
  5115. },
  5116. set: function (value)
  5117. {
  5118. value = Math.floor(Math.abs(value));
  5119. this.b = Math.min(value, 255);
  5120. this.gl[2] = value / 255;
  5121. this.update();
  5122. }
  5123. },
  5124. /**
  5125. * The alpha color value, normalized to the range 0 to 255.
  5126. *
  5127. * @name Phaser.Display.Color#alpha
  5128. * @type {number}
  5129. * @since 3.0.0
  5130. */
  5131. alpha: {
  5132. get: function ()
  5133. {
  5134. return this.a;
  5135. },
  5136. set: function (value)
  5137. {
  5138. value = Math.floor(Math.abs(value));
  5139. this.a = Math.min(value, 255);
  5140. this.gl[3] = value / 255;
  5141. this.update();
  5142. }
  5143. }
  5144. });
  5145. module.exports = Color;
  5146. /***/ }),
  5147. /* 31 */
  5148. /***/ (function(module, exports) {
  5149. /**
  5150. * @author Richard Davey <rich@photonstorm.com>
  5151. * @copyright 2018 Photon Storm Ltd.
  5152. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  5153. */
  5154. /**
  5155. * [description]
  5156. *
  5157. * @function Phaser.Geom.Rectangle.Contains
  5158. * @since 3.0.0
  5159. *
  5160. * @param {Phaser.Geom.Rectangle} rect - [description]
  5161. * @param {number} x - [description]
  5162. * @param {number} y - [description]
  5163. *
  5164. * @return {boolean} [description]
  5165. */
  5166. var Contains = function (rect, x, y)
  5167. {
  5168. if (rect.width <= 0 || rect.height <= 0)
  5169. {
  5170. return false;
  5171. }
  5172. return (rect.x <= x && rect.x + rect.width >= x && rect.y <= y && rect.y + rect.height >= y);
  5173. };
  5174. module.exports = Contains;
  5175. /***/ }),
  5176. /* 32 */
  5177. /***/ (function(module, exports, __webpack_require__) {
  5178. /**
  5179. * @author Richard Davey <rich@photonstorm.com>
  5180. * @copyright 2018 Photon Storm Ltd.
  5181. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  5182. */
  5183. var Class = __webpack_require__(0);
  5184. /**
  5185. * @classdesc
  5186. * A Matrix used for display transformations for rendering.
  5187. *
  5188. * It is represented like so:
  5189. *
  5190. * ```
  5191. * | a | c | tx |
  5192. * | b | d | ty |
  5193. * | 0 | 0 | 1 |
  5194. * ```
  5195. *
  5196. * @class TransformMatrix
  5197. * @memberOf Phaser.GameObjects.Components
  5198. * @constructor
  5199. * @since 3.0.0
  5200. *
  5201. * @param {number} [a=1] - The Scale X value.
  5202. * @param {number} [b=0] - The Shear Y value.
  5203. * @param {number} [c=0] - The Shear X value.
  5204. * @param {number} [d=1] - The Scale Y value.
  5205. * @param {number} [tx=0] - The Translate X value.
  5206. * @param {number} [ty=0] - The Translate Y value.
  5207. */
  5208. var TransformMatrix = new Class({
  5209. initialize:
  5210. function TransformMatrix (a, b, c, d, tx, ty)
  5211. {
  5212. if (a === undefined) { a = 1; }
  5213. if (b === undefined) { b = 0; }
  5214. if (c === undefined) { c = 0; }
  5215. if (d === undefined) { d = 1; }
  5216. if (tx === undefined) { tx = 0; }
  5217. if (ty === undefined) { ty = 0; }
  5218. /**
  5219. * The matrix values.
  5220. *
  5221. * @name Phaser.GameObjects.Components.TransformMatrix#matrix
  5222. * @type {Float32Array}
  5223. * @since 3.0.0
  5224. */
  5225. this.matrix = new Float32Array([ a, b, c, d, tx, ty, 0, 0, 1 ]);
  5226. /**
  5227. * The decomposed matrix.
  5228. *
  5229. * @name Phaser.GameObjects.Components.TransformMatrix#decomposedMatrix
  5230. * @type {object}
  5231. * @since 3.0.0
  5232. */
  5233. this.decomposedMatrix = {
  5234. translateX: 0,
  5235. translateY: 0,
  5236. scaleX: 1,
  5237. scaleY: 1,
  5238. rotation: 0
  5239. };
  5240. },
  5241. /**
  5242. * The Scale X value.
  5243. *
  5244. * @name Phaser.GameObjects.Components.TransformMatrix#a
  5245. * @type {number}
  5246. * @since 3.4.0
  5247. */
  5248. a: {
  5249. get: function ()
  5250. {
  5251. return this.matrix[0];
  5252. },
  5253. set: function (value)
  5254. {
  5255. this.matrix[0] = value;
  5256. }
  5257. },
  5258. /**
  5259. * The Shear Y value.
  5260. *
  5261. * @name Phaser.GameObjects.Components.TransformMatrix#b
  5262. * @type {number}
  5263. * @since 3.4.0
  5264. */
  5265. b: {
  5266. get: function ()
  5267. {
  5268. return this.matrix[1];
  5269. },
  5270. set: function (value)
  5271. {
  5272. this.matrix[1] = value;
  5273. }
  5274. },
  5275. /**
  5276. * The Shear X value.
  5277. *
  5278. * @name Phaser.GameObjects.Components.TransformMatrix#c
  5279. * @type {number}
  5280. * @since 3.4.0
  5281. */
  5282. c: {
  5283. get: function ()
  5284. {
  5285. return this.matrix[2];
  5286. },
  5287. set: function (value)
  5288. {
  5289. this.matrix[2] = value;
  5290. }
  5291. },
  5292. /**
  5293. * The Scale Y value.
  5294. *
  5295. * @name Phaser.GameObjects.Components.TransformMatrix#d
  5296. * @type {number}
  5297. * @since 3.4.0
  5298. */
  5299. d: {
  5300. get: function ()
  5301. {
  5302. return this.matrix[3];
  5303. },
  5304. set: function (value)
  5305. {
  5306. this.matrix[3] = value;
  5307. }
  5308. },
  5309. /**
  5310. * The Translate X value.
  5311. *
  5312. * @name Phaser.GameObjects.Components.TransformMatrix#e
  5313. * @type {number}
  5314. * @since 3.11.0
  5315. */
  5316. e: {
  5317. get: function ()
  5318. {
  5319. return this.matrix[4];
  5320. },
  5321. set: function (value)
  5322. {
  5323. this.matrix[4] = value;
  5324. }
  5325. },
  5326. /**
  5327. * The Translate Y value.
  5328. *
  5329. * @name Phaser.GameObjects.Components.TransformMatrix#f
  5330. * @type {number}
  5331. * @since 3.11.0
  5332. */
  5333. f: {
  5334. get: function ()
  5335. {
  5336. return this.matrix[5];
  5337. },
  5338. set: function (value)
  5339. {
  5340. this.matrix[5] = value;
  5341. }
  5342. },
  5343. /**
  5344. * The Translate X value.
  5345. *
  5346. * @name Phaser.GameObjects.Components.TransformMatrix#tx
  5347. * @type {number}
  5348. * @since 3.4.0
  5349. */
  5350. tx: {
  5351. get: function ()
  5352. {
  5353. return this.matrix[4];
  5354. },
  5355. set: function (value)
  5356. {
  5357. this.matrix[4] = value;
  5358. }
  5359. },
  5360. /**
  5361. * The Translate Y value.
  5362. *
  5363. * @name Phaser.GameObjects.Components.TransformMatrix#ty
  5364. * @type {number}
  5365. * @since 3.4.0
  5366. */
  5367. ty: {
  5368. get: function ()
  5369. {
  5370. return this.matrix[5];
  5371. },
  5372. set: function (value)
  5373. {
  5374. this.matrix[5] = value;
  5375. }
  5376. },
  5377. /**
  5378. * The rotation of the Matrix.
  5379. *
  5380. * @name Phaser.GameObjects.Components.TransformMatrix#rotation
  5381. * @type {number}
  5382. * @readOnly
  5383. * @since 3.4.0
  5384. */
  5385. rotation: {
  5386. get: function ()
  5387. {
  5388. return Math.acos(this.a / this.scaleX) * (Math.atan(-this.c / this.a) < 0 ? -1 : 1);
  5389. }
  5390. },
  5391. /**
  5392. * The horizontal scale of the Matrix.
  5393. *
  5394. * @name Phaser.GameObjects.Components.TransformMatrix#scaleX
  5395. * @type {number}
  5396. * @readOnly
  5397. * @since 3.4.0
  5398. */
  5399. scaleX: {
  5400. get: function ()
  5401. {
  5402. return Math.sqrt((this.a * this.a) + (this.c * this.c));
  5403. }
  5404. },
  5405. /**
  5406. * The vertical scale of the Matrix.
  5407. *
  5408. * @name Phaser.GameObjects.Components.TransformMatrix#scaleY
  5409. * @type {number}
  5410. * @readOnly
  5411. * @since 3.4.0
  5412. */
  5413. scaleY: {
  5414. get: function ()
  5415. {
  5416. return Math.sqrt((this.b * this.b) + (this.d * this.d));
  5417. }
  5418. },
  5419. /**
  5420. * Reset the Matrix to an identity matrix.
  5421. *
  5422. * @method Phaser.GameObjects.Components.TransformMatrix#loadIdentity
  5423. * @since 3.0.0
  5424. *
  5425. * @return {this} This TransformMatrix.
  5426. */
  5427. loadIdentity: function ()
  5428. {
  5429. var matrix = this.matrix;
  5430. matrix[0] = 1;
  5431. matrix[1] = 0;
  5432. matrix[2] = 0;
  5433. matrix[3] = 1;
  5434. matrix[4] = 0;
  5435. matrix[5] = 0;
  5436. return this;
  5437. },
  5438. /**
  5439. * Translate the Matrix.
  5440. *
  5441. * @method Phaser.GameObjects.Components.TransformMatrix#translate
  5442. * @since 3.0.0
  5443. *
  5444. * @param {number} x - The horizontal translation value.
  5445. * @param {number} y - The vertical translation value.
  5446. *
  5447. * @return {this} This TransformMatrix.
  5448. */
  5449. translate: function (x, y)
  5450. {
  5451. var matrix = this.matrix;
  5452. matrix[4] = matrix[0] * x + matrix[2] * y + matrix[4];
  5453. matrix[5] = matrix[1] * x + matrix[3] * y + matrix[5];
  5454. return this;
  5455. },
  5456. /**
  5457. * Scale the Matrix.
  5458. *
  5459. * @method Phaser.GameObjects.Components.TransformMatrix#scale
  5460. * @since 3.0.0
  5461. *
  5462. * @param {number} x - The horizontal scale value.
  5463. * @param {number} y - The vertical scale value.
  5464. *
  5465. * @return {this} This TransformMatrix.
  5466. */
  5467. scale: function (x, y)
  5468. {
  5469. var matrix = this.matrix;
  5470. matrix[0] *= x;
  5471. matrix[1] *= x;
  5472. matrix[2] *= y;
  5473. matrix[3] *= y;
  5474. return this;
  5475. },
  5476. /**
  5477. * Rotate the Matrix.
  5478. *
  5479. * @method Phaser.GameObjects.Components.TransformMatrix#rotate
  5480. * @since 3.0.0
  5481. *
  5482. * @param {number} radian - The angle of rotation in radians.
  5483. *
  5484. * @return {this} This TransformMatrix.
  5485. */
  5486. rotate: function (radian)
  5487. {
  5488. var radianSin = Math.sin(radian);
  5489. var radianCos = Math.cos(radian);
  5490. var matrix = this.matrix;
  5491. var a = matrix[0];
  5492. var b = matrix[1];
  5493. var c = matrix[2];
  5494. var d = matrix[3];
  5495. matrix[0] = a * radianCos + c * radianSin;
  5496. matrix[1] = b * radianCos + d * radianSin;
  5497. matrix[2] = a * -radianSin + c * radianCos;
  5498. matrix[3] = b * -radianSin + d * radianCos;
  5499. return this;
  5500. },
  5501. /**
  5502. * Multiply this Matrix by the given Matrix.
  5503. *
  5504. * If an `out` Matrix is given then the results will be stored in it.
  5505. * If it is not given, this matrix will be updated in place instead.
  5506. * Use an `out` Matrix if you do not wish to mutate this matrix.
  5507. *
  5508. * @method Phaser.GameObjects.Components.TransformMatrix#multiply
  5509. * @since 3.0.0
  5510. *
  5511. * @param {Phaser.GameObjects.Components.TransformMatrix} rhs - The Matrix to multiply by.
  5512. * @param {Phaser.GameObjects.Components.TransformMatrix} [out] - An optional Matrix to store the results in.
  5513. *
  5514. * @return {Phaser.GameObjects.Components.TransformMatrix} Either this TransformMatrix, or the `out` Matrix, if given in the arguments.
  5515. */
  5516. multiply: function (rhs, out)
  5517. {
  5518. var matrix = this.matrix;
  5519. var source = rhs.matrix;
  5520. var localA = matrix[0];
  5521. var localB = matrix[1];
  5522. var localC = matrix[2];
  5523. var localD = matrix[3];
  5524. var localE = matrix[4];
  5525. var localF = matrix[5];
  5526. var sourceA = source[0];
  5527. var sourceB = source[1];
  5528. var sourceC = source[2];
  5529. var sourceD = source[3];
  5530. var sourceE = source[4];
  5531. var sourceF = source[5];
  5532. var destinationMatrix = (out === undefined) ? this : out;
  5533. destinationMatrix.a = sourceA * localA + sourceB * localC;
  5534. destinationMatrix.b = sourceA * localB + sourceB * localD;
  5535. destinationMatrix.c = sourceC * localA + sourceD * localC;
  5536. destinationMatrix.d = sourceC * localB + sourceD * localD;
  5537. destinationMatrix.e = sourceE * localA + sourceF * localC + localE;
  5538. destinationMatrix.f = sourceE * localB + sourceF * localD + localF;
  5539. return destinationMatrix;
  5540. },
  5541. /**
  5542. * Multiply this Matrix by the matrix given, including the offset.
  5543. *
  5544. * The offsetX is added to the tx value: `offsetX * a + offsetY * c + tx`.
  5545. * The offsetY is added to the ty value: `offsetY * b + offsetY * d + ty`.
  5546. *
  5547. * @method Phaser.GameObjects.Components.TransformMatrix#multiplyWithOffset
  5548. * @since 3.11.0
  5549. *
  5550. * @param {Phaser.GameObjects.Components.TransformMatrix} src - The source Matrix to copy from.
  5551. * @param {number} offsetX - Horizontal offset to factor in to the multiplication.
  5552. * @param {number} offsetY - Vertical offset to factor in to the multiplication.
  5553. *
  5554. * @return {this} This TransformMatrix.
  5555. */
  5556. multiplyWithOffset: function (src, offsetX, offsetY)
  5557. {
  5558. var matrix = this.matrix;
  5559. var otherMatrix = src.matrix;
  5560. var a0 = matrix[0];
  5561. var b0 = matrix[1];
  5562. var c0 = matrix[2];
  5563. var d0 = matrix[3];
  5564. var tx0 = matrix[4];
  5565. var ty0 = matrix[5];
  5566. var pse = offsetX * a0 + offsetY * c0 + tx0;
  5567. var psf = offsetX * b0 + offsetY * d0 + ty0;
  5568. var a1 = otherMatrix[0];
  5569. var b1 = otherMatrix[1];
  5570. var c1 = otherMatrix[2];
  5571. var d1 = otherMatrix[3];
  5572. var tx1 = otherMatrix[4];
  5573. var ty1 = otherMatrix[5];
  5574. matrix[0] = a1 * a0 + b1 * c0;
  5575. matrix[1] = a1 * b0 + b1 * d0;
  5576. matrix[2] = c1 * a0 + d1 * c0;
  5577. matrix[3] = c1 * b0 + d1 * d0;
  5578. matrix[4] = tx1 * a0 + ty1 * c0 + pse;
  5579. matrix[5] = tx1 * b0 + ty1 * d0 + psf;
  5580. return this;
  5581. },
  5582. /**
  5583. * Transform the Matrix.
  5584. *
  5585. * @method Phaser.GameObjects.Components.TransformMatrix#transform
  5586. * @since 3.0.0
  5587. *
  5588. * @param {number} a - The Scale X value.
  5589. * @param {number} b - The Shear Y value.
  5590. * @param {number} c - The Shear X value.
  5591. * @param {number} d - The Scale Y value.
  5592. * @param {number} tx - The Translate X value.
  5593. * @param {number} ty - The Translate Y value.
  5594. *
  5595. * @return {this} This TransformMatrix.
  5596. */
  5597. transform: function (a, b, c, d, tx, ty)
  5598. {
  5599. var matrix = this.matrix;
  5600. var a0 = matrix[0];
  5601. var b0 = matrix[1];
  5602. var c0 = matrix[2];
  5603. var d0 = matrix[3];
  5604. var tx0 = matrix[4];
  5605. var ty0 = matrix[5];
  5606. matrix[0] = a * a0 + b * c0;
  5607. matrix[1] = a * b0 + b * d0;
  5608. matrix[2] = c * a0 + d * c0;
  5609. matrix[3] = c * b0 + d * d0;
  5610. matrix[4] = tx * a0 + ty * c0 + tx0;
  5611. matrix[5] = tx * b0 + ty * d0 + ty0;
  5612. return this;
  5613. },
  5614. /**
  5615. * Transform a point using this Matrix.
  5616. *
  5617. * @method Phaser.GameObjects.Components.TransformMatrix#transformPoint
  5618. * @since 3.0.0
  5619. *
  5620. * @param {number} x - The x coordinate of the point to transform.
  5621. * @param {number} y - The y coordinate of the point to transform.
  5622. * @param {(Phaser.Geom.Point|Phaser.Math.Vector2|object)} point - The Point object to store the transformed coordinates.
  5623. *
  5624. * @return {(Phaser.Geom.Point|Phaser.Math.Vector2|object)} The Point containing the transformed coordinates.
  5625. */
  5626. transformPoint: function (x, y, point)
  5627. {
  5628. if (point === undefined) { point = { x: 0, y: 0 }; }
  5629. var matrix = this.matrix;
  5630. var a = matrix[0];
  5631. var b = matrix[1];
  5632. var c = matrix[2];
  5633. var d = matrix[3];
  5634. var tx = matrix[4];
  5635. var ty = matrix[5];
  5636. point.x = x * a + y * c + tx;
  5637. point.y = x * b + y * d + ty;
  5638. return point;
  5639. },
  5640. /**
  5641. * Invert the Matrix.
  5642. *
  5643. * @method Phaser.GameObjects.Components.TransformMatrix#invert
  5644. * @since 3.0.0
  5645. *
  5646. * @return {this} This TransformMatrix.
  5647. */
  5648. invert: function ()
  5649. {
  5650. var matrix = this.matrix;
  5651. var a = matrix[0];
  5652. var b = matrix[1];
  5653. var c = matrix[2];
  5654. var d = matrix[3];
  5655. var tx = matrix[4];
  5656. var ty = matrix[5];
  5657. var n = a * d - b * c;
  5658. matrix[0] = d / n;
  5659. matrix[1] = -b / n;
  5660. matrix[2] = -c / n;
  5661. matrix[3] = a / n;
  5662. matrix[4] = (c * ty - d * tx) / n;
  5663. matrix[5] = -(a * ty - b * tx) / n;
  5664. return this;
  5665. },
  5666. /**
  5667. * Set the values of this Matrix to copy those of the matrix given.
  5668. *
  5669. * @method Phaser.GameObjects.Components.TransformMatrix#copyFrom
  5670. * @since 3.11.0
  5671. *
  5672. * @param {Phaser.GameObjects.Components.TransformMatrix} src - The source Matrix to copy from.
  5673. *
  5674. * @return {this} This TransformMatrix.
  5675. */
  5676. copyFrom: function (src)
  5677. {
  5678. var matrix = this.matrix;
  5679. matrix[0] = src.a;
  5680. matrix[1] = src.b;
  5681. matrix[2] = src.c;
  5682. matrix[3] = src.d;
  5683. matrix[4] = src.e;
  5684. matrix[5] = src.f;
  5685. return this;
  5686. },
  5687. /**
  5688. * Set the values of this Matrix to copy those of the array given.
  5689. * Where array indexes 0, 1, 2, 3, 4 and 5 are mapped to a, b, c, d, e and f.
  5690. *
  5691. * @method Phaser.GameObjects.Components.TransformMatrix#copyFromArray
  5692. * @since 3.11.0
  5693. *
  5694. * @param {array} src - The array of values to set into this matrix.
  5695. *
  5696. * @return {this} This TransformMatrix.
  5697. */
  5698. copyFromArray: function (src)
  5699. {
  5700. var matrix = this.matrix;
  5701. matrix[0] = src[0];
  5702. matrix[1] = src[1];
  5703. matrix[2] = src[2];
  5704. matrix[3] = src[3];
  5705. matrix[4] = src[4];
  5706. matrix[5] = src[5];
  5707. return this;
  5708. },
  5709. /**
  5710. * Set the values of this Matrix.
  5711. *
  5712. * @method Phaser.GameObjects.Components.TransformMatrix#setTransform
  5713. * @since 3.0.0
  5714. *
  5715. * @param {number} a - The Scale X value.
  5716. * @param {number} b - The Shear Y value.
  5717. * @param {number} c - The Shear X value.
  5718. * @param {number} d - The Scale Y value.
  5719. * @param {number} tx - The Translate X value.
  5720. * @param {number} ty - The Translate Y value.
  5721. *
  5722. * @return {this} This TransformMatrix.
  5723. */
  5724. setTransform: function (a, b, c, d, tx, ty)
  5725. {
  5726. var matrix = this.matrix;
  5727. matrix[0] = a;
  5728. matrix[1] = b;
  5729. matrix[2] = c;
  5730. matrix[3] = d;
  5731. matrix[4] = tx;
  5732. matrix[5] = ty;
  5733. return this;
  5734. },
  5735. /**
  5736. * Decompose this Matrix into its translation, scale and rotation values.
  5737. *
  5738. * @method Phaser.GameObjects.Components.TransformMatrix#decomposeMatrix
  5739. * @since 3.0.0
  5740. *
  5741. * @return {object} The decomposed Matrix.
  5742. */
  5743. decomposeMatrix: function ()
  5744. {
  5745. var decomposedMatrix = this.decomposedMatrix;
  5746. var matrix = this.matrix;
  5747. // a = scale X (1)
  5748. // b = shear Y (0)
  5749. // c = shear X (0)
  5750. // d = scale Y (1)
  5751. var a = matrix[0];
  5752. var b = matrix[1];
  5753. var c = matrix[2];
  5754. var d = matrix[3];
  5755. var a2 = a * a;
  5756. var b2 = b * b;
  5757. var c2 = c * c;
  5758. var d2 = d * d;
  5759. var sx = Math.sqrt(a2 + c2);
  5760. var sy = Math.sqrt(b2 + d2);
  5761. decomposedMatrix.translateX = matrix[4];
  5762. decomposedMatrix.translateY = matrix[5];
  5763. decomposedMatrix.scaleX = sx;
  5764. decomposedMatrix.scaleY = sy;
  5765. decomposedMatrix.rotation = Math.acos(a / sx) * (Math.atan(-c / a) < 0 ? -1 : 1);
  5766. return decomposedMatrix;
  5767. },
  5768. /**
  5769. * Apply the identity, translate, rotate and scale operations on the Matrix.
  5770. *
  5771. * @method Phaser.GameObjects.Components.TransformMatrix#applyITRS
  5772. * @since 3.0.0
  5773. *
  5774. * @param {number} x - The horizontal translation.
  5775. * @param {number} y - The vertical translation.
  5776. * @param {number} rotation - The angle of rotation in radians.
  5777. * @param {number} scaleX - The horizontal scale.
  5778. * @param {number} scaleY - The vertical scale.
  5779. *
  5780. * @return {this} This TransformMatrix.
  5781. */
  5782. applyITRS: function (x, y, rotation, scaleX, scaleY)
  5783. {
  5784. var matrix = this.matrix;
  5785. var radianSin = Math.sin(rotation);
  5786. var radianCos = Math.cos(rotation);
  5787. // Translate
  5788. matrix[4] = x;
  5789. matrix[5] = y;
  5790. // Rotate and Scale
  5791. matrix[0] = radianCos * scaleX;
  5792. matrix[1] = radianSin * scaleX;
  5793. matrix[2] = -radianSin * scaleY;
  5794. matrix[3] = radianCos * scaleY;
  5795. return this;
  5796. },
  5797. /**
  5798. * Destroys this Transform Matrix.
  5799. *
  5800. * @method Phaser.GameObjects.Components.TransformMatrix#destroy
  5801. * @since 3.4.0
  5802. */
  5803. destroy: function ()
  5804. {
  5805. this.matrix = null;
  5806. this.decomposedMatrix = null;
  5807. }
  5808. });
  5809. module.exports = TransformMatrix;
  5810. /***/ }),
  5811. /* 33 */
  5812. /***/ (function(module, exports) {
  5813. /**
  5814. * @author Richard Davey <rich@photonstorm.com>
  5815. * @copyright 2018 Photon Storm Ltd.
  5816. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  5817. */
  5818. /**
  5819. * Check to see if the Circle contains the given x / y coordinates.
  5820. *
  5821. * @function Phaser.Geom.Circle.Contains
  5822. * @since 3.0.0
  5823. *
  5824. * @param {Phaser.Geom.Circle} circle - The Circle to check.
  5825. * @param {number} x - The x coordinate to check within the circle.
  5826. * @param {number} y - The y coordinate to check within the circle.
  5827. *
  5828. * @return {boolean} True if the coordinates are within the circle, otherwise false.
  5829. */
  5830. var Contains = function (circle, x, y)
  5831. {
  5832. // Check if x/y are within the bounds first
  5833. if (circle.radius > 0 && x >= circle.left && x <= circle.right && y >= circle.top && y <= circle.bottom)
  5834. {
  5835. var dx = (circle.x - x) * (circle.x - x);
  5836. var dy = (circle.y - y) * (circle.y - y);
  5837. return (dx + dy) <= (circle.radius * circle.radius);
  5838. }
  5839. else
  5840. {
  5841. return false;
  5842. }
  5843. };
  5844. module.exports = Contains;
  5845. /***/ }),
  5846. /* 34 */
  5847. /***/ (function(module, exports) {
  5848. /**
  5849. * @author Richard Davey <rich@photonstorm.com>
  5850. * @copyright 2018 Photon Storm Ltd.
  5851. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  5852. */
  5853. /**
  5854. * Shallow Object Clone. Will not clone nested objects.
  5855. *
  5856. * @function Phaser.Utils.Object.Clone
  5857. * @since 3.0.0
  5858. *
  5859. * @param {object} obj - the object from which to clone
  5860. *
  5861. * @return {object} a new object with the same properties as the input obj
  5862. */
  5863. var Clone = function (obj)
  5864. {
  5865. var clone = {};
  5866. for (var key in obj)
  5867. {
  5868. if (Array.isArray(obj[key]))
  5869. {
  5870. clone[key] = obj[key].slice(0);
  5871. }
  5872. else
  5873. {
  5874. clone[key] = obj[key];
  5875. }
  5876. }
  5877. return clone;
  5878. };
  5879. module.exports = Clone;
  5880. /***/ }),
  5881. /* 35 */
  5882. /***/ (function(module, exports, __webpack_require__) {
  5883. /**
  5884. * @author Richard Davey <rich@photonstorm.com>
  5885. * @copyright 2018 Photon Storm Ltd.
  5886. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  5887. */
  5888. var Class = __webpack_require__(0);
  5889. var Components = __webpack_require__(17);
  5890. var GameObject = __webpack_require__(2);
  5891. var SpriteRender = __webpack_require__(526);
  5892. /**
  5893. * @classdesc
  5894. * A Sprite Game Object.
  5895. *
  5896. * A Sprite Game Object is used for the display of both static and animated images in your game.
  5897. * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled
  5898. * and animated.
  5899. *
  5900. * The main difference between a Sprite and an Image Game Object is that you cannot animate Images.
  5901. * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation
  5902. * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases.
  5903. *
  5904. * @class Sprite
  5905. * @extends Phaser.GameObjects.GameObject
  5906. * @memberOf Phaser.GameObjects
  5907. * @constructor
  5908. * @since 3.0.0
  5909. *
  5910. * @extends Phaser.GameObjects.Components.Alpha
  5911. * @extends Phaser.GameObjects.Components.BlendMode
  5912. * @extends Phaser.GameObjects.Components.Depth
  5913. * @extends Phaser.GameObjects.Components.Flip
  5914. * @extends Phaser.GameObjects.Components.GetBounds
  5915. * @extends Phaser.GameObjects.Components.Mask
  5916. * @extends Phaser.GameObjects.Components.Origin
  5917. * @extends Phaser.GameObjects.Components.Pipeline
  5918. * @extends Phaser.GameObjects.Components.ScaleMode
  5919. * @extends Phaser.GameObjects.Components.ScrollFactor
  5920. * @extends Phaser.GameObjects.Components.Size
  5921. * @extends Phaser.GameObjects.Components.TextureCrop
  5922. * @extends Phaser.GameObjects.Components.Tint
  5923. * @extends Phaser.GameObjects.Components.Transform
  5924. * @extends Phaser.GameObjects.Components.Visible
  5925. *
  5926. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  5927. * @param {number} x - The horizontal position of this Game Object in the world.
  5928. * @param {number} y - The vertical position of this Game Object in the world.
  5929. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  5930. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  5931. */
  5932. var Sprite = new Class({
  5933. Extends: GameObject,
  5934. Mixins: [
  5935. Components.Alpha,
  5936. Components.BlendMode,
  5937. Components.Depth,
  5938. Components.Flip,
  5939. Components.GetBounds,
  5940. Components.Mask,
  5941. Components.Origin,
  5942. Components.Pipeline,
  5943. Components.ScaleMode,
  5944. Components.ScrollFactor,
  5945. Components.Size,
  5946. Components.TextureCrop,
  5947. Components.Tint,
  5948. Components.Transform,
  5949. Components.Visible,
  5950. SpriteRender
  5951. ],
  5952. initialize:
  5953. function Sprite (scene, x, y, texture, frame)
  5954. {
  5955. GameObject.call(this, scene, 'Sprite');
  5956. /**
  5957. * The Animation Controller of this Sprite.
  5958. *
  5959. * @name Phaser.GameObjects.Sprite#anims
  5960. * @type {Phaser.GameObjects.Components.Animation}
  5961. * @since 3.0.0
  5962. */
  5963. this.anims = new Components.Animation(this);
  5964. this.setTexture(texture, frame);
  5965. this.setPosition(x, y);
  5966. this.setSizeToFrame();
  5967. this.setOriginFromFrame();
  5968. this.initPipeline('TextureTintPipeline');
  5969. },
  5970. /**
  5971. * Update this Sprite's animations.
  5972. *
  5973. * @method Phaser.GameObjects.Sprite#preUpdate
  5974. * @protected
  5975. * @since 3.0.0
  5976. *
  5977. * @param {number} time - The current timestamp.
  5978. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  5979. */
  5980. preUpdate: function (time, delta)
  5981. {
  5982. this.anims.update(time, delta);
  5983. },
  5984. /**
  5985. * Start playing the given animation.
  5986. *
  5987. * @method Phaser.GameObjects.Sprite#play
  5988. * @since 3.0.0
  5989. *
  5990. * @param {string} key - The string-based key of the animation to play.
  5991. * @param {boolean} [ignoreIfPlaying=false] - If an animation is already playing then ignore this call.
  5992. * @param {integer} [startFrame=0] - Optionally start the animation playing from this frame index.
  5993. *
  5994. * @return {Phaser.GameObjects.Sprite} This Game Object.
  5995. */
  5996. play: function (key, ignoreIfPlaying, startFrame)
  5997. {
  5998. this.anims.play(key, ignoreIfPlaying, startFrame);
  5999. return this;
  6000. },
  6001. /**
  6002. * Build a JSON representation of this Sprite.
  6003. *
  6004. * @method Phaser.GameObjects.Sprite#toJSON
  6005. * @since 3.0.0
  6006. *
  6007. * @return {JSONGameObject} A JSON representation of the Game Object.
  6008. */
  6009. toJSON: function ()
  6010. {
  6011. var data = Components.ToJSON(this);
  6012. // Extra Sprite data is added here
  6013. return data;
  6014. }
  6015. });
  6016. module.exports = Sprite;
  6017. /***/ }),
  6018. /* 36 */
  6019. /***/ (function(module, exports) {
  6020. /**
  6021. * @author Richard Davey <rich@photonstorm.com>
  6022. * @copyright 2018 Photon Storm Ltd.
  6023. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  6024. */
  6025. /**
  6026. * Takes an array of Game Objects, or any objects that have a public property as defined in `key`,
  6027. * and then adds the given value to it.
  6028. *
  6029. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  6030. *
  6031. * To use this with a Group: `PropertyValueInc(group.getChildren(), key, value, step)`
  6032. *
  6033. * @function Phaser.Actions.PropertyValueInc
  6034. * @since 3.3.0
  6035. *
  6036. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  6037. *
  6038. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  6039. * @param {string} key - The property to be updated.
  6040. * @param {number} value - The amount to be added to the property.
  6041. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  6042. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  6043. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  6044. *
  6045. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  6046. */
  6047. var PropertyValueInc = function (items, key, value, step, index, direction)
  6048. {
  6049. if (step === undefined) { step = 0; }
  6050. if (index === undefined) { index = 0; }
  6051. if (direction === undefined) { direction = 1; }
  6052. var i;
  6053. var t = 0;
  6054. var end = items.length;
  6055. if (direction === 1)
  6056. {
  6057. // Start to End
  6058. for (i = index; i < end; i++)
  6059. {
  6060. items[i][key] += value + (t * step);
  6061. t++;
  6062. }
  6063. }
  6064. else
  6065. {
  6066. // End to Start
  6067. for (i = index; i >= 0; i--)
  6068. {
  6069. items[i][key] += value + (t * step);
  6070. t++;
  6071. }
  6072. }
  6073. return items;
  6074. };
  6075. module.exports = PropertyValueInc;
  6076. /***/ }),
  6077. /* 37 */
  6078. /***/ (function(module, exports, __webpack_require__) {
  6079. /**
  6080. * @author Richard Davey <rich@photonstorm.com>
  6081. * @copyright 2018 Photon Storm Ltd.
  6082. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  6083. */
  6084. var Class = __webpack_require__(0);
  6085. /**
  6086. * @classdesc
  6087. * A MultiFile is a special kind of parent that contains two, or more, Files as children and looks after
  6088. * 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.
  6089. *
  6090. * 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.
  6091. *
  6092. * @class MultiFile
  6093. * @memberOf Phaser.Loader
  6094. * @constructor
  6095. * @since 3.7.0
  6096. *
  6097. * @param {Phaser.Loader.LoaderPlugin} loader - The Loader that is going to load this File.
  6098. * @param {string} type - The file type string for sorting within the Loader.
  6099. * @param {string} key - The key of the file within the loader.
  6100. * @param {Phaser.Loader.File[]} files - An array of Files that make-up this MultiFile.
  6101. */
  6102. var MultiFile = new Class({
  6103. initialize:
  6104. function MultiFile (loader, type, key, files)
  6105. {
  6106. /**
  6107. * A reference to the Loader that is going to load this file.
  6108. *
  6109. * @name Phaser.Loader.MultiFile#loader
  6110. * @type {Phaser.Loader.LoaderPlugin}
  6111. * @since 3.7.0
  6112. */
  6113. this.loader = loader;
  6114. /**
  6115. * The file type string for sorting within the Loader.
  6116. *
  6117. * @name Phaser.Loader.MultiFile#type
  6118. * @type {string}
  6119. * @since 3.7.0
  6120. */
  6121. this.type = type;
  6122. /**
  6123. * Unique cache key (unique within its file type)
  6124. *
  6125. * @name Phaser.Loader.MultiFile#key
  6126. * @type {string}
  6127. * @since 3.7.0
  6128. */
  6129. this.key = key;
  6130. /**
  6131. * Array of files that make up this MultiFile.
  6132. *
  6133. * @name Phaser.Loader.MultiFile#files
  6134. * @type {Phaser.Loader.File[]}
  6135. * @since 3.7.0
  6136. */
  6137. this.files = files;
  6138. /**
  6139. * The completion status of this MultiFile.
  6140. *
  6141. * @name Phaser.Loader.MultiFile#complete
  6142. * @type {boolean}
  6143. * @default false
  6144. * @since 3.7.0
  6145. */
  6146. this.complete = false;
  6147. /**
  6148. * The number of files to load.
  6149. *
  6150. * @name Phaser.Loader.MultiFile#pending
  6151. * @type {integer}
  6152. * @since 3.7.0
  6153. */
  6154. this.pending = files.length;
  6155. /**
  6156. * The number of files that failed to load.
  6157. *
  6158. * @name Phaser.Loader.MultiFile#failed
  6159. * @type {integer}
  6160. * @default 0
  6161. * @since 3.7.0
  6162. */
  6163. this.failed = 0;
  6164. /**
  6165. * A storage container for transient data that the loading files need.
  6166. *
  6167. * @name Phaser.Loader.MultiFile#config
  6168. * @type {any}
  6169. * @since 3.7.0
  6170. */
  6171. this.config = {};
  6172. // Link the files
  6173. for (var i = 0; i < files.length; i++)
  6174. {
  6175. files[i].multiFile = this;
  6176. }
  6177. },
  6178. /**
  6179. * Checks if this MultiFile is ready to process its children or not.
  6180. *
  6181. * @method Phaser.Loader.MultiFile#isReadyToProcess
  6182. * @since 3.7.0
  6183. *
  6184. * @return {boolean} `true` if all children of this MultiFile have loaded, otherwise `false`.
  6185. */
  6186. isReadyToProcess: function ()
  6187. {
  6188. return (this.pending === 0 && this.failed === 0 && !this.complete);
  6189. },
  6190. /**
  6191. * Adds another child to this MultiFile, increases the pending count and resets the completion status.
  6192. *
  6193. * @method Phaser.Loader.MultiFile#addToMultiFile
  6194. * @since 3.7.0
  6195. *
  6196. * @param {Phaser.Loader.File} files - The File to add to this MultiFile.
  6197. *
  6198. * @return {Phaser.Loader.MultiFile} This MultiFile instance.
  6199. */
  6200. addToMultiFile: function (file)
  6201. {
  6202. this.files.push(file);
  6203. file.multiFile = this;
  6204. this.pending++;
  6205. this.complete = false;
  6206. return this;
  6207. },
  6208. /**
  6209. * Called by each File when it finishes loading.
  6210. *
  6211. * @method Phaser.Loader.MultiFile#onFileComplete
  6212. * @since 3.7.0
  6213. *
  6214. * @param {Phaser.Loader.File} file - The File that has completed processing.
  6215. */
  6216. onFileComplete: function (file)
  6217. {
  6218. var index = this.files.indexOf(file);
  6219. if (index !== -1)
  6220. {
  6221. this.pending--;
  6222. }
  6223. },
  6224. /**
  6225. * Called by each File that fails to load.
  6226. *
  6227. * @method Phaser.Loader.MultiFile#onFileFailed
  6228. * @since 3.7.0
  6229. *
  6230. * @param {Phaser.Loader.File} file - The File that has failed to load.
  6231. */
  6232. onFileFailed: function (file)
  6233. {
  6234. var index = this.files.indexOf(file);
  6235. if (index !== -1)
  6236. {
  6237. this.failed++;
  6238. }
  6239. }
  6240. });
  6241. module.exports = MultiFile;
  6242. /***/ }),
  6243. /* 38 */
  6244. /***/ (function(module, exports, __webpack_require__) {
  6245. /**
  6246. * @author Richard Davey <rich@photonstorm.com>
  6247. * @copyright 2018 Photon Storm Ltd.
  6248. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  6249. */
  6250. var Class = __webpack_require__(0);
  6251. var CONST = __webpack_require__(18);
  6252. var File = __webpack_require__(20);
  6253. var FileTypesManager = __webpack_require__(7);
  6254. var GetFastValue = __webpack_require__(1);
  6255. var IsPlainObject = __webpack_require__(8);
  6256. /**
  6257. * @typedef {object} Phaser.Loader.FileTypes.ImageFrameConfig
  6258. *
  6259. * @property {integer} frameWidth - The width of the frame in pixels.
  6260. * @property {integer} [frameHeight] - The height of the frame in pixels. Uses the `frameWidth` value if not provided.
  6261. * @property {integer} [startFrame=0] - The first frame to start parsing from.
  6262. * @property {integer} [endFrame] - The frame to stop parsing at. If not provided it will calculate the value based on the image and frame dimensions.
  6263. * @property {integer} [margin=0] - The margin in the image. This is the space around the edge of the frames.
  6264. * @property {integer} [spacing=0] - The spacing between each frame in the image.
  6265. */
  6266. /**
  6267. * @typedef {object} Phaser.Loader.FileTypes.ImageFileConfig
  6268. *
  6269. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  6270. * @property {string} [url] - The absolute or relative URL to load the file from.
  6271. * @property {string} [extension='png'] - The default file extension to use if no url is provided.
  6272. * @property {string} [normalMap] - The filename of an associated normal map. It uses the same path and url to load as the image.
  6273. * @property {Phaser.Loader.FileTypes.ImageFrameConfig} [frameConfig] - The frame configuration object. Only provided for, and used by, Sprite Sheets.
  6274. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  6275. */
  6276. /**
  6277. * @classdesc
  6278. * A single Image File suitable for loading by the Loader.
  6279. *
  6280. * These are created when you use the Phaser.Loader.LoaderPlugin#image method and are not typically created directly.
  6281. *
  6282. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#image.
  6283. *
  6284. * @class ImageFile
  6285. * @extends Phaser.Loader.File
  6286. * @memberOf Phaser.Loader.FileTypes
  6287. * @constructor
  6288. * @since 3.0.0
  6289. *
  6290. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  6291. * @param {(string|Phaser.Loader.FileTypes.ImageFileConfig)} key - The key to use for this file, or a file configuration object.
  6292. * @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".
  6293. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  6294. * @param {Phaser.Loader.FileTypes.ImageFrameConfig} [frameConfig] - The frame configuration object. Only provided for, and used by, Sprite Sheets.
  6295. */
  6296. var ImageFile = new Class({
  6297. Extends: File,
  6298. initialize:
  6299. function ImageFile (loader, key, url, xhrSettings, frameConfig)
  6300. {
  6301. var extension = 'png';
  6302. var normalMapURL;
  6303. if (IsPlainObject(key))
  6304. {
  6305. var config = key;
  6306. key = GetFastValue(config, 'key');
  6307. url = GetFastValue(config, 'url');
  6308. normalMapURL = GetFastValue(config, 'normalMap');
  6309. xhrSettings = GetFastValue(config, 'xhrSettings');
  6310. extension = GetFastValue(config, 'extension', extension);
  6311. frameConfig = GetFastValue(config, 'frameConfig');
  6312. }
  6313. if (Array.isArray(url))
  6314. {
  6315. normalMapURL = url[1];
  6316. url = url[0];
  6317. }
  6318. var fileConfig = {
  6319. type: 'image',
  6320. cache: loader.textureManager,
  6321. extension: extension,
  6322. responseType: 'blob',
  6323. key: key,
  6324. url: url,
  6325. xhrSettings: xhrSettings,
  6326. config: frameConfig
  6327. };
  6328. File.call(this, loader, fileConfig);
  6329. // Do we have a normal map to load as well?
  6330. if (normalMapURL)
  6331. {
  6332. var normalMap = new ImageFile(loader, this.key, normalMapURL, xhrSettings, frameConfig);
  6333. normalMap.type = 'normalMap';
  6334. this.setLink(normalMap);
  6335. loader.addFile(normalMap);
  6336. }
  6337. },
  6338. /**
  6339. * Called automatically by Loader.nextFile.
  6340. * This method controls what extra work this File does with its loaded data.
  6341. *
  6342. * @method Phaser.Loader.FileTypes.ImageFile#onProcess
  6343. * @since 3.7.0
  6344. */
  6345. onProcess: function ()
  6346. {
  6347. this.state = CONST.FILE_PROCESSING;
  6348. this.data = new Image();
  6349. this.data.crossOrigin = this.crossOrigin;
  6350. var _this = this;
  6351. this.data.onload = function ()
  6352. {
  6353. File.revokeObjectURL(_this.data);
  6354. _this.onProcessComplete();
  6355. };
  6356. this.data.onerror = function ()
  6357. {
  6358. File.revokeObjectURL(_this.data);
  6359. _this.onProcessError();
  6360. };
  6361. File.createObjectURL(this.data, this.xhrLoader.response, 'image/png');
  6362. },
  6363. /**
  6364. * Adds this file to its target cache upon successful loading and processing.
  6365. *
  6366. * @method Phaser.Loader.FileTypes.ImageFile#addToCache
  6367. * @since 3.7.0
  6368. */
  6369. addToCache: function ()
  6370. {
  6371. var texture;
  6372. var linkFile = this.linkFile;
  6373. if (linkFile && linkFile.state === CONST.FILE_COMPLETE)
  6374. {
  6375. if (this.type === 'image')
  6376. {
  6377. texture = this.cache.addImage(this.key, this.data, linkFile.data);
  6378. }
  6379. else
  6380. {
  6381. texture = this.cache.addImage(linkFile.key, linkFile.data, this.data);
  6382. }
  6383. this.pendingDestroy(texture);
  6384. linkFile.pendingDestroy(texture);
  6385. }
  6386. else if (!linkFile)
  6387. {
  6388. texture = this.cache.addImage(this.key, this.data);
  6389. this.pendingDestroy(texture);
  6390. }
  6391. }
  6392. });
  6393. /**
  6394. * Adds an Image, or array of Images, to the current load queue.
  6395. *
  6396. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  6397. *
  6398. * ```javascript
  6399. * function preload ()
  6400. * {
  6401. * this.load.image('logo', 'images/phaserLogo.png');
  6402. * }
  6403. * ```
  6404. *
  6405. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  6406. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  6407. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  6408. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  6409. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  6410. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  6411. * loaded.
  6412. *
  6413. * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle.
  6414. * If you try to load an animated gif only the first frame will be rendered. Browsers do not natively support playback
  6415. * of animated gifs to Canvas elements.
  6416. *
  6417. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  6418. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  6419. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  6420. * then remove it from the Texture Manager first, before loading a new one.
  6421. *
  6422. * Instead of passing arguments you can pass a configuration object, such as:
  6423. *
  6424. * ```javascript
  6425. * this.load.image({
  6426. * key: 'logo',
  6427. * url: 'images/AtariLogo.png'
  6428. * });
  6429. * ```
  6430. *
  6431. * See the documentation for `Phaser.Loader.FileTypes.ImageFileConfig` for more details.
  6432. *
  6433. * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key:
  6434. *
  6435. * ```javascript
  6436. * this.load.image('logo', 'images/AtariLogo.png');
  6437. * // and later in your game ...
  6438. * this.add.image(x, y, 'logo');
  6439. * ```
  6440. *
  6441. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  6442. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  6443. * this is what you would use to retrieve the image from the Texture Manager.
  6444. *
  6445. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  6446. *
  6447. * 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"
  6448. * 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
  6449. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  6450. *
  6451. * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image,
  6452. * then you can specify it by providing an array as the `url` where the second element is the normal map:
  6453. *
  6454. * ```javascript
  6455. * this.load.image('logo', [ 'images/AtariLogo.png', 'images/AtariLogo-n.png' ]);
  6456. * ```
  6457. *
  6458. * Or, if you are using a config object use the `normalMap` property:
  6459. *
  6460. * ```javascript
  6461. * this.load.image({
  6462. * key: 'logo',
  6463. * url: 'images/AtariLogo.png',
  6464. * normalMap: 'images/AtariLogo-n.png'
  6465. * });
  6466. * ```
  6467. *
  6468. * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings.
  6469. * Normal maps are a WebGL only feature.
  6470. *
  6471. * Note: The ability to load this type of file will only be available if the Image File type has been built into Phaser.
  6472. * It is available in the default build but can be excluded from custom builds.
  6473. *
  6474. * @method Phaser.Loader.LoaderPlugin#image
  6475. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  6476. * @since 3.0.0
  6477. *
  6478. * @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.
  6479. * @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".
  6480. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  6481. *
  6482. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  6483. */
  6484. FileTypesManager.register('image', function (key, url, xhrSettings)
  6485. {
  6486. if (Array.isArray(key))
  6487. {
  6488. for (var i = 0; i < key.length; i++)
  6489. {
  6490. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  6491. this.addFile(new ImageFile(this, key[i]));
  6492. }
  6493. }
  6494. else
  6495. {
  6496. this.addFile(new ImageFile(this, key, url, xhrSettings));
  6497. }
  6498. return this;
  6499. });
  6500. module.exports = ImageFile;
  6501. /***/ }),
  6502. /* 39 */
  6503. /***/ (function(module, exports, __webpack_require__) {
  6504. /**
  6505. * @author Richard Davey <rich@photonstorm.com>
  6506. * @copyright 2018 Photon Storm Ltd.
  6507. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  6508. */
  6509. var CONST = __webpack_require__(15);
  6510. /**
  6511. * Convert the given angle from degrees, to the equivalent angle in radians.
  6512. *
  6513. * @function Phaser.Math.DegToRad
  6514. * @since 3.0.0
  6515. *
  6516. * @param {integer} degrees - The angle (in degrees) to convert to radians.
  6517. *
  6518. * @return {number} The given angle converted to radians.
  6519. */
  6520. var DegToRad = function (degrees)
  6521. {
  6522. return degrees * CONST.DEG_TO_RAD;
  6523. };
  6524. module.exports = DegToRad;
  6525. /***/ }),
  6526. /* 40 */
  6527. /***/ (function(module, exports) {
  6528. /**
  6529. * @author Richard Davey <rich@photonstorm.com>
  6530. * @copyright 2018 Photon Storm Ltd.
  6531. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  6532. */
  6533. /**
  6534. * Wrap the given `value` between `min` and `max.
  6535. *
  6536. * @function Phaser.Math.Wrap
  6537. * @since 3.0.0
  6538. *
  6539. * @param {number} value - The value to wrap.
  6540. * @param {number} min - The minimum value.
  6541. * @param {number} max - The maximum value.
  6542. *
  6543. * @return {number} The wrapped value.
  6544. */
  6545. var Wrap = function (value, min, max)
  6546. {
  6547. var range = max - min;
  6548. return (min + ((((value - min) % range) + range) % range));
  6549. };
  6550. module.exports = Wrap;
  6551. /***/ }),
  6552. /* 41 */
  6553. /***/ (function(module, exports, __webpack_require__) {
  6554. /**
  6555. * @author Richard Davey <rich@photonstorm.com>
  6556. * @copyright 2018 Photon Storm Ltd.
  6557. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  6558. */
  6559. var GetTileAt = __webpack_require__(141);
  6560. var GetTilesWithin = __webpack_require__(23);
  6561. /**
  6562. * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the
  6563. * layer. Interesting faces are used internally for optimizing collisions against tiles. This method
  6564. * is mostly used internally.
  6565. *
  6566. * @function Phaser.Tilemaps.Components.CalculateFacesWithin
  6567. * @private
  6568. * @since 3.0.0
  6569. *
  6570. * @param {integer} tileX - [description]
  6571. * @param {integer} tileY - [description]
  6572. * @param {integer} width - [description]
  6573. * @param {integer} height - [description]
  6574. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  6575. */
  6576. var CalculateFacesWithin = function (tileX, tileY, width, height, layer)
  6577. {
  6578. var above = null;
  6579. var below = null;
  6580. var left = null;
  6581. var right = null;
  6582. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  6583. for (var i = 0; i < tiles.length; i++)
  6584. {
  6585. var tile = tiles[i];
  6586. if (tile)
  6587. {
  6588. if (tile.collides)
  6589. {
  6590. above = GetTileAt(tile.x, tile.y - 1, true, layer);
  6591. below = GetTileAt(tile.x, tile.y + 1, true, layer);
  6592. left = GetTileAt(tile.x - 1, tile.y, true, layer);
  6593. right = GetTileAt(tile.x + 1, tile.y, true, layer);
  6594. tile.faceTop = (above && above.collides) ? false : true;
  6595. tile.faceBottom = (below && below.collides) ? false : true;
  6596. tile.faceLeft = (left && left.collides) ? false : true;
  6597. tile.faceRight = (right && right.collides) ? false : true;
  6598. }
  6599. else
  6600. {
  6601. tile.resetFaces();
  6602. }
  6603. }
  6604. }
  6605. };
  6606. module.exports = CalculateFacesWithin;
  6607. /***/ }),
  6608. /* 42 */
  6609. /***/ (function(module, exports) {
  6610. /**
  6611. * The `Matter.Common` module contains utility functions that are common to all modules.
  6612. *
  6613. * @class Common
  6614. */
  6615. var Common = {};
  6616. module.exports = Common;
  6617. (function() {
  6618. Common._nextId = 0;
  6619. Common._seed = 0;
  6620. Common._nowStartTime = +(new Date());
  6621. /**
  6622. * Extends the object in the first argument using the object in the second argument.
  6623. * @method extend
  6624. * @param {} obj
  6625. * @param {boolean} deep
  6626. * @return {} obj extended
  6627. */
  6628. Common.extend = function(obj, deep) {
  6629. var argsStart,
  6630. args,
  6631. deepClone;
  6632. if (typeof deep === 'boolean') {
  6633. argsStart = 2;
  6634. deepClone = deep;
  6635. } else {
  6636. argsStart = 1;
  6637. deepClone = true;
  6638. }
  6639. for (var i = argsStart; i < arguments.length; i++) {
  6640. var source = arguments[i];
  6641. if (source) {
  6642. for (var prop in source) {
  6643. if (deepClone && source[prop] && source[prop].constructor === Object) {
  6644. if (!obj[prop] || obj[prop].constructor === Object) {
  6645. obj[prop] = obj[prop] || {};
  6646. Common.extend(obj[prop], deepClone, source[prop]);
  6647. } else {
  6648. obj[prop] = source[prop];
  6649. }
  6650. } else {
  6651. obj[prop] = source[prop];
  6652. }
  6653. }
  6654. }
  6655. }
  6656. return obj;
  6657. };
  6658. /**
  6659. * Creates a new clone of the object, if deep is true references will also be cloned.
  6660. * @method clone
  6661. * @param {} obj
  6662. * @param {bool} deep
  6663. * @return {} obj cloned
  6664. */
  6665. Common.clone = function(obj, deep) {
  6666. return Common.extend({}, deep, obj);
  6667. };
  6668. /**
  6669. * Returns the list of keys for the given object.
  6670. * @method keys
  6671. * @param {} obj
  6672. * @return {string[]} keys
  6673. */
  6674. Common.keys = function(obj) {
  6675. if (Object.keys)
  6676. return Object.keys(obj);
  6677. // avoid hasOwnProperty for performance
  6678. var keys = [];
  6679. for (var key in obj)
  6680. keys.push(key);
  6681. return keys;
  6682. };
  6683. /**
  6684. * Returns the list of values for the given object.
  6685. * @method values
  6686. * @param {} obj
  6687. * @return {array} Array of the objects property values
  6688. */
  6689. Common.values = function(obj) {
  6690. var values = [];
  6691. if (Object.keys) {
  6692. var keys = Object.keys(obj);
  6693. for (var i = 0; i < keys.length; i++) {
  6694. values.push(obj[keys[i]]);
  6695. }
  6696. return values;
  6697. }
  6698. // avoid hasOwnProperty for performance
  6699. for (var key in obj)
  6700. values.push(obj[key]);
  6701. return values;
  6702. };
  6703. /**
  6704. * Gets a value from `base` relative to the `path` string.
  6705. * @method get
  6706. * @param {} obj The base object
  6707. * @param {string} path The path relative to `base`, e.g. 'Foo.Bar.baz'
  6708. * @param {number} [begin] Path slice begin
  6709. * @param {number} [end] Path slice end
  6710. * @return {} The object at the given path
  6711. */
  6712. Common.get = function(obj, path, begin, end) {
  6713. path = path.split('.').slice(begin, end);
  6714. for (var i = 0; i < path.length; i += 1) {
  6715. obj = obj[path[i]];
  6716. }
  6717. return obj;
  6718. };
  6719. /**
  6720. * Sets a value on `base` relative to the given `path` string.
  6721. * @method set
  6722. * @param {} obj The base object
  6723. * @param {string} path The path relative to `base`, e.g. 'Foo.Bar.baz'
  6724. * @param {} val The value to set
  6725. * @param {number} [begin] Path slice begin
  6726. * @param {number} [end] Path slice end
  6727. * @return {} Pass through `val` for chaining
  6728. */
  6729. Common.set = function(obj, path, val, begin, end) {
  6730. var parts = path.split('.').slice(begin, end);
  6731. Common.get(obj, path, 0, -1)[parts[parts.length - 1]] = val;
  6732. return val;
  6733. };
  6734. /**
  6735. * Shuffles the given array in-place.
  6736. * The function uses a seeded random generator.
  6737. * @method shuffle
  6738. * @param {array} array
  6739. * @return {array} array shuffled randomly
  6740. */
  6741. Common.shuffle = function(array) {
  6742. for (var i = array.length - 1; i > 0; i--) {
  6743. var j = Math.floor(Common.random() * (i + 1));
  6744. var temp = array[i];
  6745. array[i] = array[j];
  6746. array[j] = temp;
  6747. }
  6748. return array;
  6749. };
  6750. /**
  6751. * Randomly chooses a value from a list with equal probability.
  6752. * The function uses a seeded random generator.
  6753. * @method choose
  6754. * @param {array} choices
  6755. * @return {object} A random choice object from the array
  6756. */
  6757. Common.choose = function(choices) {
  6758. return choices[Math.floor(Common.random() * choices.length)];
  6759. };
  6760. /**
  6761. * Returns true if the object is a HTMLElement, otherwise false.
  6762. * @method isElement
  6763. * @param {object} obj
  6764. * @return {boolean} True if the object is a HTMLElement, otherwise false
  6765. */
  6766. Common.isElement = function(obj) {
  6767. return obj instanceof HTMLElement;
  6768. };
  6769. /**
  6770. * Returns true if the object is an array.
  6771. * @method isArray
  6772. * @param {object} obj
  6773. * @return {boolean} True if the object is an array, otherwise false
  6774. */
  6775. Common.isArray = function(obj) {
  6776. return Object.prototype.toString.call(obj) === '[object Array]';
  6777. };
  6778. /**
  6779. * Returns true if the object is a function.
  6780. * @method isFunction
  6781. * @param {object} obj
  6782. * @return {boolean} True if the object is a function, otherwise false
  6783. */
  6784. Common.isFunction = function(obj) {
  6785. return typeof obj === "function";
  6786. };
  6787. /**
  6788. * Returns true if the object is a plain object.
  6789. * @method isPlainObject
  6790. * @param {object} obj
  6791. * @return {boolean} True if the object is a plain object, otherwise false
  6792. */
  6793. Common.isPlainObject = function(obj) {
  6794. return typeof obj === 'object' && obj.constructor === Object;
  6795. };
  6796. /**
  6797. * Returns true if the object is a string.
  6798. * @method isString
  6799. * @param {object} obj
  6800. * @return {boolean} True if the object is a string, otherwise false
  6801. */
  6802. Common.isString = function(obj) {
  6803. return Object.prototype.toString.call(obj) === '[object String]';
  6804. };
  6805. /**
  6806. * Returns the given value clamped between a minimum and maximum value.
  6807. * @method clamp
  6808. * @param {number} value
  6809. * @param {number} min
  6810. * @param {number} max
  6811. * @return {number} The value clamped between min and max inclusive
  6812. */
  6813. Common.clamp = function(value, min, max) {
  6814. if (value < min)
  6815. return min;
  6816. if (value > max)
  6817. return max;
  6818. return value;
  6819. };
  6820. /**
  6821. * Returns the sign of the given value.
  6822. * @method sign
  6823. * @param {number} value
  6824. * @return {number} -1 if negative, +1 if 0 or positive
  6825. */
  6826. Common.sign = function(value) {
  6827. return value < 0 ? -1 : 1;
  6828. };
  6829. /**
  6830. * Returns the current timestamp since the time origin (e.g. from page load).
  6831. * The result will be high-resolution including decimal places if available.
  6832. * @method now
  6833. * @return {number} the current timestamp
  6834. */
  6835. Common.now = function() {
  6836. if (window.performance) {
  6837. if (window.performance.now) {
  6838. return window.performance.now();
  6839. } else if (window.performance.webkitNow) {
  6840. return window.performance.webkitNow();
  6841. }
  6842. }
  6843. return (new Date()) - Common._nowStartTime;
  6844. };
  6845. /**
  6846. * Returns a random value between a minimum and a maximum value inclusive.
  6847. * The function uses a seeded random generator.
  6848. * @method random
  6849. * @param {number} min
  6850. * @param {number} max
  6851. * @return {number} A random number between min and max inclusive
  6852. */
  6853. Common.random = function(min, max) {
  6854. min = (typeof min !== "undefined") ? min : 0;
  6855. max = (typeof max !== "undefined") ? max : 1;
  6856. return min + _seededRandom() * (max - min);
  6857. };
  6858. var _seededRandom = function() {
  6859. // https://en.wikipedia.org/wiki/Linear_congruential_generator
  6860. Common._seed = (Common._seed * 9301 + 49297) % 233280;
  6861. return Common._seed / 233280;
  6862. };
  6863. /**
  6864. * Converts a CSS hex colour string into an integer.
  6865. * @method colorToNumber
  6866. * @param {string} colorString
  6867. * @return {number} An integer representing the CSS hex string
  6868. */
  6869. Common.colorToNumber = function(colorString) {
  6870. colorString = colorString.replace('#','');
  6871. if (colorString.length == 3) {
  6872. colorString = colorString.charAt(0) + colorString.charAt(0)
  6873. + colorString.charAt(1) + colorString.charAt(1)
  6874. + colorString.charAt(2) + colorString.charAt(2);
  6875. }
  6876. return parseInt(colorString, 16);
  6877. };
  6878. /**
  6879. * The console logging level to use, where each level includes all levels above and excludes the levels below.
  6880. * The default level is 'debug' which shows all console messages.
  6881. *
  6882. * Possible level values are:
  6883. * - 0 = None
  6884. * - 1 = Debug
  6885. * - 2 = Info
  6886. * - 3 = Warn
  6887. * - 4 = Error
  6888. * @property Common.logLevel
  6889. * @type {Number}
  6890. * @default 1
  6891. */
  6892. Common.logLevel = 1;
  6893. /**
  6894. * Shows a `console.log` message only if the current `Common.logLevel` allows it.
  6895. * The message will be prefixed with 'matter-js' to make it easily identifiable.
  6896. * @method log
  6897. * @param ...objs {} The objects to log.
  6898. */
  6899. Common.log = function() {
  6900. if (console && Common.logLevel > 0 && Common.logLevel <= 3) {
  6901. console.log.apply(console, ['matter-js:'].concat(Array.prototype.slice.call(arguments)));
  6902. }
  6903. };
  6904. /**
  6905. * Shows a `console.info` message only if the current `Common.logLevel` allows it.
  6906. * The message will be prefixed with 'matter-js' to make it easily identifiable.
  6907. * @method info
  6908. * @param ...objs {} The objects to log.
  6909. */
  6910. Common.info = function() {
  6911. if (console && Common.logLevel > 0 && Common.logLevel <= 2) {
  6912. console.info.apply(console, ['matter-js:'].concat(Array.prototype.slice.call(arguments)));
  6913. }
  6914. };
  6915. /**
  6916. * Shows a `console.warn` message only if the current `Common.logLevel` allows it.
  6917. * The message will be prefixed with 'matter-js' to make it easily identifiable.
  6918. * @method warn
  6919. * @param ...objs {} The objects to log.
  6920. */
  6921. Common.warn = function() {
  6922. if (console && Common.logLevel > 0 && Common.logLevel <= 3) {
  6923. console.warn.apply(console, ['matter-js:'].concat(Array.prototype.slice.call(arguments)));
  6924. }
  6925. };
  6926. /**
  6927. * Returns the next unique sequential ID.
  6928. * @method nextId
  6929. * @return {Number} Unique sequential ID
  6930. */
  6931. Common.nextId = function() {
  6932. return Common._nextId++;
  6933. };
  6934. /**
  6935. * A cross browser compatible indexOf implementation.
  6936. * @method indexOf
  6937. * @param {array} haystack
  6938. * @param {object} needle
  6939. * @return {number} The position of needle in haystack, otherwise -1.
  6940. Common.indexOf = function(haystack, needle) {
  6941. if (haystack.indexOf)
  6942. return haystack.indexOf(needle);
  6943. for (var i = 0; i < haystack.length; i++) {
  6944. if (haystack[i] === needle)
  6945. return i;
  6946. }
  6947. return -1;
  6948. };
  6949. */
  6950. /**
  6951. * A cross browser compatible array map implementation.
  6952. * @method map
  6953. * @param {array} list
  6954. * @param {function} func
  6955. * @return {array} Values from list transformed by func.
  6956. */
  6957. Common.map = function(list, func) {
  6958. if (list.map) {
  6959. return list.map(func);
  6960. }
  6961. var mapped = [];
  6962. for (var i = 0; i < list.length; i += 1) {
  6963. mapped.push(func(list[i]));
  6964. }
  6965. return mapped;
  6966. };
  6967. /**
  6968. * Takes a directed graph and returns the partially ordered set of vertices in topological order.
  6969. * Circular dependencies are allowed.
  6970. * @method topologicalSort
  6971. * @param {object} graph
  6972. * @return {array} Partially ordered set of vertices in topological order.
  6973. */
  6974. Common.topologicalSort = function(graph) {
  6975. // https://github.com/mgechev/javascript-algorithms
  6976. // Copyright (c) Minko Gechev (MIT license)
  6977. // Modifications: tidy formatting and naming
  6978. var result = [],
  6979. visited = [],
  6980. temp = [];
  6981. for (var node in graph) {
  6982. if (!visited[node] && !temp[node]) {
  6983. _topologicalSort(node, visited, temp, graph, result);
  6984. }
  6985. }
  6986. return result;
  6987. };
  6988. var _topologicalSort = function(node, visited, temp, graph, result) {
  6989. var neighbors = graph[node] || [];
  6990. temp[node] = true;
  6991. for (var i = 0; i < neighbors.length; i += 1) {
  6992. var neighbor = neighbors[i];
  6993. if (temp[neighbor]) {
  6994. // skip circular dependencies
  6995. continue;
  6996. }
  6997. if (!visited[neighbor]) {
  6998. _topologicalSort(neighbor, visited, temp, graph, result);
  6999. }
  7000. }
  7001. temp[node] = false;
  7002. visited[node] = true;
  7003. result.push(node);
  7004. };
  7005. /**
  7006. * Takes _n_ functions as arguments and returns a new function that calls them in order.
  7007. * The arguments applied when calling the new function will also be applied to every function passed.
  7008. * The value of `this` refers to the last value returned in the chain that was not `undefined`.
  7009. * Therefore if a passed function does not return a value, the previously returned value is maintained.
  7010. * After all passed functions have been called the new function returns the last returned value (if any).
  7011. * If any of the passed functions are a chain, then the chain will be flattened.
  7012. * @method chain
  7013. * @param ...funcs {function} The functions to chain.
  7014. * @return {function} A new function that calls the passed functions in order.
  7015. */
  7016. Common.chain = function() {
  7017. var funcs = [];
  7018. for (var i = 0; i < arguments.length; i += 1) {
  7019. var func = arguments[i];
  7020. if (func._chained) {
  7021. // flatten already chained functions
  7022. funcs.push.apply(funcs, func._chained);
  7023. } else {
  7024. funcs.push(func);
  7025. }
  7026. }
  7027. var chain = function() {
  7028. // https://github.com/GoogleChrome/devtools-docs/issues/53#issuecomment-51941358
  7029. var lastResult,
  7030. args = new Array(arguments.length);
  7031. for (var i = 0, l = arguments.length; i < l; i++) {
  7032. args[i] = arguments[i];
  7033. }
  7034. for (i = 0; i < funcs.length; i += 1) {
  7035. var result = funcs[i].apply(lastResult, args);
  7036. if (typeof result !== 'undefined') {
  7037. lastResult = result;
  7038. }
  7039. }
  7040. return lastResult;
  7041. };
  7042. chain._chained = funcs;
  7043. return chain;
  7044. };
  7045. /**
  7046. * Chains a function to excute before the original function on the given `path` relative to `base`.
  7047. * See also docs for `Common.chain`.
  7048. * @method chainPathBefore
  7049. * @param {} base The base object
  7050. * @param {string} path The path relative to `base`
  7051. * @param {function} func The function to chain before the original
  7052. * @return {function} The chained function that replaced the original
  7053. */
  7054. Common.chainPathBefore = function(base, path, func) {
  7055. return Common.set(base, path, Common.chain(
  7056. func,
  7057. Common.get(base, path)
  7058. ));
  7059. };
  7060. /**
  7061. * Chains a function to excute after the original function on the given `path` relative to `base`.
  7062. * See also docs for `Common.chain`.
  7063. * @method chainPathAfter
  7064. * @param {} base The base object
  7065. * @param {string} path The path relative to `base`
  7066. * @param {function} func The function to chain after the original
  7067. * @return {function} The chained function that replaced the original
  7068. */
  7069. Common.chainPathAfter = function(base, path, func) {
  7070. return Common.set(base, path, Common.chain(
  7071. Common.get(base, path),
  7072. func
  7073. ));
  7074. };
  7075. })();
  7076. /***/ }),
  7077. /* 43 */
  7078. /***/ (function(module, exports) {
  7079. /**
  7080. * @author Richard Davey <rich@photonstorm.com>
  7081. * @copyright 2018 Photon Storm Ltd.
  7082. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7083. */
  7084. /**
  7085. * Arcade Physics consts.
  7086. *
  7087. * @ignore
  7088. */
  7089. var CONST = {
  7090. /**
  7091. * [description]
  7092. *
  7093. * @name Phaser.Physics.Arcade.DYNAMIC_BODY
  7094. * @readOnly
  7095. * @type {number}
  7096. * @since 3.0.0
  7097. */
  7098. DYNAMIC_BODY: 0,
  7099. /**
  7100. * [description]
  7101. *
  7102. * @name Phaser.Physics.Arcade.STATIC_BODY
  7103. * @readOnly
  7104. * @type {number}
  7105. * @since 3.0.0
  7106. */
  7107. STATIC_BODY: 1,
  7108. /**
  7109. * [description]
  7110. *
  7111. * @name Phaser.Physics.Arcade.GROUP
  7112. * @readOnly
  7113. * @type {number}
  7114. * @since 3.0.0
  7115. */
  7116. GROUP: 2,
  7117. /**
  7118. * [description]
  7119. *
  7120. * @name Phaser.Physics.Arcade.TILEMAPLAYER
  7121. * @readOnly
  7122. * @type {number}
  7123. * @since 3.0.0
  7124. */
  7125. TILEMAPLAYER: 3,
  7126. /**
  7127. * [description]
  7128. *
  7129. * @name Phaser.Physics.Arcade.FACING_NONE
  7130. * @readOnly
  7131. * @type {number}
  7132. * @since 3.0.0
  7133. */
  7134. FACING_NONE: 10,
  7135. /**
  7136. * [description]
  7137. *
  7138. * @name Phaser.Physics.Arcade.FACING_UP
  7139. * @readOnly
  7140. * @type {number}
  7141. * @since 3.0.0
  7142. */
  7143. FACING_UP: 11,
  7144. /**
  7145. * [description]
  7146. *
  7147. * @name Phaser.Physics.Arcade.FACING_DOWN
  7148. * @readOnly
  7149. * @type {number}
  7150. * @since 3.0.0
  7151. */
  7152. FACING_DOWN: 12,
  7153. /**
  7154. * [description]
  7155. *
  7156. * @name Phaser.Physics.Arcade.FACING_LEFT
  7157. * @readOnly
  7158. * @type {number}
  7159. * @since 3.0.0
  7160. */
  7161. FACING_LEFT: 13,
  7162. /**
  7163. * [description]
  7164. *
  7165. * @name Phaser.Physics.Arcade.FACING_RIGHT
  7166. * @readOnly
  7167. * @type {number}
  7168. * @since 3.0.0
  7169. */
  7170. FACING_RIGHT: 14
  7171. };
  7172. module.exports = CONST;
  7173. /***/ }),
  7174. /* 44 */
  7175. /***/ (function(module, exports) {
  7176. /**
  7177. * @author Richard Davey <rich@photonstorm.com>
  7178. * @copyright 2018 Photon Storm Ltd.
  7179. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7180. */
  7181. /**
  7182. * Positions the Game Object so that the top of its bounds aligns with the given coordinate.
  7183. *
  7184. * @function Phaser.Display.Bounds.SetTop
  7185. * @since 3.0.0
  7186. *
  7187. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  7188. *
  7189. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  7190. * @param {number} value - The coordinate to position the Game Object bounds on.
  7191. *
  7192. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  7193. */
  7194. var SetTop = function (gameObject, value)
  7195. {
  7196. gameObject.y = value + (gameObject.height * gameObject.originY);
  7197. return gameObject;
  7198. };
  7199. module.exports = SetTop;
  7200. /***/ }),
  7201. /* 45 */
  7202. /***/ (function(module, exports) {
  7203. /**
  7204. * @author Richard Davey <rich@photonstorm.com>
  7205. * @copyright 2018 Photon Storm Ltd.
  7206. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7207. */
  7208. /**
  7209. * Returns the top coordinate from the bounds of the Game Object.
  7210. *
  7211. * @function Phaser.Display.Bounds.GetTop
  7212. * @since 3.0.0
  7213. *
  7214. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  7215. *
  7216. * @return {number} The top coordinate of the bounds of the Game Object.
  7217. */
  7218. var GetTop = function (gameObject)
  7219. {
  7220. return gameObject.y - (gameObject.height * gameObject.originY);
  7221. };
  7222. module.exports = GetTop;
  7223. /***/ }),
  7224. /* 46 */
  7225. /***/ (function(module, exports) {
  7226. /**
  7227. * @author Richard Davey <rich@photonstorm.com>
  7228. * @copyright 2018 Photon Storm Ltd.
  7229. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7230. */
  7231. /**
  7232. * Positions the Game Object so that the left of its bounds aligns with the given coordinate.
  7233. *
  7234. * @function Phaser.Display.Bounds.SetRight
  7235. * @since 3.0.0
  7236. *
  7237. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  7238. *
  7239. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  7240. * @param {number} value - The coordinate to position the Game Object bounds on.
  7241. *
  7242. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  7243. */
  7244. var SetRight = function (gameObject, value)
  7245. {
  7246. gameObject.x = (value - gameObject.width) + (gameObject.width * gameObject.originX);
  7247. return gameObject;
  7248. };
  7249. module.exports = SetRight;
  7250. /***/ }),
  7251. /* 47 */
  7252. /***/ (function(module, exports) {
  7253. /**
  7254. * @author Richard Davey <rich@photonstorm.com>
  7255. * @copyright 2018 Photon Storm Ltd.
  7256. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7257. */
  7258. /**
  7259. * Returns the right coordinate from the bounds of the Game Object.
  7260. *
  7261. * @function Phaser.Display.Bounds.GetRight
  7262. * @since 3.0.0
  7263. *
  7264. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  7265. *
  7266. * @return {number} The right coordinate of the bounds of the Game Object.
  7267. */
  7268. var GetRight = function (gameObject)
  7269. {
  7270. return (gameObject.x + gameObject.width) - (gameObject.width * gameObject.originX);
  7271. };
  7272. module.exports = GetRight;
  7273. /***/ }),
  7274. /* 48 */
  7275. /***/ (function(module, exports) {
  7276. /**
  7277. * @author Richard Davey <rich@photonstorm.com>
  7278. * @copyright 2018 Photon Storm Ltd.
  7279. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7280. */
  7281. /**
  7282. * Positions the Game Object so that the left of its bounds aligns with the given coordinate.
  7283. *
  7284. * @function Phaser.Display.Bounds.SetLeft
  7285. * @since 3.0.0
  7286. *
  7287. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  7288. *
  7289. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  7290. * @param {number} value - The coordinate to position the Game Object bounds on.
  7291. *
  7292. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  7293. */
  7294. var SetLeft = function (gameObject, value)
  7295. {
  7296. gameObject.x = value + (gameObject.width * gameObject.originX);
  7297. return gameObject;
  7298. };
  7299. module.exports = SetLeft;
  7300. /***/ }),
  7301. /* 49 */
  7302. /***/ (function(module, exports) {
  7303. /**
  7304. * @author Richard Davey <rich@photonstorm.com>
  7305. * @copyright 2018 Photon Storm Ltd.
  7306. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7307. */
  7308. /**
  7309. * Returns the left coordinate from the bounds of the Game Object.
  7310. *
  7311. * @function Phaser.Display.Bounds.GetLeft
  7312. * @since 3.0.0
  7313. *
  7314. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  7315. *
  7316. * @return {number} The left coordinate of the bounds of the Game Object.
  7317. */
  7318. var GetLeft = function (gameObject)
  7319. {
  7320. return gameObject.x - (gameObject.width * gameObject.originX);
  7321. };
  7322. module.exports = GetLeft;
  7323. /***/ }),
  7324. /* 50 */
  7325. /***/ (function(module, exports) {
  7326. /**
  7327. * @author Richard Davey <rich@photonstorm.com>
  7328. * @copyright 2018 Photon Storm Ltd.
  7329. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7330. */
  7331. /**
  7332. * Positions the Game Object so that the bottom of its bounds aligns with the given coordinate.
  7333. *
  7334. * @function Phaser.Display.Bounds.SetBottom
  7335. * @since 3.0.0
  7336. *
  7337. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  7338. *
  7339. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  7340. * @param {number} value - The coordinate to position the Game Object bounds on.
  7341. *
  7342. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  7343. */
  7344. var SetBottom = function (gameObject, value)
  7345. {
  7346. gameObject.y = (value - gameObject.height) + (gameObject.height * gameObject.originY);
  7347. return gameObject;
  7348. };
  7349. module.exports = SetBottom;
  7350. /***/ }),
  7351. /* 51 */
  7352. /***/ (function(module, exports) {
  7353. /**
  7354. * @author Richard Davey <rich@photonstorm.com>
  7355. * @copyright 2018 Photon Storm Ltd.
  7356. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7357. */
  7358. /**
  7359. * Returns the bottom coordinate from the bounds of the Game Object.
  7360. *
  7361. * @function Phaser.Display.Bounds.GetBottom
  7362. * @since 3.0.0
  7363. *
  7364. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  7365. *
  7366. * @return {number} The bottom coordinate of the bounds of the Game Object.
  7367. */
  7368. var GetBottom = function (gameObject)
  7369. {
  7370. return (gameObject.y + gameObject.height) - (gameObject.height * gameObject.originY);
  7371. };
  7372. module.exports = GetBottom;
  7373. /***/ }),
  7374. /* 52 */
  7375. /***/ (function(module, exports) {
  7376. /**
  7377. * @author Richard Davey <rich@photonstorm.com>
  7378. * @copyright 2018 Photon Storm Ltd.
  7379. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7380. */
  7381. /**
  7382. * Phaser Blend Modes.
  7383. *
  7384. * @name Phaser.BlendModes
  7385. * @enum {integer}
  7386. * @memberOf Phaser
  7387. * @readOnly
  7388. * @since 3.0.0
  7389. */
  7390. module.exports = {
  7391. /**
  7392. * Skips the Blend Mode check in the renderer.
  7393. *
  7394. * @name Phaser.BlendModes.SKIP_CHECK
  7395. */
  7396. SKIP_CHECK: -1,
  7397. /**
  7398. * Normal blend mode.
  7399. *
  7400. * @name Phaser.BlendModes.NORMAL
  7401. */
  7402. NORMAL: 0,
  7403. /**
  7404. * Add blend mode.
  7405. *
  7406. * @name Phaser.BlendModes.ADD
  7407. */
  7408. ADD: 1,
  7409. /**
  7410. * Multiply blend mode.
  7411. *
  7412. * @name Phaser.BlendModes.MULTIPLY
  7413. */
  7414. MULTIPLY: 2,
  7415. /**
  7416. * Screen blend mode.
  7417. *
  7418. * @name Phaser.BlendModes.SCREEN
  7419. */
  7420. SCREEN: 3,
  7421. /**
  7422. * Overlay blend mode.
  7423. *
  7424. * @name Phaser.BlendModes.OVERLAY
  7425. */
  7426. OVERLAY: 4,
  7427. /**
  7428. * Darken blend mode.
  7429. *
  7430. * @name Phaser.BlendModes.DARKEN
  7431. */
  7432. DARKEN: 5,
  7433. /**
  7434. * Lighten blend mode.
  7435. *
  7436. * @name Phaser.BlendModes.LIGHTEN
  7437. */
  7438. LIGHTEN: 6,
  7439. /**
  7440. * Color Dodge blend mode.
  7441. *
  7442. * @name Phaser.BlendModes.COLOR_DODGE
  7443. */
  7444. COLOR_DODGE: 7,
  7445. /**
  7446. * Color Burn blend mode.
  7447. *
  7448. * @name Phaser.BlendModes.COLOR_BURN
  7449. */
  7450. COLOR_BURN: 8,
  7451. /**
  7452. * Hard Light blend mode.
  7453. *
  7454. * @name Phaser.BlendModes.HARD_LIGHT
  7455. */
  7456. HARD_LIGHT: 9,
  7457. /**
  7458. * Soft Light blend mode.
  7459. *
  7460. * @name Phaser.BlendModes.SOFT_LIGHT
  7461. */
  7462. SOFT_LIGHT: 10,
  7463. /**
  7464. * Difference blend mode.
  7465. *
  7466. * @name Phaser.BlendModes.DIFFERENCE
  7467. */
  7468. DIFFERENCE: 11,
  7469. /**
  7470. * Exclusion blend mode.
  7471. *
  7472. * @name Phaser.BlendModes.EXCLUSION
  7473. */
  7474. EXCLUSION: 12,
  7475. /**
  7476. * Hue blend mode.
  7477. *
  7478. * @name Phaser.BlendModes.HUE
  7479. */
  7480. HUE: 13,
  7481. /**
  7482. * Saturation blend mode.
  7483. *
  7484. * @name Phaser.BlendModes.SATURATION
  7485. */
  7486. SATURATION: 14,
  7487. /**
  7488. * Color blend mode.
  7489. *
  7490. * @name Phaser.BlendModes.COLOR
  7491. */
  7492. COLOR: 15,
  7493. /**
  7494. * Luminosity blend mode.
  7495. *
  7496. * @name Phaser.BlendModes.LUMINOSITY
  7497. */
  7498. LUMINOSITY: 16
  7499. };
  7500. /***/ }),
  7501. /* 53 */
  7502. /***/ (function(module, exports) {
  7503. /**
  7504. * @author Richard Davey <rich@photonstorm.com>
  7505. * @copyright 2018 Photon Storm Ltd.
  7506. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7507. */
  7508. /**
  7509. * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the
  7510. * layer's position, scale and scroll.
  7511. *
  7512. * @function Phaser.Tilemaps.Components.WorldToTileY
  7513. * @private
  7514. * @since 3.0.0
  7515. *
  7516. * @param {number} worldY - [description]
  7517. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  7518. * nearest integer.
  7519. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  7520. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  7521. *
  7522. * @return {number} The Y location in tile units.
  7523. */
  7524. var WorldToTileY = function (worldY, snapToFloor, camera, layer)
  7525. {
  7526. if (snapToFloor === undefined) { snapToFloor = true; }
  7527. var tileHeight = layer.baseTileHeight;
  7528. var tilemapLayer = layer.tilemapLayer;
  7529. if (tilemapLayer)
  7530. {
  7531. if (camera === undefined) { camera = tilemapLayer.scene.cameras.main; }
  7532. // Find the world position relative to the static or dynamic layer's top left origin,
  7533. // factoring in the camera's vertical scroll
  7534. worldY = worldY - (tilemapLayer.y + camera.scrollY * (1 - tilemapLayer.scrollFactorY));
  7535. tileHeight *= tilemapLayer.scaleY;
  7536. }
  7537. return snapToFloor
  7538. ? Math.floor(worldY / tileHeight)
  7539. : worldY / tileHeight;
  7540. };
  7541. module.exports = WorldToTileY;
  7542. /***/ }),
  7543. /* 54 */
  7544. /***/ (function(module, exports) {
  7545. /**
  7546. * @author Richard Davey <rich@photonstorm.com>
  7547. * @copyright 2018 Photon Storm Ltd.
  7548. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7549. */
  7550. /**
  7551. * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the
  7552. * layer's position, scale and scroll.
  7553. *
  7554. * @function Phaser.Tilemaps.Components.WorldToTileX
  7555. * @private
  7556. * @since 3.0.0
  7557. *
  7558. * @param {number} worldX - [description]
  7559. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  7560. * nearest integer.
  7561. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  7562. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  7563. *
  7564. * @return {number} The X location in tile units.
  7565. */
  7566. var WorldToTileX = function (worldX, snapToFloor, camera, layer)
  7567. {
  7568. if (snapToFloor === undefined) { snapToFloor = true; }
  7569. var tileWidth = layer.baseTileWidth;
  7570. var tilemapLayer = layer.tilemapLayer;
  7571. if (tilemapLayer)
  7572. {
  7573. if (camera === undefined) { camera = tilemapLayer.scene.cameras.main; }
  7574. // Find the world position relative to the static or dynamic layer's top left origin,
  7575. // factoring in the camera's horizontal scroll
  7576. worldX = worldX - (tilemapLayer.x + camera.scrollX * (1 - tilemapLayer.scrollFactorX));
  7577. tileWidth *= tilemapLayer.scaleX;
  7578. }
  7579. return snapToFloor
  7580. ? Math.floor(worldX / tileWidth)
  7581. : worldX / tileWidth;
  7582. };
  7583. module.exports = WorldToTileX;
  7584. /***/ }),
  7585. /* 55 */
  7586. /***/ (function(module, exports) {
  7587. /**
  7588. * @author Richard Davey <rich@photonstorm.com>
  7589. * @copyright 2018 Photon Storm Ltd.
  7590. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7591. */
  7592. /**
  7593. * Check to see if the Ellipse contains the given x / y coordinates.
  7594. *
  7595. * @function Phaser.Geom.Ellipse.Contains
  7596. * @since 3.0.0
  7597. *
  7598. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to check.
  7599. * @param {number} x - The x coordinate to check within the ellipse.
  7600. * @param {number} y - The y coordinate to check within the ellipse.
  7601. *
  7602. * @return {boolean} True if the coordinates are within the ellipse, otherwise false.
  7603. */
  7604. var Contains = function (ellipse, x, y)
  7605. {
  7606. if (ellipse.width <= 0 || ellipse.height <= 0)
  7607. {
  7608. return false;
  7609. }
  7610. // Normalize the coords to an ellipse with center 0,0 and a radius of 0.5
  7611. var normx = ((x - ellipse.x) / ellipse.width);
  7612. var normy = ((y - ellipse.y) / ellipse.height);
  7613. normx *= normx;
  7614. normy *= normy;
  7615. return (normx + normy < 0.25);
  7616. };
  7617. module.exports = Contains;
  7618. /***/ }),
  7619. /* 56 */
  7620. /***/ (function(module, exports) {
  7621. /**
  7622. * @author Richard Davey <rich@photonstorm.com>
  7623. * @copyright 2018 Photon Storm Ltd.
  7624. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7625. */
  7626. /**
  7627. * Removes a single item from an array and returns it without creating gc, like the native splice does.
  7628. * Based on code by Mike Reinstein.
  7629. *
  7630. * @function Phaser.Utils.Array.SpliceOne
  7631. * @since 3.0.0
  7632. *
  7633. * @param {array} array - [description]
  7634. * @param {integer} index - [description]
  7635. *
  7636. * @return {*} [description]
  7637. */
  7638. var SpliceOne = function (array, index)
  7639. {
  7640. if (index >= array.length)
  7641. {
  7642. return;
  7643. }
  7644. var len = array.length - 1;
  7645. var item = array[index];
  7646. for (var i = index; i < len; i++)
  7647. {
  7648. array[i] = array[i + 1];
  7649. }
  7650. array.length = len;
  7651. return item;
  7652. };
  7653. module.exports = SpliceOne;
  7654. /***/ }),
  7655. /* 57 */
  7656. /***/ (function(module, exports, __webpack_require__) {
  7657. /* WEBPACK VAR INJECTION */(function(process) {/**
  7658. * @author Richard Davey <rich@photonstorm.com>
  7659. * @copyright 2018 Photon Storm Ltd.
  7660. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7661. */
  7662. /**
  7663. * Determines the operating system of the device running this Phaser Game instance.
  7664. * These values are read-only and populated during the boot sequence of the game.
  7665. * They are then referenced by internal game systems and are available for you to access
  7666. * via `this.sys.game.device.os` from within any Scene.
  7667. *
  7668. * @typedef {object} Phaser.Device.OS
  7669. * @since 3.0.0
  7670. *
  7671. * @property {boolean} android - Is running on android?
  7672. * @property {boolean} chromeOS - Is running on chromeOS?
  7673. * @property {boolean} cocoonJS - Is the game running under CocoonJS?
  7674. * @property {boolean} cocoonJSApp - Is this game running with CocoonJS.App?
  7675. * @property {boolean} cordova - Is the game running under Apache Cordova?
  7676. * @property {boolean} crosswalk - Is the game running under the Intel Crosswalk XDK?
  7677. * @property {boolean} desktop - Is running on a desktop?
  7678. * @property {boolean} ejecta - Is the game running under Ejecta?
  7679. * @property {boolean} electron - Is the game running under GitHub Electron?
  7680. * @property {boolean} iOS - Is running on iOS?
  7681. * @property {boolean} iPad - Is running on iPad?
  7682. * @property {boolean} iPhone - Is running on iPhone?
  7683. * @property {boolean} kindle - Is running on an Amazon Kindle?
  7684. * @property {boolean} linux - Is running on linux?
  7685. * @property {boolean} macOS - Is running on macOS?
  7686. * @property {boolean} node - Is the game running under Node.js?
  7687. * @property {boolean} nodeWebkit - Is the game running under Node-Webkit?
  7688. * @property {boolean} webApp - Set to true if running as a WebApp, i.e. within a WebView
  7689. * @property {boolean} windows - Is running on windows?
  7690. * @property {boolean} windowsPhone - Is running on a Windows Phone?
  7691. * @property {number} iOSVersion - If running in iOS this will contain the major version number.
  7692. * @property {number} pixelRatio - PixelRatio of the host device?
  7693. */
  7694. var OS = {
  7695. android: false,
  7696. chromeOS: false,
  7697. cocoonJS: false,
  7698. cocoonJSApp: false,
  7699. cordova: false,
  7700. crosswalk: false,
  7701. desktop: false,
  7702. ejecta: false,
  7703. electron: false,
  7704. iOS: false,
  7705. iOSVersion: 0,
  7706. iPad: false,
  7707. iPhone: false,
  7708. kindle: false,
  7709. linux: false,
  7710. macOS: false,
  7711. node: false,
  7712. nodeWebkit: false,
  7713. pixelRatio: 1,
  7714. webApp: false,
  7715. windows: false,
  7716. windowsPhone: false
  7717. };
  7718. function init ()
  7719. {
  7720. var ua = navigator.userAgent;
  7721. if (/Windows/.test(ua))
  7722. {
  7723. OS.windows = true;
  7724. }
  7725. else if (/Mac OS/.test(ua))
  7726. {
  7727. OS.macOS = true;
  7728. }
  7729. else if (/Android/.test(ua))
  7730. {
  7731. OS.android = true;
  7732. }
  7733. else if (/Linux/.test(ua))
  7734. {
  7735. OS.linux = true;
  7736. }
  7737. else if (/iP[ao]d|iPhone/i.test(ua))
  7738. {
  7739. OS.iOS = true;
  7740. (navigator.appVersion).match(/OS (\d+)/);
  7741. OS.iOSVersion = parseInt(RegExp.$1, 10);
  7742. }
  7743. else if (/Kindle/.test(ua) || (/\bKF[A-Z][A-Z]+/).test(ua) || (/Silk.*Mobile Safari/).test(ua))
  7744. {
  7745. OS.kindle = true;
  7746. // This will NOT detect early generations of Kindle Fire, I think there is no reliable way...
  7747. // 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"
  7748. }
  7749. else if (/CrOS/.test(ua))
  7750. {
  7751. OS.chromeOS = true;
  7752. }
  7753. if (/Windows Phone/i.test(ua) || (/IEMobile/i).test(ua))
  7754. {
  7755. OS.android = false;
  7756. OS.iOS = false;
  7757. OS.macOS = false;
  7758. OS.windows = true;
  7759. OS.windowsPhone = true;
  7760. }
  7761. var silk = (/Silk/).test(ua);
  7762. if (OS.windows || OS.macOS || (OS.linux && !silk) || OS.chromeOS)
  7763. {
  7764. OS.desktop = true;
  7765. }
  7766. // Windows Phone / Table reset
  7767. if (OS.windowsPhone || ((/Windows NT/i.test(ua)) && (/Touch/i.test(ua))))
  7768. {
  7769. OS.desktop = false;
  7770. }
  7771. // WebApp mode in iOS
  7772. if (navigator.standalone)
  7773. {
  7774. OS.webApp = true;
  7775. }
  7776. if (window.cordova !== undefined)
  7777. {
  7778. OS.cordova = true;
  7779. }
  7780. if (process && process.versions && process.versions.node)
  7781. {
  7782. OS.node = true;
  7783. }
  7784. if (OS.node && typeof process.versions === 'object')
  7785. {
  7786. OS.nodeWebkit = !!process.versions['node-webkit'];
  7787. OS.electron = !!process.versions.electron;
  7788. }
  7789. if (navigator.isCocoonJS)
  7790. {
  7791. OS.cocoonJS = true;
  7792. try
  7793. {
  7794. OS.cocoonJSApp = (typeof CocoonJS !== 'undefined');
  7795. }
  7796. catch (error)
  7797. {
  7798. OS.cocoonJSApp = false;
  7799. }
  7800. }
  7801. if (window.ejecta !== undefined)
  7802. {
  7803. OS.ejecta = true;
  7804. }
  7805. if ((/Crosswalk/).test(ua))
  7806. {
  7807. OS.crosswalk = true;
  7808. }
  7809. OS.iPhone = ua.toLowerCase().indexOf('iphone') !== -1;
  7810. OS.iPad = ua.toLowerCase().indexOf('ipad') !== -1;
  7811. OS.pixelRatio = window['devicePixelRatio'] || 1;
  7812. return OS;
  7813. }
  7814. module.exports = init();
  7815. /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(507)))
  7816. /***/ }),
  7817. /* 58 */
  7818. /***/ (function(module, exports) {
  7819. /**
  7820. * @author Richard Davey <rich@photonstorm.com>
  7821. * @copyright 2018 Photon Storm Ltd.
  7822. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7823. */
  7824. /**
  7825. * Calculate the distance between two sets of coordinates (points).
  7826. *
  7827. * @function Phaser.Math.Distance.Between
  7828. * @since 3.0.0
  7829. *
  7830. * @param {number} x1 - The x coordinate of the first point.
  7831. * @param {number} y1 - The y coordinate of the first point.
  7832. * @param {number} x2 - The x coordinate of the second point.
  7833. * @param {number} y2 - The y coordinate of the second point.
  7834. *
  7835. * @return {number} The distance between each point.
  7836. */
  7837. var DistanceBetween = function (x1, y1, x2, y2)
  7838. {
  7839. var dx = x1 - x2;
  7840. var dy = y1 - y2;
  7841. return Math.sqrt(dx * dx + dy * dy);
  7842. };
  7843. module.exports = DistanceBetween;
  7844. /***/ }),
  7845. /* 59 */
  7846. /***/ (function(module, exports) {
  7847. /**
  7848. * @author Richard Davey <rich@photonstorm.com>
  7849. * @copyright 2018 Photon Storm Ltd.
  7850. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7851. */
  7852. /**
  7853. * Phaser Scale Modes.
  7854. *
  7855. * @name Phaser.ScaleModes
  7856. * @enum {integer}
  7857. * @memberOf Phaser
  7858. * @readOnly
  7859. * @since 3.0.0
  7860. */
  7861. module.exports = {
  7862. /**
  7863. * Default Scale Mode (Linear).
  7864. *
  7865. * @name Phaser.ScaleModes.DEFAULT
  7866. */
  7867. DEFAULT: 0,
  7868. /**
  7869. * Linear Scale Mode.
  7870. *
  7871. * @name Phaser.ScaleModes.LINEAR
  7872. */
  7873. LINEAR: 0,
  7874. /**
  7875. * Nearest Scale Mode.
  7876. *
  7877. * @name Phaser.ScaleModes.NEAREST
  7878. */
  7879. NEAREST: 1
  7880. };
  7881. /***/ }),
  7882. /* 60 */
  7883. /***/ (function(module, exports) {
  7884. /**
  7885. * @author Richard Davey <rich@photonstorm.com>
  7886. * @copyright 2018 Photon Storm Ltd.
  7887. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7888. */
  7889. // http://www.blackpawn.com/texts/pointinpoly/
  7890. /**
  7891. * [description]
  7892. *
  7893. * @function Phaser.Geom.Triangle.Contains
  7894. * @since 3.0.0
  7895. *
  7896. * @param {Phaser.Geom.Triangle} triangle - [description]
  7897. * @param {number} x - [description]
  7898. * @param {number} y - [description]
  7899. *
  7900. * @return {boolean} [description]
  7901. */
  7902. var Contains = function (triangle, x, y)
  7903. {
  7904. var v0x = triangle.x3 - triangle.x1;
  7905. var v0y = triangle.y3 - triangle.y1;
  7906. var v1x = triangle.x2 - triangle.x1;
  7907. var v1y = triangle.y2 - triangle.y1;
  7908. var v2x = x - triangle.x1;
  7909. var v2y = y - triangle.y1;
  7910. var dot00 = (v0x * v0x) + (v0y * v0y);
  7911. var dot01 = (v0x * v1x) + (v0y * v1y);
  7912. var dot02 = (v0x * v2x) + (v0y * v2y);
  7913. var dot11 = (v1x * v1x) + (v1y * v1y);
  7914. var dot12 = (v1x * v2x) + (v1y * v2y);
  7915. // Compute barycentric coordinates
  7916. var b = ((dot00 * dot11) - (dot01 * dot01));
  7917. var inv = (b === 0) ? 0 : (1 / b);
  7918. var u = ((dot11 * dot02) - (dot01 * dot12)) * inv;
  7919. var v = ((dot00 * dot12) - (dot01 * dot02)) * inv;
  7920. return (u >= 0 && v >= 0 && (u + v < 1));
  7921. };
  7922. module.exports = Contains;
  7923. /***/ }),
  7924. /* 61 */
  7925. /***/ (function(module, exports) {
  7926. /**
  7927. * @author Richard Davey <rich@photonstorm.com>
  7928. * @copyright 2018 Photon Storm Ltd.
  7929. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  7930. */
  7931. var TWEEN_CONST = {
  7932. /**
  7933. * TweenData state.
  7934. *
  7935. * @name Phaser.Tweens.CREATED
  7936. * @type {integer}
  7937. * @since 3.0.0
  7938. */
  7939. CREATED: 0,
  7940. /**
  7941. * TweenData state.
  7942. *
  7943. * @name Phaser.Tweens.INIT
  7944. * @type {integer}
  7945. * @since 3.0.0
  7946. */
  7947. INIT: 1,
  7948. /**
  7949. * TweenData state.
  7950. *
  7951. * @name Phaser.Tweens.DELAY
  7952. * @type {integer}
  7953. * @since 3.0.0
  7954. */
  7955. DELAY: 2,
  7956. /**
  7957. * TweenData state.
  7958. *
  7959. * @name Phaser.Tweens.OFFSET_DELAY
  7960. * @type {integer}
  7961. * @since 3.0.0
  7962. */
  7963. OFFSET_DELAY: 3,
  7964. /**
  7965. * TweenData state.
  7966. *
  7967. * @name Phaser.Tweens.PENDING_RENDER
  7968. * @type {integer}
  7969. * @since 3.0.0
  7970. */
  7971. PENDING_RENDER: 4,
  7972. /**
  7973. * TweenData state.
  7974. *
  7975. * @name Phaser.Tweens.PLAYING_FORWARD
  7976. * @type {integer}
  7977. * @since 3.0.0
  7978. */
  7979. PLAYING_FORWARD: 5,
  7980. /**
  7981. * TweenData state.
  7982. *
  7983. * @name Phaser.Tweens.PLAYING_BACKWARD
  7984. * @type {integer}
  7985. * @since 3.0.0
  7986. */
  7987. PLAYING_BACKWARD: 6,
  7988. /**
  7989. * TweenData state.
  7990. *
  7991. * @name Phaser.Tweens.HOLD_DELAY
  7992. * @type {integer}
  7993. * @since 3.0.0
  7994. */
  7995. HOLD_DELAY: 7,
  7996. /**
  7997. * TweenData state.
  7998. *
  7999. * @name Phaser.Tweens.REPEAT_DELAY
  8000. * @type {integer}
  8001. * @since 3.0.0
  8002. */
  8003. REPEAT_DELAY: 8,
  8004. /**
  8005. * TweenData state.
  8006. *
  8007. * @name Phaser.Tweens.COMPLETE
  8008. * @type {integer}
  8009. * @since 3.0.0
  8010. */
  8011. COMPLETE: 9,
  8012. // Tween specific (starts from 20 to cleanly allow extra TweenData consts in the future)
  8013. /**
  8014. * Tween state.
  8015. *
  8016. * @name Phaser.Tweens.PENDING_ADD
  8017. * @type {integer}
  8018. * @since 3.0.0
  8019. */
  8020. PENDING_ADD: 20,
  8021. /**
  8022. * Tween state.
  8023. *
  8024. * @name Phaser.Tweens.PAUSED
  8025. * @type {integer}
  8026. * @since 3.0.0
  8027. */
  8028. PAUSED: 21,
  8029. /**
  8030. * Tween state.
  8031. *
  8032. * @name Phaser.Tweens.LOOP_DELAY
  8033. * @type {integer}
  8034. * @since 3.0.0
  8035. */
  8036. LOOP_DELAY: 22,
  8037. /**
  8038. * Tween state.
  8039. *
  8040. * @name Phaser.Tweens.ACTIVE
  8041. * @type {integer}
  8042. * @since 3.0.0
  8043. */
  8044. ACTIVE: 23,
  8045. /**
  8046. * Tween state.
  8047. *
  8048. * @name Phaser.Tweens.COMPLETE_DELAY
  8049. * @type {integer}
  8050. * @since 3.0.0
  8051. */
  8052. COMPLETE_DELAY: 24,
  8053. /**
  8054. * Tween state.
  8055. *
  8056. * @name Phaser.Tweens.PENDING_REMOVE
  8057. * @type {integer}
  8058. * @since 3.0.0
  8059. */
  8060. PENDING_REMOVE: 25,
  8061. /**
  8062. * Tween state.
  8063. *
  8064. * @name Phaser.Tweens.REMOVED
  8065. * @type {integer}
  8066. * @since 3.0.0
  8067. */
  8068. REMOVED: 26
  8069. };
  8070. module.exports = TWEEN_CONST;
  8071. /***/ }),
  8072. /* 62 */
  8073. /***/ (function(module, exports) {
  8074. /**
  8075. * @author Richard Davey <rich@photonstorm.com>
  8076. * @copyright 2018 Photon Storm Ltd.
  8077. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  8078. */
  8079. /**
  8080. * [description]
  8081. *
  8082. * @function Phaser.Tweens.Builders.GetBoolean
  8083. * @since 3.0.0
  8084. *
  8085. * @param {object} source - [description]
  8086. * @param {string} key - [description]
  8087. * @param {*} defaultValue - [description]
  8088. *
  8089. * @return {*} [description]
  8090. */
  8091. var GetBoolean = function (source, key, defaultValue)
  8092. {
  8093. if (!source)
  8094. {
  8095. return defaultValue;
  8096. }
  8097. else if (source.hasOwnProperty(key))
  8098. {
  8099. return source[key];
  8100. }
  8101. else
  8102. {
  8103. return defaultValue;
  8104. }
  8105. };
  8106. module.exports = GetBoolean;
  8107. /***/ }),
  8108. /* 63 */
  8109. /***/ (function(module, exports, __webpack_require__) {
  8110. /**
  8111. * @author Richard Davey <rich@photonstorm.com>
  8112. * @copyright 2018 Photon Storm Ltd.
  8113. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  8114. */
  8115. var EaseMap = __webpack_require__(123);
  8116. /**
  8117. * [description]
  8118. *
  8119. * @function Phaser.Tweens.Builders.GetEaseFunction
  8120. * @since 3.0.0
  8121. *
  8122. * @param {(string|function)} ease - [description]
  8123. * @param {array} easeParams - [description]
  8124. *
  8125. * @return {function} [description]
  8126. */
  8127. var GetEaseFunction = function (ease, easeParams)
  8128. {
  8129. if (typeof ease === 'string' && EaseMap.hasOwnProperty(ease))
  8130. {
  8131. if (easeParams)
  8132. {
  8133. var cloneParams = easeParams.slice(0);
  8134. cloneParams.unshift(0);
  8135. return function (v)
  8136. {
  8137. cloneParams[0] = v;
  8138. return EaseMap[ease].apply(this, cloneParams);
  8139. };
  8140. }
  8141. else
  8142. {
  8143. // String based look-up
  8144. return EaseMap[ease];
  8145. }
  8146. }
  8147. else if (typeof ease === 'function')
  8148. {
  8149. // Custom function
  8150. return ease;
  8151. }
  8152. else if (Array.isArray(ease) && ease.length === 4)
  8153. {
  8154. // Bezier function (TODO)
  8155. }
  8156. return EaseMap.Power0;
  8157. };
  8158. module.exports = GetEaseFunction;
  8159. /***/ }),
  8160. /* 64 */
  8161. /***/ (function(module, exports, __webpack_require__) {
  8162. /**
  8163. * @author Richard Davey <rich@photonstorm.com>
  8164. * @copyright 2018 Photon Storm Ltd.
  8165. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  8166. */
  8167. var Clamp = __webpack_require__(19);
  8168. /**
  8169. * Return a value based on the range between `min` and `max` and the percentage given.
  8170. *
  8171. * @function Phaser.Math.FromPercent
  8172. * @since 3.0.0
  8173. *
  8174. * @param {number} percent - A value between 0 and 1 representing the percentage.
  8175. * @param {number} min - The minimum value.
  8176. * @param {number} [max] - The maximum value.
  8177. *
  8178. * @return {number} The value that is `percent` percent between `min` and `max`.
  8179. */
  8180. var FromPercent = function (percent, min, max)
  8181. {
  8182. percent = Clamp(percent, 0, 1);
  8183. return (max - min) * percent;
  8184. };
  8185. module.exports = FromPercent;
  8186. /***/ }),
  8187. /* 65 */
  8188. /***/ (function(module, exports, __webpack_require__) {
  8189. /**
  8190. * @author Richard Davey <rich@photonstorm.com>
  8191. * @copyright 2018 Photon Storm Ltd.
  8192. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  8193. */
  8194. var Class = __webpack_require__(0);
  8195. var Components = __webpack_require__(17);
  8196. var Rectangle = __webpack_require__(394);
  8197. /**
  8198. * @classdesc
  8199. * A Tile is a representation of a single tile within the Tilemap. This is a lightweight data
  8200. * representation, so its position information is stored without factoring in scroll, layer
  8201. * scale or layer position.
  8202. *
  8203. * @class Tile
  8204. * @memberOf Phaser.Tilemaps
  8205. * @constructor
  8206. * @since 3.0.0
  8207. *
  8208. * @extends Phaser.GameObjects.Components.Alpha
  8209. * @extends Phaser.GameObjects.Components.Flip
  8210. * @extends Phaser.GameObjects.Components.Visible
  8211. *
  8212. * @param {Phaser.Tilemaps.LayerData} layer - The LayerData object in the Tilemap that this tile belongs to.
  8213. * @param {integer} index - The unique index of this tile within the map.
  8214. * @param {integer} x - The x coordinate of this tile in tile coordinates.
  8215. * @param {integer} y - The y coordinate of this tile in tile coordinates.
  8216. * @param {integer} width - Width of the tile in pixels.
  8217. * @param {integer} height - Height of the tile in pixels.
  8218. * @param {integer} baseWidth - The base width a tile in the map (in pixels). Tiled maps support
  8219. * multiple tileset sizes within one map, but they are still placed at intervals of the base
  8220. * tile width.
  8221. * @param {integer} baseHeight - The base height of the tile in pixels (in pixels). Tiled maps
  8222. * support multiple tileset sizes within one map, but they are still placed at intervals of the
  8223. * base tile height.
  8224. */
  8225. var Tile = new Class({
  8226. Mixins: [
  8227. Components.Alpha,
  8228. Components.Flip,
  8229. Components.Visible
  8230. ],
  8231. initialize:
  8232. function Tile (layer, index, x, y, width, height, baseWidth, baseHeight)
  8233. {
  8234. /**
  8235. * The LayerData in the Tilemap data that this tile belongs to.
  8236. *
  8237. * @name Phaser.Tilemaps.Tile#layer
  8238. * @type {Phaser.Tilemaps.LayerData}
  8239. * @since 3.0.0
  8240. */
  8241. this.layer = layer;
  8242. /**
  8243. * The index of this tile within the map data corresponding to the tileset, or -1 if this
  8244. * represents a blank tile.
  8245. *
  8246. * @name Phaser.Tilemaps.Tile#index
  8247. * @type {integer}
  8248. * @since 3.0.0
  8249. */
  8250. this.index = index;
  8251. /**
  8252. * The x map coordinate of this tile in tile units.
  8253. *
  8254. * @name Phaser.Tilemaps.Tile#x
  8255. * @type {integer}
  8256. * @since 3.0.0
  8257. */
  8258. this.x = x;
  8259. /**
  8260. * The y map coordinate of this tile in tile units.
  8261. *
  8262. * @name Phaser.Tilemaps.Tile#y
  8263. * @type {integer}
  8264. * @since 3.0.0
  8265. */
  8266. this.y = y;
  8267. /**
  8268. * The width of the tile in pixels.
  8269. *
  8270. * @name Phaser.Tilemaps.Tile#width
  8271. * @type {integer}
  8272. * @since 3.0.0
  8273. */
  8274. this.width = width;
  8275. /**
  8276. * The height of the tile in pixels.
  8277. *
  8278. * @name Phaser.Tilemaps.Tile#height
  8279. * @type {integer}
  8280. * @since 3.0.0
  8281. */
  8282. this.height = height;
  8283. /**
  8284. * The map's base width of a tile in pixels. Tiled maps support multiple tileset sizes
  8285. * within one map, but they are still placed at intervals of the base tile size.
  8286. *
  8287. * @name Phaser.Tilemaps.Tile#baseWidth
  8288. * @type {integer}
  8289. * @since 3.0.0
  8290. */
  8291. this.baseWidth = (baseWidth !== undefined) ? baseWidth : width;
  8292. /**
  8293. * The map's base height of a tile in pixels. Tiled maps support multiple tileset sizes
  8294. * within one map, but they are still placed at intervals of the base tile size.
  8295. *
  8296. * @name Phaser.Tilemaps.Tile#baseHeight
  8297. * @type {integer}
  8298. * @since 3.0.0
  8299. */
  8300. this.baseHeight = (baseHeight !== undefined) ? baseHeight : height;
  8301. /**
  8302. * The x coordinate of the top left of this tile in pixels. This is relative to the top left
  8303. * of the layer this tile is being rendered within. This property does NOT factor in camera
  8304. * scroll, layer scale or layer position.
  8305. *
  8306. * @name Phaser.Tilemaps.Tile#pixelX
  8307. * @type {number}
  8308. * @since 3.0.0
  8309. */
  8310. this.pixelX = 0;
  8311. /**
  8312. * The y coordinate of the top left of this tile in pixels. This is relative to the top left
  8313. * of the layer this tile is being rendered within. This property does NOT factor in camera
  8314. * scroll, layer scale or layer position.
  8315. *
  8316. * @name Phaser.Tilemaps.Tile#pixelY
  8317. * @type {number}
  8318. * @since 3.0.0
  8319. */
  8320. this.pixelY = 0;
  8321. this.updatePixelXY();
  8322. /**
  8323. * Tile specific properties. These usually come from Tiled.
  8324. *
  8325. * @name Phaser.Tilemaps.Tile#properties
  8326. * @type {object}
  8327. * @since 3.0.0
  8328. */
  8329. this.properties = {};
  8330. /**
  8331. * The rotation angle of this tile.
  8332. *
  8333. * @name Phaser.Tilemaps.Tile#rotation
  8334. * @type {number}
  8335. * @since 3.0.0
  8336. */
  8337. this.rotation = 0;
  8338. /**
  8339. * Whether the tile should collide with any object on the left side.
  8340. *
  8341. * @name Phaser.Tilemaps.Tile#collideLeft
  8342. * @type {boolean}
  8343. * @since 3.0.0
  8344. */
  8345. this.collideLeft = false;
  8346. /**
  8347. * Whether the tile should collide with any object on the right side.
  8348. *
  8349. * @name Phaser.Tilemaps.Tile#collideRight
  8350. * @type {boolean}
  8351. * @since 3.0.0
  8352. */
  8353. this.collideRight = false;
  8354. /**
  8355. * Whether the tile should collide with any object on the top side.
  8356. *
  8357. * @name Phaser.Tilemaps.Tile#collideUp
  8358. * @type {boolean}
  8359. * @since 3.0.0
  8360. */
  8361. this.collideUp = false;
  8362. /**
  8363. * Whether the tile should collide with any object on the bottom side.
  8364. *
  8365. * @name Phaser.Tilemaps.Tile#collideDown
  8366. * @type {boolean}
  8367. * @since 3.0.0
  8368. */
  8369. this.collideDown = false;
  8370. /**
  8371. * Whether the tile's left edge is interesting for collisions.
  8372. *
  8373. * @name Phaser.Tilemaps.Tile#faceLeft
  8374. * @type {boolean}
  8375. * @since 3.0.0
  8376. */
  8377. this.faceLeft = false;
  8378. /**
  8379. * Whether the tile's right edge is interesting for collisions.
  8380. *
  8381. * @name Phaser.Tilemaps.Tile#faceRight
  8382. * @type {boolean}
  8383. * @since 3.0.0
  8384. */
  8385. this.faceRight = false;
  8386. /**
  8387. * Whether the tile's top edge is interesting for collisions.
  8388. *
  8389. * @name Phaser.Tilemaps.Tile#faceTop
  8390. * @type {boolean}
  8391. * @since 3.0.0
  8392. */
  8393. this.faceTop = false;
  8394. /**
  8395. * Whether the tile's bottom edge is interesting for collisions.
  8396. *
  8397. * @name Phaser.Tilemaps.Tile#faceBottom
  8398. * @type {boolean}
  8399. * @since 3.0.0
  8400. */
  8401. this.faceBottom = false;
  8402. /**
  8403. * Tile collision callback.
  8404. *
  8405. * @name Phaser.Tilemaps.Tile#collisionCallback
  8406. * @type {function}
  8407. * @since 3.0.0
  8408. */
  8409. this.collisionCallback = null;
  8410. /**
  8411. * The context in which the collision callback will be called.
  8412. *
  8413. * @name Phaser.Tilemaps.Tile#collisionCallbackContext
  8414. * @type {object}
  8415. * @since 3.0.0
  8416. */
  8417. this.collisionCallbackContext = this;
  8418. /**
  8419. * The tint to apply to this tile. Note: tint is currently a single color value instead of
  8420. * the 4 corner tint component on other GameObjects.
  8421. *
  8422. * @name Phaser.Tilemaps.Tile#tint
  8423. * @type {number}
  8424. * @default
  8425. * @since 3.0.0
  8426. */
  8427. this.tint = 0xffffff;
  8428. /**
  8429. * An empty object where physics-engine specific information (e.g. bodies) may be stored.
  8430. *
  8431. * @name Phaser.Tilemaps.Tile#physics
  8432. * @type {object}
  8433. * @since 3.0.0
  8434. */
  8435. this.physics = {};
  8436. },
  8437. /**
  8438. * Check if the given x and y world coordinates are within this Tile. This does not factor in
  8439. * camera scroll, layer scale or layer position.
  8440. *
  8441. * @method Phaser.Tilemaps.Tile#containsPoint
  8442. * @since 3.0.0
  8443. *
  8444. * @param {number} x - The x coordinate to test.
  8445. * @param {number} y - The y coordinate to test.
  8446. *
  8447. * @return {boolean} True if the coordinates are within this Tile, otherwise false.
  8448. */
  8449. containsPoint: function (x, y)
  8450. {
  8451. return !(x < this.pixelX || y < this.pixelY || x > this.right || y > this.bottom);
  8452. },
  8453. /**
  8454. * Copies the tile data & properties from the given tile to this tile. This copies everything
  8455. * except for position and interesting faces.
  8456. *
  8457. * @method Phaser.Tilemaps.Tile#copy
  8458. * @since 3.0.0
  8459. *
  8460. * @param {Phaser.Tilemaps.Tile} tile - The tile to copy from.
  8461. *
  8462. * @return {Phaser.Tilemaps.Tile} This Tile object.
  8463. */
  8464. copy: function (tile)
  8465. {
  8466. this.index = tile.index;
  8467. this.alpha = tile.alpha;
  8468. this.properties = tile.properties;
  8469. this.visible = tile.visible;
  8470. this.setFlip(tile.flipX, tile.flipY);
  8471. this.tint = tile.tint;
  8472. this.rotation = tile.rotation;
  8473. this.collideUp = tile.collideUp;
  8474. this.collideDown = tile.collideDown;
  8475. this.collideLeft = tile.collideLeft;
  8476. this.collideRight = tile.collideRight;
  8477. this.collisionCallback = tile.collisionCallback;
  8478. this.collisionCallbackContext = tile.collisionCallbackContext;
  8479. return this;
  8480. },
  8481. /**
  8482. * The collision group for this Tile, defined within the Tileset. This returns a reference to
  8483. * the collision group stored within the Tileset, so any modification of the returned object
  8484. * will impact all tiles that have the same index as this tile.
  8485. *
  8486. * @method Phaser.Tilemaps.Tile#getCollisionGroup
  8487. * @since 3.0.0
  8488. *
  8489. * @return {?object} tileset
  8490. */
  8491. getCollisionGroup: function ()
  8492. {
  8493. return this.tileset ? this.tileset.getTileCollisionGroup(this.index) : null;
  8494. },
  8495. /**
  8496. * The tile data for this Tile, defined within the Tileset. This typically contains Tiled
  8497. * collision data, tile animations and terrain information. This returns a reference to the tile
  8498. * data stored within the Tileset, so any modification of the returned object will impact all
  8499. * tiles that have the same index as this tile.
  8500. *
  8501. * @method Phaser.Tilemaps.Tile#getTileData
  8502. * @since 3.0.0
  8503. *
  8504. * @return {?object} tileset
  8505. */
  8506. getTileData: function ()
  8507. {
  8508. return this.tileset ? this.tileset.getTileData(this.index) : null;
  8509. },
  8510. /**
  8511. * Gets the world X position of the left side of the tile, factoring in the layers position,
  8512. * scale and scroll.
  8513. *
  8514. * @method Phaser.Tilemaps.Tile#getLeft
  8515. * @since 3.0.0
  8516. *
  8517. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8518. *
  8519. * @return {number}
  8520. */
  8521. getLeft: function (camera)
  8522. {
  8523. var tilemapLayer = this.tilemapLayer;
  8524. return (tilemapLayer) ? tilemapLayer.tileToWorldX(this.x, camera) : this.x * this.baseWidth;
  8525. },
  8526. /**
  8527. * Gets the world X position of the right side of the tile, factoring in the layer's position,
  8528. * scale and scroll.
  8529. *
  8530. * @method Phaser.Tilemaps.Tile#getRight
  8531. * @since 3.0.0
  8532. *
  8533. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8534. *
  8535. * @return {number}
  8536. */
  8537. getRight: function (camera)
  8538. {
  8539. var tilemapLayer = this.tilemapLayer;
  8540. return (tilemapLayer) ? this.getLeft(camera) + this.width * tilemapLayer.scaleX : this.getLeft(camera) + this.width;
  8541. },
  8542. /**
  8543. * Gets the world Y position of the top side of the tile, factoring in the layer's position,
  8544. * scale and scroll.
  8545. *
  8546. * @method Phaser.Tilemaps.Tile#getTop
  8547. * @since 3.0.0
  8548. *
  8549. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8550. *
  8551. * @return {number}
  8552. */
  8553. getTop: function (camera)
  8554. {
  8555. var tilemapLayer = this.tilemapLayer;
  8556. // Tiled places tiles on a grid of baseWidth x baseHeight. The origin for a tile in grid
  8557. // units is the bottom left, so the y coordinate needs to be adjusted by the difference
  8558. // between the base size and this tile's size.
  8559. return tilemapLayer
  8560. ? tilemapLayer.tileToWorldY(this.y, camera) - (this.height - this.baseHeight) * tilemapLayer.scaleY
  8561. : this.y * this.baseHeight - (this.height - this.baseHeight);
  8562. },
  8563. /**
  8564. * Gets the world Y position of the bottom side of the tile, factoring in the layer's position,
  8565. * scale and scroll.
  8566. * @method Phaser.Tilemaps.Tile#getBottom
  8567. * @since 3.0.0
  8568. *
  8569. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8570. *
  8571. * @return {number}
  8572. */
  8573. getBottom: function (camera)
  8574. {
  8575. var tilemapLayer = this.tilemapLayer;
  8576. return tilemapLayer
  8577. ? this.getTop(camera) + this.height * tilemapLayer.scaleY
  8578. : this.getTop(camera) + this.height;
  8579. },
  8580. /**
  8581. * Gets the world rectangle bounding box for the tile, factoring in the layers position,
  8582. * scale and scroll.
  8583. *
  8584. * @method Phaser.Tilemaps.Tile#getBounds
  8585. * @since 3.0.0
  8586. *
  8587. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8588. * @param {object} [output] - [description]
  8589. *
  8590. * @return {(Phaser.Geom.Rectangle|object)}
  8591. */
  8592. getBounds: function (camera, output)
  8593. {
  8594. if (output === undefined) { output = new Rectangle(); }
  8595. output.x = this.getLeft();
  8596. output.y = this.getTop();
  8597. output.width = this.getRight() - output.x;
  8598. output.height = this.getBottom() - output.y;
  8599. return output;
  8600. },
  8601. /**
  8602. * Gets the world X position of the center of the tile, factoring in the layer's position,
  8603. * scale and scroll.
  8604. *
  8605. * @method Phaser.Tilemaps.Tile#getCenterX
  8606. * @since 3.0.0
  8607. *
  8608. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8609. *
  8610. * @return {number}
  8611. */
  8612. getCenterX: function (camera)
  8613. {
  8614. return this.getLeft(camera) + this.width / 2;
  8615. },
  8616. /**
  8617. * Gets the world Y position of the center of the tile, factoring in the layer's position,
  8618. * scale and scroll.
  8619. *
  8620. * @method Phaser.Tilemaps.Tile#getCenterY
  8621. * @since 3.0.0
  8622. *
  8623. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to use to perform the check.
  8624. *
  8625. * @return {number}
  8626. */
  8627. getCenterY: function (camera)
  8628. {
  8629. return this.getTop(camera) + this.height / 2;
  8630. },
  8631. /**
  8632. * Clean up memory.
  8633. *
  8634. * @method Phaser.Tilemaps.Tile#destroy
  8635. * @since 3.0.0
  8636. */
  8637. destroy: function ()
  8638. {
  8639. this.collisionCallback = undefined;
  8640. this.collisionCallbackContext = undefined;
  8641. this.properties = undefined;
  8642. },
  8643. /**
  8644. * Check for intersection with this tile. This does not factor in camera scroll, layer scale or
  8645. * layer position.
  8646. *
  8647. * @method Phaser.Tilemaps.Tile#intersects
  8648. * @since 3.0.0
  8649. *
  8650. * @param {number} x - The x axis in pixels.
  8651. * @param {number} y - The y axis in pixels.
  8652. * @param {number} right - The right point.
  8653. * @param {number} bottom - The bottom point.
  8654. *
  8655. * @return {boolean}
  8656. */
  8657. intersects: function (x, y, right, bottom)
  8658. {
  8659. return !(
  8660. right <= this.pixelX || bottom <= this.pixelY ||
  8661. x >= this.right || y >= this.bottom
  8662. );
  8663. },
  8664. /**
  8665. * Checks if the tile is interesting.
  8666. *
  8667. * @method Phaser.Tilemaps.Tile#isInteresting
  8668. * @since 3.0.0
  8669. *
  8670. * @param {boolean} collides - If true, will consider the tile interesting if it collides on any side.
  8671. * @param {boolean} faces - If true, will consider the tile interesting if it has an interesting face.
  8672. *
  8673. * @return {boolean} True if the Tile is interesting, otherwise false.
  8674. */
  8675. isInteresting: function (collides, faces)
  8676. {
  8677. if (collides && faces) { return (this.canCollide || this.hasInterestingFace); }
  8678. else if (collides) { return this.collides; }
  8679. else if (faces) { return this.hasInterestingFace; }
  8680. return false;
  8681. },
  8682. /**
  8683. * Reset collision status flags.
  8684. *
  8685. * @method Phaser.Tilemaps.Tile#resetCollision
  8686. * @since 3.0.0
  8687. *
  8688. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate interesting faces for this tile and its neighbors.
  8689. *
  8690. * @return {Phaser.Tilemaps.Tile} This Tile object.
  8691. */
  8692. resetCollision: function (recalculateFaces)
  8693. {
  8694. if (recalculateFaces === undefined) { recalculateFaces = true; }
  8695. this.collideLeft = false;
  8696. this.collideRight = false;
  8697. this.collideUp = false;
  8698. this.collideDown = false;
  8699. this.faceTop = false;
  8700. this.faceBottom = false;
  8701. this.faceLeft = false;
  8702. this.faceRight = false;
  8703. if (recalculateFaces)
  8704. {
  8705. var tilemapLayer = this.tilemapLayer;
  8706. if (tilemapLayer)
  8707. {
  8708. this.tilemapLayer.calculateFacesAt(this.x, this.y);
  8709. }
  8710. }
  8711. return this;
  8712. },
  8713. /**
  8714. * Reset faces.
  8715. *
  8716. * @method Phaser.Tilemaps.Tile#resetFaces
  8717. * @since 3.0.0
  8718. *
  8719. * @return {Phaser.Tilemaps.Tile} This Tile object.
  8720. */
  8721. resetFaces: function ()
  8722. {
  8723. this.faceTop = false;
  8724. this.faceBottom = false;
  8725. this.faceLeft = false;
  8726. this.faceRight = false;
  8727. return this;
  8728. },
  8729. /**
  8730. * Sets the collision flags for each side of this tile and updates the interesting faces list.
  8731. *
  8732. * @method Phaser.Tilemaps.Tile#setCollision
  8733. * @since 3.0.0
  8734. *
  8735. * @param {boolean} left - Indicating collide with any object on the left.
  8736. * @param {boolean} [right] - Indicating collide with any object on the right.
  8737. * @param {boolean} [up] - Indicating collide with any object on the top.
  8738. * @param {boolean} [down] - Indicating collide with any object on the bottom.
  8739. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate interesting faces
  8740. * for this tile and its neighbors.
  8741. *
  8742. * @return {Phaser.Tilemaps.Tile} This Tile object.
  8743. */
  8744. setCollision: function (left, right, up, down, recalculateFaces)
  8745. {
  8746. if (right === undefined) { right = left; }
  8747. if (up === undefined) { up = left; }
  8748. if (down === undefined) { down = left; }
  8749. if (recalculateFaces === undefined) { recalculateFaces = true; }
  8750. this.collideLeft = left;
  8751. this.collideRight = right;
  8752. this.collideUp = up;
  8753. this.collideDown = down;
  8754. this.faceLeft = left;
  8755. this.faceRight = right;
  8756. this.faceTop = up;
  8757. this.faceBottom = down;
  8758. if (recalculateFaces)
  8759. {
  8760. var tilemapLayer = this.tilemapLayer;
  8761. if (tilemapLayer)
  8762. {
  8763. this.tilemapLayer.calculateFacesAt(this.x, this.y);
  8764. }
  8765. }
  8766. return this;
  8767. },
  8768. /**
  8769. * Set a callback to be called when this tile is hit by an object. The callback must true for
  8770. * collision processing to take place.
  8771. *
  8772. * @method Phaser.Tilemaps.Tile#setCollisionCallback
  8773. * @since 3.0.0
  8774. *
  8775. * @param {function} callback - Callback function.
  8776. * @param {object} context - Callback will be called within this context.
  8777. *
  8778. * @return {Phaser.Tilemaps.Tile} This Tile object.
  8779. */
  8780. setCollisionCallback: function (callback, context)
  8781. {
  8782. if (callback === null)
  8783. {
  8784. this.collisionCallback = undefined;
  8785. this.collisionCallbackContext = undefined;
  8786. }
  8787. else
  8788. {
  8789. this.collisionCallback = callback;
  8790. this.collisionCallbackContext = context;
  8791. }
  8792. return this;
  8793. },
  8794. /**
  8795. * Sets the size of the tile and updates its pixelX and pixelY.
  8796. *
  8797. * @method Phaser.Tilemaps.Tile#setSize
  8798. * @since 3.0.0
  8799. *
  8800. * @param {integer} tileWidth - The width of the tile in pixels.
  8801. * @param {integer} tileHeight - The height of the tile in pixels.
  8802. * @param {integer} baseWidth - The base width a tile in the map (in pixels).
  8803. * @param {integer} baseHeight - The base height of the tile in pixels (in pixels).
  8804. *
  8805. * @return {Phaser.Tilemaps.Tile} This Tile object.
  8806. */
  8807. setSize: function (tileWidth, tileHeight, baseWidth, baseHeight)
  8808. {
  8809. if (tileWidth !== undefined) { this.width = tileWidth; }
  8810. if (tileHeight !== undefined) { this.height = tileHeight; }
  8811. if (baseWidth !== undefined) { this.baseWidth = baseWidth; }
  8812. if (baseHeight !== undefined) { this.baseHeight = baseHeight; }
  8813. this.updatePixelXY();
  8814. return this;
  8815. },
  8816. /**
  8817. * Used internally. Updates the tile's world XY position based on the current tile size.
  8818. *
  8819. * @method Phaser.Tilemaps.Tile#updatePixelXY
  8820. * @since 3.0.0
  8821. *
  8822. * @return {Phaser.Tilemaps.Tile} This Tile object.
  8823. */
  8824. updatePixelXY: function ()
  8825. {
  8826. // Tiled places tiles on a grid of baseWidth x baseHeight. The origin for a tile is the
  8827. // bottom left, while the Phaser renderer assumes the origin is the top left. The y
  8828. // coordinate needs to be adjusted by the difference.
  8829. this.pixelX = this.x * this.baseWidth;
  8830. this.pixelY = this.y * this.baseHeight - (this.height - this.baseHeight);
  8831. return this;
  8832. },
  8833. /**
  8834. * True if this tile can collide on any of its faces or has a collision callback set.
  8835. *
  8836. * @name Phaser.Tilemaps.Tile#canCollide
  8837. * @type {boolean}
  8838. * @readOnly
  8839. * @since 3.0.0
  8840. */
  8841. canCollide: {
  8842. get: function ()
  8843. {
  8844. return (this.collideLeft || this.collideRight || this.collideUp || this.collideDown || this.collisionCallback);
  8845. }
  8846. },
  8847. /**
  8848. * True if this tile can collide on any of its faces.
  8849. *
  8850. * @name Phaser.Tilemaps.Tile#collides
  8851. * @type {boolean}
  8852. * @readOnly
  8853. * @since 3.0.0
  8854. */
  8855. collides: {
  8856. get: function ()
  8857. {
  8858. return (this.collideLeft || this.collideRight || this.collideUp || this.collideDown);
  8859. }
  8860. },
  8861. /**
  8862. * True if this tile has any interesting faces.
  8863. *
  8864. * @name Phaser.Tilemaps.Tile#hasInterestingFace
  8865. * @type {boolean}
  8866. * @readOnly
  8867. * @since 3.0.0
  8868. */
  8869. hasInterestingFace: {
  8870. get: function ()
  8871. {
  8872. return (this.faceTop || this.faceBottom || this.faceLeft || this.faceRight);
  8873. }
  8874. },
  8875. /**
  8876. * The tileset that contains this Tile. This will only return null if accessed from a LayerData
  8877. * instance before the tile is placed within a StaticTilemapLayer or DynamicTilemapLayer.
  8878. *
  8879. * @name Phaser.Tilemaps.Tile#tileset
  8880. * @type {?Phaser.Tilemaps.Tileset}
  8881. * @readOnly
  8882. * @since 3.0.0
  8883. */
  8884. tileset: {
  8885. get: function ()
  8886. {
  8887. var tilemapLayer = this.tilemapLayer;
  8888. return tilemapLayer ? tilemapLayer.tileset : null;
  8889. }
  8890. },
  8891. /**
  8892. * The tilemap layer that contains this Tile. This will only return null if accessed from a
  8893. * LayerData instance before the tile is placed within a StaticTilemapLayer or
  8894. * DynamicTilemapLayer.
  8895. *
  8896. * @name Phaser.Tilemaps.Tile#tilemapLayer
  8897. * @type {?Phaser.Tilemaps.StaticTilemapLayer|Phaser.Tilemaps.DynamicTilemapLayer}
  8898. * @readOnly
  8899. * @since 3.0.0
  8900. */
  8901. tilemapLayer: {
  8902. get: function ()
  8903. {
  8904. return this.layer.tilemapLayer;
  8905. }
  8906. },
  8907. /**
  8908. * The tilemap that contains this Tile. This will only return null if accessed from a LayerData
  8909. * instance before the tile is placed within a StaticTilemapLayer or DynamicTilemapLayer.
  8910. *
  8911. * @name Phaser.Tilemaps.Tile#tilemap
  8912. * @type {?Phaser.Tilemaps.Tilemap}
  8913. * @readOnly
  8914. * @since 3.0.0
  8915. */
  8916. tilemap: {
  8917. get: function ()
  8918. {
  8919. var tilemapLayer = this.tilemapLayer;
  8920. return tilemapLayer ? tilemapLayer.tilemap : null;
  8921. }
  8922. }
  8923. });
  8924. module.exports = Tile;
  8925. /***/ }),
  8926. /* 66 */
  8927. /***/ (function(module, exports) {
  8928. /**
  8929. * @author Richard Davey <rich@photonstorm.com>
  8930. * @copyright 2018 Photon Storm Ltd.
  8931. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  8932. */
  8933. /**
  8934. * Internally used method to set the colliding state of a tile. This does not recalculate
  8935. * interesting faces.
  8936. *
  8937. * @function Phaser.Tilemaps.Components.SetTileCollision
  8938. * @private
  8939. * @since 3.0.0
  8940. *
  8941. * @param {Phaser.Tilemaps.Tile} tile - [description]
  8942. * @param {boolean} [collides=true] - [description]
  8943. */
  8944. var SetTileCollision = function (tile, collides)
  8945. {
  8946. if (collides)
  8947. {
  8948. tile.setCollision(true, true, true, true, false);
  8949. }
  8950. else
  8951. {
  8952. tile.resetCollision(false);
  8953. }
  8954. };
  8955. module.exports = SetTileCollision;
  8956. /***/ }),
  8957. /* 67 */
  8958. /***/ (function(module, exports, __webpack_require__) {
  8959. /**
  8960. * @author Richard Davey <rich@photonstorm.com>
  8961. * @copyright 2018 Photon Storm Ltd.
  8962. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  8963. */
  8964. var Class = __webpack_require__(0);
  8965. var Contains = __webpack_require__(60);
  8966. var GetPoint = __webpack_require__(232);
  8967. var GetPoints = __webpack_require__(231);
  8968. var Line = __webpack_require__(96);
  8969. var Random = __webpack_require__(158);
  8970. /**
  8971. * @classdesc
  8972. * A triangle is a plane created by connecting three points.
  8973. * The first two arguments specify the first point, the middle two arguments
  8974. * specify the second point, and the last two arguments specify the third point.
  8975. *
  8976. * @class Triangle
  8977. * @memberOf Phaser.Geom
  8978. * @constructor
  8979. * @since 3.0.0
  8980. *
  8981. * @param {number} [x1=0] - [description]
  8982. * @param {number} [y1=0] - [description]
  8983. * @param {number} [x2=0] - [description]
  8984. * @param {number} [y2=0] - [description]
  8985. * @param {number} [x3=0] - [description]
  8986. * @param {number} [y3=0] - [description]
  8987. */
  8988. var Triangle = new Class({
  8989. initialize:
  8990. function Triangle (x1, y1, x2, y2, x3, y3)
  8991. {
  8992. if (x1 === undefined) { x1 = 0; }
  8993. if (y1 === undefined) { y1 = 0; }
  8994. if (x2 === undefined) { x2 = 0; }
  8995. if (y2 === undefined) { y2 = 0; }
  8996. if (x3 === undefined) { x3 = 0; }
  8997. if (y3 === undefined) { y3 = 0; }
  8998. /**
  8999. * [description]
  9000. *
  9001. * @name Phaser.Geom.Triangle#x1
  9002. * @type {number}
  9003. * @default 0
  9004. * @since 3.0.0
  9005. */
  9006. this.x1 = x1;
  9007. /**
  9008. * [description]
  9009. *
  9010. * @name Phaser.Geom.Triangle#y1
  9011. * @type {number}
  9012. * @default 0
  9013. * @since 3.0.0
  9014. */
  9015. this.y1 = y1;
  9016. /**
  9017. * [description]
  9018. *
  9019. * @name Phaser.Geom.Triangle#x2
  9020. * @type {number}
  9021. * @default 0
  9022. * @since 3.0.0
  9023. */
  9024. this.x2 = x2;
  9025. /**
  9026. * [description]
  9027. *
  9028. * @name Phaser.Geom.Triangle#y2
  9029. * @type {number}
  9030. * @default 0
  9031. * @since 3.0.0
  9032. */
  9033. this.y2 = y2;
  9034. /**
  9035. * [description]
  9036. *
  9037. * @name Phaser.Geom.Triangle#x3
  9038. * @type {number}
  9039. * @default 0
  9040. * @since 3.0.0
  9041. */
  9042. this.x3 = x3;
  9043. /**
  9044. * [description]
  9045. *
  9046. * @name Phaser.Geom.Triangle#y3
  9047. * @type {number}
  9048. * @default 0
  9049. * @since 3.0.0
  9050. */
  9051. this.y3 = y3;
  9052. },
  9053. /**
  9054. * [description]
  9055. *
  9056. * @method Phaser.Geom.Triangle#contains
  9057. * @since 3.0.0
  9058. *
  9059. * @param {number} x - [description]
  9060. * @param {number} y - [description]
  9061. *
  9062. * @return {boolean} [description]
  9063. */
  9064. contains: function (x, y)
  9065. {
  9066. return Contains(this, x, y);
  9067. },
  9068. /**
  9069. * [description]
  9070. *
  9071. * @method Phaser.Geom.Triangle#getPoint
  9072. * @since 3.0.0
  9073. *
  9074. * @generic {Phaser.Geom.Point} O - [output,$return]
  9075. *
  9076. * @param {number} position - [description]
  9077. * @param {(Phaser.Geom.Point|object)} [output] - [description]
  9078. *
  9079. * @return {(Phaser.Geom.Point|object)} [description]
  9080. */
  9081. getPoint: function (position, output)
  9082. {
  9083. return GetPoint(this, position, output);
  9084. },
  9085. /**
  9086. * [description]
  9087. *
  9088. * @method Phaser.Geom.Triangle#getPoints
  9089. * @since 3.0.0
  9090. *
  9091. * @generic {Phaser.Geom.Point[]} O - [output,$return]
  9092. *
  9093. * @param {integer} quantity - [description]
  9094. * @param {number} [stepRate] - [description]
  9095. * @param {(array|Phaser.Geom.Point[])} [output] - [description]
  9096. *
  9097. * @return {(array|Phaser.Geom.Point[])} [description]
  9098. */
  9099. getPoints: function (quantity, stepRate, output)
  9100. {
  9101. return GetPoints(this, quantity, stepRate, output);
  9102. },
  9103. /**
  9104. * [description]
  9105. *
  9106. * @method Phaser.Geom.Triangle#getRandomPoint
  9107. * @since 3.0.0
  9108. *
  9109. * @generic {Phaser.Geom.Point} O - [point,$return]
  9110. *
  9111. * @param {Phaser.Geom.Point} [point] - [description]
  9112. *
  9113. * @return {Phaser.Geom.Point} [description]
  9114. */
  9115. getRandomPoint: function (point)
  9116. {
  9117. return Random(this, point);
  9118. },
  9119. /**
  9120. * [description]
  9121. *
  9122. * @method Phaser.Geom.Triangle#setTo
  9123. * @since 3.0.0
  9124. *
  9125. * @param {number} [x1=0] - [description]
  9126. * @param {number} [y1=0] - [description]
  9127. * @param {number} [x2=0] - [description]
  9128. * @param {number} [y2=0] - [description]
  9129. * @param {number} [x3=0] - [description]
  9130. * @param {number} [y3=0] - [description]
  9131. *
  9132. * @return {Phaser.Geom.Triangle} This Triangle object.
  9133. */
  9134. setTo: function (x1, y1, x2, y2, x3, y3)
  9135. {
  9136. if (x1 === undefined) { x1 = 0; }
  9137. if (y1 === undefined) { y1 = 0; }
  9138. if (x2 === undefined) { x2 = 0; }
  9139. if (y2 === undefined) { y2 = 0; }
  9140. if (x3 === undefined) { x3 = 0; }
  9141. if (y3 === undefined) { y3 = 0; }
  9142. this.x1 = x1;
  9143. this.y1 = y1;
  9144. this.x2 = x2;
  9145. this.y2 = y2;
  9146. this.x3 = x3;
  9147. this.y3 = y3;
  9148. return this;
  9149. },
  9150. /**
  9151. * Returns a Line object that corresponds to Line A of this Triangle.
  9152. *
  9153. * @method Phaser.Geom.Triangle#getLineA
  9154. * @since 3.0.0
  9155. *
  9156. * @generic {Phaser.Geom.Line} O - [line,$return]
  9157. *
  9158. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  9159. *
  9160. * @return {Phaser.Geom.Line} A Line object that corresponds to line A of this Triangle.
  9161. */
  9162. getLineA: function (line)
  9163. {
  9164. if (line === undefined) { line = new Line(); }
  9165. line.setTo(this.x1, this.y1, this.x2, this.y2);
  9166. return line;
  9167. },
  9168. /**
  9169. * Returns a Line object that corresponds to Line B of this Triangle.
  9170. *
  9171. * @method Phaser.Geom.Triangle#getLineB
  9172. * @since 3.0.0
  9173. *
  9174. * @generic {Phaser.Geom.Line} O - [line,$return]
  9175. *
  9176. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  9177. *
  9178. * @return {Phaser.Geom.Line} A Line object that corresponds to line B of this Triangle.
  9179. */
  9180. getLineB: function (line)
  9181. {
  9182. if (line === undefined) { line = new Line(); }
  9183. line.setTo(this.x2, this.y2, this.x3, this.y3);
  9184. return line;
  9185. },
  9186. /**
  9187. * Returns a Line object that corresponds to Line C of this Triangle.
  9188. *
  9189. * @method Phaser.Geom.Triangle#getLineC
  9190. * @since 3.0.0
  9191. *
  9192. * @generic {Phaser.Geom.Line} O - [line,$return]
  9193. *
  9194. * @param {Phaser.Geom.Line} [line] - A Line object to set the results in. If `undefined` a new Line will be created.
  9195. *
  9196. * @return {Phaser.Geom.Line} A Line object that corresponds to line C of this Triangle.
  9197. */
  9198. getLineC: function (line)
  9199. {
  9200. if (line === undefined) { line = new Line(); }
  9201. line.setTo(this.x3, this.y3, this.x1, this.y1);
  9202. return line;
  9203. },
  9204. /**
  9205. * [description]
  9206. *
  9207. * @name Phaser.Geom.Triangle#left
  9208. * @type {number}
  9209. * @since 3.0.0
  9210. */
  9211. left: {
  9212. get: function ()
  9213. {
  9214. return Math.min(this.x1, this.x2, this.x3);
  9215. },
  9216. set: function (value)
  9217. {
  9218. var diff = 0;
  9219. if (this.x1 <= this.x2 && this.x1 <= this.x3)
  9220. {
  9221. diff = this.x1 - value;
  9222. }
  9223. else if (this.x2 <= this.x1 && this.x2 <= this.x3)
  9224. {
  9225. diff = this.x2 - value;
  9226. }
  9227. else
  9228. {
  9229. diff = this.x3 - value;
  9230. }
  9231. this.x1 -= diff;
  9232. this.x2 -= diff;
  9233. this.x3 -= diff;
  9234. }
  9235. },
  9236. /**
  9237. * [description]
  9238. *
  9239. * @name Phaser.Geom.Triangle#right
  9240. * @type {number}
  9241. * @since 3.0.0
  9242. */
  9243. right: {
  9244. get: function ()
  9245. {
  9246. return Math.max(this.x1, this.x2, this.x3);
  9247. },
  9248. set: function (value)
  9249. {
  9250. var diff = 0;
  9251. if (this.x1 >= this.x2 && this.x1 >= this.x3)
  9252. {
  9253. diff = this.x1 - value;
  9254. }
  9255. else if (this.x2 >= this.x1 && this.x2 >= this.x3)
  9256. {
  9257. diff = this.x2 - value;
  9258. }
  9259. else
  9260. {
  9261. diff = this.x3 - value;
  9262. }
  9263. this.x1 -= diff;
  9264. this.x2 -= diff;
  9265. this.x3 -= diff;
  9266. }
  9267. },
  9268. /**
  9269. * [description]
  9270. *
  9271. * @name Phaser.Geom.Triangle#top
  9272. * @type {number}
  9273. * @since 3.0.0
  9274. */
  9275. top: {
  9276. get: function ()
  9277. {
  9278. return Math.min(this.y1, this.y2, this.y3);
  9279. },
  9280. set: function (value)
  9281. {
  9282. var diff = 0;
  9283. if (this.y1 <= this.y2 && this.y1 <= this.y3)
  9284. {
  9285. diff = this.y1 - value;
  9286. }
  9287. else if (this.y2 <= this.y1 && this.y2 <= this.y3)
  9288. {
  9289. diff = this.y2 - value;
  9290. }
  9291. else
  9292. {
  9293. diff = this.y3 - value;
  9294. }
  9295. this.y1 -= diff;
  9296. this.y2 -= diff;
  9297. this.y3 -= diff;
  9298. }
  9299. },
  9300. /**
  9301. * [description]
  9302. *
  9303. * @name Phaser.Geom.Triangle#bottom
  9304. * @type {number}
  9305. * @since 3.0.0
  9306. */
  9307. bottom: {
  9308. get: function ()
  9309. {
  9310. return Math.max(this.y1, this.y2, this.y3);
  9311. },
  9312. set: function (value)
  9313. {
  9314. var diff = 0;
  9315. if (this.y1 >= this.y2 && this.y1 >= this.y3)
  9316. {
  9317. diff = this.y1 - value;
  9318. }
  9319. else if (this.y2 >= this.y1 && this.y2 >= this.y3)
  9320. {
  9321. diff = this.y2 - value;
  9322. }
  9323. else
  9324. {
  9325. diff = this.y3 - value;
  9326. }
  9327. this.y1 -= diff;
  9328. this.y2 -= diff;
  9329. this.y3 -= diff;
  9330. }
  9331. }
  9332. });
  9333. module.exports = Triangle;
  9334. /***/ }),
  9335. /* 68 */
  9336. /***/ (function(module, exports, __webpack_require__) {
  9337. /**
  9338. * @author Richard Davey <rich@photonstorm.com>
  9339. * @copyright 2018 Photon Storm Ltd.
  9340. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  9341. */
  9342. var Class = __webpack_require__(0);
  9343. var Components = __webpack_require__(17);
  9344. var GameObject = __webpack_require__(2);
  9345. var ImageRender = __webpack_require__(432);
  9346. /**
  9347. * @classdesc
  9348. * An Image Game Object.
  9349. *
  9350. * An Image is a light-weight Game Object useful for the display of static images in your game,
  9351. * such as logos, backgrounds, scenery or other non-animated elements. Images can have input
  9352. * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an
  9353. * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component.
  9354. *
  9355. * @class Image
  9356. * @extends Phaser.GameObjects.GameObject
  9357. * @memberOf Phaser.GameObjects
  9358. * @constructor
  9359. * @since 3.0.0
  9360. *
  9361. * @extends Phaser.GameObjects.Components.Alpha
  9362. * @extends Phaser.GameObjects.Components.BlendMode
  9363. * @extends Phaser.GameObjects.Components.Depth
  9364. * @extends Phaser.GameObjects.Components.Flip
  9365. * @extends Phaser.GameObjects.Components.GetBounds
  9366. * @extends Phaser.GameObjects.Components.Mask
  9367. * @extends Phaser.GameObjects.Components.Origin
  9368. * @extends Phaser.GameObjects.Components.Pipeline
  9369. * @extends Phaser.GameObjects.Components.ScaleMode
  9370. * @extends Phaser.GameObjects.Components.ScrollFactor
  9371. * @extends Phaser.GameObjects.Components.Size
  9372. * @extends Phaser.GameObjects.Components.TextureCrop
  9373. * @extends Phaser.GameObjects.Components.Tint
  9374. * @extends Phaser.GameObjects.Components.Transform
  9375. * @extends Phaser.GameObjects.Components.Visible
  9376. *
  9377. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  9378. * @param {number} x - The horizontal position of this Game Object in the world.
  9379. * @param {number} y - The vertical position of this Game Object in the world.
  9380. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  9381. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  9382. */
  9383. var Image = new Class({
  9384. Extends: GameObject,
  9385. Mixins: [
  9386. Components.Alpha,
  9387. Components.BlendMode,
  9388. Components.Depth,
  9389. Components.Flip,
  9390. Components.GetBounds,
  9391. Components.Mask,
  9392. Components.Origin,
  9393. Components.Pipeline,
  9394. Components.ScaleMode,
  9395. Components.ScrollFactor,
  9396. Components.Size,
  9397. Components.TextureCrop,
  9398. Components.Tint,
  9399. Components.Transform,
  9400. Components.Visible,
  9401. ImageRender
  9402. ],
  9403. initialize:
  9404. function Image (scene, x, y, texture, frame)
  9405. {
  9406. GameObject.call(this, scene, 'Image');
  9407. this.setTexture(texture, frame);
  9408. this.setPosition(x, y);
  9409. this.setSizeToFrame();
  9410. this.setOriginFromFrame();
  9411. this.initPipeline('TextureTintPipeline');
  9412. }
  9413. });
  9414. module.exports = Image;
  9415. /***/ }),
  9416. /* 69 */
  9417. /***/ (function(module, exports, __webpack_require__) {
  9418. /**
  9419. * @author Richard Davey <rich@photonstorm.com>
  9420. * @copyright 2018 Photon Storm Ltd.
  9421. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  9422. */
  9423. var Class = __webpack_require__(0);
  9424. /**
  9425. * @callback EachSetCallback
  9426. * @generic E - [entry]
  9427. *
  9428. * @param {*} entry - [description]
  9429. * @param {number} index - [description]
  9430. *
  9431. * @return {?boolean} [description]
  9432. */
  9433. /**
  9434. * @classdesc
  9435. * A Set is a collection of unique elements.
  9436. *
  9437. * @class Set
  9438. * @memberOf Phaser.Structs
  9439. * @constructor
  9440. * @since 3.0.0
  9441. *
  9442. * @generic T
  9443. * @genericUse {T[]} - [elements]
  9444. *
  9445. * @param {Array.<*>} [elements] - [description]
  9446. */
  9447. var Set = new Class({
  9448. initialize:
  9449. function Set (elements)
  9450. {
  9451. /**
  9452. * [description]
  9453. *
  9454. * @genericUse {T[]} - [$type]
  9455. *
  9456. * @name Phaser.Structs.Set#entries
  9457. * @type {Array.<*>}
  9458. * @default []
  9459. * @since 3.0.0
  9460. */
  9461. this.entries = [];
  9462. if (Array.isArray(elements))
  9463. {
  9464. for (var i = 0; i < elements.length; i++)
  9465. {
  9466. this.set(elements[i]);
  9467. }
  9468. }
  9469. },
  9470. /**
  9471. * [description]
  9472. *
  9473. * @method Phaser.Structs.Set#set
  9474. * @since 3.0.0
  9475. *
  9476. * @genericUse {T} - [value]
  9477. * @genericUse {Phaser.Structs.Set.<T>} - [$return]
  9478. *
  9479. * @param {*} value - [description]
  9480. *
  9481. * @return {Phaser.Structs.Set} This Set object.
  9482. */
  9483. set: function (value)
  9484. {
  9485. if (this.entries.indexOf(value) === -1)
  9486. {
  9487. this.entries.push(value);
  9488. }
  9489. return this;
  9490. },
  9491. /**
  9492. * [description]
  9493. *
  9494. * @method Phaser.Structs.Set#get
  9495. * @since 3.0.0
  9496. *
  9497. * @genericUse {T} - [value,$return]
  9498. *
  9499. * @param {string} property - [description]
  9500. * @param {*} value - [description]
  9501. *
  9502. * @return {*} [description]
  9503. */
  9504. get: function (property, value)
  9505. {
  9506. for (var i = 0; i < this.entries.length; i++)
  9507. {
  9508. var entry = this.entries[i];
  9509. if (entry[property] === value)
  9510. {
  9511. return entry;
  9512. }
  9513. }
  9514. },
  9515. /**
  9516. * [description]
  9517. *
  9518. * @method Phaser.Structs.Set#getArray
  9519. * @since 3.0.0
  9520. *
  9521. * @genericUse {T[]} - [$return]
  9522. *
  9523. * @return {Array.<*>} [description]
  9524. */
  9525. getArray: function ()
  9526. {
  9527. return this.entries.slice(0);
  9528. },
  9529. /**
  9530. * [description]
  9531. *
  9532. * @method Phaser.Structs.Set#delete
  9533. * @since 3.0.0
  9534. *
  9535. * @genericUse {T} - [value]
  9536. * @genericUse {Phaser.Structs.Set.<T>} - [$return]
  9537. *
  9538. * @param {*} value - [description]
  9539. *
  9540. * @return {Phaser.Structs.Set} This Set object.
  9541. */
  9542. delete: function (value)
  9543. {
  9544. var index = this.entries.indexOf(value);
  9545. if (index > -1)
  9546. {
  9547. this.entries.splice(index, 1);
  9548. }
  9549. return this;
  9550. },
  9551. /**
  9552. * [description]
  9553. *
  9554. * @method Phaser.Structs.Set#dump
  9555. * @since 3.0.0
  9556. */
  9557. dump: function ()
  9558. {
  9559. // eslint-disable-next-line no-console
  9560. console.group('Set');
  9561. for (var i = 0; i < this.entries.length; i++)
  9562. {
  9563. var entry = this.entries[i];
  9564. console.log(entry);
  9565. }
  9566. // eslint-disable-next-line no-console
  9567. console.groupEnd();
  9568. },
  9569. /**
  9570. * For when you know this Set will be modified during the iteration.
  9571. *
  9572. * @method Phaser.Structs.Set#each
  9573. * @since 3.0.0
  9574. *
  9575. * @genericUse {EachSetCallback.<T>} - [callback]
  9576. * @genericUse {Phaser.Structs.Set.<T>} - [$return]
  9577. *
  9578. * @param {EachSetCallback} callback - [description]
  9579. * @param {*} callbackScope - [description]
  9580. *
  9581. * @return {Phaser.Structs.Set} This Set object.
  9582. */
  9583. each: function (callback, callbackScope)
  9584. {
  9585. var i;
  9586. var temp = this.entries.slice();
  9587. var len = temp.length;
  9588. if (callbackScope)
  9589. {
  9590. for (i = 0; i < len; i++)
  9591. {
  9592. if (callback.call(callbackScope, temp[i], i) === false)
  9593. {
  9594. break;
  9595. }
  9596. }
  9597. }
  9598. else
  9599. {
  9600. for (i = 0; i < len; i++)
  9601. {
  9602. if (callback(temp[i], i) === false)
  9603. {
  9604. break;
  9605. }
  9606. }
  9607. }
  9608. return this;
  9609. },
  9610. /**
  9611. * For when you absolutely know this Set won't be modified during the iteration.
  9612. *
  9613. * @method Phaser.Structs.Set#iterate
  9614. * @since 3.0.0
  9615. *
  9616. * @genericUse {EachSetCallback.<T>} - [callback]
  9617. * @genericUse {Phaser.Structs.Set.<T>} - [$return]
  9618. *
  9619. * @param {EachSetCallback} callback - [description]
  9620. * @param {*} callbackScope - [description]
  9621. *
  9622. * @return {Phaser.Structs.Set} This Set object.
  9623. */
  9624. iterate: function (callback, callbackScope)
  9625. {
  9626. var i;
  9627. var len = this.entries.length;
  9628. if (callbackScope)
  9629. {
  9630. for (i = 0; i < len; i++)
  9631. {
  9632. if (callback.call(callbackScope, this.entries[i], i) === false)
  9633. {
  9634. break;
  9635. }
  9636. }
  9637. }
  9638. else
  9639. {
  9640. for (i = 0; i < len; i++)
  9641. {
  9642. if (callback(this.entries[i], i) === false)
  9643. {
  9644. break;
  9645. }
  9646. }
  9647. }
  9648. return this;
  9649. },
  9650. /**
  9651. * [description]
  9652. *
  9653. * @method Phaser.Structs.Set#iterateLocal
  9654. * @since 3.0.0
  9655. *
  9656. * @genericUse {Phaser.Structs.Set.<T>} - [$return]
  9657. *
  9658. * @param {string} callbackKey - [description]
  9659. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  9660. *
  9661. * @return {Phaser.Structs.Set} This Set object.
  9662. */
  9663. iterateLocal: function (callbackKey)
  9664. {
  9665. var i;
  9666. var args = [];
  9667. for (i = 1; i < arguments.length; i++)
  9668. {
  9669. args.push(arguments[i]);
  9670. }
  9671. var len = this.entries.length;
  9672. for (i = 0; i < len; i++)
  9673. {
  9674. var entry = this.entries[i];
  9675. entry[callbackKey].apply(entry, args);
  9676. }
  9677. return this;
  9678. },
  9679. /**
  9680. * [description]
  9681. *
  9682. * @method Phaser.Structs.Set#clear
  9683. * @since 3.0.0
  9684. *
  9685. * @genericUse {Phaser.Structs.Set.<T>} - [$return]
  9686. *
  9687. * @return {Phaser.Structs.Set} This Set object.
  9688. */
  9689. clear: function ()
  9690. {
  9691. this.entries.length = 0;
  9692. return this;
  9693. },
  9694. /**
  9695. * [description]
  9696. *
  9697. * @method Phaser.Structs.Set#contains
  9698. * @since 3.0.0
  9699. *
  9700. * @genericUse {T} - [value]
  9701. *
  9702. * @param {*} value - [description]
  9703. *
  9704. * @return {boolean} [description]
  9705. */
  9706. contains: function (value)
  9707. {
  9708. return (this.entries.indexOf(value) > -1);
  9709. },
  9710. /**
  9711. * [description]
  9712. *
  9713. * @method Phaser.Structs.Set#union
  9714. * @since 3.0.0
  9715. *
  9716. * @genericUse {Phaser.Structs.Set.<T>} - [set,$return]
  9717. *
  9718. * @param {Phaser.Structs.Set} set - [description]
  9719. *
  9720. * @return {Phaser.Structs.Set} [description]
  9721. */
  9722. union: function (set)
  9723. {
  9724. var newSet = new Set();
  9725. set.entries.forEach(function (value)
  9726. {
  9727. newSet.set(value);
  9728. });
  9729. this.entries.forEach(function (value)
  9730. {
  9731. newSet.set(value);
  9732. });
  9733. return newSet;
  9734. },
  9735. /**
  9736. * [description]
  9737. *
  9738. * @method Phaser.Structs.Set#intersect
  9739. * @since 3.0.0
  9740. *
  9741. * @genericUse {Phaser.Structs.Set.<T>} - [set,$return]
  9742. *
  9743. * @param {Phaser.Structs.Set} set - [description]
  9744. *
  9745. * @return {Phaser.Structs.Set} [description]
  9746. */
  9747. intersect: function (set)
  9748. {
  9749. var newSet = new Set();
  9750. this.entries.forEach(function (value)
  9751. {
  9752. if (set.contains(value))
  9753. {
  9754. newSet.set(value);
  9755. }
  9756. });
  9757. return newSet;
  9758. },
  9759. /**
  9760. * [description]
  9761. *
  9762. * @method Phaser.Structs.Set#difference
  9763. * @since 3.0.0
  9764. *
  9765. * @genericUse {Phaser.Structs.Set.<T>} - [set,$return]
  9766. *
  9767. * @param {Phaser.Structs.Set} set - [description]
  9768. *
  9769. * @return {Phaser.Structs.Set} [description]
  9770. */
  9771. difference: function (set)
  9772. {
  9773. var newSet = new Set();
  9774. this.entries.forEach(function (value)
  9775. {
  9776. if (!set.contains(value))
  9777. {
  9778. newSet.set(value);
  9779. }
  9780. });
  9781. return newSet;
  9782. },
  9783. /**
  9784. * [description]
  9785. *
  9786. * @name Phaser.Structs.Set#size
  9787. * @type {integer}
  9788. * @since 3.0.0
  9789. */
  9790. size: {
  9791. get: function ()
  9792. {
  9793. return this.entries.length;
  9794. },
  9795. set: function (value)
  9796. {
  9797. return this.entries.length = value;
  9798. }
  9799. }
  9800. });
  9801. module.exports = Set;
  9802. /***/ }),
  9803. /* 70 */
  9804. /***/ (function(module, exports) {
  9805. /**
  9806. * @author Richard Davey <rich@photonstorm.com>
  9807. * @copyright 2018 Photon Storm Ltd.
  9808. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  9809. */
  9810. /**
  9811. * Calculate the length of the given line.
  9812. *
  9813. * @function Phaser.Geom.Line.Length
  9814. * @since 3.0.0
  9815. *
  9816. * @param {Phaser.Geom.Line} line - The line to calculate the length of.
  9817. *
  9818. * @return {number} The length of the line.
  9819. */
  9820. var Length = function (line)
  9821. {
  9822. return Math.sqrt((line.x2 - line.x1) * (line.x2 - line.x1) + (line.y2 - line.y1) * (line.y2 - line.y1));
  9823. };
  9824. module.exports = Length;
  9825. /***/ }),
  9826. /* 71 */
  9827. /***/ (function(module, exports, __webpack_require__) {
  9828. /**
  9829. * @author Richard Davey <rich@photonstorm.com>
  9830. * @copyright 2018 Photon Storm Ltd.
  9831. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  9832. */
  9833. var Defaults = __webpack_require__(100);
  9834. var GetAdvancedValue = __webpack_require__(10);
  9835. var GetBoolean = __webpack_require__(62);
  9836. var GetEaseFunction = __webpack_require__(63);
  9837. var GetNewValue = __webpack_require__(72);
  9838. var GetProps = __webpack_require__(168);
  9839. var GetTargets = __webpack_require__(102);
  9840. var GetValue = __webpack_require__(4);
  9841. var GetValueOp = __webpack_require__(101);
  9842. var Tween = __webpack_require__(99);
  9843. var TweenData = __webpack_require__(98);
  9844. /**
  9845. * [description]
  9846. *
  9847. * @function Phaser.Tweens.Builders.TweenBuilder
  9848. * @since 3.0.0
  9849. *
  9850. * @param {(Phaser.Tweens.TweenManager|Phaser.Tweens.Timeline)} parent - [description]
  9851. * @param {object} config - [description]
  9852. * @param {Phaser.Tweens.TweenConfigDefaults} defaults - [description]
  9853. *
  9854. * @return {Phaser.Tweens.Tween} [description]
  9855. */
  9856. var TweenBuilder = function (parent, config, defaults)
  9857. {
  9858. if (defaults === undefined)
  9859. {
  9860. defaults = Defaults;
  9861. }
  9862. // Create arrays of the Targets and the Properties
  9863. var targets = (defaults.targets) ? defaults.targets : GetTargets(config);
  9864. // var props = (defaults.props) ? defaults.props : GetProps(config);
  9865. var props = GetProps(config);
  9866. // Default Tween values
  9867. var delay = GetNewValue(config, 'delay', defaults.delay);
  9868. var duration = GetNewValue(config, 'duration', defaults.duration);
  9869. var easeParams = GetValue(config, 'easeParams', defaults.easeParams);
  9870. var ease = GetEaseFunction(GetValue(config, 'ease', defaults.ease), easeParams);
  9871. var hold = GetNewValue(config, 'hold', defaults.hold);
  9872. var repeat = GetNewValue(config, 'repeat', defaults.repeat);
  9873. var repeatDelay = GetNewValue(config, 'repeatDelay', defaults.repeatDelay);
  9874. var yoyo = GetBoolean(config, 'yoyo', defaults.yoyo);
  9875. var flipX = GetBoolean(config, 'flipX', defaults.flipX);
  9876. var flipY = GetBoolean(config, 'flipY', defaults.flipY);
  9877. var data = [];
  9878. // Loop through every property defined in the Tween, i.e.: props { x, y, alpha }
  9879. for (var p = 0; p < props.length; p++)
  9880. {
  9881. var key = props[p].key;
  9882. var value = props[p].value;
  9883. // Create 1 TweenData per target, per property
  9884. for (var t = 0; t < targets.length; t++)
  9885. {
  9886. var ops = GetValueOp(key, value);
  9887. var tweenData = TweenData(
  9888. targets[t],
  9889. key,
  9890. ops.getEnd,
  9891. ops.getStart,
  9892. GetEaseFunction(GetValue(value, 'ease', ease), easeParams),
  9893. GetNewValue(value, 'delay', delay),
  9894. GetNewValue(value, 'duration', duration),
  9895. GetBoolean(value, 'yoyo', yoyo),
  9896. GetNewValue(value, 'hold', hold),
  9897. GetNewValue(value, 'repeat', repeat),
  9898. GetNewValue(value, 'repeatDelay', repeatDelay),
  9899. GetBoolean(value, 'flipX', flipX),
  9900. GetBoolean(value, 'flipY', flipY)
  9901. );
  9902. data.push(tweenData);
  9903. }
  9904. }
  9905. var tween = new Tween(parent, data, targets);
  9906. tween.offset = GetAdvancedValue(config, 'offset', null);
  9907. tween.completeDelay = GetAdvancedValue(config, 'completeDelay', 0);
  9908. tween.loop = Math.round(GetAdvancedValue(config, 'loop', 0));
  9909. tween.loopDelay = Math.round(GetAdvancedValue(config, 'loopDelay', 0));
  9910. tween.paused = GetBoolean(config, 'paused', false);
  9911. tween.useFrames = GetBoolean(config, 'useFrames', false);
  9912. // Set the Callbacks
  9913. var scope = GetValue(config, 'callbackScope', tween);
  9914. // Callback parameters: 0 = a reference to the Tween itself, 1 = the target/s of the Tween, ... your own params
  9915. var tweenArray = [ tween, null ];
  9916. var callbacks = Tween.TYPES;
  9917. for (var i = 0; i < callbacks.length; i++)
  9918. {
  9919. var type = callbacks[i];
  9920. var callback = GetValue(config, type, false);
  9921. if (callback)
  9922. {
  9923. var callbackScope = GetValue(config, type + 'Scope', scope);
  9924. var callbackParams = GetValue(config, type + 'Params', []);
  9925. // The null is reset to be the Tween target
  9926. tween.setCallback(type, callback, tweenArray.concat(callbackParams), callbackScope);
  9927. }
  9928. }
  9929. return tween;
  9930. };
  9931. module.exports = TweenBuilder;
  9932. /***/ }),
  9933. /* 72 */
  9934. /***/ (function(module, exports) {
  9935. /**
  9936. * @author Richard Davey <rich@photonstorm.com>
  9937. * @copyright 2018 Photon Storm Ltd.
  9938. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  9939. */
  9940. /**
  9941. * [description]
  9942. *
  9943. * @function Phaser.Tweens.Builders.GetNewValue
  9944. * @since 3.0.0
  9945. *
  9946. * @param {object} source - [description]
  9947. * @param {string} key - [description]
  9948. * @param {*} defaultValue - [description]
  9949. *
  9950. * @return {function} [description]
  9951. */
  9952. var GetNewValue = function (source, key, defaultValue)
  9953. {
  9954. var valueCallback;
  9955. if (source.hasOwnProperty(key))
  9956. {
  9957. var t = typeof(source[key]);
  9958. if (t === 'function')
  9959. {
  9960. valueCallback = function (index, totalTargets, target)
  9961. {
  9962. return source[key](index, totalTargets, target);
  9963. };
  9964. }
  9965. else
  9966. {
  9967. valueCallback = function ()
  9968. {
  9969. return source[key];
  9970. };
  9971. }
  9972. }
  9973. else if (typeof defaultValue === 'function')
  9974. {
  9975. valueCallback = defaultValue;
  9976. }
  9977. else
  9978. {
  9979. valueCallback = function ()
  9980. {
  9981. return defaultValue;
  9982. };
  9983. }
  9984. return valueCallback;
  9985. };
  9986. module.exports = GetNewValue;
  9987. /***/ }),
  9988. /* 73 */
  9989. /***/ (function(module, exports, __webpack_require__) {
  9990. /**
  9991. * The `Matter.Body` module contains methods for creating and manipulating body models.
  9992. * A `Matter.Body` is a rigid body that can be simulated by a `Matter.Engine`.
  9993. * Factories for commonly used body configurations (such as rectangles, circles and other polygons) can be found in the module `Matter.Bodies`.
  9994. *
  9995. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  9996. * @class Body
  9997. */
  9998. var Body = {};
  9999. module.exports = Body;
  10000. var Vertices = __webpack_require__(127);
  10001. var Vector = __webpack_require__(106);
  10002. var Sleeping = __webpack_require__(336);
  10003. var Common = __webpack_require__(42);
  10004. var Bounds = __webpack_require__(126);
  10005. var Axes = __webpack_require__(685);
  10006. (function() {
  10007. Body._inertiaScale = 4;
  10008. Body._nextCollidingGroupId = 1;
  10009. Body._nextNonCollidingGroupId = -1;
  10010. Body._nextCategory = 0x0001;
  10011. /**
  10012. * Creates a new rigid body model. The options parameter is an object that specifies any properties you wish to override the defaults.
  10013. * All properties have default values, and many are pre-calculated automatically based on other properties.
  10014. * Vertices must be specified in clockwise order.
  10015. * See the properties section below for detailed information on what you can pass via the `options` object.
  10016. * @method create
  10017. * @param {} options
  10018. * @return {body} body
  10019. */
  10020. Body.create = function(options) {
  10021. var defaults = {
  10022. id: Common.nextId(),
  10023. type: 'body',
  10024. label: 'Body',
  10025. gameObject: null,
  10026. parts: [],
  10027. plugin: {},
  10028. angle: 0,
  10029. vertices: Vertices.fromPath('L 0 0 L 40 0 L 40 40 L 0 40'),
  10030. position: { x: 0, y: 0 },
  10031. force: { x: 0, y: 0 },
  10032. torque: 0,
  10033. positionImpulse: { x: 0, y: 0 },
  10034. previousPositionImpulse: { x: 0, y: 0 },
  10035. constraintImpulse: { x: 0, y: 0, angle: 0 },
  10036. totalContacts: 0,
  10037. speed: 0,
  10038. angularSpeed: 0,
  10039. velocity: { x: 0, y: 0 },
  10040. angularVelocity: 0,
  10041. isSensor: false,
  10042. isStatic: false,
  10043. isSleeping: false,
  10044. ignoreGravity: false,
  10045. ignorePointer: false,
  10046. motion: 0,
  10047. sleepThreshold: 60,
  10048. density: 0.001,
  10049. restitution: 0,
  10050. friction: 0.1,
  10051. frictionStatic: 0.5,
  10052. frictionAir: 0.01,
  10053. collisionFilter: {
  10054. category: 0x0001,
  10055. mask: 0xFFFFFFFF,
  10056. group: 0
  10057. },
  10058. slop: 0.05,
  10059. timeScale: 1,
  10060. render: {
  10061. visible: true,
  10062. opacity: 1,
  10063. sprite: {
  10064. xScale: 1,
  10065. yScale: 1,
  10066. xOffset: 0,
  10067. yOffset: 0
  10068. },
  10069. lineWidth: 0
  10070. },
  10071. events: null,
  10072. bounds: null,
  10073. chamfer: null,
  10074. circleRadius: 0,
  10075. positionPrev: null,
  10076. anglePrev: 0,
  10077. parent: null,
  10078. axes: null,
  10079. area: 0,
  10080. mass: 0,
  10081. inertia: 0,
  10082. _original: null
  10083. };
  10084. var body = Common.extend(defaults, options);
  10085. _initProperties(body, options);
  10086. return body;
  10087. };
  10088. /**
  10089. * Returns the next unique group index for which bodies will collide.
  10090. * If `isNonColliding` is `true`, returns the next unique group index for which bodies will _not_ collide.
  10091. * See `body.collisionFilter` for more information.
  10092. * @method nextGroup
  10093. * @param {bool} [isNonColliding=false]
  10094. * @return {Number} Unique group index
  10095. */
  10096. Body.nextGroup = function(isNonColliding) {
  10097. if (isNonColliding)
  10098. return Body._nextNonCollidingGroupId--;
  10099. return Body._nextCollidingGroupId++;
  10100. };
  10101. /**
  10102. * Returns the next unique category bitfield (starting after the initial default category `0x0001`).
  10103. * There are 32 available. See `body.collisionFilter` for more information.
  10104. * @method nextCategory
  10105. * @return {Number} Unique category bitfield
  10106. */
  10107. Body.nextCategory = function() {
  10108. Body._nextCategory = Body._nextCategory << 1;
  10109. return Body._nextCategory;
  10110. };
  10111. /**
  10112. * Initialises body properties.
  10113. * @method _initProperties
  10114. * @private
  10115. * @param {body} body
  10116. * @param {} [options]
  10117. */
  10118. var _initProperties = function(body, options) {
  10119. options = options || {};
  10120. // init required properties (order is important)
  10121. Body.set(body, {
  10122. bounds: body.bounds || Bounds.create(body.vertices),
  10123. positionPrev: body.positionPrev || Vector.clone(body.position),
  10124. anglePrev: body.anglePrev || body.angle,
  10125. vertices: body.vertices,
  10126. parts: body.parts || [body],
  10127. isStatic: body.isStatic,
  10128. isSleeping: body.isSleeping,
  10129. parent: body.parent || body
  10130. });
  10131. Vertices.rotate(body.vertices, body.angle, body.position);
  10132. Axes.rotate(body.axes, body.angle);
  10133. Bounds.update(body.bounds, body.vertices, body.velocity);
  10134. // allow options to override the automatically calculated properties
  10135. Body.set(body, {
  10136. axes: options.axes || body.axes,
  10137. area: options.area || body.area,
  10138. mass: options.mass || body.mass,
  10139. inertia: options.inertia || body.inertia
  10140. });
  10141. // render properties
  10142. var defaultFillStyle = (body.isStatic ? '#2e2b44' : Common.choose(['#006BA6', '#0496FF', '#FFBC42', '#D81159', '#8F2D56'])),
  10143. defaultStrokeStyle = '#000';
  10144. body.render.fillStyle = body.render.fillStyle || defaultFillStyle;
  10145. body.render.strokeStyle = body.render.strokeStyle || defaultStrokeStyle;
  10146. body.render.sprite.xOffset += -(body.bounds.min.x - body.position.x) / (body.bounds.max.x - body.bounds.min.x);
  10147. body.render.sprite.yOffset += -(body.bounds.min.y - body.position.y) / (body.bounds.max.y - body.bounds.min.y);
  10148. };
  10149. /**
  10150. * Given a property and a value (or map of), sets the property(s) on the body, using the appropriate setter functions if they exist.
  10151. * Prefer to use the actual setter functions in performance critical situations.
  10152. * @method set
  10153. * @param {body} body
  10154. * @param {object} settings A map of properties and values to set on the body.
  10155. */
  10156. Body.set = function(body, settings) {
  10157. var property,
  10158. value;
  10159. if (typeof settings === 'string') {
  10160. property = settings;
  10161. settings = {};
  10162. settings[property] = value;
  10163. }
  10164. for (property in settings) {
  10165. if (!settings.hasOwnProperty(property))
  10166. continue;
  10167. value = settings[property];
  10168. switch (property) {
  10169. case 'isStatic':
  10170. Body.setStatic(body, value);
  10171. break;
  10172. case 'isSleeping':
  10173. Sleeping.set(body, value);
  10174. break;
  10175. case 'mass':
  10176. Body.setMass(body, value);
  10177. break;
  10178. case 'density':
  10179. Body.setDensity(body, value);
  10180. break;
  10181. case 'inertia':
  10182. Body.setInertia(body, value);
  10183. break;
  10184. case 'vertices':
  10185. Body.setVertices(body, value);
  10186. break;
  10187. case 'position':
  10188. Body.setPosition(body, value);
  10189. break;
  10190. case 'angle':
  10191. Body.setAngle(body, value);
  10192. break;
  10193. case 'velocity':
  10194. Body.setVelocity(body, value);
  10195. break;
  10196. case 'angularVelocity':
  10197. Body.setAngularVelocity(body, value);
  10198. break;
  10199. case 'parts':
  10200. Body.setParts(body, value);
  10201. break;
  10202. default:
  10203. body[property] = value;
  10204. }
  10205. }
  10206. };
  10207. /**
  10208. * Sets the body as static, including isStatic flag and setting mass and inertia to Infinity.
  10209. * @method setStatic
  10210. * @param {body} body
  10211. * @param {bool} isStatic
  10212. */
  10213. Body.setStatic = function(body, isStatic) {
  10214. for (var i = 0; i < body.parts.length; i++) {
  10215. var part = body.parts[i];
  10216. part.isStatic = isStatic;
  10217. if (isStatic) {
  10218. part._original = {
  10219. restitution: part.restitution,
  10220. friction: part.friction,
  10221. mass: part.mass,
  10222. inertia: part.inertia,
  10223. density: part.density,
  10224. inverseMass: part.inverseMass,
  10225. inverseInertia: part.inverseInertia
  10226. };
  10227. part.restitution = 0;
  10228. part.friction = 1;
  10229. part.mass = part.inertia = part.density = Infinity;
  10230. part.inverseMass = part.inverseInertia = 0;
  10231. part.positionPrev.x = part.position.x;
  10232. part.positionPrev.y = part.position.y;
  10233. part.anglePrev = part.angle;
  10234. part.angularVelocity = 0;
  10235. part.speed = 0;
  10236. part.angularSpeed = 0;
  10237. part.motion = 0;
  10238. } else if (part._original) {
  10239. part.restitution = part._original.restitution;
  10240. part.friction = part._original.friction;
  10241. part.mass = part._original.mass;
  10242. part.inertia = part._original.inertia;
  10243. part.density = part._original.density;
  10244. part.inverseMass = part._original.inverseMass;
  10245. part.inverseInertia = part._original.inverseInertia;
  10246. part._original = null;
  10247. }
  10248. }
  10249. };
  10250. /**
  10251. * Sets the mass of the body. Inverse mass, density and inertia are automatically updated to reflect the change.
  10252. * @method setMass
  10253. * @param {body} body
  10254. * @param {number} mass
  10255. */
  10256. Body.setMass = function(body, mass) {
  10257. var moment = body.inertia / (body.mass / 6);
  10258. body.inertia = moment * (mass / 6);
  10259. body.inverseInertia = 1 / body.inertia;
  10260. body.mass = mass;
  10261. body.inverseMass = 1 / body.mass;
  10262. body.density = body.mass / body.area;
  10263. };
  10264. /**
  10265. * Sets the density of the body. Mass and inertia are automatically updated to reflect the change.
  10266. * @method setDensity
  10267. * @param {body} body
  10268. * @param {number} density
  10269. */
  10270. Body.setDensity = function(body, density) {
  10271. Body.setMass(body, density * body.area);
  10272. body.density = density;
  10273. };
  10274. /**
  10275. * Sets the moment of inertia (i.e. second moment of area) of the body of the body.
  10276. * Inverse inertia is automatically updated to reflect the change. Mass is not changed.
  10277. * @method setInertia
  10278. * @param {body} body
  10279. * @param {number} inertia
  10280. */
  10281. Body.setInertia = function(body, inertia) {
  10282. body.inertia = inertia;
  10283. body.inverseInertia = 1 / body.inertia;
  10284. };
  10285. /**
  10286. * Sets the body's vertices and updates body properties accordingly, including inertia, area and mass (with respect to `body.density`).
  10287. * Vertices will be automatically transformed to be orientated around their centre of mass as the origin.
  10288. * They are then automatically translated to world space based on `body.position`.
  10289. *
  10290. * The `vertices` argument should be passed as an array of `Matter.Vector` points (or a `Matter.Vertices` array).
  10291. * Vertices must form a convex hull, concave hulls are not supported.
  10292. *
  10293. * @method setVertices
  10294. * @param {body} body
  10295. * @param {vector[]} vertices
  10296. */
  10297. Body.setVertices = function(body, vertices) {
  10298. // change vertices
  10299. if (vertices[0].body === body) {
  10300. body.vertices = vertices;
  10301. } else {
  10302. body.vertices = Vertices.create(vertices, body);
  10303. }
  10304. // update properties
  10305. body.axes = Axes.fromVertices(body.vertices);
  10306. body.area = Vertices.area(body.vertices);
  10307. Body.setMass(body, body.density * body.area);
  10308. // orient vertices around the centre of mass at origin (0, 0)
  10309. var centre = Vertices.centre(body.vertices);
  10310. Vertices.translate(body.vertices, centre, -1);
  10311. // update inertia while vertices are at origin (0, 0)
  10312. Body.setInertia(body, Body._inertiaScale * Vertices.inertia(body.vertices, body.mass));
  10313. // update geometry
  10314. Vertices.translate(body.vertices, body.position);
  10315. Bounds.update(body.bounds, body.vertices, body.velocity);
  10316. };
  10317. /**
  10318. * Sets the parts of the `body` and updates mass, inertia and centroid.
  10319. * Each part will have its parent set to `body`.
  10320. * By default the convex hull will be automatically computed and set on `body`, unless `autoHull` is set to `false.`
  10321. * Note that this method will ensure that the first part in `body.parts` will always be the `body`.
  10322. * @method setParts
  10323. * @param {body} body
  10324. * @param [body] parts
  10325. * @param {bool} [autoHull=true]
  10326. */
  10327. Body.setParts = function(body, parts, autoHull) {
  10328. var i;
  10329. // add all the parts, ensuring that the first part is always the parent body
  10330. parts = parts.slice(0);
  10331. body.parts.length = 0;
  10332. body.parts.push(body);
  10333. body.parent = body;
  10334. for (i = 0; i < parts.length; i++) {
  10335. var part = parts[i];
  10336. if (part !== body) {
  10337. part.parent = body;
  10338. body.parts.push(part);
  10339. }
  10340. }
  10341. if (body.parts.length === 1)
  10342. return;
  10343. autoHull = typeof autoHull !== 'undefined' ? autoHull : true;
  10344. // find the convex hull of all parts to set on the parent body
  10345. if (autoHull) {
  10346. var vertices = [];
  10347. for (i = 0; i < parts.length; i++) {
  10348. vertices = vertices.concat(parts[i].vertices);
  10349. }
  10350. Vertices.clockwiseSort(vertices);
  10351. var hull = Vertices.hull(vertices),
  10352. hullCentre = Vertices.centre(hull);
  10353. Body.setVertices(body, hull);
  10354. Vertices.translate(body.vertices, hullCentre);
  10355. }
  10356. // sum the properties of all compound parts of the parent body
  10357. var total = _totalProperties(body);
  10358. body.area = total.area;
  10359. body.parent = body;
  10360. body.position.x = total.centre.x;
  10361. body.position.y = total.centre.y;
  10362. body.positionPrev.x = total.centre.x;
  10363. body.positionPrev.y = total.centre.y;
  10364. Body.setMass(body, total.mass);
  10365. Body.setInertia(body, total.inertia);
  10366. Body.setPosition(body, total.centre);
  10367. };
  10368. /**
  10369. * Sets the position of the body instantly. Velocity, angle, force etc. are unchanged.
  10370. * @method setPosition
  10371. * @param {body} body
  10372. * @param {vector} position
  10373. */
  10374. Body.setPosition = function(body, position) {
  10375. var delta = Vector.sub(position, body.position);
  10376. body.positionPrev.x += delta.x;
  10377. body.positionPrev.y += delta.y;
  10378. for (var i = 0; i < body.parts.length; i++) {
  10379. var part = body.parts[i];
  10380. part.position.x += delta.x;
  10381. part.position.y += delta.y;
  10382. Vertices.translate(part.vertices, delta);
  10383. Bounds.update(part.bounds, part.vertices, body.velocity);
  10384. }
  10385. };
  10386. /**
  10387. * Sets the angle of the body instantly. Angular velocity, position, force etc. are unchanged.
  10388. * @method setAngle
  10389. * @param {body} body
  10390. * @param {number} angle
  10391. */
  10392. Body.setAngle = function(body, angle) {
  10393. var delta = angle - body.angle;
  10394. body.anglePrev += delta;
  10395. for (var i = 0; i < body.parts.length; i++) {
  10396. var part = body.parts[i];
  10397. part.angle += delta;
  10398. Vertices.rotate(part.vertices, delta, body.position);
  10399. Axes.rotate(part.axes, delta);
  10400. Bounds.update(part.bounds, part.vertices, body.velocity);
  10401. if (i > 0) {
  10402. Vector.rotateAbout(part.position, delta, body.position, part.position);
  10403. }
  10404. }
  10405. };
  10406. /**
  10407. * Sets the linear velocity of the body instantly. Position, angle, force etc. are unchanged. See also `Body.applyForce`.
  10408. * @method setVelocity
  10409. * @param {body} body
  10410. * @param {vector} velocity
  10411. */
  10412. Body.setVelocity = function(body, velocity) {
  10413. body.positionPrev.x = body.position.x - velocity.x;
  10414. body.positionPrev.y = body.position.y - velocity.y;
  10415. body.velocity.x = velocity.x;
  10416. body.velocity.y = velocity.y;
  10417. body.speed = Vector.magnitude(body.velocity);
  10418. };
  10419. /**
  10420. * Sets the angular velocity of the body instantly. Position, angle, force etc. are unchanged. See also `Body.applyForce`.
  10421. * @method setAngularVelocity
  10422. * @param {body} body
  10423. * @param {number} velocity
  10424. */
  10425. Body.setAngularVelocity = function(body, velocity) {
  10426. body.anglePrev = body.angle - velocity;
  10427. body.angularVelocity = velocity;
  10428. body.angularSpeed = Math.abs(body.angularVelocity);
  10429. };
  10430. /**
  10431. * Moves a body by a given vector relative to its current position, without imparting any velocity.
  10432. * @method translate
  10433. * @param {body} body
  10434. * @param {vector} translation
  10435. */
  10436. Body.translate = function(body, translation) {
  10437. Body.setPosition(body, Vector.add(body.position, translation));
  10438. };
  10439. /**
  10440. * Rotates a body by a given angle relative to its current angle, without imparting any angular velocity.
  10441. * @method rotate
  10442. * @param {body} body
  10443. * @param {number} rotation
  10444. * @param {vector} [point]
  10445. */
  10446. Body.rotate = function(body, rotation, point) {
  10447. if (!point) {
  10448. Body.setAngle(body, body.angle + rotation);
  10449. } else {
  10450. var cos = Math.cos(rotation),
  10451. sin = Math.sin(rotation),
  10452. dx = body.position.x - point.x,
  10453. dy = body.position.y - point.y;
  10454. Body.setPosition(body, {
  10455. x: point.x + (dx * cos - dy * sin),
  10456. y: point.y + (dx * sin + dy * cos)
  10457. });
  10458. Body.setAngle(body, body.angle + rotation);
  10459. }
  10460. };
  10461. /**
  10462. * Scales the body, including updating physical properties (mass, area, axes, inertia), from a world-space point (default is body centre).
  10463. * @method scale
  10464. * @param {body} body
  10465. * @param {number} scaleX
  10466. * @param {number} scaleY
  10467. * @param {vector} [point]
  10468. */
  10469. Body.scale = function(body, scaleX, scaleY, point) {
  10470. point = point || body.position;
  10471. for (var i = 0; i < body.parts.length; i++) {
  10472. var part = body.parts[i];
  10473. // scale position
  10474. part.position.x = point.x + (part.position.x - point.x) * scaleX;
  10475. part.position.y = point.y + (part.position.y - point.y) * scaleY;
  10476. // scale vertices
  10477. Vertices.scale(part.vertices, scaleX, scaleY, point);
  10478. // update properties
  10479. part.axes = Axes.fromVertices(part.vertices);
  10480. if (!body.isStatic) {
  10481. part.area = Vertices.area(part.vertices);
  10482. Body.setMass(part, body.density * part.area);
  10483. // update inertia (requires vertices to be at origin)
  10484. Vertices.translate(part.vertices, { x: -part.position.x, y: -part.position.y });
  10485. Body.setInertia(part, Vertices.inertia(part.vertices, part.mass));
  10486. Vertices.translate(part.vertices, { x: part.position.x, y: part.position.y });
  10487. }
  10488. // update bounds
  10489. Bounds.update(part.bounds, part.vertices, body.velocity);
  10490. }
  10491. // handle circles
  10492. if (body.circleRadius) {
  10493. if (scaleX === scaleY) {
  10494. body.circleRadius *= scaleX;
  10495. } else {
  10496. // body is no longer a circle
  10497. body.circleRadius = null;
  10498. }
  10499. }
  10500. if (!body.isStatic) {
  10501. var total = _totalProperties(body);
  10502. body.area = total.area;
  10503. Body.setMass(body, total.mass);
  10504. Body.setInertia(body, total.inertia);
  10505. }
  10506. };
  10507. /**
  10508. * Performs a simulation step for the given `body`, including updating position and angle using Verlet integration.
  10509. * @method update
  10510. * @param {body} body
  10511. * @param {number} deltaTime
  10512. * @param {number} timeScale
  10513. * @param {number} correction
  10514. */
  10515. Body.update = function(body, deltaTime, timeScale, correction) {
  10516. var deltaTimeSquared = Math.pow(deltaTime * timeScale * body.timeScale, 2);
  10517. // from the previous step
  10518. var frictionAir = 1 - body.frictionAir * timeScale * body.timeScale,
  10519. velocityPrevX = body.position.x - body.positionPrev.x,
  10520. velocityPrevY = body.position.y - body.positionPrev.y;
  10521. // update velocity with Verlet integration
  10522. body.velocity.x = (velocityPrevX * frictionAir * correction) + (body.force.x / body.mass) * deltaTimeSquared;
  10523. body.velocity.y = (velocityPrevY * frictionAir * correction) + (body.force.y / body.mass) * deltaTimeSquared;
  10524. body.positionPrev.x = body.position.x;
  10525. body.positionPrev.y = body.position.y;
  10526. body.position.x += body.velocity.x;
  10527. body.position.y += body.velocity.y;
  10528. // update angular velocity with Verlet integration
  10529. body.angularVelocity = ((body.angle - body.anglePrev) * frictionAir * correction) + (body.torque / body.inertia) * deltaTimeSquared;
  10530. body.anglePrev = body.angle;
  10531. body.angle += body.angularVelocity;
  10532. // track speed and acceleration
  10533. body.speed = Vector.magnitude(body.velocity);
  10534. body.angularSpeed = Math.abs(body.angularVelocity);
  10535. // transform the body geometry
  10536. for (var i = 0; i < body.parts.length; i++) {
  10537. var part = body.parts[i];
  10538. Vertices.translate(part.vertices, body.velocity);
  10539. if (i > 0) {
  10540. part.position.x += body.velocity.x;
  10541. part.position.y += body.velocity.y;
  10542. }
  10543. if (body.angularVelocity !== 0) {
  10544. Vertices.rotate(part.vertices, body.angularVelocity, body.position);
  10545. Axes.rotate(part.axes, body.angularVelocity);
  10546. if (i > 0) {
  10547. Vector.rotateAbout(part.position, body.angularVelocity, body.position, part.position);
  10548. }
  10549. }
  10550. Bounds.update(part.bounds, part.vertices, body.velocity);
  10551. }
  10552. };
  10553. /**
  10554. * Applies a force to a body from a given world-space position, including resulting torque.
  10555. * @method applyForce
  10556. * @param {body} body
  10557. * @param {vector} position
  10558. * @param {vector} force
  10559. */
  10560. Body.applyForce = function(body, position, force) {
  10561. body.force.x += force.x;
  10562. body.force.y += force.y;
  10563. var offset = { x: position.x - body.position.x, y: position.y - body.position.y };
  10564. body.torque += offset.x * force.y - offset.y * force.x;
  10565. };
  10566. /**
  10567. * Returns the sums of the properties of all compound parts of the parent body.
  10568. * @method _totalProperties
  10569. * @private
  10570. * @param {body} body
  10571. * @return {}
  10572. */
  10573. var _totalProperties = function(body) {
  10574. // from equations at:
  10575. // https://ecourses.ou.edu/cgi-bin/ebook.cgi?doc=&topic=st&chap_sec=07.2&page=theory
  10576. // http://output.to/sideway/default.asp?qno=121100087
  10577. var properties = {
  10578. mass: 0,
  10579. area: 0,
  10580. inertia: 0,
  10581. centre: { x: 0, y: 0 }
  10582. };
  10583. // sum the properties of all compound parts of the parent body
  10584. for (var i = body.parts.length === 1 ? 0 : 1; i < body.parts.length; i++) {
  10585. var part = body.parts[i],
  10586. mass = part.mass !== Infinity ? part.mass : 1;
  10587. properties.mass += part.mass;
  10588. properties.area += part.area;
  10589. properties.inertia += part.inertia;
  10590. properties.centre = Vector.add(properties.centre, Vector.mult(part.position, mass));
  10591. }
  10592. properties.centre = Vector.div(properties.centre, properties.mass);
  10593. return properties;
  10594. };
  10595. /*
  10596. *
  10597. * Events Documentation
  10598. *
  10599. */
  10600. /**
  10601. * Fired when a body starts sleeping (where `this` is the body).
  10602. *
  10603. * @event sleepStart
  10604. * @this {body} The body that has started sleeping
  10605. * @param {} event An event object
  10606. * @param {} event.source The source object of the event
  10607. * @param {} event.name The name of the event
  10608. */
  10609. /**
  10610. * Fired when a body ends sleeping (where `this` is the body).
  10611. *
  10612. * @event sleepEnd
  10613. * @this {body} The body that has ended sleeping
  10614. * @param {} event An event object
  10615. * @param {} event.source The source object of the event
  10616. * @param {} event.name The name of the event
  10617. */
  10618. /*
  10619. *
  10620. * Properties Documentation
  10621. *
  10622. */
  10623. /**
  10624. * An integer `Number` uniquely identifying number generated in `Body.create` by `Common.nextId`.
  10625. *
  10626. * @property id
  10627. * @type number
  10628. */
  10629. /**
  10630. * A `String` denoting the type of object.
  10631. *
  10632. * @property type
  10633. * @type string
  10634. * @default "body"
  10635. * @readOnly
  10636. */
  10637. /**
  10638. * An arbitrary `String` name to help the user identify and manage bodies.
  10639. *
  10640. * @property label
  10641. * @type string
  10642. * @default "Body"
  10643. */
  10644. /**
  10645. * An array of bodies that make up this body.
  10646. * The first body in the array must always be a self reference to the current body instance.
  10647. * All bodies in the `parts` array together form a single rigid compound body.
  10648. * Parts are allowed to overlap, have gaps or holes or even form concave bodies.
  10649. * Parts themselves should never be added to a `World`, only the parent body should be.
  10650. * Use `Body.setParts` when setting parts to ensure correct updates of all properties.
  10651. *
  10652. * @property parts
  10653. * @type body[]
  10654. */
  10655. /**
  10656. * An object reserved for storing plugin-specific properties.
  10657. *
  10658. * @property plugin
  10659. * @type {}
  10660. */
  10661. /**
  10662. * A self reference if the body is _not_ a part of another body.
  10663. * Otherwise this is a reference to the body that this is a part of.
  10664. * See `body.parts`.
  10665. *
  10666. * @property parent
  10667. * @type body
  10668. */
  10669. /**
  10670. * A `Number` specifying the angle of the body, in radians.
  10671. *
  10672. * @property angle
  10673. * @type number
  10674. * @default 0
  10675. */
  10676. /**
  10677. * An array of `Vector` objects that specify the convex hull of the rigid body.
  10678. * These should be provided about the origin `(0, 0)`. E.g.
  10679. *
  10680. * [{ x: 0, y: 0 }, { x: 25, y: 50 }, { x: 50, y: 0 }]
  10681. *
  10682. * 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).
  10683. * The `Vector` objects are also augmented with additional properties required for efficient collision detection.
  10684. *
  10685. * Other properties such as `inertia` and `bounds` are automatically calculated from the passed vertices (unless provided via `options`).
  10686. * Concave hulls are not currently supported. The module `Matter.Vertices` contains useful methods for working with vertices.
  10687. *
  10688. * @property vertices
  10689. * @type vector[]
  10690. */
  10691. /**
  10692. * A `Vector` that specifies the current world-space position of the body.
  10693. *
  10694. * @property position
  10695. * @type vector
  10696. * @default { x: 0, y: 0 }
  10697. */
  10698. /**
  10699. * A `Vector` that specifies the force to apply in the current step. It is zeroed after every `Body.update`. See also `Body.applyForce`.
  10700. *
  10701. * @property force
  10702. * @type vector
  10703. * @default { x: 0, y: 0 }
  10704. */
  10705. /**
  10706. * A `Number` that specifies the torque (turning force) to apply in the current step. It is zeroed after every `Body.update`.
  10707. *
  10708. * @property torque
  10709. * @type number
  10710. * @default 0
  10711. */
  10712. /**
  10713. * 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`).
  10714. *
  10715. * @readOnly
  10716. * @property speed
  10717. * @type number
  10718. * @default 0
  10719. */
  10720. /**
  10721. * 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`).
  10722. *
  10723. * @readOnly
  10724. * @property angularSpeed
  10725. * @type number
  10726. * @default 0
  10727. */
  10728. /**
  10729. * A `Vector` that _measures_ the current velocity of the body after the last `Body.update`. It is read-only.
  10730. * 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).
  10731. *
  10732. * @readOnly
  10733. * @property velocity
  10734. * @type vector
  10735. * @default { x: 0, y: 0 }
  10736. */
  10737. /**
  10738. * A `Number` that _measures_ the current angular velocity of the body after the last `Body.update`. It is read-only.
  10739. * 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).
  10740. *
  10741. * @readOnly
  10742. * @property angularVelocity
  10743. * @type number
  10744. * @default 0
  10745. */
  10746. /**
  10747. * A flag that indicates whether a body is considered static. A static body can never change position or angle and is completely fixed.
  10748. * 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.
  10749. *
  10750. * @property isStatic
  10751. * @type boolean
  10752. * @default false
  10753. */
  10754. /**
  10755. * A flag that indicates whether a body is a sensor. Sensor triggers collision events, but doesn't react with colliding body physically.
  10756. *
  10757. * @property isSensor
  10758. * @type boolean
  10759. * @default false
  10760. */
  10761. /**
  10762. * 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.
  10763. * If you need to set a body as sleeping, you should use `Sleeping.set` as this requires more than just setting this flag.
  10764. *
  10765. * @property isSleeping
  10766. * @type boolean
  10767. * @default false
  10768. */
  10769. /**
  10770. * 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.
  10771. * It is used and updated by the `Matter.Sleeping` module during simulation to decide if a body has come to rest.
  10772. *
  10773. * @readOnly
  10774. * @property motion
  10775. * @type number
  10776. * @default 0
  10777. */
  10778. /**
  10779. * 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).
  10780. *
  10781. * @property sleepThreshold
  10782. * @type number
  10783. * @default 60
  10784. */
  10785. /**
  10786. * A `Number` that defines the density of the body, that is its mass per unit area.
  10787. * If you pass the density via `Body.create` the `mass` property is automatically calculated for you based on the size (area) of the object.
  10788. * 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).
  10789. *
  10790. * @property density
  10791. * @type number
  10792. * @default 0.001
  10793. */
  10794. /**
  10795. * A `Number` that defines the mass of the body, although it may be more appropriate to specify the `density` property instead.
  10796. * If you modify this value, you must also modify the `body.inverseMass` property (`1 / mass`).
  10797. *
  10798. * @property mass
  10799. * @type number
  10800. */
  10801. /**
  10802. * A `Number` that defines the inverse mass of the body (`1 / mass`).
  10803. * If you modify this value, you must also modify the `body.mass` property.
  10804. *
  10805. * @property inverseMass
  10806. * @type number
  10807. */
  10808. /**
  10809. * A `Number` that defines the moment of inertia (i.e. second moment of area) of the body.
  10810. * It is automatically calculated from the given convex hull (`vertices` array) and density in `Body.create`.
  10811. * If you modify this value, you must also modify the `body.inverseInertia` property (`1 / inertia`).
  10812. *
  10813. * @property inertia
  10814. * @type number
  10815. */
  10816. /**
  10817. * A `Number` that defines the inverse moment of inertia of the body (`1 / inertia`).
  10818. * If you modify this value, you must also modify the `body.inertia` property.
  10819. *
  10820. * @property inverseInertia
  10821. * @type number
  10822. */
  10823. /**
  10824. * A `Number` that defines the restitution (elasticity) of the body. The value is always positive and is in the range `(0, 1)`.
  10825. * A value of `0` means collisions may be perfectly inelastic and no bouncing may occur.
  10826. * A value of `0.8` means the body may bounce back with approximately 80% of its kinetic energy.
  10827. * Note that collision response is based on _pairs_ of bodies, and that `restitution` values are _combined_ with the following formula:
  10828. *
  10829. * Math.max(bodyA.restitution, bodyB.restitution)
  10830. *
  10831. * @property restitution
  10832. * @type number
  10833. * @default 0
  10834. */
  10835. /**
  10836. * A `Number` that defines the friction of the body. The value is always positive and is in the range `(0, 1)`.
  10837. * A value of `0` means that the body may slide indefinitely.
  10838. * A value of `1` means the body may come to a stop almost instantly after a force is applied.
  10839. *
  10840. * The effects of the value may be non-linear.
  10841. * High values may be unstable depending on the body.
  10842. * The engine uses a Coulomb friction model including static and kinetic friction.
  10843. * Note that collision response is based on _pairs_ of bodies, and that `friction` values are _combined_ with the following formula:
  10844. *
  10845. * Math.min(bodyA.friction, bodyB.friction)
  10846. *
  10847. * @property friction
  10848. * @type number
  10849. * @default 0.1
  10850. */
  10851. /**
  10852. * A `Number` that defines the static friction of the body (in the Coulomb friction model).
  10853. * A value of `0` means the body will never 'stick' when it is nearly stationary and only dynamic `friction` is used.
  10854. * The higher the value (e.g. `10`), the more force it will take to initially get the body moving when nearly stationary.
  10855. * This value is multiplied with the `friction` property to make it easier to change `friction` and maintain an appropriate amount of static friction.
  10856. *
  10857. * @property frictionStatic
  10858. * @type number
  10859. * @default 0.5
  10860. */
  10861. /**
  10862. * A `Number` that defines the air friction of the body (air resistance).
  10863. * A value of `0` means the body will never slow as it moves through space.
  10864. * The higher the value, the faster a body slows when moving through space.
  10865. * The effects of the value are non-linear.
  10866. *
  10867. * @property frictionAir
  10868. * @type number
  10869. * @default 0.01
  10870. */
  10871. /**
  10872. * An `Object` that specifies the collision filtering properties of this body.
  10873. *
  10874. * Collisions between two bodies will obey the following rules:
  10875. * - If the two bodies have the same non-zero value of `collisionFilter.group`,
  10876. * they will always collide if the value is positive, and they will never collide
  10877. * if the value is negative.
  10878. * - If the two bodies have different values of `collisionFilter.group` or if one
  10879. * (or both) of the bodies has a value of 0, then the category/mask rules apply as follows:
  10880. *
  10881. * Each body belongs to a collision category, given by `collisionFilter.category`. This
  10882. * value is used as a bit field and the category should have only one bit set, meaning that
  10883. * the value of this property is a power of two in the range [1, 2^31]. Thus, there are 32
  10884. * different collision categories available.
  10885. *
  10886. * Each body also defines a collision bitmask, given by `collisionFilter.mask` which specifies
  10887. * the categories it collides with (the value is the bitwise AND value of all these categories).
  10888. *
  10889. * Using the category/mask rules, two bodies `A` and `B` collide if each includes the other's
  10890. * category in its mask, i.e. `(categoryA & maskB) !== 0` and `(categoryB & maskA) !== 0`
  10891. * are both true.
  10892. *
  10893. * @property collisionFilter
  10894. * @type object
  10895. */
  10896. /**
  10897. * An Integer `Number`, that specifies the collision group this body belongs to.
  10898. * See `body.collisionFilter` for more information.
  10899. *
  10900. * @property collisionFilter.group
  10901. * @type object
  10902. * @default 0
  10903. */
  10904. /**
  10905. * A bit field that specifies the collision category this body belongs to.
  10906. * The category value should have only one bit set, for example `0x0001`.
  10907. * This means there are up to 32 unique collision categories available.
  10908. * See `body.collisionFilter` for more information.
  10909. *
  10910. * @property collisionFilter.category
  10911. * @type object
  10912. * @default 1
  10913. */
  10914. /**
  10915. * A bit mask that specifies the collision categories this body may collide with.
  10916. * See `body.collisionFilter` for more information.
  10917. *
  10918. * @property collisionFilter.mask
  10919. * @type object
  10920. * @default -1
  10921. */
  10922. /**
  10923. * A `Number` that specifies a tolerance on how far a body is allowed to 'sink' or rotate into other bodies.
  10924. * Avoid changing this value unless you understand the purpose of `slop` in physics engines.
  10925. * The default should generally suffice, although very large bodies may require larger values for stable stacking.
  10926. *
  10927. * @property slop
  10928. * @type number
  10929. * @default 0.05
  10930. */
  10931. /**
  10932. * 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.
  10933. *
  10934. * @property timeScale
  10935. * @type number
  10936. * @default 1
  10937. */
  10938. /**
  10939. * An `Object` that defines the rendering properties to be consumed by the module `Matter.Render`.
  10940. *
  10941. * @property render
  10942. * @type object
  10943. */
  10944. /**
  10945. * A flag that indicates if the body should be rendered.
  10946. *
  10947. * @property render.visible
  10948. * @type boolean
  10949. * @default true
  10950. */
  10951. /**
  10952. * Sets the opacity to use when rendering.
  10953. *
  10954. * @property render.opacity
  10955. * @type number
  10956. * @default 1
  10957. */
  10958. /**
  10959. * An `Object` that defines the sprite properties to use when rendering, if any.
  10960. *
  10961. * @property render.sprite
  10962. * @type object
  10963. */
  10964. /**
  10965. * An `String` that defines the path to the image to use as the sprite texture, if any.
  10966. *
  10967. * @property render.sprite.texture
  10968. * @type string
  10969. */
  10970. /**
  10971. * A `Number` that defines the scaling in the x-axis for the sprite, if any.
  10972. *
  10973. * @property render.sprite.xScale
  10974. * @type number
  10975. * @default 1
  10976. */
  10977. /**
  10978. * A `Number` that defines the scaling in the y-axis for the sprite, if any.
  10979. *
  10980. * @property render.sprite.yScale
  10981. * @type number
  10982. * @default 1
  10983. */
  10984. /**
  10985. * A `Number` that defines the offset in the x-axis for the sprite (normalised by texture width).
  10986. *
  10987. * @property render.sprite.xOffset
  10988. * @type number
  10989. * @default 0
  10990. */
  10991. /**
  10992. * A `Number` that defines the offset in the y-axis for the sprite (normalised by texture height).
  10993. *
  10994. * @property render.sprite.yOffset
  10995. * @type number
  10996. * @default 0
  10997. */
  10998. /**
  10999. * A `Number` that defines the line width to use when rendering the body outline (if a sprite is not defined).
  11000. * A value of `0` means no outline will be rendered.
  11001. *
  11002. * @property render.lineWidth
  11003. * @type number
  11004. * @default 0
  11005. */
  11006. /**
  11007. * A `String` that defines the fill style to use when rendering the body (if a sprite is not defined).
  11008. * It is the same as when using a canvas, so it accepts CSS style property values.
  11009. *
  11010. * @property render.fillStyle
  11011. * @type string
  11012. * @default a random colour
  11013. */
  11014. /**
  11015. * A `String` that defines the stroke style to use when rendering the body outline (if a sprite is not defined).
  11016. * It is the same as when using a canvas, so it accepts CSS style property values.
  11017. *
  11018. * @property render.strokeStyle
  11019. * @type string
  11020. * @default a random colour
  11021. */
  11022. /**
  11023. * An array of unique axis vectors (edge normals) used for collision detection.
  11024. * These are automatically calculated from the given convex hull (`vertices` array) in `Body.create`.
  11025. * They are constantly updated by `Body.update` during the simulation.
  11026. *
  11027. * @property axes
  11028. * @type vector[]
  11029. */
  11030. /**
  11031. * A `Number` that _measures_ the area of the body's convex hull, calculated at creation by `Body.create`.
  11032. *
  11033. * @property area
  11034. * @type string
  11035. * @default
  11036. */
  11037. /**
  11038. * A `Bounds` object that defines the AABB region for the body.
  11039. * It is automatically calculated from the given convex hull (`vertices` array) in `Body.create` and constantly updated by `Body.update` during simulation.
  11040. *
  11041. * @property bounds
  11042. * @type bounds
  11043. */
  11044. })();
  11045. /***/ }),
  11046. /* 74 */
  11047. /***/ (function(module, exports) {
  11048. /**
  11049. * @author Richard Davey <rich@photonstorm.com>
  11050. * @copyright 2018 Photon Storm Ltd.
  11051. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  11052. */
  11053. /**
  11054. * @typedef {object} XHRSettingsObject
  11055. *
  11056. * @property {XMLHttpRequestResponseType} responseType - The response type of the XHR request, i.e. `blob`, `text`, etc.
  11057. * @property {boolean} [async=true] - Should the XHR request use async or not?
  11058. * @property {string} [user=''] - Optional username for the XHR request.
  11059. * @property {string} [password=''] - Optional password for the XHR request.
  11060. * @property {integer} [timeout=0] - Optional XHR timeout value.
  11061. * @property {(string|undefined)} [header] - This value is used to populate the XHR `setRequestHeader` and is undefined by default.
  11062. * @property {(string|undefined)} [headerValue] - This value is used to populate the XHR `setRequestHeader` and is undefined by default.
  11063. * @property {(string|undefined)} [requestedWith] - This value is used to populate the XHR `setRequestHeader` and is undefined by default.
  11064. * @property {(string|undefined)} [overrideMimeType] - Provide a custom mime-type to use instead of the default.
  11065. */
  11066. /**
  11067. * Creates an XHRSettings Object with default values.
  11068. *
  11069. * @function Phaser.Loader.XHRSettings
  11070. * @since 3.0.0
  11071. *
  11072. * @param {XMLHttpRequestResponseType} [responseType=''] - The responseType, such as 'text'.
  11073. * @param {boolean} [async=true] - Should the XHR request use async or not?
  11074. * @param {string} [user=''] - Optional username for the XHR request.
  11075. * @param {string} [password=''] - Optional password for the XHR request.
  11076. * @param {integer} [timeout=0] - Optional XHR timeout value.
  11077. *
  11078. * @return {XHRSettingsObject} The XHRSettings object as used by the Loader.
  11079. */
  11080. var XHRSettings = function (responseType, async, user, password, timeout)
  11081. {
  11082. if (responseType === undefined) { responseType = ''; }
  11083. if (async === undefined) { async = true; }
  11084. if (user === undefined) { user = ''; }
  11085. if (password === undefined) { password = ''; }
  11086. if (timeout === undefined) { timeout = 0; }
  11087. // Before sending a request, set the xhr.responseType to "text",
  11088. // "arraybuffer", "blob", or "document", depending on your data needs.
  11089. // Note, setting xhr.responseType = '' (or omitting) will default the response to "text".
  11090. return {
  11091. // Ignored by the Loader, only used by File.
  11092. responseType: responseType,
  11093. async: async,
  11094. // credentials
  11095. user: user,
  11096. password: password,
  11097. // timeout in ms (0 = no timeout)
  11098. timeout: timeout,
  11099. // setRequestHeader
  11100. header: undefined,
  11101. headerValue: undefined,
  11102. requestedWith: false,
  11103. // overrideMimeType
  11104. overrideMimeType: undefined
  11105. };
  11106. };
  11107. module.exports = XHRSettings;
  11108. /***/ }),
  11109. /* 75 */
  11110. /***/ (function(module, exports, __webpack_require__) {
  11111. /**
  11112. * @author Richard Davey <rich@photonstorm.com>
  11113. * @copyright 2018 Photon Storm Ltd.
  11114. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  11115. */
  11116. var GetValue = __webpack_require__(4);
  11117. // Contains the plugins that Phaser uses globally and locally.
  11118. // These are the source objects, not instantiated.
  11119. var inputPlugins = {};
  11120. /**
  11121. * @typedef {object} InputPluginContainer
  11122. *
  11123. * @property {string} key - The unique name of this plugin in the input plugin cache.
  11124. * @property {function} plugin - The plugin to be stored. Should be the source object, not instantiated.
  11125. * @property {string} [mapping] - If this plugin is to be injected into the Input Plugin, this is the property key map used.
  11126. */
  11127. var InputPluginCache = {};
  11128. /**
  11129. * Static method called directly by the Core internal Plugins.
  11130. * Key is a reference used to get the plugin from the plugins object (i.e. InputPlugin)
  11131. * Plugin is the object to instantiate to create the plugin
  11132. * Mapping is what the plugin is injected into the Scene.Systems as (i.e. input)
  11133. *
  11134. * @method Phaser.Input.InputPluginCache.register
  11135. * @since 3.10.0
  11136. *
  11137. * @param {string} key - A reference used to get this plugin from the plugin cache.
  11138. * @param {function} plugin - The plugin to be stored. Should be the core object, not instantiated.
  11139. * @param {string} mapping - If this plugin is to be injected into the Input Plugin, this is the property key used.
  11140. * @param {string} settingsKey - The key in the Scene Settings to check to see if this plugin should install or not.
  11141. * @param {string} configKey - The key in the Game Config to check to see if this plugin should install or not.
  11142. */
  11143. InputPluginCache.register = function (key, plugin, mapping, settingsKey, configKey)
  11144. {
  11145. inputPlugins[key] = { plugin: plugin, mapping: mapping, settingsKey: settingsKey, configKey: configKey };
  11146. };
  11147. /**
  11148. * Returns the input plugin object from the cache based on the given key.
  11149. *
  11150. * @method Phaser.Input.InputPluginCache.getCore
  11151. * @since 3.10.0
  11152. *
  11153. * @param {string} key - The key of the input plugin to get.
  11154. *
  11155. * @return {InputPluginContainer} The input plugin object.
  11156. */
  11157. InputPluginCache.getPlugin = function (key)
  11158. {
  11159. return inputPlugins[key];
  11160. };
  11161. /**
  11162. * Installs all of the registered Input Plugins into the given target.
  11163. *
  11164. * @method Phaser.Input.InputPluginCache.install
  11165. * @since 3.10.0
  11166. *
  11167. * @param {Phaser.Input.InputPlugin} target - The target InputPlugin to install the plugins into.
  11168. */
  11169. InputPluginCache.install = function (target)
  11170. {
  11171. var sys = target.scene.sys;
  11172. var settings = sys.settings.input;
  11173. var config = sys.game.config;
  11174. for (var key in inputPlugins)
  11175. {
  11176. var source = inputPlugins[key].plugin;
  11177. var mapping = inputPlugins[key].mapping;
  11178. var settingsKey = inputPlugins[key].settingsKey;
  11179. var configKey = inputPlugins[key].configKey;
  11180. if (GetValue(settings, settingsKey, config[configKey]))
  11181. {
  11182. target[mapping] = new source(target);
  11183. }
  11184. }
  11185. };
  11186. /**
  11187. * Removes an input plugin based on the given key.
  11188. *
  11189. * @method Phaser.Input.InputPluginCache.remove
  11190. * @since 3.10.0
  11191. *
  11192. * @param {string} key - The key of the input plugin to remove.
  11193. */
  11194. InputPluginCache.remove = function (key)
  11195. {
  11196. if (inputPlugins.hasOwnProperty(key))
  11197. {
  11198. delete inputPlugins[key];
  11199. }
  11200. };
  11201. module.exports = InputPluginCache;
  11202. /***/ }),
  11203. /* 76 */
  11204. /***/ (function(module, exports, __webpack_require__) {
  11205. /**
  11206. * @author Richard Davey <rich@photonstorm.com>
  11207. * @copyright 2018 Photon Storm Ltd.
  11208. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  11209. */
  11210. // Based on the routine from {@link http://jsfiddle.net/MrPolywhirl/NH42z/}.
  11211. var CheckMatrix = __webpack_require__(116);
  11212. var TransposeMatrix = __webpack_require__(186);
  11213. /**
  11214. * [description]
  11215. *
  11216. * @function Phaser.Utils.Array.Matrix.RotateMatrix
  11217. * @since 3.0.0
  11218. *
  11219. * @param {array} matrix - The array to rotate.
  11220. * @param {(number|string)} [direction=90] - The amount to rotate the matrix by. The value can be given in degrees: 90, -90, 270, -270 or 180, or a string command: `rotateLeft`, `rotateRight` or `rotate180`.
  11221. *
  11222. * @return {array} The rotated matrix array. The source matrix should be discard for the returned matrix.
  11223. */
  11224. var RotateMatrix = function (matrix, direction)
  11225. {
  11226. if (direction === undefined) { direction = 90; }
  11227. if (!CheckMatrix(matrix))
  11228. {
  11229. return null;
  11230. }
  11231. if (typeof direction !== 'string')
  11232. {
  11233. direction = ((direction % 360) + 360) % 360;
  11234. }
  11235. if (direction === 90 || direction === -270 || direction === 'rotateLeft')
  11236. {
  11237. matrix = TransposeMatrix(matrix);
  11238. matrix.reverse();
  11239. }
  11240. else if (direction === -90 || direction === 270 || direction === 'rotateRight')
  11241. {
  11242. matrix.reverse();
  11243. matrix = TransposeMatrix(matrix);
  11244. }
  11245. else if (Math.abs(direction) === 180 || direction === 'rotate180')
  11246. {
  11247. for (var i = 0; i < matrix.length; i++)
  11248. {
  11249. matrix[i].reverse();
  11250. }
  11251. matrix.reverse();
  11252. }
  11253. return matrix;
  11254. };
  11255. module.exports = RotateMatrix;
  11256. /***/ }),
  11257. /* 77 */
  11258. /***/ (function(module, exports, __webpack_require__) {
  11259. /**
  11260. * @author Richard Davey <rich@photonstorm.com>
  11261. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  11262. * @copyright 2018 Photon Storm Ltd.
  11263. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  11264. */
  11265. var Class = __webpack_require__(0);
  11266. var EventEmitter = __webpack_require__(9);
  11267. var Extend = __webpack_require__(16);
  11268. var NOOP = __webpack_require__(3);
  11269. /**
  11270. * @classdesc
  11271. * Class containing all the shared state and behavior of a sound object, independent of the implementation.
  11272. *
  11273. * @class BaseSound
  11274. * @extends Phaser.Events.EventEmitter
  11275. * @memberOf Phaser.Sound
  11276. * @constructor
  11277. * @since 3.0.0
  11278. *
  11279. * @param {Phaser.Sound.BaseSoundManager} manager - Reference to the current sound manager instance.
  11280. * @param {string} key - Asset key for the sound.
  11281. * @param {SoundConfig} [config] - An optional config object containing default sound settings.
  11282. */
  11283. var BaseSound = new Class({
  11284. Extends: EventEmitter,
  11285. initialize:
  11286. function BaseSound (manager, key, config)
  11287. {
  11288. EventEmitter.call(this);
  11289. /**
  11290. * Local reference to the sound manager.
  11291. *
  11292. * @name Phaser.Sound.BaseSound#manager
  11293. * @type {Phaser.Sound.BaseSoundManager}
  11294. * @private
  11295. * @since 3.0.0
  11296. */
  11297. this.manager = manager;
  11298. /**
  11299. * Asset key for the sound.
  11300. *
  11301. * @name Phaser.Sound.BaseSound#key
  11302. * @type {string}
  11303. * @readOnly
  11304. * @since 3.0.0
  11305. */
  11306. this.key = key;
  11307. /**
  11308. * Flag indicating if sound is currently playing.
  11309. *
  11310. * @name Phaser.Sound.BaseSound#isPlaying
  11311. * @type {boolean}
  11312. * @default false
  11313. * @readOnly
  11314. * @since 3.0.0
  11315. */
  11316. this.isPlaying = false;
  11317. /**
  11318. * Flag indicating if sound is currently paused.
  11319. *
  11320. * @name Phaser.Sound.BaseSound#isPaused
  11321. * @type {boolean}
  11322. * @default false
  11323. * @readOnly
  11324. * @since 3.0.0
  11325. */
  11326. this.isPaused = false;
  11327. /**
  11328. * A property that holds the value of sound's actual playback rate,
  11329. * after its rate and detune values has been combined with global
  11330. * rate and detune values.
  11331. *
  11332. * @name Phaser.Sound.BaseSound#totalRate
  11333. * @type {number}
  11334. * @default 1
  11335. * @readOnly
  11336. * @since 3.0.0
  11337. */
  11338. this.totalRate = 1;
  11339. /**
  11340. * A value representing the duration, in seconds.
  11341. * It could be total sound duration or a marker duration.
  11342. *
  11343. * @name Phaser.Sound.BaseSound#duration
  11344. * @type {number}
  11345. * @readOnly
  11346. * @since 3.0.0
  11347. */
  11348. this.duration = this.duration || 0;
  11349. /**
  11350. * The total duration of the sound in seconds.
  11351. *
  11352. * @name Phaser.Sound.BaseSound#totalDuration
  11353. * @type {number}
  11354. * @readOnly
  11355. * @since 3.0.0
  11356. */
  11357. this.totalDuration = this.totalDuration || 0;
  11358. /**
  11359. * A config object used to store default sound settings' values.
  11360. * Default values will be set by properties' setters.
  11361. *
  11362. * @name Phaser.Sound.BaseSound#config
  11363. * @type {SoundConfig}
  11364. * @private
  11365. * @since 3.0.0
  11366. */
  11367. this.config = {
  11368. mute: false,
  11369. volume: 1,
  11370. rate: 1,
  11371. detune: 0,
  11372. seek: 0,
  11373. loop: false,
  11374. delay: 0
  11375. };
  11376. /**
  11377. * Reference to the currently used config.
  11378. * It could be default config or marker config.
  11379. *
  11380. * @name Phaser.Sound.BaseSound#currentConfig
  11381. * @type {SoundConfig}
  11382. * @private
  11383. * @since 3.0.0
  11384. */
  11385. this.currentConfig = this.config;
  11386. this.config = Extend(this.config, config);
  11387. /**
  11388. * Object containing markers definitions.
  11389. *
  11390. * @name Phaser.Sound.BaseSound#markers
  11391. * @type {Object.<string, SoundMarker>}
  11392. * @default {}
  11393. * @readOnly
  11394. * @since 3.0.0
  11395. */
  11396. this.markers = {};
  11397. /**
  11398. * Currently playing marker.
  11399. * 'null' if whole sound is playing.
  11400. *
  11401. * @name Phaser.Sound.BaseSound#currentMarker
  11402. * @type {SoundMarker}
  11403. * @default null
  11404. * @readOnly
  11405. * @since 3.0.0
  11406. */
  11407. this.currentMarker = null;
  11408. /**
  11409. * Flag indicating if destroy method was called on this sound.
  11410. *
  11411. * @name Phaser.Sound.BaseSound#pendingRemove
  11412. * @type {boolean}
  11413. * @private
  11414. * @default false
  11415. * @since 3.0.0
  11416. */
  11417. this.pendingRemove = false;
  11418. },
  11419. /**
  11420. * Adds a marker into the current sound. A marker is represented by name, start time, duration, and optionally config object.
  11421. * This allows you to bundle multiple sounds together into a single audio file and use markers to jump between them for playback.
  11422. *
  11423. * @method Phaser.Sound.BaseSound#addMarker
  11424. * @since 3.0.0
  11425. *
  11426. * @param {SoundMarker} marker - Marker object.
  11427. *
  11428. * @return {boolean} Whether the marker was added successfully.
  11429. */
  11430. addMarker: function (marker)
  11431. {
  11432. if (!marker || !marker.name || typeof marker.name !== 'string')
  11433. {
  11434. return false;
  11435. }
  11436. if (this.markers[marker.name])
  11437. {
  11438. // eslint-disable-next-line no-console
  11439. console.error('addMarker ' + marker.name + ' already exists in Sound');
  11440. return false;
  11441. }
  11442. marker = Extend(true, {
  11443. name: '',
  11444. start: 0,
  11445. duration: this.totalDuration - (marker.start || 0),
  11446. config: {
  11447. mute: false,
  11448. volume: 1,
  11449. rate: 1,
  11450. detune: 0,
  11451. seek: 0,
  11452. loop: false,
  11453. delay: 0
  11454. }
  11455. }, marker);
  11456. this.markers[marker.name] = marker;
  11457. return true;
  11458. },
  11459. /**
  11460. * Updates previously added marker.
  11461. *
  11462. * @method Phaser.Sound.BaseSound#updateMarker
  11463. * @since 3.0.0
  11464. *
  11465. * @param {SoundMarker} marker - Marker object with updated values.
  11466. *
  11467. * @return {boolean} Whether the marker was updated successfully.
  11468. */
  11469. updateMarker: function (marker)
  11470. {
  11471. if (!marker || !marker.name || typeof marker.name !== 'string')
  11472. {
  11473. return false;
  11474. }
  11475. if (!this.markers[marker.name])
  11476. {
  11477. // eslint-disable-next-line no-console
  11478. console.warn('Audio Marker: ' + marker.name + ' missing in Sound: ' + this.key);
  11479. return false;
  11480. }
  11481. this.markers[marker.name] = Extend(true, this.markers[marker.name], marker);
  11482. return true;
  11483. },
  11484. /**
  11485. * Removes a marker from the sound.
  11486. *
  11487. * @method Phaser.Sound.BaseSound#removeMarker
  11488. * @since 3.0.0
  11489. *
  11490. * @param {string} markerName - The name of the marker to remove.
  11491. *
  11492. * @return {?SoundMarker} Removed marker object or 'null' if there was no marker with provided name.
  11493. */
  11494. removeMarker: function (markerName)
  11495. {
  11496. var marker = this.markers[markerName];
  11497. if (!marker)
  11498. {
  11499. return null;
  11500. }
  11501. this.markers[markerName] = null;
  11502. return marker;
  11503. },
  11504. /**
  11505. * Play this sound, or a marked section of it.
  11506. * It always plays the sound from the start. If you want to start playback from a specific time
  11507. * you can set 'seek' setting of the config object, provided to this call, to that value.
  11508. *
  11509. * @method Phaser.Sound.BaseSound#play
  11510. * @since 3.0.0
  11511. *
  11512. * @param {string} [markerName=''] - If you want to play a marker then provide the marker name here, otherwise omit it to play the full sound.
  11513. * @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.
  11514. *
  11515. * @return {boolean} Whether the sound started playing successfully.
  11516. */
  11517. play: function (markerName, config)
  11518. {
  11519. if (markerName === undefined) { markerName = ''; }
  11520. if (typeof markerName === 'object')
  11521. {
  11522. config = markerName;
  11523. markerName = '';
  11524. }
  11525. if (typeof markerName !== 'string')
  11526. {
  11527. return false;
  11528. }
  11529. if (!markerName)
  11530. {
  11531. this.currentMarker = null;
  11532. this.currentConfig = this.config;
  11533. this.duration = this.totalDuration;
  11534. }
  11535. else
  11536. {
  11537. if (!this.markers[markerName])
  11538. {
  11539. // eslint-disable-next-line no-console
  11540. console.warn('Marker: ' + markerName + ' missing in Sound: ' + this.key);
  11541. return false;
  11542. }
  11543. this.currentMarker = this.markers[markerName];
  11544. this.currentConfig = this.currentMarker.config;
  11545. this.duration = this.currentMarker.duration;
  11546. }
  11547. this.resetConfig();
  11548. this.currentConfig = Extend(this.currentConfig, config);
  11549. this.isPlaying = true;
  11550. this.isPaused = false;
  11551. return true;
  11552. },
  11553. /**
  11554. * Pauses the sound.
  11555. *
  11556. * @method Phaser.Sound.BaseSound#pause
  11557. * @since 3.0.0
  11558. *
  11559. * @return {boolean} Whether the sound was paused successfully.
  11560. */
  11561. pause: function ()
  11562. {
  11563. if (this.isPaused || !this.isPlaying)
  11564. {
  11565. return false;
  11566. }
  11567. this.isPlaying = false;
  11568. this.isPaused = true;
  11569. return true;
  11570. },
  11571. /**
  11572. * Resumes the sound.
  11573. *
  11574. * @method Phaser.Sound.BaseSound#resume
  11575. * @since 3.0.0
  11576. *
  11577. * @return {boolean} Whether the sound was resumed successfully.
  11578. */
  11579. resume: function ()
  11580. {
  11581. if (!this.isPaused || this.isPlaying)
  11582. {
  11583. return false;
  11584. }
  11585. this.isPlaying = true;
  11586. this.isPaused = false;
  11587. return true;
  11588. },
  11589. /**
  11590. * Stop playing this sound.
  11591. *
  11592. * @method Phaser.Sound.BaseSound#stop
  11593. * @since 3.0.0
  11594. *
  11595. * @return {boolean} Whether the sound was stopped successfully.
  11596. */
  11597. stop: function ()
  11598. {
  11599. if (!this.isPaused && !this.isPlaying)
  11600. {
  11601. return false;
  11602. }
  11603. this.isPlaying = false;
  11604. this.isPaused = false;
  11605. this.resetConfig();
  11606. return true;
  11607. },
  11608. /**
  11609. * Method used internally for applying config values to some of the sound properties.
  11610. *
  11611. * @method Phaser.Sound.BaseSound#applyConfig
  11612. * @protected
  11613. * @since 3.0.0
  11614. */
  11615. applyConfig: function ()
  11616. {
  11617. this.mute = this.currentConfig.mute;
  11618. this.volume = this.currentConfig.volume;
  11619. this.rate = this.currentConfig.rate;
  11620. this.detune = this.currentConfig.detune;
  11621. this.loop = this.currentConfig.loop;
  11622. },
  11623. /**
  11624. * Method used internally for resetting values of some of the config properties.
  11625. *
  11626. * @method Phaser.Sound.BaseSound#resetConfig
  11627. * @protected
  11628. * @since 3.0.0
  11629. */
  11630. resetConfig: function ()
  11631. {
  11632. this.currentConfig.seek = 0;
  11633. this.currentConfig.delay = 0;
  11634. },
  11635. /**
  11636. * Update method called automatically by sound manager on every game step.
  11637. *
  11638. * @method Phaser.Sound.BaseSound#update
  11639. * @override
  11640. * @protected
  11641. * @since 3.0.0
  11642. *
  11643. * @param {number} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  11644. * @param {number} delta - The delta time elapsed since the last frame.
  11645. */
  11646. update: NOOP,
  11647. /**
  11648. * Method used internally to calculate total playback rate of the sound.
  11649. *
  11650. * @method Phaser.Sound.BaseSound#calculateRate
  11651. * @protected
  11652. * @since 3.0.0
  11653. */
  11654. calculateRate: function ()
  11655. {
  11656. var cent = 1.0005777895065548; // Math.pow(2, 1/1200);
  11657. var totalDetune = this.currentConfig.detune + this.manager.detune;
  11658. var detuneRate = Math.pow(cent, totalDetune);
  11659. this.totalRate = this.currentConfig.rate * this.manager.rate * detuneRate;
  11660. },
  11661. /**
  11662. * Destroys this sound and all associated events and marks it for removal from the sound manager.
  11663. *
  11664. * @method Phaser.Sound.BaseSound#destroy
  11665. * @since 3.0.0
  11666. */
  11667. destroy: function ()
  11668. {
  11669. if (this.pendingRemove)
  11670. {
  11671. return;
  11672. }
  11673. this.emit('destroy', this);
  11674. this.pendingRemove = true;
  11675. this.manager = null;
  11676. this.key = '';
  11677. this.removeAllListeners();
  11678. this.isPlaying = false;
  11679. this.isPaused = false;
  11680. this.config = null;
  11681. this.currentConfig = null;
  11682. this.markers = null;
  11683. this.currentMarker = null;
  11684. }
  11685. });
  11686. module.exports = BaseSound;
  11687. /***/ }),
  11688. /* 78 */
  11689. /***/ (function(module, exports, __webpack_require__) {
  11690. /**
  11691. * @author Richard Davey <rich@photonstorm.com>
  11692. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  11693. * @copyright 2018 Photon Storm Ltd.
  11694. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  11695. */
  11696. var Class = __webpack_require__(0);
  11697. var Clone = __webpack_require__(34);
  11698. var EventEmitter = __webpack_require__(9);
  11699. var NOOP = __webpack_require__(3);
  11700. /**
  11701. * @callback EachActiveSoundCallback
  11702. *
  11703. * @param {Phaser.Sound.BaseSoundManager} manager - The SoundManager
  11704. * @param {Phaser.Sound.BaseSound} sound - The current active Sound
  11705. * @param {number} index - The index of the current active Sound
  11706. * @param {Phaser.Sound.BaseSound[]} sounds - All sounds
  11707. */
  11708. /**
  11709. * Audio sprite sound type.
  11710. *
  11711. * @typedef {Phaser.Sound.BaseSound} Phaser.Sound.BaseSound.AudioSpriteSound
  11712. *
  11713. * @property {object} spritemap - Local reference to 'spritemap' object form json file generated by audiosprite tool.
  11714. */
  11715. /**
  11716. * @classdesc
  11717. * The sound manager is responsible for playing back audio via Web Audio API or HTML Audio tag as fallback.
  11718. * The audio file type and the encoding of those files are extremely important.
  11719. *
  11720. * Not all browsers can play all audio formats.
  11721. *
  11722. * 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).
  11723. *
  11724. * @class BaseSoundManager
  11725. * @extends Phaser.Events.EventEmitter
  11726. * @memberOf Phaser.Sound
  11727. * @constructor
  11728. * @since 3.0.0
  11729. *
  11730. * @param {Phaser.Game} game - Reference to the current game instance.
  11731. */
  11732. var BaseSoundManager = new Class({
  11733. Extends: EventEmitter,
  11734. initialize:
  11735. function BaseSoundManager (game)
  11736. {
  11737. EventEmitter.call(this);
  11738. /**
  11739. * Local reference to game.
  11740. *
  11741. * @name Phaser.Sound.BaseSoundManager#game
  11742. * @type {Phaser.Game}
  11743. * @readOnly
  11744. * @since 3.0.0
  11745. */
  11746. this.game = game;
  11747. /**
  11748. * Local reference to the JSON Cache, as used by Audio Sprites.
  11749. *
  11750. * @name Phaser.Sound.BaseSoundManager#jsonCache
  11751. * @type {Phaser.Cache.BaseCache}
  11752. * @readOnly
  11753. * @since 3.7.0
  11754. */
  11755. this.jsonCache = game.cache.json;
  11756. /**
  11757. * An array containing all added sounds.
  11758. *
  11759. * @name Phaser.Sound.BaseSoundManager#sounds
  11760. * @type {Phaser.Sound.BaseSound[]}
  11761. * @default []
  11762. * @private
  11763. * @since 3.0.0
  11764. */
  11765. this.sounds = [];
  11766. /**
  11767. * Global mute setting.
  11768. *
  11769. * @name Phaser.Sound.BaseSoundManager#mute
  11770. * @type {boolean}
  11771. * @default false
  11772. * @since 3.0.0
  11773. */
  11774. this.mute = false;
  11775. /**
  11776. * Global volume setting.
  11777. *
  11778. * @name Phaser.Sound.BaseSoundManager#volume
  11779. * @type {number}
  11780. * @default 1
  11781. * @since 3.0.0
  11782. */
  11783. this.volume = 1;
  11784. /**
  11785. * Flag indicating if sounds should be paused when game looses focus,
  11786. * for instance when user switches to another tab/program/app.
  11787. *
  11788. * @name Phaser.Sound.BaseSoundManager#pauseOnBlur
  11789. * @type {boolean}
  11790. * @default true
  11791. * @since 3.0.0
  11792. */
  11793. this.pauseOnBlur = true;
  11794. /**
  11795. * Property that actually holds the value of global playback rate.
  11796. *
  11797. * @name Phaser.Sound.BaseSoundManager#_rate
  11798. * @type {number}
  11799. * @private
  11800. * @default 1
  11801. * @since 3.0.0
  11802. */
  11803. this._rate = 1;
  11804. /**
  11805. * Property that actually holds the value of global detune.
  11806. *
  11807. * @name Phaser.Sound.BaseSoundManager#_detune
  11808. * @type {number}
  11809. * @private
  11810. * @default 0
  11811. * @since 3.0.0
  11812. */
  11813. this._detune = 0;
  11814. /**
  11815. * Mobile devices require sounds to be triggered from an explicit user action,
  11816. * such as a tap, before any sound can be loaded/played on a web page.
  11817. * Set to true if the audio system is currently locked awaiting user interaction.
  11818. *
  11819. * @name Phaser.Sound.BaseSoundManager#locked
  11820. * @type {boolean}
  11821. * @readOnly
  11822. * @since 3.0.0
  11823. */
  11824. this.locked = this.locked || false;
  11825. /**
  11826. * Flag used internally for handling when the audio system
  11827. * has been unlocked, if there ever was a need for it.
  11828. *
  11829. * @name Phaser.Sound.BaseSoundManager#unlocked
  11830. * @type {boolean}
  11831. * @default false
  11832. * @private
  11833. * @since 3.0.0
  11834. */
  11835. this.unlocked = false;
  11836. game.events.on('blur', function ()
  11837. {
  11838. if (this.pauseOnBlur)
  11839. {
  11840. this.onBlur();
  11841. }
  11842. }, this);
  11843. game.events.on('focus', function ()
  11844. {
  11845. if (this.pauseOnBlur)
  11846. {
  11847. this.onFocus();
  11848. }
  11849. }, this);
  11850. game.events.on('prestep', this.update, this);
  11851. game.events.once('destroy', this.destroy, this);
  11852. },
  11853. /**
  11854. * Adds a new sound into the sound manager.
  11855. *
  11856. * @method Phaser.Sound.BaseSoundManager#add
  11857. * @override
  11858. * @since 3.0.0
  11859. *
  11860. * @param {string} key - Asset key for the sound.
  11861. * @param {SoundConfig} [config] - An optional config object containing default sound settings.
  11862. *
  11863. * @return {Phaser.Sound.BaseSound} The new sound instance.
  11864. */
  11865. add: NOOP,
  11866. /**
  11867. * Adds a new audio sprite sound into the sound manager.
  11868. * Audio Sprites are a combination of audio files and a JSON configuration.
  11869. * The JSON follows the format of that created by https://github.com/tonistiigi/audiosprite
  11870. *
  11871. * @method Phaser.Sound.BaseSoundManager#addAudioSprite
  11872. * @since 3.0.0
  11873. *
  11874. * @param {string} key - Asset key for the sound.
  11875. * @param {SoundConfig} [config] - An optional config object containing default sound settings.
  11876. *
  11877. * @return {Phaser.Sound.BaseSound.AudioSpriteSound} The new audio sprite sound instance.
  11878. */
  11879. addAudioSprite: function (key, config)
  11880. {
  11881. if (config === undefined) { config = {}; }
  11882. var sound = this.add(key, config);
  11883. sound.spritemap = this.jsonCache.get(key).spritemap;
  11884. for (var markerName in sound.spritemap)
  11885. {
  11886. if (!sound.spritemap.hasOwnProperty(markerName))
  11887. {
  11888. continue;
  11889. }
  11890. var markerConfig = Clone(config);
  11891. var marker = sound.spritemap[markerName];
  11892. markerConfig.loop = (marker.hasOwnProperty('loop')) ? marker.loop : false;
  11893. sound.addMarker({
  11894. name: markerName,
  11895. start: marker.start,
  11896. duration: marker.end - marker.start,
  11897. config: markerConfig
  11898. });
  11899. }
  11900. return sound;
  11901. },
  11902. /**
  11903. * Enables playing sound on the fly without the need to keep a reference to it.
  11904. * Sound will auto destroy once its playback ends.
  11905. *
  11906. * @method Phaser.Sound.BaseSoundManager#play
  11907. * @since 3.0.0
  11908. *
  11909. * @param {string} key - Asset key for the sound.
  11910. * @param {(SoundConfig|SoundMarker)} [extra] - An optional additional object containing settings to be applied to the sound. It could be either config or marker object.
  11911. *
  11912. * @return {boolean} Whether the sound started playing successfully.
  11913. */
  11914. play: function (key, extra)
  11915. {
  11916. var sound = this.add(key);
  11917. sound.once('ended', sound.destroy, sound);
  11918. if (extra)
  11919. {
  11920. if (extra.name)
  11921. {
  11922. sound.addMarker(extra);
  11923. return sound.play(extra.name);
  11924. }
  11925. else
  11926. {
  11927. return sound.play(extra);
  11928. }
  11929. }
  11930. else
  11931. {
  11932. return sound.play();
  11933. }
  11934. },
  11935. /**
  11936. * Enables playing audio sprite sound on the fly without the need to keep a reference to it.
  11937. * Sound will auto destroy once its playback ends.
  11938. *
  11939. * @method Phaser.Sound.BaseSoundManager#playAudioSprite
  11940. * @since 3.0.0
  11941. *
  11942. * @param {string} key - Asset key for the sound.
  11943. * @param {string} spriteName - The name of the sound sprite to play.
  11944. * @param {SoundConfig} [config] - An optional config object containing default sound settings.
  11945. *
  11946. * @return {boolean} Whether the audio sprite sound started playing successfully.
  11947. */
  11948. playAudioSprite: function (key, spriteName, config)
  11949. {
  11950. var sound = this.addAudioSprite(key);
  11951. sound.once('ended', sound.destroy, sound);
  11952. return sound.play(spriteName, config);
  11953. },
  11954. /**
  11955. * Removes a sound from the sound manager.
  11956. * The removed sound is destroyed before removal.
  11957. *
  11958. * @method Phaser.Sound.BaseSoundManager#remove
  11959. * @since 3.0.0
  11960. *
  11961. * @param {Phaser.Sound.BaseSound} sound - The sound object to remove.
  11962. *
  11963. * @return {boolean} True if the sound was removed successfully, otherwise false.
  11964. */
  11965. remove: function (sound)
  11966. {
  11967. var index = this.sounds.indexOf(sound);
  11968. if (index !== -1)
  11969. {
  11970. sound.destroy();
  11971. this.sounds.splice(index, 1);
  11972. return true;
  11973. }
  11974. return false;
  11975. },
  11976. /**
  11977. * Removes all sounds from the sound manager that have an asset key matching the given value.
  11978. * The removed sounds are destroyed before removal.
  11979. *
  11980. * @method Phaser.Sound.BaseSoundManager#removeByKey
  11981. * @since 3.0.0
  11982. *
  11983. * @param {string} key - The key to match when removing sound objects.
  11984. *
  11985. * @return {number} The number of matching sound objects that were removed.
  11986. */
  11987. removeByKey: function (key)
  11988. {
  11989. var removed = 0;
  11990. for (var i = this.sounds.length - 1; i >= 0; i--)
  11991. {
  11992. var sound = this.sounds[i];
  11993. if (sound.key === key)
  11994. {
  11995. sound.destroy();
  11996. this.sounds.splice(i, 1);
  11997. removed++;
  11998. }
  11999. }
  12000. return removed;
  12001. },
  12002. /**
  12003. * @event Phaser.Sound.BaseSoundManager#pauseall
  12004. * @param {Phaser.Sound.BaseSoundManager} soundManager - Reference to the sound manager that emitted event.
  12005. */
  12006. /**
  12007. * Pauses all the sounds in the game.
  12008. *
  12009. * @method Phaser.Sound.BaseSoundManager#pauseAll
  12010. * @fires Phaser.Sound.BaseSoundManager#pauseall
  12011. * @since 3.0.0
  12012. */
  12013. pauseAll: function ()
  12014. {
  12015. this.forEachActiveSound(function (sound)
  12016. {
  12017. sound.pause();
  12018. });
  12019. this.emit('pauseall', this);
  12020. },
  12021. /**
  12022. * @event Phaser.Sound.BaseSoundManager#resumeall
  12023. * @param {Phaser.Sound.BaseSoundManager} soundManager - Reference to the sound manager that emitted event.
  12024. */
  12025. /**
  12026. * Resumes all the sounds in the game.
  12027. *
  12028. * @method Phaser.Sound.BaseSoundManager#resumeAll
  12029. * @fires Phaser.Sound.BaseSoundManager#resumeall
  12030. * @since 3.0.0
  12031. */
  12032. resumeAll: function ()
  12033. {
  12034. this.forEachActiveSound(function (sound)
  12035. {
  12036. sound.resume();
  12037. });
  12038. this.emit('resumeall', this);
  12039. },
  12040. /**
  12041. * @event Phaser.Sound.BaseSoundManager#stopall
  12042. * @param {Phaser.Sound.BaseSoundManager} soundManager - Reference to the sound manager that emitted event.
  12043. */
  12044. /**
  12045. * Stops all the sounds in the game.
  12046. *
  12047. * @method Phaser.Sound.BaseSoundManager#stopAll
  12048. * @fires Phaser.Sound.BaseSoundManager#stopall
  12049. * @since 3.0.0
  12050. */
  12051. stopAll: function ()
  12052. {
  12053. this.forEachActiveSound(function (sound)
  12054. {
  12055. sound.stop();
  12056. });
  12057. this.emit('stopall', this);
  12058. },
  12059. /**
  12060. * Method used internally for unlocking audio playback on devices that
  12061. * require user interaction before any sound can be played on a web page.
  12062. *
  12063. * Read more about how this issue is handled here in [this article](https://medium.com/@pgoloskokovic/unlocking-web-audio-the-smarter-way-8858218c0e09).
  12064. *
  12065. * @method Phaser.Sound.BaseSoundManager#unlock
  12066. * @override
  12067. * @protected
  12068. * @since 3.0.0
  12069. */
  12070. unlock: NOOP,
  12071. /**
  12072. * Method used internally for pausing sound manager if
  12073. * Phaser.Sound.BaseSoundManager#pauseOnBlur is set to true.
  12074. *
  12075. * @method Phaser.Sound.BaseSoundManager#onBlur
  12076. * @override
  12077. * @protected
  12078. * @since 3.0.0
  12079. */
  12080. onBlur: NOOP,
  12081. /**
  12082. * Method used internally for resuming sound manager if
  12083. * Phaser.Sound.BaseSoundManager#pauseOnBlur is set to true.
  12084. *
  12085. * @method Phaser.Sound.BaseSoundManager#onFocus
  12086. * @override
  12087. * @protected
  12088. * @since 3.0.0
  12089. */
  12090. onFocus: NOOP,
  12091. /**
  12092. * Update method called on every game step.
  12093. * Removes destroyed sounds and updates every active sound in the game.
  12094. *
  12095. * @method Phaser.Sound.BaseSoundManager#update
  12096. * @protected
  12097. * @since 3.0.0
  12098. *
  12099. * @param {number} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  12100. * @param {number} delta - The delta time elapsed since the last frame.
  12101. */
  12102. update: function (time, delta)
  12103. {
  12104. if (this.unlocked)
  12105. {
  12106. this.unlocked = false;
  12107. this.locked = false;
  12108. /**
  12109. * @event Phaser.Sound.BaseSoundManager#unlocked
  12110. * @param {Phaser.Sound.BaseSoundManager} soundManager - Reference to the sound manager that emitted event.
  12111. */
  12112. this.emit('unlocked', this);
  12113. }
  12114. for (var i = this.sounds.length - 1; i >= 0; i--)
  12115. {
  12116. if (this.sounds[i].pendingRemove)
  12117. {
  12118. this.sounds.splice(i, 1);
  12119. }
  12120. }
  12121. this.sounds.forEach(function (sound)
  12122. {
  12123. sound.update(time, delta);
  12124. });
  12125. },
  12126. /**
  12127. * Destroys all the sounds in the game and all associated events.
  12128. *
  12129. * @method Phaser.Sound.BaseSoundManager#destroy
  12130. * @since 3.0.0
  12131. */
  12132. destroy: function ()
  12133. {
  12134. this.removeAllListeners();
  12135. this.forEachActiveSound(function (sound)
  12136. {
  12137. sound.destroy();
  12138. });
  12139. this.sounds.length = 0;
  12140. this.sounds = null;
  12141. this.game = null;
  12142. },
  12143. /**
  12144. * Method used internally for iterating only over active sounds and skipping sounds that are marked for removal.
  12145. *
  12146. * @method Phaser.Sound.BaseSoundManager#forEachActiveSound
  12147. * @private
  12148. * @since 3.0.0
  12149. *
  12150. * @param {EachActiveSoundCallback} callback - Callback function. (manager: Phaser.Sound.BaseSoundManager, sound: Phaser.Sound.BaseSound, index: number, sounds: Phaser.Manager.BaseSound[]) => void
  12151. * @param {*} [scope] - Callback context.
  12152. */
  12153. forEachActiveSound: function (callback, scope)
  12154. {
  12155. var _this = this;
  12156. this.sounds.forEach(function (sound, index)
  12157. {
  12158. if (!sound.pendingRemove)
  12159. {
  12160. callback.call(scope || _this, sound, index, _this.sounds);
  12161. }
  12162. });
  12163. },
  12164. /**
  12165. * @event Phaser.Sound.BaseSoundManager#rate
  12166. * @param {Phaser.Sound.BaseSoundManager} soundManager - Reference to the sound manager that emitted event.
  12167. * @param {number} value - An updated value of Phaser.Sound.BaseSoundManager#rate property.
  12168. */
  12169. /**
  12170. * Sets the global playback rate at which all the sounds will be played.
  12171. *
  12172. * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed
  12173. * and 2.0 doubles the audios playback speed.
  12174. *
  12175. * @method Phaser.Sound.BaseSoundManager#setRate
  12176. * @fires Phaser.Sound.BaseSoundManager#rate
  12177. * @since 3.3.0
  12178. *
  12179. * @param {number} value - Global playback rate at which all the sounds will be played.
  12180. *
  12181. * @return {Phaser.Sound.BaseSoundManager} This Sound Manager.
  12182. */
  12183. setRate: function (value)
  12184. {
  12185. this.rate = value;
  12186. return this;
  12187. },
  12188. /**
  12189. * Global playback rate at which all the sounds will be played.
  12190. * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed
  12191. * and 2.0 doubles the audio's playback speed.
  12192. *
  12193. * @name Phaser.Sound.BaseSoundManager#rate
  12194. * @type {number}
  12195. * @default 1
  12196. * @since 3.0.0
  12197. */
  12198. rate: {
  12199. get: function ()
  12200. {
  12201. return this._rate;
  12202. },
  12203. set: function (value)
  12204. {
  12205. this._rate = value;
  12206. this.forEachActiveSound(function (sound)
  12207. {
  12208. sound.calculateRate();
  12209. });
  12210. this.emit('rate', this, value);
  12211. }
  12212. },
  12213. /**
  12214. * Sets the global detuning of all sounds in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  12215. * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  12216. *
  12217. * @method Phaser.Sound.BaseSoundManager#setDetune
  12218. * @fires Phaser.Sound.BaseSoundManager#detune
  12219. * @since 3.3.0
  12220. *
  12221. * @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).
  12222. *
  12223. * @return {Phaser.Sound.BaseSoundManager} This Sound Manager.
  12224. */
  12225. setDetune: function (value)
  12226. {
  12227. this.detune = value;
  12228. return this;
  12229. },
  12230. /**
  12231. * @event Phaser.Sound.BaseSoundManager#detune
  12232. * @param {Phaser.Sound.BaseSoundManager} soundManager - Reference to the sound manager that emitted event.
  12233. * @param {number} value - An updated value of Phaser.Sound.BaseSoundManager#detune property.
  12234. */
  12235. /**
  12236. * Global detuning of all sounds in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  12237. * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  12238. *
  12239. * @name Phaser.Sound.BaseSoundManager#detune
  12240. * @type {number}
  12241. * @default 0
  12242. * @since 3.0.0
  12243. */
  12244. detune: {
  12245. get: function ()
  12246. {
  12247. return this._detune;
  12248. },
  12249. set: function (value)
  12250. {
  12251. this._detune = value;
  12252. this.forEachActiveSound(function (sound)
  12253. {
  12254. sound.calculateRate();
  12255. });
  12256. this.emit('detune', this, value);
  12257. }
  12258. }
  12259. });
  12260. module.exports = BaseSoundManager;
  12261. /***/ }),
  12262. /* 79 */
  12263. /***/ (function(module, exports) {
  12264. /**
  12265. * @author Richard Davey <rich@photonstorm.com>
  12266. * @copyright 2018 Photon Storm Ltd.
  12267. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  12268. */
  12269. /**
  12270. * Scene consts.
  12271. *
  12272. * @ignore
  12273. */
  12274. var CONST = {
  12275. /**
  12276. * Scene state.
  12277. *
  12278. * @name Phaser.Scenes.PENDING
  12279. * @readOnly
  12280. * @type {integer}
  12281. * @since 3.0.0
  12282. */
  12283. PENDING: 0,
  12284. /**
  12285. * Scene state.
  12286. *
  12287. * @name Phaser.Scenes.INIT
  12288. * @readOnly
  12289. * @type {integer}
  12290. * @since 3.0.0
  12291. */
  12292. INIT: 1,
  12293. /**
  12294. * Scene state.
  12295. *
  12296. * @name Phaser.Scenes.START
  12297. * @readOnly
  12298. * @type {integer}
  12299. * @since 3.0.0
  12300. */
  12301. START: 2,
  12302. /**
  12303. * Scene state.
  12304. *
  12305. * @name Phaser.Scenes.LOADING
  12306. * @readOnly
  12307. * @type {integer}
  12308. * @since 3.0.0
  12309. */
  12310. LOADING: 3,
  12311. /**
  12312. * Scene state.
  12313. *
  12314. * @name Phaser.Scenes.CREATING
  12315. * @readOnly
  12316. * @type {integer}
  12317. * @since 3.0.0
  12318. */
  12319. CREATING: 4,
  12320. /**
  12321. * Scene state.
  12322. *
  12323. * @name Phaser.Scenes.RUNNING
  12324. * @readOnly
  12325. * @type {integer}
  12326. * @since 3.0.0
  12327. */
  12328. RUNNING: 5,
  12329. /**
  12330. * Scene state.
  12331. *
  12332. * @name Phaser.Scenes.PAUSED
  12333. * @readOnly
  12334. * @type {integer}
  12335. * @since 3.0.0
  12336. */
  12337. PAUSED: 6,
  12338. /**
  12339. * Scene state.
  12340. *
  12341. * @name Phaser.Scenes.SLEEPING
  12342. * @readOnly
  12343. * @type {integer}
  12344. * @since 3.0.0
  12345. */
  12346. SLEEPING: 7,
  12347. /**
  12348. * Scene state.
  12349. *
  12350. * @name Phaser.Scenes.SHUTDOWN
  12351. * @readOnly
  12352. * @type {integer}
  12353. * @since 3.0.0
  12354. */
  12355. SHUTDOWN: 8,
  12356. /**
  12357. * Scene state.
  12358. *
  12359. * @name Phaser.Scenes.DESTROYED
  12360. * @readOnly
  12361. * @type {integer}
  12362. * @since 3.0.0
  12363. */
  12364. DESTROYED: 9
  12365. };
  12366. module.exports = CONST;
  12367. /***/ }),
  12368. /* 80 */
  12369. /***/ (function(module, exports, __webpack_require__) {
  12370. /**
  12371. * @author Richard Davey <rich@photonstorm.com>
  12372. * @copyright 2018 Photon Storm Ltd.
  12373. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  12374. */
  12375. var OS = __webpack_require__(57);
  12376. /**
  12377. * Determines the browser type and version running this Phaser Game instance.
  12378. * These values are read-only and populated during the boot sequence of the game.
  12379. * They are then referenced by internal game systems and are available for you to access
  12380. * via `this.sys.game.device.browser` from within any Scene.
  12381. *
  12382. * @typedef {object} Phaser.Device.Browser
  12383. * @since 3.0.0
  12384. *
  12385. * @property {boolean} chrome - Set to true if running in Chrome.
  12386. * @property {boolean} edge - Set to true if running in Microsoft Edge browser.
  12387. * @property {boolean} firefox - Set to true if running in Firefox.
  12388. * @property {boolean} ie - Set to true if running in Internet Explorer 11 or less (not Edge).
  12389. * @property {boolean} mobileSafari - Set to true if running in Mobile Safari.
  12390. * @property {boolean} opera - Set to true if running in Opera.
  12391. * @property {boolean} safari - Set to true if running in Safari.
  12392. * @property {boolean} silk - Set to true if running in the Silk browser (as used on the Amazon Kindle)
  12393. * @property {boolean} trident - Set to true if running a Trident version of Internet Explorer (IE11+)
  12394. * @property {number} chromeVersion - If running in Chrome this will contain the major version number.
  12395. * @property {number} firefoxVersion - If running in Firefox this will contain the major version number.
  12396. * @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.
  12397. * @property {number} safariVersion - If running in Safari this will contain the major version number.
  12398. * @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}
  12399. */
  12400. var Browser = {
  12401. chrome: false,
  12402. chromeVersion: 0,
  12403. edge: false,
  12404. firefox: false,
  12405. firefoxVersion: 0,
  12406. ie: false,
  12407. ieVersion: 0,
  12408. mobileSafari: false,
  12409. opera: false,
  12410. safari: false,
  12411. safariVersion: 0,
  12412. silk: false,
  12413. trident: false,
  12414. tridentVersion: 0
  12415. };
  12416. function init ()
  12417. {
  12418. var ua = navigator.userAgent;
  12419. if (/Edge\/\d+/.test(ua))
  12420. {
  12421. Browser.edge = true;
  12422. }
  12423. else if ((/Chrome\/(\d+)/).test(ua) && !OS.windowsPhone)
  12424. {
  12425. Browser.chrome = true;
  12426. Browser.chromeVersion = parseInt(RegExp.$1, 10);
  12427. }
  12428. else if ((/Firefox\D+(\d+)/).test(ua))
  12429. {
  12430. Browser.firefox = true;
  12431. Browser.firefoxVersion = parseInt(RegExp.$1, 10);
  12432. }
  12433. else if ((/AppleWebKit/).test(ua) && OS.iOS)
  12434. {
  12435. Browser.mobileSafari = true;
  12436. }
  12437. else if ((/MSIE (\d+\.\d+);/).test(ua))
  12438. {
  12439. Browser.ie = true;
  12440. Browser.ieVersion = parseInt(RegExp.$1, 10);
  12441. }
  12442. else if ((/Opera/).test(ua))
  12443. {
  12444. Browser.opera = true;
  12445. }
  12446. else if ((/Safari/).test(ua) && !OS.windowsPhone)
  12447. {
  12448. Browser.safari = true;
  12449. }
  12450. else if ((/Trident\/(\d+\.\d+)(.*)rv:(\d+\.\d+)/).test(ua))
  12451. {
  12452. Browser.ie = true;
  12453. Browser.trident = true;
  12454. Browser.tridentVersion = parseInt(RegExp.$1, 10);
  12455. Browser.ieVersion = parseInt(RegExp.$3, 10);
  12456. }
  12457. // Silk gets its own if clause because its ua also contains 'Safari'
  12458. if ((/Silk/).test(ua))
  12459. {
  12460. Browser.silk = true;
  12461. }
  12462. return Browser;
  12463. }
  12464. module.exports = init();
  12465. /***/ }),
  12466. /* 81 */
  12467. /***/ (function(module, exports, __webpack_require__) {
  12468. /**
  12469. * @author Richard Davey <rich@photonstorm.com>
  12470. * @copyright 2018 Photon Storm Ltd.
  12471. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  12472. */
  12473. var Class = __webpack_require__(0);
  12474. /**
  12475. * @callback DataEachCallback
  12476. *
  12477. * @param {*} parent - The parent object of the DataManager.
  12478. * @param {string} key - The key of the value.
  12479. * @param {*} value - The value.
  12480. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the game object, key, and data.
  12481. */
  12482. /**
  12483. * @classdesc
  12484. * The Data Component features a means to store pieces of data specific to a Game Object, System or Plugin.
  12485. * You can then search, query it, and retrieve the data. The parent must either extend EventEmitter,
  12486. * or have a property called `events` that is an instance of it.
  12487. *
  12488. * @class DataManager
  12489. * @memberOf Phaser.Data
  12490. * @constructor
  12491. * @since 3.0.0
  12492. *
  12493. * @param {object} parent - The object that this DataManager belongs to.
  12494. * @param {Phaser.Events.EventEmitter} eventEmitter - The DataManager's event emitter.
  12495. */
  12496. var DataManager = new Class({
  12497. initialize:
  12498. function DataManager (parent, eventEmitter)
  12499. {
  12500. /**
  12501. * The object that this DataManager belongs to.
  12502. *
  12503. * @name Phaser.Data.DataManager#parent
  12504. * @type {*}
  12505. * @since 3.0.0
  12506. */
  12507. this.parent = parent;
  12508. /**
  12509. * The DataManager's event emitter.
  12510. *
  12511. * @name Phaser.Data.DataManager#events
  12512. * @type {Phaser.Events.EventEmitter}
  12513. * @since 3.0.0
  12514. */
  12515. this.events = eventEmitter;
  12516. if (!eventEmitter)
  12517. {
  12518. this.events = (parent.events) ? parent.events : parent;
  12519. }
  12520. /**
  12521. * The data list.
  12522. *
  12523. * @name Phaser.Data.DataManager#list
  12524. * @type {Object.<string, *>}
  12525. * @default {}
  12526. * @since 3.0.0
  12527. */
  12528. this.list = {};
  12529. /**
  12530. * The public values list. You can use this to access anything you have stored
  12531. * in this Data Manager. For example, if you set a value called `gold` you can
  12532. * access it via:
  12533. *
  12534. * ```javascript
  12535. * this.data.values.gold;
  12536. * ```
  12537. *
  12538. * You can also modify it directly:
  12539. *
  12540. * ```javascript
  12541. * this.data.values.gold += 1000;
  12542. * ```
  12543. *
  12544. * Doing so will emit a `setdata` event from the parent of this Data Manager.
  12545. *
  12546. * @name Phaser.Data.DataManager#values
  12547. * @type {Object.<string, *>}
  12548. * @default {}
  12549. * @since 3.10.0
  12550. */
  12551. this.values = {};
  12552. /**
  12553. * Whether setting data is frozen for this DataManager.
  12554. *
  12555. * @name Phaser.Data.DataManager#_frozen
  12556. * @type {boolean}
  12557. * @private
  12558. * @default false
  12559. * @since 3.0.0
  12560. */
  12561. this._frozen = false;
  12562. if (!parent.hasOwnProperty('sys') && this.events)
  12563. {
  12564. this.events.once('destroy', this.destroy, this);
  12565. }
  12566. },
  12567. /**
  12568. * Retrieves the value for the given key, or undefined if it doesn't exist.
  12569. *
  12570. * You can also access values via the `values` object. For example, if you had a key called `gold` you can do either:
  12571. *
  12572. * ```javascript
  12573. * this.data.get('gold');
  12574. * ```
  12575. *
  12576. * Or access the value directly:
  12577. *
  12578. * ```javascript
  12579. * this.data.values.gold;
  12580. * ```
  12581. *
  12582. * You can also pass in an array of keys, in which case an array of values will be returned:
  12583. *
  12584. * ```javascript
  12585. * this.data.get([ 'gold', 'armor', 'health' ]);
  12586. * ```
  12587. *
  12588. * This approach is useful for destructuring arrays in ES6.
  12589. *
  12590. * @method Phaser.Data.DataManager#get
  12591. * @since 3.0.0
  12592. *
  12593. * @param {(string|string[])} key - The key of the value to retrieve, or an array of keys.
  12594. *
  12595. * @return {*} The value belonging to the given key, or an array of values, the order of which will match the input array.
  12596. */
  12597. get: function (key)
  12598. {
  12599. var list = this.list;
  12600. if (Array.isArray(key))
  12601. {
  12602. var output = [];
  12603. for (var i = 0; i < key.length; i++)
  12604. {
  12605. output.push(list[key[i]]);
  12606. }
  12607. return output;
  12608. }
  12609. else
  12610. {
  12611. return list[key];
  12612. }
  12613. },
  12614. /**
  12615. * Retrieves all data values in a new object.
  12616. *
  12617. * @method Phaser.Data.DataManager#getAll
  12618. * @since 3.0.0
  12619. *
  12620. * @return {Object.<string, *>} All data values.
  12621. */
  12622. getAll: function ()
  12623. {
  12624. var results = {};
  12625. for (var key in this.list)
  12626. {
  12627. if (this.list.hasOwnProperty(key))
  12628. {
  12629. results[key] = this.list[key];
  12630. }
  12631. }
  12632. return results;
  12633. },
  12634. /**
  12635. * Queries the DataManager for the values of keys matching the given regular expression.
  12636. *
  12637. * @method Phaser.Data.DataManager#query
  12638. * @since 3.0.0
  12639. *
  12640. * @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).
  12641. *
  12642. * @return {Object.<string, *>} The values of the keys matching the search string.
  12643. */
  12644. query: function (search)
  12645. {
  12646. var results = {};
  12647. for (var key in this.list)
  12648. {
  12649. if (this.list.hasOwnProperty(key) && key.match(search))
  12650. {
  12651. results[key] = this.list[key];
  12652. }
  12653. }
  12654. return results;
  12655. },
  12656. /**
  12657. * Sets a value for the given key. If the key doesn't already exist in the Data Manager then it is created.
  12658. *
  12659. * ```javascript
  12660. * data.set('name', 'Red Gem Stone');
  12661. * ```
  12662. *
  12663. * You can also pass in an object of key value pairs as the first argument:
  12664. *
  12665. * ```javascript
  12666. * data.set({ name: 'Red Gem Stone', level: 2, owner: 'Link', gold: 50 });
  12667. * ```
  12668. *
  12669. * To get a value back again you can call `get`:
  12670. *
  12671. * ```javascript
  12672. * data.get('gold');
  12673. * ```
  12674. *
  12675. * Or you can access the value directly via the `values` property, where it works like any other variable:
  12676. *
  12677. * ```javascript
  12678. * data.values.gold += 50;
  12679. * ```
  12680. *
  12681. * When the value is first set, a `setdata` event is emitted.
  12682. *
  12683. * If the key already exists, a `changedata` event is emitted instead, along an event named after the key.
  12684. * For example, if you updated an existing key called `PlayerLives` then it would emit the event `changedata_PlayerLives`.
  12685. * These events will be emitted regardless if you use this method to set the value, or the direct `values` setter.
  12686. *
  12687. * Please note that the data keys are case-sensitive and must be valid JavaScript Object property strings.
  12688. * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager.
  12689. *
  12690. * @method Phaser.Data.DataManager#set
  12691. * @since 3.0.0
  12692. *
  12693. * @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.
  12694. * @param {*} data - The value to set for the given key. If an object is provided as the key this argument is ignored.
  12695. *
  12696. * @return {Phaser.Data.DataManager} This DataManager object.
  12697. */
  12698. set: function (key, data)
  12699. {
  12700. if (this._frozen)
  12701. {
  12702. return this;
  12703. }
  12704. if (typeof key === 'string')
  12705. {
  12706. return this.setValue(key, data);
  12707. }
  12708. else
  12709. {
  12710. for (var entry in key)
  12711. {
  12712. this.setValue(entry, key[entry]);
  12713. }
  12714. }
  12715. return this;
  12716. },
  12717. /**
  12718. * Internal value setter, called automatically by the `set` method.
  12719. *
  12720. * @method Phaser.Data.DataManager#setValue
  12721. * @private
  12722. * @since 3.10.0
  12723. *
  12724. * @param {string} key - The key to set the value for.
  12725. * @param {*} data - The value to set.
  12726. *
  12727. * @return {Phaser.Data.DataManager} This DataManager object.
  12728. */
  12729. setValue: function (key, data)
  12730. {
  12731. if (this._frozen)
  12732. {
  12733. return this;
  12734. }
  12735. if (this.has(key))
  12736. {
  12737. // Hit the key getter, which will in turn emit the events.
  12738. this.values[key] = data;
  12739. }
  12740. else
  12741. {
  12742. var _this = this;
  12743. var list = this.list;
  12744. var events = this.events;
  12745. var parent = this.parent;
  12746. Object.defineProperty(this.values, key, {
  12747. enumerable: true,
  12748. configurable: true,
  12749. get: function ()
  12750. {
  12751. return list[key];
  12752. },
  12753. set: function (value)
  12754. {
  12755. if (!_this._frozen)
  12756. {
  12757. list[key] = value;
  12758. events.emit('changedata', parent, key, value);
  12759. events.emit('changedata_' + key, parent, value);
  12760. }
  12761. }
  12762. });
  12763. list[key] = data;
  12764. events.emit('setdata', parent, key, data);
  12765. }
  12766. return this;
  12767. },
  12768. /**
  12769. * Passes all data entries to the given callback.
  12770. *
  12771. * @method Phaser.Data.DataManager#each
  12772. * @since 3.0.0
  12773. *
  12774. * @param {DataEachCallback} callback - The function to call.
  12775. * @param {*} [context] - Value to use as `this` when executing callback.
  12776. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the game object, key, and data.
  12777. *
  12778. * @return {Phaser.Data.DataManager} This DataManager object.
  12779. */
  12780. each: function (callback, context)
  12781. {
  12782. var args = [ this.parent, null, undefined ];
  12783. for (var i = 1; i < arguments.length; i++)
  12784. {
  12785. args.push(arguments[i]);
  12786. }
  12787. for (var key in this.list)
  12788. {
  12789. args[1] = key;
  12790. args[2] = this.list[key];
  12791. callback.apply(context, args);
  12792. }
  12793. return this;
  12794. },
  12795. /**
  12796. * Merge the given object of key value pairs into this DataManager.
  12797. *
  12798. * Any newly created values will emit a `setdata` event. Any updated values (see the `overwrite` argument)
  12799. * will emit a `changedata` event.
  12800. *
  12801. * @method Phaser.Data.DataManager#merge
  12802. * @since 3.0.0
  12803. *
  12804. * @param {Object.<string, *>} data - The data to merge.
  12805. * @param {boolean} [overwrite=true] - Whether to overwrite existing data. Defaults to true.
  12806. *
  12807. * @return {Phaser.Data.DataManager} This DataManager object.
  12808. */
  12809. merge: function (data, overwrite)
  12810. {
  12811. if (overwrite === undefined) { overwrite = true; }
  12812. // Merge data from another component into this one
  12813. for (var key in data)
  12814. {
  12815. if (data.hasOwnProperty(key) && (overwrite || (!overwrite && !this.has(key))))
  12816. {
  12817. this.setValue(key, data[key]);
  12818. }
  12819. }
  12820. return this;
  12821. },
  12822. /**
  12823. * Remove the value for the given key.
  12824. *
  12825. * If the key is found in this Data Manager it is removed from the internal lists and a
  12826. * `removedata` event is emitted.
  12827. *
  12828. * You can also pass in an array of keys, in which case all keys in the array will be removed:
  12829. *
  12830. * ```javascript
  12831. * this.data.remove([ 'gold', 'armor', 'health' ]);
  12832. * ```
  12833. *
  12834. * @method Phaser.Data.DataManager#remove
  12835. * @since 3.0.0
  12836. *
  12837. * @param {(string|string[])} key - The key to remove, or an array of keys to remove.
  12838. *
  12839. * @return {Phaser.Data.DataManager} This DataManager object.
  12840. */
  12841. remove: function (key)
  12842. {
  12843. if (this._frozen)
  12844. {
  12845. return this;
  12846. }
  12847. if (Array.isArray(key))
  12848. {
  12849. for (var i = 0; i < key.length; i++)
  12850. {
  12851. this.removeValue(key[i]);
  12852. }
  12853. }
  12854. else
  12855. {
  12856. return this.removeValue(key);
  12857. }
  12858. return this;
  12859. },
  12860. /**
  12861. * Internal value remover, called automatically by the `remove` method.
  12862. *
  12863. * @method Phaser.Data.DataManager#removeValue
  12864. * @private
  12865. * @since 3.10.0
  12866. *
  12867. * @param {string} key - The key to set the value for.
  12868. *
  12869. * @return {Phaser.Data.DataManager} This DataManager object.
  12870. */
  12871. removeValue: function (key)
  12872. {
  12873. if (this.has(key))
  12874. {
  12875. var data = this.list[key];
  12876. delete this.list[key];
  12877. delete this.values[key];
  12878. this.events.emit('removedata', this.parent, key, data);
  12879. }
  12880. return this;
  12881. },
  12882. /**
  12883. * Retrieves the data associated with the given 'key', deletes it from this Data Manager, then returns it.
  12884. *
  12885. * @method Phaser.Data.DataManager#pop
  12886. * @since 3.0.0
  12887. *
  12888. * @param {string} key - The key of the value to retrieve and delete.
  12889. *
  12890. * @return {*} The value of the given key.
  12891. */
  12892. pop: function (key)
  12893. {
  12894. var data = undefined;
  12895. if (!this._frozen && this.has(key))
  12896. {
  12897. data = this.list[key];
  12898. delete this.list[key];
  12899. delete this.values[key];
  12900. this.events.emit('removedata', this, key, data);
  12901. }
  12902. return data;
  12903. },
  12904. /**
  12905. * Determines whether the given key is set in this Data Manager.
  12906. *
  12907. * Please note that the keys are case-sensitive and must be valid JavaScript Object property strings.
  12908. * This means the keys `gold` and `Gold` are treated as two unique values within the Data Manager.
  12909. *
  12910. * @method Phaser.Data.DataManager#has
  12911. * @since 3.0.0
  12912. *
  12913. * @param {string} key - The key to check.
  12914. *
  12915. * @return {boolean} Returns `true` if the key exists, otherwise `false`.
  12916. */
  12917. has: function (key)
  12918. {
  12919. return this.list.hasOwnProperty(key);
  12920. },
  12921. /**
  12922. * Freeze or unfreeze this Data Manager. A frozen Data Manager will block all attempts
  12923. * to create new values or update existing ones.
  12924. *
  12925. * @method Phaser.Data.DataManager#setFreeze
  12926. * @since 3.0.0
  12927. *
  12928. * @param {boolean} value - Whether to freeze or unfreeze the Data Manager.
  12929. *
  12930. * @return {Phaser.Data.DataManager} This DataManager object.
  12931. */
  12932. setFreeze: function (value)
  12933. {
  12934. this._frozen = value;
  12935. return this;
  12936. },
  12937. /**
  12938. * Delete all data in this Data Manager and unfreeze it.
  12939. *
  12940. * @method Phaser.Data.DataManager#reset
  12941. * @since 3.0.0
  12942. *
  12943. * @return {Phaser.Data.DataManager} This DataManager object.
  12944. */
  12945. reset: function ()
  12946. {
  12947. for (var key in this.list)
  12948. {
  12949. delete this.list[key];
  12950. delete this.values[key];
  12951. }
  12952. this._frozen = false;
  12953. return this;
  12954. },
  12955. /**
  12956. * Destroy this data manager.
  12957. *
  12958. * @method Phaser.Data.DataManager#destroy
  12959. * @since 3.0.0
  12960. */
  12961. destroy: function ()
  12962. {
  12963. this.reset();
  12964. this.events.off('changedata');
  12965. this.events.off('setdata');
  12966. this.events.off('removedata');
  12967. this.parent = null;
  12968. },
  12969. /**
  12970. * Gets or sets the frozen state of this Data Manager.
  12971. * A frozen Data Manager will block all attempts to create new values or update existing ones.
  12972. *
  12973. * @name Phaser.Data.DataManager#freeze
  12974. * @type {boolean}
  12975. * @since 3.0.0
  12976. */
  12977. freeze: {
  12978. get: function ()
  12979. {
  12980. return this._frozen;
  12981. },
  12982. set: function (value)
  12983. {
  12984. this._frozen = (value) ? true : false;
  12985. }
  12986. },
  12987. /**
  12988. * Return the total number of entries in this Data Manager.
  12989. *
  12990. * @name Phaser.Data.DataManager#count
  12991. * @type {integer}
  12992. * @since 3.0.0
  12993. */
  12994. count: {
  12995. get: function ()
  12996. {
  12997. var i = 0;
  12998. for (var key in this.list)
  12999. {
  13000. if (this.list[key] !== undefined)
  13001. {
  13002. i++;
  13003. }
  13004. }
  13005. return i;
  13006. }
  13007. }
  13008. });
  13009. module.exports = DataManager;
  13010. /***/ }),
  13011. /* 82 */
  13012. /***/ (function(module, exports) {
  13013. /**
  13014. * @author Richard Davey <rich@photonstorm.com>
  13015. * @copyright 2018 Photon Storm Ltd.
  13016. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  13017. */
  13018. /**
  13019. * Calculate the angle of the line in radians.
  13020. *
  13021. * @function Phaser.Geom.Line.Angle
  13022. * @since 3.0.0
  13023. *
  13024. * @param {Phaser.Geom.Line} line - The line to calculate the angle of.
  13025. *
  13026. * @return {number} The angle of the line, in radians.
  13027. */
  13028. var Angle = function (line)
  13029. {
  13030. return Math.atan2(line.y2 - line.y1, line.x2 - line.x1);
  13031. };
  13032. module.exports = Angle;
  13033. /***/ }),
  13034. /* 83 */
  13035. /***/ (function(module, exports, __webpack_require__) {
  13036. /**
  13037. * @author Richard Davey <rich@photonstorm.com>
  13038. * @copyright 2018 Photon Storm Ltd.
  13039. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  13040. */
  13041. //! stable.js 0.1.6, https://github.com/Two-Screen/stable
  13042. //! © 2017 Angry Bytes and contributors. MIT licensed.
  13043. (function() {
  13044. // A stable array sort, because `Array#sort()` is not guaranteed stable.
  13045. // This is an implementation of merge sort, without recursion.
  13046. var stable = function(arr, comp) {
  13047. return exec(arr.slice(), comp);
  13048. };
  13049. stable.inplace = function(arr, comp) {
  13050. var result = exec(arr, comp);
  13051. // This simply copies back if the result isn't in the original array,
  13052. // which happens on an odd number of passes.
  13053. if (result !== arr) {
  13054. pass(result, null, arr.length, arr);
  13055. }
  13056. return arr;
  13057. };
  13058. // Execute the sort using the input array and a second buffer as work space.
  13059. // Returns one of those two, containing the final result.
  13060. function exec(arr, comp) {
  13061. if (typeof(comp) !== 'function') {
  13062. comp = function(a, b) {
  13063. return String(a).localeCompare(b);
  13064. };
  13065. }
  13066. // Short-circuit when there's nothing to sort.
  13067. var len = arr.length;
  13068. if (len <= 1) {
  13069. return arr;
  13070. }
  13071. // Rather than dividing input, simply iterate chunks of 1, 2, 4, 8, etc.
  13072. // Chunks are the size of the left or right hand in merge sort.
  13073. // Stop when the left-hand covers all of the array.
  13074. var buffer = new Array(len);
  13075. for (var chk = 1; chk < len; chk *= 2) {
  13076. pass(arr, comp, chk, buffer);
  13077. var tmp = arr;
  13078. arr = buffer;
  13079. buffer = tmp;
  13080. }
  13081. return arr;
  13082. }
  13083. // Run a single pass with the given chunk size.
  13084. var pass = function(arr, comp, chk, result) {
  13085. var len = arr.length;
  13086. var i = 0;
  13087. // Step size / double chunk size.
  13088. var dbl = chk * 2;
  13089. // Bounds of the left and right chunks.
  13090. var l, r, e;
  13091. // Iterators over the left and right chunk.
  13092. var li, ri;
  13093. // Iterate over pairs of chunks.
  13094. for (l = 0; l < len; l += dbl) {
  13095. r = l + chk;
  13096. e = r + chk;
  13097. if (r > len) r = len;
  13098. if (e > len) e = len;
  13099. // Iterate both chunks in parallel.
  13100. li = l;
  13101. ri = r;
  13102. while (true) {
  13103. // Compare the chunks.
  13104. if (li < r && ri < e) {
  13105. // This works for a regular `sort()` compatible comparator,
  13106. // but also for a simple comparator like: `a > b`
  13107. if (comp(arr[li], arr[ri]) <= 0) {
  13108. result[i++] = arr[li++];
  13109. }
  13110. else {
  13111. result[i++] = arr[ri++];
  13112. }
  13113. }
  13114. // Nothing to compare, just flush what's left.
  13115. else if (li < r) {
  13116. result[i++] = arr[li++];
  13117. }
  13118. else if (ri < e) {
  13119. result[i++] = arr[ri++];
  13120. }
  13121. // Both iterators are at the chunk ends.
  13122. else {
  13123. break;
  13124. }
  13125. }
  13126. }
  13127. };
  13128. // Export using CommonJS or to the window.
  13129. if (true) {
  13130. module.exports = stable;
  13131. }
  13132. else {}
  13133. })();
  13134. /***/ }),
  13135. /* 84 */
  13136. /***/ (function(module, exports, __webpack_require__) {
  13137. /**
  13138. * @author Richard Davey <rich@photonstorm.com>
  13139. * @author Felipe Alfonso <@bitnenfer>
  13140. * @copyright 2018 Photon Storm Ltd.
  13141. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  13142. */
  13143. var Class = __webpack_require__(0);
  13144. var Utils = __webpack_require__(21);
  13145. /**
  13146. * @classdesc
  13147. * WebGLPipeline is a class that describes the way elements will be rendererd
  13148. * in WebGL, specially focused on batching vertices (batching is not provided).
  13149. * Pipelines are mostly used for describing 2D rendering passes but it's
  13150. * flexible enough to be used for any type of rendering including 3D.
  13151. * Internally WebGLPipeline will handle things like compiling shaders,
  13152. * creating vertex buffers, assigning primitive topology and binding
  13153. * vertex attributes.
  13154. *
  13155. * The config properties are:
  13156. * - game: Current game instance.
  13157. * - renderer: Current WebGL renderer.
  13158. * - gl: Current WebGL context.
  13159. * - topology: This indicates how the primitives are rendered. The default value is GL_TRIANGLES.
  13160. * Here is the full list of rendering primitives (https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants).
  13161. * - vertShader: Source for vertex shader as a string.
  13162. * - fragShader: Source for fragment shader as a string.
  13163. * - vertexCapacity: The amount of vertices that shall be allocated
  13164. * - vertexSize: The size of a single vertex in bytes.
  13165. * - vertices: An optional buffer of vertices
  13166. * - attributes: An array describing the vertex attributes
  13167. *
  13168. * The vertex attributes properties are:
  13169. * - name : String - Name of the attribute in the vertex shader
  13170. * - size : integer - How many components describe the attribute. For ex: vec3 = size of 3, float = size of 1
  13171. * - type : GLenum - WebGL type (gl.BYTE, gl.SHORT, gl.UNSIGNED_BYTE, gl.UNSIGNED_SHORT, gl.FLOAT)
  13172. * - normalized : boolean - Is the attribute normalized
  13173. * - offset : integer - The offset in bytes to the current attribute in the vertex. Equivalent to offsetof(vertex, attrib) in C
  13174. * Here you can find more information of how to describe an attribute:
  13175. * - https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/vertexAttribPointer
  13176. *
  13177. * @class WebGLPipeline
  13178. * @memberOf Phaser.Renderer.WebGL
  13179. * @constructor
  13180. * @since 3.0.0
  13181. *
  13182. * @param {object} config - [description]
  13183. */
  13184. var WebGLPipeline = new Class({
  13185. initialize:
  13186. function WebGLPipeline (config)
  13187. {
  13188. /**
  13189. * Name of the Pipeline. Used for identifying
  13190. *
  13191. * @name Phaser.Renderer.WebGL.WebGLPipeline#name
  13192. * @type {string}
  13193. * @since 3.0.0
  13194. */
  13195. this.name = 'WebGLPipeline';
  13196. /**
  13197. * [description]
  13198. *
  13199. * @name Phaser.Renderer.WebGL.WebGLPipeline#game
  13200. * @type {Phaser.Game}
  13201. * @since 3.0.0
  13202. */
  13203. this.game = config.game;
  13204. /**
  13205. * [description]
  13206. *
  13207. * @name Phaser.Renderer.WebGL.WebGLPipeline#view
  13208. * @type {HTMLCanvasElement}
  13209. * @since 3.0.0
  13210. */
  13211. this.view = config.game.canvas;
  13212. /**
  13213. * Used to store the current game resolution
  13214. *
  13215. * @name Phaser.Renderer.WebGL.WebGLPipeline#resolution
  13216. * @type {number}
  13217. * @since 3.0.0
  13218. */
  13219. this.resolution = config.game.config.resolution;
  13220. /**
  13221. * Width of the current viewport
  13222. *
  13223. * @name Phaser.Renderer.WebGL.WebGLPipeline#width
  13224. * @type {number}
  13225. * @since 3.0.0
  13226. */
  13227. this.width = config.game.config.width * this.resolution;
  13228. /**
  13229. * Height of the current viewport
  13230. *
  13231. * @name Phaser.Renderer.WebGL.WebGLPipeline#height
  13232. * @type {number}
  13233. * @since 3.0.0
  13234. */
  13235. this.height = config.game.config.height * this.resolution;
  13236. /**
  13237. * [description]
  13238. *
  13239. * @name Phaser.Renderer.WebGL.WebGLPipeline#gl
  13240. * @type {WebGLRenderingContext}
  13241. * @since 3.0.0
  13242. */
  13243. this.gl = config.gl;
  13244. /**
  13245. * How many vertices have been fed to the current pipeline.
  13246. *
  13247. * @name Phaser.Renderer.WebGL.WebGLPipeline#vertexCount
  13248. * @type {number}
  13249. * @default 0
  13250. * @since 3.0.0
  13251. */
  13252. this.vertexCount = 0;
  13253. /**
  13254. * The limit of vertices that the pipeline can hold
  13255. *
  13256. * @name Phaser.Renderer.WebGL.WebGLPipeline#vertexCapacity
  13257. * @type {integer}
  13258. * @since 3.0.0
  13259. */
  13260. this.vertexCapacity = config.vertexCapacity;
  13261. /**
  13262. * [description]
  13263. *
  13264. * @name Phaser.Renderer.WebGL.WebGLPipeline#renderer
  13265. * @type {Phaser.Renderer.WebGL.WebGLRenderer}
  13266. * @since 3.0.0
  13267. */
  13268. this.renderer = config.renderer;
  13269. /**
  13270. * Raw byte buffer of vertices.
  13271. *
  13272. * @name Phaser.Renderer.WebGL.WebGLPipeline#vertexData
  13273. * @type {ArrayBuffer}
  13274. * @since 3.0.0
  13275. */
  13276. this.vertexData = (config.vertices ? config.vertices : new ArrayBuffer(config.vertexCapacity * config.vertexSize));
  13277. /**
  13278. * The handle to a WebGL vertex buffer object.
  13279. *
  13280. * @name Phaser.Renderer.WebGL.WebGLPipeline#vertexBuffer
  13281. * @type {WebGLBuffer}
  13282. * @since 3.0.0
  13283. */
  13284. this.vertexBuffer = this.renderer.createVertexBuffer((config.vertices ? config.vertices : this.vertexData.byteLength), this.gl.STREAM_DRAW);
  13285. /**
  13286. * The handle to a WebGL program
  13287. *
  13288. * @name Phaser.Renderer.WebGL.WebGLPipeline#program
  13289. * @type {WebGLProgram}
  13290. * @since 3.0.0
  13291. */
  13292. this.program = this.renderer.createProgram(config.vertShader, config.fragShader);
  13293. /**
  13294. * Array of objects that describe the vertex attributes
  13295. *
  13296. * @name Phaser.Renderer.WebGL.WebGLPipeline#attributes
  13297. * @type {object}
  13298. * @since 3.0.0
  13299. */
  13300. this.attributes = config.attributes;
  13301. /**
  13302. * The size in bytes of the vertex
  13303. *
  13304. * @name Phaser.Renderer.WebGL.WebGLPipeline#vertexSize
  13305. * @type {integer}
  13306. * @since 3.0.0
  13307. */
  13308. this.vertexSize = config.vertexSize;
  13309. /**
  13310. * The primitive topology which the pipeline will use to submit draw calls
  13311. *
  13312. * @name Phaser.Renderer.WebGL.WebGLPipeline#topology
  13313. * @type {integer}
  13314. * @since 3.0.0
  13315. */
  13316. this.topology = config.topology;
  13317. /**
  13318. * Uint8 view to the vertex raw buffer. Used for uploading vertex buffer resources
  13319. * to the GPU.
  13320. *
  13321. * @name Phaser.Renderer.WebGL.WebGLPipeline#bytes
  13322. * @type {Uint8Array}
  13323. * @since 3.0.0
  13324. */
  13325. this.bytes = new Uint8Array(this.vertexData);
  13326. /**
  13327. * This will store the amount of components of 32 bit length
  13328. *
  13329. * @name Phaser.Renderer.WebGL.WebGLPipeline#vertexComponentCount
  13330. * @type {integer}
  13331. * @since 3.0.0
  13332. */
  13333. this.vertexComponentCount = Utils.getComponentCount(config.attributes, this.gl);
  13334. /**
  13335. * Indicates if the current pipeline is flushing the contents to the GPU.
  13336. * When the variable is set the flush function will be locked.
  13337. *
  13338. * @name Phaser.Renderer.WebGL.WebGLPipeline#flushLocked
  13339. * @type {boolean}
  13340. * @since 3.1.0
  13341. */
  13342. this.flushLocked = false;
  13343. /**
  13344. * Indicates if the current pipeline is active or not for this frame only.
  13345. * Reset in the onRender method.
  13346. *
  13347. * @name Phaser.Renderer.WebGL.WebGLPipeline#active
  13348. * @type {boolean}
  13349. * @since 3.10.0
  13350. */
  13351. this.active = false;
  13352. },
  13353. /**
  13354. * Called when the Game has fully booted and the Renderer has finished setting up.
  13355. *
  13356. * By this stage all Game level systems are now in place and you can perform any final
  13357. * tasks that the pipeline may need that relied on game systems such as the Texture Manager.
  13358. *
  13359. * @method Phaser.Renderer.WebGL.WebGLPipeline#boot
  13360. * @since 3.11.0
  13361. */
  13362. boot: function ()
  13363. {
  13364. },
  13365. /**
  13366. * Adds a description of vertex attribute to the pipeline
  13367. *
  13368. * @method Phaser.Renderer.WebGL.WebGLPipeline#addAttribute
  13369. * @since 3.2.0
  13370. *
  13371. * @param {string} name - Name of the vertex attribute
  13372. * @param {integer} size - Vertex component size
  13373. * @param {integer} type - Type of the attribute
  13374. * @param {boolean} normalized - Is the value normalized to a range
  13375. * @param {integer} offset - Byte offset to the beginning of the first element in the vertex
  13376. *
  13377. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13378. */
  13379. addAttribute: function (name, size, type, normalized, offset)
  13380. {
  13381. this.attributes.push({
  13382. name: name,
  13383. size: size,
  13384. type: this.renderer.glFormats[type],
  13385. normalized: normalized,
  13386. offset: offset
  13387. });
  13388. return this;
  13389. },
  13390. /**
  13391. * Check if the current batch of vertices is full.
  13392. *
  13393. * @method Phaser.Renderer.WebGL.WebGLPipeline#shouldFlush
  13394. * @since 3.0.0
  13395. *
  13396. * @return {boolean} [description]
  13397. */
  13398. shouldFlush: function ()
  13399. {
  13400. return (this.vertexCount >= this.vertexCapacity);
  13401. },
  13402. /**
  13403. * Resizes the properties used to describe the viewport
  13404. *
  13405. * @method Phaser.Renderer.WebGL.WebGLPipeline#resize
  13406. * @since 3.0.0
  13407. *
  13408. * @param {number} width - [description]
  13409. * @param {number} height - [description]
  13410. * @param {number} resolution - [description]
  13411. *
  13412. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13413. */
  13414. resize: function (width, height, resolution)
  13415. {
  13416. this.width = width * resolution;
  13417. this.height = height * resolution;
  13418. return this;
  13419. },
  13420. /**
  13421. * Binds the pipeline resources, including programs, vertex buffers and binds attributes
  13422. *
  13423. * @method Phaser.Renderer.WebGL.WebGLPipeline#bind
  13424. * @since 3.0.0
  13425. *
  13426. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13427. */
  13428. bind: function ()
  13429. {
  13430. var gl = this.gl;
  13431. var vertexBuffer = this.vertexBuffer;
  13432. var attributes = this.attributes;
  13433. var program = this.program;
  13434. var renderer = this.renderer;
  13435. var vertexSize = this.vertexSize;
  13436. renderer.setProgram(program);
  13437. renderer.setVertexBuffer(vertexBuffer);
  13438. for (var index = 0; index < attributes.length; ++index)
  13439. {
  13440. var element = attributes[index];
  13441. var location = gl.getAttribLocation(program, element.name);
  13442. if (location >= 0)
  13443. {
  13444. gl.enableVertexAttribArray(location);
  13445. gl.vertexAttribPointer(location, element.size, element.type, element.normalized, vertexSize, element.offset);
  13446. }
  13447. else
  13448. {
  13449. gl.disableVertexAttribArray(location);
  13450. }
  13451. }
  13452. return this;
  13453. },
  13454. /**
  13455. * [description]
  13456. *
  13457. * @method Phaser.Renderer.WebGL.WebGLPipeline#onBind
  13458. * @since 3.0.0
  13459. *
  13460. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13461. */
  13462. onBind: function ()
  13463. {
  13464. // This is for updating uniform data it's called on each bind attempt.
  13465. return this;
  13466. },
  13467. /**
  13468. * [description]
  13469. *
  13470. * @method Phaser.Renderer.WebGL.WebGLPipeline#onPreRender
  13471. * @since 3.0.0
  13472. *
  13473. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13474. */
  13475. onPreRender: function ()
  13476. {
  13477. // called once every frame
  13478. return this;
  13479. },
  13480. /**
  13481. * [description]
  13482. *
  13483. * @method Phaser.Renderer.WebGL.WebGLPipeline#onRender
  13484. * @since 3.0.0
  13485. *
  13486. * @param {Phaser.Scene} scene - [description]
  13487. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  13488. *
  13489. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13490. */
  13491. onRender: function ()
  13492. {
  13493. // called for each camera
  13494. return this;
  13495. },
  13496. /**
  13497. * [description]
  13498. *
  13499. * @method Phaser.Renderer.WebGL.WebGLPipeline#onPostRender
  13500. * @since 3.0.0
  13501. *
  13502. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13503. */
  13504. onPostRender: function ()
  13505. {
  13506. // called once every frame
  13507. return this;
  13508. },
  13509. /**
  13510. * Uploads the vertex data and emits a draw call
  13511. * for the current batch of vertices.
  13512. *
  13513. * @method Phaser.Renderer.WebGL.WebGLPipeline#flush
  13514. * @since 3.0.0
  13515. *
  13516. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13517. */
  13518. flush: function ()
  13519. {
  13520. if (this.flushLocked) { return this; }
  13521. this.flushLocked = true;
  13522. var gl = this.gl;
  13523. var vertexCount = this.vertexCount;
  13524. var topology = this.topology;
  13525. var vertexSize = this.vertexSize;
  13526. if (vertexCount === 0)
  13527. {
  13528. this.flushLocked = false;
  13529. return;
  13530. }
  13531. gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bytes.subarray(0, vertexCount * vertexSize));
  13532. gl.drawArrays(topology, 0, vertexCount);
  13533. this.vertexCount = 0;
  13534. this.flushLocked = false;
  13535. return this;
  13536. },
  13537. /**
  13538. * [description]
  13539. *
  13540. * @method Phaser.Renderer.WebGL.WebGLPipeline#destroy
  13541. * @since 3.0.0
  13542. *
  13543. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13544. */
  13545. destroy: function ()
  13546. {
  13547. var gl = this.gl;
  13548. gl.deleteProgram(this.program);
  13549. gl.deleteBuffer(this.vertexBuffer);
  13550. delete this.program;
  13551. delete this.vertexBuffer;
  13552. delete this.gl;
  13553. return this;
  13554. },
  13555. /**
  13556. * Set a uniform value of the current pipeline program.
  13557. *
  13558. * @method Phaser.Renderer.WebGL.WebGLPipeline#setFloat1
  13559. * @since 3.2.0
  13560. *
  13561. * @param {string} name - [description]
  13562. * @param {number} x - [description]
  13563. *
  13564. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13565. */
  13566. setFloat1: function (name, x)
  13567. {
  13568. this.renderer.setFloat1(this.program, name, x);
  13569. return this;
  13570. },
  13571. /**
  13572. * Set a uniform value of the current pipeline program.
  13573. *
  13574. * @method Phaser.Renderer.WebGL.WebGLPipeline#setFloat2
  13575. * @since 3.2.0
  13576. *
  13577. * @param {string} name - [description]
  13578. * @param {number} x - [description]
  13579. * @param {number} y - [description]
  13580. *
  13581. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13582. */
  13583. setFloat2: function (name, x, y)
  13584. {
  13585. this.renderer.setFloat2(this.program, name, x, y);
  13586. return this;
  13587. },
  13588. /**
  13589. * Set a uniform value of the current pipeline program.
  13590. *
  13591. * @method Phaser.Renderer.WebGL.WebGLPipeline#setFloat3
  13592. * @since 3.2.0
  13593. *
  13594. * @param {string} name - [description]
  13595. * @param {number} x - [description]
  13596. * @param {number} y - [description]
  13597. * @param {number} z - [description]
  13598. *
  13599. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13600. */
  13601. setFloat3: function (name, x, y, z)
  13602. {
  13603. this.renderer.setFloat3(this.program, name, x, y, z);
  13604. return this;
  13605. },
  13606. /**
  13607. * Set a uniform value of the current pipeline program.
  13608. *
  13609. * @method Phaser.Renderer.WebGL.WebGLPipeline#setFloat4
  13610. * @since 3.2.0
  13611. *
  13612. * @param {string} name - Name of the uniform
  13613. * @param {number} x - X component of the uniform
  13614. * @param {number} y - Y component of the uniform
  13615. * @param {number} z - Z component of the uniform
  13616. * @param {number} w - W component of the uniform
  13617. *
  13618. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13619. */
  13620. setFloat4: function (name, x, y, z, w)
  13621. {
  13622. this.renderer.setFloat4(this.program, name, x, y, z, w);
  13623. return this;
  13624. },
  13625. /**
  13626. * Set a uniform value of the current pipeline program.
  13627. *
  13628. * @method Phaser.Renderer.WebGL.WebGLPipeline#setInt1
  13629. * @since 3.2.0
  13630. *
  13631. * @param {string} name - [description]
  13632. * @param {integer} x - [description]
  13633. *
  13634. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13635. */
  13636. setInt1: function (name, x)
  13637. {
  13638. this.renderer.setInt1(this.program, name, x);
  13639. return this;
  13640. },
  13641. /**
  13642. * Set a uniform value of the current pipeline program.
  13643. *
  13644. * @method Phaser.Renderer.WebGL.WebGLPipeline#setInt2
  13645. * @since 3.2.0
  13646. *
  13647. * @param {string} name - [description]
  13648. * @param {integer} x - [description]
  13649. * @param {integer} y - [description]
  13650. *
  13651. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13652. */
  13653. setInt2: function (name, x, y)
  13654. {
  13655. this.renderer.setInt2(this.program, name, x, y);
  13656. return this;
  13657. },
  13658. /**
  13659. * Set a uniform value of the current pipeline program.
  13660. *
  13661. * @method Phaser.Renderer.WebGL.WebGLPipeline#setInt3
  13662. * @since 3.2.0
  13663. *
  13664. * @param {string} name - [description]
  13665. * @param {integer} x - [description]
  13666. * @param {integer} y - [description]
  13667. * @param {integer} z - [description]
  13668. *
  13669. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13670. */
  13671. setInt3: function (name, x, y, z)
  13672. {
  13673. this.renderer.setInt3(this.program, name, x, y, z);
  13674. return this;
  13675. },
  13676. /**
  13677. * Set a uniform value of the current pipeline program.
  13678. *
  13679. * @method Phaser.Renderer.WebGL.WebGLPipeline#setInt4
  13680. * @since 3.2.0
  13681. *
  13682. * @param {string} name - Name of the uniform
  13683. * @param {integer} x - X component of the uniform
  13684. * @param {integer} y - Y component of the uniform
  13685. * @param {integer} z - Z component of the uniform
  13686. * @param {integer} w - W component of the uniform
  13687. *
  13688. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13689. */
  13690. setInt4: function (name, x, y, z, w)
  13691. {
  13692. this.renderer.setInt4(this.program, name, x, y, z, w);
  13693. return this;
  13694. },
  13695. /**
  13696. * Set a uniform value of the current pipeline program.
  13697. * [description]
  13698. *
  13699. * @method Phaser.Renderer.WebGL.WebGLPipeline#setMatrix2
  13700. * @since 3.2.0
  13701. *
  13702. * @param {string} name - [description]
  13703. * @param {boolean} transpose - [description]
  13704. * @param {Float32Array} matrix - [description]
  13705. *
  13706. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13707. */
  13708. setMatrix2: function (name, transpose, matrix)
  13709. {
  13710. this.renderer.setMatrix2(this.program, name, transpose, matrix);
  13711. return this;
  13712. },
  13713. /**
  13714. * Set a uniform value of the current pipeline program.
  13715. * [description]
  13716. * [description]
  13717. *
  13718. * @method Phaser.Renderer.WebGL.WebGLPipeline#setMatrix3
  13719. * @since 3.2.0
  13720. *
  13721. * @param {string} name - [description]
  13722. * @param {boolean} transpose - [description]
  13723. * @param {Float32Array} matrix - [description]
  13724. *
  13725. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13726. */
  13727. setMatrix3: function (name, transpose, matrix)
  13728. {
  13729. this.renderer.setMatrix3(this.program, name, transpose, matrix);
  13730. return this;
  13731. },
  13732. /**
  13733. * Set a uniform value of the current pipeline program.
  13734. *
  13735. * @method Phaser.Renderer.WebGL.WebGLPipeline#setMatrix4
  13736. * @since 3.2.0
  13737. *
  13738. * @param {string} name - Name of the uniform
  13739. * @param {boolean} transpose - Should the matrix be transpose
  13740. * @param {Float32Array} matrix - Matrix data
  13741. *
  13742. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  13743. */
  13744. setMatrix4: function (name, transpose, matrix)
  13745. {
  13746. this.renderer.setMatrix4(this.program, name, transpose, matrix);
  13747. return this;
  13748. }
  13749. });
  13750. module.exports = WebGLPipeline;
  13751. /***/ }),
  13752. /* 85 */
  13753. /***/ (function(module, exports) {
  13754. /**
  13755. * @author Richard Davey <rich@photonstorm.com>
  13756. * @copyright 2018 Photon Storm Ltd.
  13757. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  13758. */
  13759. /**
  13760. * Checks if the given `width` and `height` are a power of two.
  13761. * Useful for checking texture dimensions.
  13762. *
  13763. * @function Phaser.Math.Pow2.IsSizePowerOfTwo
  13764. * @since 3.0.0
  13765. *
  13766. * @param {number} width - The width.
  13767. * @param {number} height - The height.
  13768. *
  13769. * @return {boolean} `true` if `width` and `height` are a power of two, otherwise `false`.
  13770. */
  13771. var IsSizePowerOfTwo = function (width, height)
  13772. {
  13773. return (width > 0 && (width & (width - 1)) === 0 && height > 0 && (height & (height - 1)) === 0);
  13774. };
  13775. module.exports = IsSizePowerOfTwo;
  13776. /***/ }),
  13777. /* 86 */
  13778. /***/ (function(module, exports, __webpack_require__) {
  13779. /**
  13780. * @author Richard Davey <rich@photonstorm.com>
  13781. * @copyright 2018 Photon Storm Ltd.
  13782. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  13783. */
  13784. var Class = __webpack_require__(0);
  13785. var FromPoints = __webpack_require__(268);
  13786. var Rectangle = __webpack_require__(13);
  13787. var Vector2 = __webpack_require__(6);
  13788. /**
  13789. * @classdesc
  13790. * A Base Curve class, which all other curve types extend.
  13791. *
  13792. * Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
  13793. *
  13794. * @class Curve
  13795. * @memberOf Phaser.Curves
  13796. * @constructor
  13797. * @since 3.0.0
  13798. *
  13799. * @param {string} type - [description]
  13800. */
  13801. var Curve = new Class({
  13802. initialize:
  13803. function Curve (type)
  13804. {
  13805. /**
  13806. * String based identifier for the type of curve.
  13807. *
  13808. * @name Phaser.Curves.Curve#type
  13809. * @type {string}
  13810. * @since 3.0.0
  13811. */
  13812. this.type = type;
  13813. /**
  13814. * The default number of divisions within the curve.
  13815. *
  13816. * @name Phaser.Curves.Curve#defaultDivisions
  13817. * @type {integer}
  13818. * @default 5
  13819. * @since 3.0.0
  13820. */
  13821. this.defaultDivisions = 5;
  13822. /**
  13823. * The quantity of arc length divisions within the curve.
  13824. *
  13825. * @name Phaser.Curves.Curve#arcLengthDivisions
  13826. * @type {integer}
  13827. * @default 100
  13828. * @since 3.0.0
  13829. */
  13830. this.arcLengthDivisions = 100;
  13831. /**
  13832. * An array of cached arc length values.
  13833. *
  13834. * @name Phaser.Curves.Curve#cacheArcLengths
  13835. * @type {number[]}
  13836. * @default []
  13837. * @since 3.0.0
  13838. */
  13839. this.cacheArcLengths = [];
  13840. /**
  13841. * Does the data of this curve need updating?
  13842. *
  13843. * @name Phaser.Curves.Curve#needsUpdate
  13844. * @type {boolean}
  13845. * @default true
  13846. * @since 3.0.0
  13847. */
  13848. this.needsUpdate = true;
  13849. /**
  13850. * [description]
  13851. *
  13852. * @name Phaser.Curves.Curve#active
  13853. * @type {boolean}
  13854. * @default true
  13855. * @since 3.0.0
  13856. */
  13857. this.active = true;
  13858. /**
  13859. * A temporary calculation Vector.
  13860. *
  13861. * @name Phaser.Curves.Curve#_tmpVec2A
  13862. * @type {Phaser.Math.Vector2}
  13863. * @private
  13864. * @since 3.0.0
  13865. */
  13866. this._tmpVec2A = new Vector2();
  13867. /**
  13868. * A temporary calculation Vector.
  13869. *
  13870. * @name Phaser.Curves.Curve#_tmpVec2B
  13871. * @type {Phaser.Math.Vector2}
  13872. * @private
  13873. * @since 3.0.0
  13874. */
  13875. this._tmpVec2B = new Vector2();
  13876. },
  13877. /**
  13878. * Draws this curve on the given Graphics object.
  13879. *
  13880. * The curve is drawn using `Graphics.strokePoints` so will be drawn at whatever the present Graphics stroke color is.
  13881. * The Graphics object is not cleared before the draw, so the curve will appear on-top of anything else already rendered to it.
  13882. *
  13883. * @method Phaser.Curves.Curve#draw
  13884. * @since 3.0.0
  13885. *
  13886. * @generic {Phaser.GameObjects.Graphics} G - [graphics,$return]
  13887. *
  13888. * @param {Phaser.GameObjects.Graphics} graphics - The Graphics instance onto which this curve will be drawn.
  13889. * @param {integer} [pointsTotal=32] - The resolution of the curve. The higher the value the smoother it will render, at the cost of rendering performance.
  13890. *
  13891. * @return {Phaser.GameObjects.Graphics} The Graphics object to which the curve was drawn.
  13892. */
  13893. draw: function (graphics, pointsTotal)
  13894. {
  13895. if (pointsTotal === undefined) { pointsTotal = 32; }
  13896. // So you can chain graphics calls
  13897. return graphics.strokePoints(this.getPoints(pointsTotal));
  13898. },
  13899. /**
  13900. * Returns a Rectangle where the position and dimensions match the bounds of this Curve.
  13901. *
  13902. * You can control the accuracy of the bounds. The value given is used to work out how many points
  13903. * to plot across the curve. Higher values are more accurate at the cost of calculation speed.
  13904. *
  13905. * @method Phaser.Curves.Curve#getBounds
  13906. * @since 3.0.0
  13907. *
  13908. * @param {Phaser.Geom.Rectangle} [out] - The Rectangle to store the bounds in. If falsey a new object will be created.
  13909. * @param {integer} [accuracy=16] - The accuracy of the bounds calculations.
  13910. *
  13911. * @return {Phaser.Geom.Rectangle} A Rectangle object holding the bounds of this curve. If `out` was given it will be this object.
  13912. */
  13913. getBounds: function (out, accuracy)
  13914. {
  13915. if (!out) { out = new Rectangle(); }
  13916. if (accuracy === undefined) { accuracy = 16; }
  13917. var len = this.getLength();
  13918. if (accuracy > len)
  13919. {
  13920. accuracy = len / 2;
  13921. }
  13922. // The length of the curve in pixels
  13923. // So we'll have 1 spaced point per 'accuracy' pixels
  13924. var spaced = Math.max(1, Math.round(len / accuracy));
  13925. return FromPoints(this.getSpacedPoints(spaced), out);
  13926. },
  13927. /**
  13928. * Returns an array of points, spaced out X distance pixels apart.
  13929. * The smaller the distance, the larger the array will be.
  13930. *
  13931. * @method Phaser.Curves.Curve#getDistancePoints
  13932. * @since 3.0.0
  13933. *
  13934. * @param {integer} distance - The distance, in pixels, between each point along the curve.
  13935. *
  13936. * @return {Phaser.Geom.Point[]} An Array of Point objects.
  13937. */
  13938. getDistancePoints: function (distance)
  13939. {
  13940. var len = this.getLength();
  13941. var spaced = Math.max(1, len / distance);
  13942. return this.getSpacedPoints(spaced);
  13943. },
  13944. /**
  13945. * [description]
  13946. *
  13947. * @method Phaser.Curves.Curve#getEndPoint
  13948. * @since 3.0.0
  13949. *
  13950. * @param {Phaser.Math.Vector2} out - [description]
  13951. *
  13952. * @return {Phaser.Math.Vector2} [description]
  13953. */
  13954. getEndPoint: function (out)
  13955. {
  13956. if (out === undefined) { out = new Vector2(); }
  13957. return this.getPointAt(1, out);
  13958. },
  13959. // Get total curve arc length
  13960. /**
  13961. * [description]
  13962. *
  13963. * @method Phaser.Curves.Curve#getLength
  13964. * @since 3.0.0
  13965. *
  13966. * @return {number} [description]
  13967. */
  13968. getLength: function ()
  13969. {
  13970. var lengths = this.getLengths();
  13971. return lengths[lengths.length - 1];
  13972. },
  13973. // Get list of cumulative segment lengths
  13974. /**
  13975. * [description]
  13976. *
  13977. * @method Phaser.Curves.Curve#getLengths
  13978. * @since 3.0.0
  13979. *
  13980. * @param {integer} [divisions] - [description]
  13981. *
  13982. * @return {number[]} [description]
  13983. */
  13984. getLengths: function (divisions)
  13985. {
  13986. if (divisions === undefined) { divisions = this.arcLengthDivisions; }
  13987. if ((this.cacheArcLengths.length === divisions + 1) && !this.needsUpdate)
  13988. {
  13989. return this.cacheArcLengths;
  13990. }
  13991. this.needsUpdate = false;
  13992. var cache = [];
  13993. var current;
  13994. var last = this.getPoint(0, this._tmpVec2A);
  13995. var sum = 0;
  13996. cache.push(0);
  13997. for (var p = 1; p <= divisions; p++)
  13998. {
  13999. current = this.getPoint(p / divisions, this._tmpVec2B);
  14000. sum += current.distance(last);
  14001. cache.push(sum);
  14002. last.copy(current);
  14003. }
  14004. this.cacheArcLengths = cache;
  14005. return cache; // { sums: cache, sum:sum }; Sum is in the last element.
  14006. },
  14007. // Get point at relative position in curve according to arc length
  14008. // - u [0 .. 1]
  14009. /**
  14010. * [description]
  14011. *
  14012. * @method Phaser.Curves.Curve#getPointAt
  14013. * @since 3.0.0
  14014. *
  14015. * @generic {Phaser.Math.Vector2} O - [out,$return]
  14016. *
  14017. * @param {number} u - [description]
  14018. * @param {Phaser.Math.Vector2} [out] - [description]
  14019. *
  14020. * @return {Phaser.Math.Vector2} [description]
  14021. */
  14022. getPointAt: function (u, out)
  14023. {
  14024. var t = this.getUtoTmapping(u);
  14025. return this.getPoint(t, out);
  14026. },
  14027. // Get sequence of points using getPoint( t )
  14028. /**
  14029. * [description]
  14030. *
  14031. * @method Phaser.Curves.Curve#getPoints
  14032. * @since 3.0.0
  14033. *
  14034. * @param {integer} [divisions] - [description]
  14035. *
  14036. * @return {Phaser.Math.Vector2[]} [description]
  14037. */
  14038. getPoints: function (divisions)
  14039. {
  14040. if (divisions === undefined) { divisions = this.defaultDivisions; }
  14041. var points = [];
  14042. for (var d = 0; d <= divisions; d++)
  14043. {
  14044. points.push(this.getPoint(d / divisions));
  14045. }
  14046. return points;
  14047. },
  14048. /**
  14049. * [description]
  14050. *
  14051. * @method Phaser.Curves.Curve#getRandomPoint
  14052. * @since 3.0.0
  14053. *
  14054. * @generic {Phaser.Math.Vector2} O - [out,$return]
  14055. *
  14056. * @param {Phaser.Math.Vector2} [out] - [description]
  14057. *
  14058. * @return {Phaser.Math.Vector2} [description]
  14059. */
  14060. getRandomPoint: function (out)
  14061. {
  14062. if (out === undefined) { out = new Vector2(); }
  14063. return this.getPoint(Math.random(), out);
  14064. },
  14065. // Get sequence of points using getPointAt( u )
  14066. /**
  14067. * [description]
  14068. *
  14069. * @method Phaser.Curves.Curve#getSpacedPoints
  14070. * @since 3.0.0
  14071. *
  14072. * @param {integer} [divisions] - [description]
  14073. *
  14074. * @return {Phaser.Math.Vector2[]} [description]
  14075. */
  14076. getSpacedPoints: function (divisions)
  14077. {
  14078. if (divisions === undefined) { divisions = this.defaultDivisions; }
  14079. var points = [];
  14080. for (var d = 0; d <= divisions; d++)
  14081. {
  14082. var t = this.getUtoTmapping(d / divisions, null, divisions);
  14083. points.push(this.getPoint(t));
  14084. }
  14085. return points;
  14086. },
  14087. /**
  14088. * [description]
  14089. *
  14090. * @method Phaser.Curves.Curve#getStartPoint
  14091. * @since 3.0.0
  14092. *
  14093. * @generic {Phaser.Math.Vector2} O - [out,$return]
  14094. *
  14095. * @param {Phaser.Math.Vector2} [out] - [description]
  14096. *
  14097. * @return {Phaser.Math.Vector2} [description]
  14098. */
  14099. getStartPoint: function (out)
  14100. {
  14101. if (out === undefined) { out = new Vector2(); }
  14102. return this.getPointAt(0, out);
  14103. },
  14104. // Returns a unit vector tangent at t
  14105. // In case any sub curve does not implement its tangent derivation,
  14106. // 2 points a small delta apart will be used to find its gradient
  14107. // which seems to give a reasonable approximation
  14108. /**
  14109. * [description]
  14110. *
  14111. * @method Phaser.Curves.Curve#getTangent
  14112. * @since 3.0.0
  14113. *
  14114. * @generic {Phaser.Math.Vector2} O - [out,$return]
  14115. *
  14116. * @param {number} t - [description]
  14117. * @param {Phaser.Math.Vector2} [out] - [description]
  14118. *
  14119. * @return {Phaser.Math.Vector2} [description]
  14120. */
  14121. getTangent: function (t, out)
  14122. {
  14123. if (out === undefined) { out = new Vector2(); }
  14124. var delta = 0.0001;
  14125. var t1 = t - delta;
  14126. var t2 = t + delta;
  14127. // Capping in case of danger
  14128. if (t1 < 0)
  14129. {
  14130. t1 = 0;
  14131. }
  14132. if (t2 > 1)
  14133. {
  14134. t2 = 1;
  14135. }
  14136. this.getPoint(t1, this._tmpVec2A);
  14137. this.getPoint(t2, out);
  14138. return out.subtract(this._tmpVec2A).normalize();
  14139. },
  14140. /**
  14141. * [description]
  14142. *
  14143. * @method Phaser.Curves.Curve#getTangentAt
  14144. * @since 3.0.0
  14145. *
  14146. * @generic {Phaser.Math.Vector2} O - [out,$return]
  14147. *
  14148. * @param {number} u - [description]
  14149. * @param {Phaser.Math.Vector2} [out] - [description]
  14150. *
  14151. * @return {Phaser.Math.Vector2} [description]
  14152. */
  14153. getTangentAt: function (u, out)
  14154. {
  14155. var t = this.getUtoTmapping(u);
  14156. return this.getTangent(t, out);
  14157. },
  14158. // Given a distance in pixels, get a t to find p.
  14159. /**
  14160. * [description]
  14161. *
  14162. * @method Phaser.Curves.Curve#getTFromDistance
  14163. * @since 3.0.0
  14164. *
  14165. * @param {integer} distance - [description]
  14166. * @param {integer} [divisions] - [description]
  14167. *
  14168. * @return {number} [description]
  14169. */
  14170. getTFromDistance: function (distance, divisions)
  14171. {
  14172. if (distance <= 0)
  14173. {
  14174. return 0;
  14175. }
  14176. return this.getUtoTmapping(0, distance, divisions);
  14177. },
  14178. // Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant
  14179. /**
  14180. * [description]
  14181. *
  14182. * @method Phaser.Curves.Curve#getUtoTmapping
  14183. * @since 3.0.0
  14184. *
  14185. * @param {number} u - [description]
  14186. * @param {integer} distance - [description]
  14187. * @param {integer} [divisions] - [description]
  14188. *
  14189. * @return {number} [description]
  14190. */
  14191. getUtoTmapping: function (u, distance, divisions)
  14192. {
  14193. var arcLengths = this.getLengths(divisions);
  14194. var i = 0;
  14195. var il = arcLengths.length;
  14196. var targetArcLength; // The targeted u distance value to get
  14197. if (distance)
  14198. {
  14199. // Cannot overshoot the curve
  14200. targetArcLength = Math.min(distance, arcLengths[il - 1]);
  14201. }
  14202. else
  14203. {
  14204. targetArcLength = u * arcLengths[il - 1];
  14205. }
  14206. // binary search for the index with largest value smaller than target u distance
  14207. var low = 0;
  14208. var high = il - 1;
  14209. var comparison;
  14210. while (low <= high)
  14211. {
  14212. 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
  14213. comparison = arcLengths[i] - targetArcLength;
  14214. if (comparison < 0)
  14215. {
  14216. low = i + 1;
  14217. }
  14218. else if (comparison > 0)
  14219. {
  14220. high = i - 1;
  14221. }
  14222. else
  14223. {
  14224. high = i;
  14225. break;
  14226. }
  14227. }
  14228. i = high;
  14229. if (arcLengths[i] === targetArcLength)
  14230. {
  14231. return i / (il - 1);
  14232. }
  14233. // we could get finer grain at lengths, or use simple interpolation between two points
  14234. var lengthBefore = arcLengths[i];
  14235. var lengthAfter = arcLengths[i + 1];
  14236. var segmentLength = lengthAfter - lengthBefore;
  14237. // determine where we are between the 'before' and 'after' points
  14238. var segmentFraction = (targetArcLength - lengthBefore) / segmentLength;
  14239. // add that fractional amount to t
  14240. return (i + segmentFraction) / (il - 1);
  14241. },
  14242. /**
  14243. * [description]
  14244. *
  14245. * @method Phaser.Curves.Curve#updateArcLengths
  14246. * @since 3.0.0
  14247. */
  14248. updateArcLengths: function ()
  14249. {
  14250. this.needsUpdate = true;
  14251. this.getLengths();
  14252. }
  14253. });
  14254. module.exports = Curve;
  14255. /***/ }),
  14256. /* 87 */
  14257. /***/ (function(module, exports, __webpack_require__) {
  14258. /**
  14259. * @author Richard Davey <rich@photonstorm.com>
  14260. * @copyright 2018 Photon Storm Ltd.
  14261. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  14262. */
  14263. // Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji
  14264. // and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl
  14265. var Class = __webpack_require__(0);
  14266. /**
  14267. * @classdesc
  14268. * A representation of a vector in 3D space.
  14269. *
  14270. * A three-component vector.
  14271. *
  14272. * @class Vector3
  14273. * @memberOf Phaser.Math
  14274. * @constructor
  14275. * @since 3.0.0
  14276. *
  14277. * @param {number} [x] - The x component.
  14278. * @param {number} [y] - The y component.
  14279. * @param {number} [z] - The z component.
  14280. */
  14281. var Vector3 = new Class({
  14282. initialize:
  14283. function Vector3 (x, y, z)
  14284. {
  14285. /**
  14286. * The x component of this Vector.
  14287. *
  14288. * @name Phaser.Math.Vector3#x
  14289. * @type {number}
  14290. * @default 0
  14291. * @since 3.0.0
  14292. */
  14293. this.x = 0;
  14294. /**
  14295. * The y component of this Vector.
  14296. *
  14297. * @name Phaser.Math.Vector3#y
  14298. * @type {number}
  14299. * @default 0
  14300. * @since 3.0.0
  14301. */
  14302. this.y = 0;
  14303. /**
  14304. * The z component of this Vector.
  14305. *
  14306. * @name Phaser.Math.Vector3#z
  14307. * @type {number}
  14308. * @default 0
  14309. * @since 3.0.0
  14310. */
  14311. this.z = 0;
  14312. if (typeof x === 'object')
  14313. {
  14314. this.x = x.x || 0;
  14315. this.y = x.y || 0;
  14316. this.z = x.z || 0;
  14317. }
  14318. else
  14319. {
  14320. this.x = x || 0;
  14321. this.y = y || 0;
  14322. this.z = z || 0;
  14323. }
  14324. },
  14325. /**
  14326. * Set this Vector to point up.
  14327. *
  14328. * Sets the y component of the vector to 1, and the others to 0.
  14329. *
  14330. * @method Phaser.Math.Vector3#up
  14331. * @since 3.0.0
  14332. *
  14333. * @return {Phaser.Math.Vector3} This Vector3.
  14334. */
  14335. up: function ()
  14336. {
  14337. this.x = 0;
  14338. this.y = 1;
  14339. this.z = 0;
  14340. return this;
  14341. },
  14342. /**
  14343. * Make a clone of this Vector3.
  14344. *
  14345. * @method Phaser.Math.Vector3#clone
  14346. * @since 3.0.0
  14347. *
  14348. * @return {Phaser.Math.Vector3} A new Vector3 object containing this Vectors values.
  14349. */
  14350. clone: function ()
  14351. {
  14352. return new Vector3(this.x, this.y, this.z);
  14353. },
  14354. /**
  14355. * [description]
  14356. *
  14357. * @method Phaser.Math.Vector3#crossVectors
  14358. * @since 3.0.0
  14359. *
  14360. * @param {Phaser.Math.Vector3} a - [description]
  14361. * @param {Phaser.Math.Vector3} b - [description]
  14362. *
  14363. * @return {Phaser.Math.Vector3} This Vector3.
  14364. */
  14365. crossVectors: function (a, b)
  14366. {
  14367. var ax = a.x;
  14368. var ay = a.y;
  14369. var az = a.z;
  14370. var bx = b.x;
  14371. var by = b.y;
  14372. var bz = b.z;
  14373. this.x = ay * bz - az * by;
  14374. this.y = az * bx - ax * bz;
  14375. this.z = ax * by - ay * bx;
  14376. return this;
  14377. },
  14378. /**
  14379. * Check whether this Vector is equal to a given Vector.
  14380. *
  14381. * Performs a strict equality check against each Vector's components.
  14382. *
  14383. * @method Phaser.Math.Vector3#equals
  14384. * @since 3.0.0
  14385. *
  14386. * @param {Phaser.Math.Vector3} v - The Vector3 to compare against.
  14387. *
  14388. * @return {boolean} True if the two vectors strictly match, otherwise false.
  14389. */
  14390. equals: function (v)
  14391. {
  14392. return ((this.x === v.x) && (this.y === v.y) && (this.z === v.z));
  14393. },
  14394. /**
  14395. * Copy the components of a given Vector into this Vector.
  14396. *
  14397. * @method Phaser.Math.Vector3#copy
  14398. * @since 3.0.0
  14399. *
  14400. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} src - The Vector to copy the components from.
  14401. *
  14402. * @return {Phaser.Math.Vector3} This Vector3.
  14403. */
  14404. copy: function (src)
  14405. {
  14406. this.x = src.x;
  14407. this.y = src.y;
  14408. this.z = src.z || 0;
  14409. return this;
  14410. },
  14411. /**
  14412. * Set the `x`, `y`, and `z` components of this Vector to the given `x`, `y`, and `z` values.
  14413. *
  14414. * @method Phaser.Math.Vector3#set
  14415. * @since 3.0.0
  14416. *
  14417. * @param {(number|object)} x - The x value to set for this Vector, or an object containing x, y and z components.
  14418. * @param {number} [y] - The y value to set for this Vector.
  14419. * @param {number} [z] - The z value to set for this Vector.
  14420. *
  14421. * @return {Phaser.Math.Vector3} This Vector3.
  14422. */
  14423. set: function (x, y, z)
  14424. {
  14425. if (typeof x === 'object')
  14426. {
  14427. this.x = x.x || 0;
  14428. this.y = x.y || 0;
  14429. this.z = x.z || 0;
  14430. }
  14431. else
  14432. {
  14433. this.x = x || 0;
  14434. this.y = y || 0;
  14435. this.z = z || 0;
  14436. }
  14437. return this;
  14438. },
  14439. /**
  14440. * Add a given Vector to this Vector. Addition is component-wise.
  14441. *
  14442. * @method Phaser.Math.Vector3#add
  14443. * @since 3.0.0
  14444. *
  14445. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} v - The Vector to add to this Vector.
  14446. *
  14447. * @return {Phaser.Math.Vector3} This Vector3.
  14448. */
  14449. add: function (v)
  14450. {
  14451. this.x += v.x;
  14452. this.y += v.y;
  14453. this.z += v.z || 0;
  14454. return this;
  14455. },
  14456. /**
  14457. * Subtract the given Vector from this Vector. Subtraction is component-wise.
  14458. *
  14459. * @method Phaser.Math.Vector3#subtract
  14460. * @since 3.0.0
  14461. *
  14462. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} v - The Vector to subtract from this Vector.
  14463. *
  14464. * @return {Phaser.Math.Vector3} This Vector3.
  14465. */
  14466. subtract: function (v)
  14467. {
  14468. this.x -= v.x;
  14469. this.y -= v.y;
  14470. this.z -= v.z || 0;
  14471. return this;
  14472. },
  14473. /**
  14474. * Perform a component-wise multiplication between this Vector and the given Vector.
  14475. *
  14476. * Multiplies this Vector by the given Vector.
  14477. *
  14478. * @method Phaser.Math.Vector3#multiply
  14479. * @since 3.0.0
  14480. *
  14481. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} v - The Vector to multiply this Vector by.
  14482. *
  14483. * @return {Phaser.Math.Vector3} This Vector3.
  14484. */
  14485. multiply: function (v)
  14486. {
  14487. this.x *= v.x;
  14488. this.y *= v.y;
  14489. this.z *= v.z || 1;
  14490. return this;
  14491. },
  14492. /**
  14493. * Scale this Vector by the given value.
  14494. *
  14495. * @method Phaser.Math.Vector3#scale
  14496. * @since 3.0.0
  14497. *
  14498. * @param {number} scale - The value to scale this Vector by.
  14499. *
  14500. * @return {Phaser.Math.Vector3} This Vector3.
  14501. */
  14502. scale: function (scale)
  14503. {
  14504. if (isFinite(scale))
  14505. {
  14506. this.x *= scale;
  14507. this.y *= scale;
  14508. this.z *= scale;
  14509. }
  14510. else
  14511. {
  14512. this.x = 0;
  14513. this.y = 0;
  14514. this.z = 0;
  14515. }
  14516. return this;
  14517. },
  14518. /**
  14519. * Perform a component-wise division between this Vector and the given Vector.
  14520. *
  14521. * Divides this Vector by the given Vector.
  14522. *
  14523. * @method Phaser.Math.Vector3#divide
  14524. * @since 3.0.0
  14525. *
  14526. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} v - The Vector to divide this Vector by.
  14527. *
  14528. * @return {Phaser.Math.Vector3} This Vector3.
  14529. */
  14530. divide: function (v)
  14531. {
  14532. this.x /= v.x;
  14533. this.y /= v.y;
  14534. this.z /= v.z || 1;
  14535. return this;
  14536. },
  14537. /**
  14538. * Negate the `x`, `y` and `z` components of this Vector.
  14539. *
  14540. * @method Phaser.Math.Vector3#negate
  14541. * @since 3.0.0
  14542. *
  14543. * @return {Phaser.Math.Vector3} This Vector3.
  14544. */
  14545. negate: function ()
  14546. {
  14547. this.x = -this.x;
  14548. this.y = -this.y;
  14549. this.z = -this.z;
  14550. return this;
  14551. },
  14552. /**
  14553. * Calculate the distance between this Vector and the given Vector.
  14554. *
  14555. * @method Phaser.Math.Vector3#distance
  14556. * @since 3.0.0
  14557. *
  14558. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} v - The Vector to calculate the distance to.
  14559. *
  14560. * @return {number} The distance from this Vector to the given Vector.
  14561. */
  14562. distance: function (v)
  14563. {
  14564. var dx = v.x - this.x;
  14565. var dy = v.y - this.y;
  14566. var dz = v.z - this.z || 0;
  14567. return Math.sqrt(dx * dx + dy * dy + dz * dz);
  14568. },
  14569. /**
  14570. * Calculate the distance between this Vector and the given Vector, squared.
  14571. *
  14572. * @method Phaser.Math.Vector3#distanceSq
  14573. * @since 3.0.0
  14574. *
  14575. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3)} v - The Vector to calculate the distance to.
  14576. *
  14577. * @return {number} The distance from this Vector to the given Vector, squared.
  14578. */
  14579. distanceSq: function (v)
  14580. {
  14581. var dx = v.x - this.x;
  14582. var dy = v.y - this.y;
  14583. var dz = v.z - this.z || 0;
  14584. return dx * dx + dy * dy + dz * dz;
  14585. },
  14586. /**
  14587. * Calculate the length (or magnitude) of this Vector.
  14588. *
  14589. * @method Phaser.Math.Vector3#length
  14590. * @since 3.0.0
  14591. *
  14592. * @return {number} The length of this Vector.
  14593. */
  14594. length: function ()
  14595. {
  14596. var x = this.x;
  14597. var y = this.y;
  14598. var z = this.z;
  14599. return Math.sqrt(x * x + y * y + z * z);
  14600. },
  14601. /**
  14602. * Calculate the length of this Vector squared.
  14603. *
  14604. * @method Phaser.Math.Vector3#lengthSq
  14605. * @since 3.0.0
  14606. *
  14607. * @return {number} The length of this Vector, squared.
  14608. */
  14609. lengthSq: function ()
  14610. {
  14611. var x = this.x;
  14612. var y = this.y;
  14613. var z = this.z;
  14614. return x * x + y * y + z * z;
  14615. },
  14616. /**
  14617. * Normalize this Vector.
  14618. *
  14619. * Makes the vector a unit length vector (magnitude of 1) in the same direction.
  14620. *
  14621. * @method Phaser.Math.Vector3#normalize
  14622. * @since 3.0.0
  14623. *
  14624. * @return {Phaser.Math.Vector3} This Vector3.
  14625. */
  14626. normalize: function ()
  14627. {
  14628. var x = this.x;
  14629. var y = this.y;
  14630. var z = this.z;
  14631. var len = x * x + y * y + z * z;
  14632. if (len > 0)
  14633. {
  14634. len = 1 / Math.sqrt(len);
  14635. this.x = x * len;
  14636. this.y = y * len;
  14637. this.z = z * len;
  14638. }
  14639. return this;
  14640. },
  14641. /**
  14642. * Calculate the dot product of this Vector and the given Vector.
  14643. *
  14644. * @method Phaser.Math.Vector3#dot
  14645. * @since 3.0.0
  14646. *
  14647. * @param {Phaser.Math.Vector3} v - The Vector3 to dot product with this Vector3.
  14648. *
  14649. * @return {number} [description]
  14650. */
  14651. dot: function (v)
  14652. {
  14653. return this.x * v.x + this.y * v.y + this.z * v.z;
  14654. },
  14655. /**
  14656. * [description]
  14657. *
  14658. * @method Phaser.Math.Vector3#cross
  14659. * @since 3.0.0
  14660. *
  14661. * @param {Phaser.Math.Vector3} v - [description]
  14662. *
  14663. * @return {Phaser.Math.Vector3} This Vector3.
  14664. */
  14665. cross: function (v)
  14666. {
  14667. var ax = this.x;
  14668. var ay = this.y;
  14669. var az = this.z;
  14670. var bx = v.x;
  14671. var by = v.y;
  14672. var bz = v.z;
  14673. this.x = ay * bz - az * by;
  14674. this.y = az * bx - ax * bz;
  14675. this.z = ax * by - ay * bx;
  14676. return this;
  14677. },
  14678. /**
  14679. * Linearly interpolate between this Vector and the given Vector.
  14680. *
  14681. * Interpolates this Vector towards the given Vector.
  14682. *
  14683. * @method Phaser.Math.Vector3#lerp
  14684. * @since 3.0.0
  14685. *
  14686. * @param {Phaser.Math.Vector3} v - The Vector3 to interpolate towards.
  14687. * @param {number} [t=0] - The interpolation percentage, between 0 and 1.
  14688. *
  14689. * @return {Phaser.Math.Vector3} This Vector3.
  14690. */
  14691. lerp: function (v, t)
  14692. {
  14693. if (t === undefined) { t = 0; }
  14694. var ax = this.x;
  14695. var ay = this.y;
  14696. var az = this.z;
  14697. this.x = ax + t * (v.x - ax);
  14698. this.y = ay + t * (v.y - ay);
  14699. this.z = az + t * (v.z - az);
  14700. return this;
  14701. },
  14702. /**
  14703. * Transform this Vector with the given Matrix.
  14704. *
  14705. * @method Phaser.Math.Vector3#transformMat3
  14706. * @since 3.0.0
  14707. *
  14708. * @param {Phaser.Math.Matrix3} mat - The Matrix3 to transform this Vector3 with.
  14709. *
  14710. * @return {Phaser.Math.Vector3} This Vector3.
  14711. */
  14712. transformMat3: function (mat)
  14713. {
  14714. var x = this.x;
  14715. var y = this.y;
  14716. var z = this.z;
  14717. var m = mat.val;
  14718. this.x = x * m[0] + y * m[3] + z * m[6];
  14719. this.y = x * m[1] + y * m[4] + z * m[7];
  14720. this.z = x * m[2] + y * m[5] + z * m[8];
  14721. return this;
  14722. },
  14723. /**
  14724. * Transform this Vector with the given Matrix.
  14725. *
  14726. * @method Phaser.Math.Vector3#transformMat4
  14727. * @since 3.0.0
  14728. *
  14729. * @param {Phaser.Math.Matrix4} mat - The Matrix4 to transform this Vector3 with.
  14730. *
  14731. * @return {Phaser.Math.Vector3} This Vector3.
  14732. */
  14733. transformMat4: function (mat)
  14734. {
  14735. var x = this.x;
  14736. var y = this.y;
  14737. var z = this.z;
  14738. var m = mat.val;
  14739. this.x = m[0] * x + m[4] * y + m[8] * z + m[12];
  14740. this.y = m[1] * x + m[5] * y + m[9] * z + m[13];
  14741. this.z = m[2] * x + m[6] * y + m[10] * z + m[14];
  14742. return this;
  14743. },
  14744. /**
  14745. * [description]
  14746. *
  14747. * @method Phaser.Math.Vector3#transformCoordinates
  14748. * @since 3.0.0
  14749. *
  14750. * @param {Phaser.Math.Matrix4} mat - The Matrix4 to transform this Vector3 with.
  14751. *
  14752. * @return {Phaser.Math.Vector3} This Vector3.
  14753. */
  14754. transformCoordinates: function (mat)
  14755. {
  14756. var x = this.x;
  14757. var y = this.y;
  14758. var z = this.z;
  14759. var m = mat.val;
  14760. var tx = (x * m[0]) + (y * m[4]) + (z * m[8]) + m[12];
  14761. var ty = (x * m[1]) + (y * m[5]) + (z * m[9]) + m[13];
  14762. var tz = (x * m[2]) + (y * m[6]) + (z * m[10]) + m[14];
  14763. var tw = (x * m[3]) + (y * m[7]) + (z * m[11]) + m[15];
  14764. this.x = tx / tw;
  14765. this.y = ty / tw;
  14766. this.z = tz / tw;
  14767. return this;
  14768. },
  14769. /**
  14770. * Transform this Vector with the given Quaternion.
  14771. *
  14772. * @method Phaser.Math.Vector3#transformQuat
  14773. * @since 3.0.0
  14774. *
  14775. * @param {Phaser.Math.Quaternion} q - The Quaternion to transform this Vector with.
  14776. *
  14777. * @return {Phaser.Math.Vector3} This Vector3.
  14778. */
  14779. transformQuat: function (q)
  14780. {
  14781. // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations
  14782. var x = this.x;
  14783. var y = this.y;
  14784. var z = this.z;
  14785. var qx = q.x;
  14786. var qy = q.y;
  14787. var qz = q.z;
  14788. var qw = q.w;
  14789. // calculate quat * vec
  14790. var ix = qw * x + qy * z - qz * y;
  14791. var iy = qw * y + qz * x - qx * z;
  14792. var iz = qw * z + qx * y - qy * x;
  14793. var iw = -qx * x - qy * y - qz * z;
  14794. // calculate result * inverse quat
  14795. this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
  14796. this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
  14797. this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
  14798. return this;
  14799. },
  14800. /**
  14801. * Multiplies this Vector3 by the specified matrix, applying a W divide. This is useful for projection,
  14802. * e.g. unprojecting a 2D point into 3D space.
  14803. *
  14804. * @method Phaser.Math.Vector3#project
  14805. * @since 3.0.0
  14806. *
  14807. * @param {Phaser.Math.Matrix4} mat - The Matrix4 to multiply this Vector3 with.
  14808. *
  14809. * @return {Phaser.Math.Vector3} This Vector3.
  14810. */
  14811. project: function (mat)
  14812. {
  14813. var x = this.x;
  14814. var y = this.y;
  14815. var z = this.z;
  14816. var m = mat.val;
  14817. var a00 = m[0];
  14818. var a01 = m[1];
  14819. var a02 = m[2];
  14820. var a03 = m[3];
  14821. var a10 = m[4];
  14822. var a11 = m[5];
  14823. var a12 = m[6];
  14824. var a13 = m[7];
  14825. var a20 = m[8];
  14826. var a21 = m[9];
  14827. var a22 = m[10];
  14828. var a23 = m[11];
  14829. var a30 = m[12];
  14830. var a31 = m[13];
  14831. var a32 = m[14];
  14832. var a33 = m[15];
  14833. var lw = 1 / (x * a03 + y * a13 + z * a23 + a33);
  14834. this.x = (x * a00 + y * a10 + z * a20 + a30) * lw;
  14835. this.y = (x * a01 + y * a11 + z * a21 + a31) * lw;
  14836. this.z = (x * a02 + y * a12 + z * a22 + a32) * lw;
  14837. return this;
  14838. },
  14839. /**
  14840. * Unproject this point from 2D space to 3D space.
  14841. * The point should have its x and y properties set to
  14842. * 2D screen space, and the z either at 0 (near plane)
  14843. * or 1 (far plane). The provided matrix is assumed to already
  14844. * be combined, i.e. projection * view * model.
  14845. *
  14846. * After this operation, this vector's (x, y, z) components will
  14847. * represent the unprojected 3D coordinate.
  14848. *
  14849. * @method Phaser.Math.Vector3#unproject
  14850. * @since 3.0.0
  14851. *
  14852. * @param {Phaser.Math.Vector4} viewport - Screen x, y, width and height in pixels.
  14853. * @param {Phaser.Math.Matrix4} invProjectionView - Combined projection and view matrix.
  14854. *
  14855. * @return {Phaser.Math.Vector3} This Vector3.
  14856. */
  14857. unproject: function (viewport, invProjectionView)
  14858. {
  14859. var viewX = viewport.x;
  14860. var viewY = viewport.y;
  14861. var viewWidth = viewport.z;
  14862. var viewHeight = viewport.w;
  14863. var x = this.x - viewX;
  14864. var y = (viewHeight - this.y - 1) - viewY;
  14865. var z = this.z;
  14866. this.x = (2 * x) / viewWidth - 1;
  14867. this.y = (2 * y) / viewHeight - 1;
  14868. this.z = 2 * z - 1;
  14869. return this.project(invProjectionView);
  14870. },
  14871. /**
  14872. * Make this Vector the zero vector (0, 0, 0).
  14873. *
  14874. * @method Phaser.Math.Vector3#reset
  14875. * @since 3.0.0
  14876. *
  14877. * @return {Phaser.Math.Vector3} This Vector3.
  14878. */
  14879. reset: function ()
  14880. {
  14881. this.x = 0;
  14882. this.y = 0;
  14883. this.z = 0;
  14884. return this;
  14885. }
  14886. });
  14887. /*
  14888. Vector3.Zero = function ()
  14889. {
  14890. return new Vector3(0, 0, 0);
  14891. };
  14892. Vector3.Up = function ()
  14893. {
  14894. return new Vector3(0, 1.0, 0);
  14895. };
  14896. Vector3.Copy = function (source)
  14897. {
  14898. return new Vector3(source.x, source.y, source.z);
  14899. };
  14900. Vector3.TransformCoordinates = function (vector, transformation)
  14901. {
  14902. var x = (vector.x * transformation.m[0]) + (vector.y * transformation.m[4]) + (vector.z * transformation.m[8]) + transformation.m[12];
  14903. var y = (vector.x * transformation.m[1]) + (vector.y * transformation.m[5]) + (vector.z * transformation.m[9]) + transformation.m[13];
  14904. var z = (vector.x * transformation.m[2]) + (vector.y * transformation.m[6]) + (vector.z * transformation.m[10]) + transformation.m[14];
  14905. var w = (vector.x * transformation.m[3]) + (vector.y * transformation.m[7]) + (vector.z * transformation.m[11]) + transformation.m[15];
  14906. return new Vector3(x / w, y / w, z / w);
  14907. };
  14908. Vector3.TransformNormal = function (vector, transformation)
  14909. {
  14910. var x = (vector.x * transformation.m[0]) + (vector.y * transformation.m[4]) + (vector.z * transformation.m[8]);
  14911. var y = (vector.x * transformation.m[1]) + (vector.y * transformation.m[5]) + (vector.z * transformation.m[9]);
  14912. var z = (vector.x * transformation.m[2]) + (vector.y * transformation.m[6]) + (vector.z * transformation.m[10]);
  14913. return new Vector3(x, y, z);
  14914. };
  14915. Vector3.Dot = function (left, right)
  14916. {
  14917. return (left.x * right.x + left.y * right.y + left.z * right.z);
  14918. };
  14919. Vector3.Cross = function (left, right)
  14920. {
  14921. var x = left.y * right.z - left.z * right.y;
  14922. var y = left.z * right.x - left.x * right.z;
  14923. var z = left.x * right.y - left.y * right.x;
  14924. return new Vector3(x, y, z);
  14925. };
  14926. Vector3.Normalize = function (vector)
  14927. {
  14928. var newVector = Vector3.Copy(vector);
  14929. newVector.normalize();
  14930. return newVector;
  14931. };
  14932. Vector3.Distance = function (value1, value2)
  14933. {
  14934. return Math.sqrt(Vector3.DistanceSquared(value1, value2));
  14935. };
  14936. Vector3.DistanceSquared = function (value1, value2)
  14937. {
  14938. var x = value1.x - value2.x;
  14939. var y = value1.y - value2.y;
  14940. var z = value1.z - value2.z;
  14941. return (x * x) + (y * y) + (z * z);
  14942. };
  14943. */
  14944. module.exports = Vector3;
  14945. /***/ }),
  14946. /* 88 */
  14947. /***/ (function(module, exports, __webpack_require__) {
  14948. /**
  14949. * @author Richard Davey <rich@photonstorm.com>
  14950. * @copyright 2018 Photon Storm Ltd.
  14951. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  14952. */
  14953. var Class = __webpack_require__(0);
  14954. var Contains = __webpack_require__(33);
  14955. var GetPoint = __webpack_require__(303);
  14956. var GetPoints = __webpack_require__(301);
  14957. var Random = __webpack_require__(162);
  14958. /**
  14959. * @classdesc
  14960. * A Circle object.
  14961. *
  14962. * This is a geometry object, containing numerical values and related methods to inspect and modify them.
  14963. * It is not a Game Object, in that you cannot add it to the display list, and it has no texture.
  14964. * To render a Circle you should look at the capabilities of the Graphics class.
  14965. *
  14966. * @class Circle
  14967. * @memberOf Phaser.Geom
  14968. * @constructor
  14969. * @since 3.0.0
  14970. *
  14971. * @param {number} [x=0] - The x position of the center of the circle.
  14972. * @param {number} [y=0] - The y position of the center of the circle.
  14973. * @param {number} [radius=0] - The radius of the circle.
  14974. */
  14975. var Circle = new Class({
  14976. initialize:
  14977. function Circle (x, y, radius)
  14978. {
  14979. if (x === undefined) { x = 0; }
  14980. if (y === undefined) { y = 0; }
  14981. if (radius === undefined) { radius = 0; }
  14982. /**
  14983. * The x position of the center of the circle.
  14984. *
  14985. * @name Phaser.Geom.Circle#x
  14986. * @type {number}
  14987. * @default 0
  14988. * @since 3.0.0
  14989. */
  14990. this.x = x;
  14991. /**
  14992. * The y position of the center of the circle.
  14993. *
  14994. * @name Phaser.Geom.Circle#y
  14995. * @type {number}
  14996. * @default 0
  14997. * @since 3.0.0
  14998. */
  14999. this.y = y;
  15000. /**
  15001. * The internal radius of the circle.
  15002. *
  15003. * @name Phaser.Geom.Circle#_radius
  15004. * @type {number}
  15005. * @private
  15006. * @since 3.0.0
  15007. */
  15008. this._radius = radius;
  15009. /**
  15010. * The internal diameter of the circle.
  15011. *
  15012. * @name Phaser.Geom.Circle#_diameter
  15013. * @type {number}
  15014. * @private
  15015. * @since 3.0.0
  15016. */
  15017. this._diameter = radius * 2;
  15018. },
  15019. /**
  15020. * Check to see if the Circle contains the given x / y coordinates.
  15021. *
  15022. * @method Phaser.Geom.Circle#contains
  15023. * @since 3.0.0
  15024. *
  15025. * @param {number} x - The x coordinate to check within the circle.
  15026. * @param {number} y - The y coordinate to check within the circle.
  15027. *
  15028. * @return {boolean} True if the coordinates are within the circle, otherwise false.
  15029. */
  15030. contains: function (x, y)
  15031. {
  15032. return Contains(this, x, y);
  15033. },
  15034. /**
  15035. * Returns a Point object containing the coordinates of a point on the circumference of the Circle
  15036. * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point
  15037. * at 180 degrees around the circle.
  15038. *
  15039. * @method Phaser.Geom.Circle#getPoint
  15040. * @since 3.0.0
  15041. *
  15042. * @generic {Phaser.Geom.Point} O - [out,$return]
  15043. *
  15044. * @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.
  15045. * @param {(Phaser.Geom.Point|object)} [out] - An object to store the return values in. If not given a Point object will be created.
  15046. *
  15047. * @return {(Phaser.Geom.Point|object)} A Point, or point-like object, containing the coordinates of the point around the circle.
  15048. */
  15049. getPoint: function (position, point)
  15050. {
  15051. return GetPoint(this, position, point);
  15052. },
  15053. /**
  15054. * Returns an array of Point objects containing the coordinates of the points around the circumference of the Circle,
  15055. * based on the given quantity or stepRate values.
  15056. *
  15057. * @method Phaser.Geom.Circle#getPoints
  15058. * @since 3.0.0
  15059. *
  15060. * @generic {Phaser.Geom.Point[]} O - [output,$return]
  15061. *
  15062. * @param {integer} quantity - The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead.
  15063. * @param {number} [stepRate] - Sets the quantity by getting the circumference of the circle and dividing it by the stepRate.
  15064. * @param {(array|Phaser.Geom.Point[])} [output] - An array to insert the points in to. If not provided a new array will be created.
  15065. *
  15066. * @return {(array|Phaser.Geom.Point[])} An array of Point objects pertaining to the points around the circumference of the circle.
  15067. */
  15068. getPoints: function (quantity, stepRate, output)
  15069. {
  15070. return GetPoints(this, quantity, stepRate, output);
  15071. },
  15072. /**
  15073. * Returns a uniformly distributed random point from anywhere within the Circle.
  15074. *
  15075. * @method Phaser.Geom.Circle#getRandomPoint
  15076. * @since 3.0.0
  15077. *
  15078. * @generic {Phaser.Geom.Point} O - [point,$return]
  15079. *
  15080. * @param {(Phaser.Geom.Point|object)} [point] - A Point or point-like object to set the random `x` and `y` values in.
  15081. *
  15082. * @return {(Phaser.Geom.Point|object)} A Point object with the random values set in the `x` and `y` properties.
  15083. */
  15084. getRandomPoint: function (point)
  15085. {
  15086. return Random(this, point);
  15087. },
  15088. /**
  15089. * Sets the x, y and radius of this circle.
  15090. *
  15091. * @method Phaser.Geom.Circle#setTo
  15092. * @since 3.0.0
  15093. *
  15094. * @param {number} [x=0] - The x position of the center of the circle.
  15095. * @param {number} [y=0] - The y position of the center of the circle.
  15096. * @param {number} [radius=0] - The radius of the circle.
  15097. *
  15098. * @return {Phaser.Geom.Circle} This Circle object.
  15099. */
  15100. setTo: function (x, y, radius)
  15101. {
  15102. this.x = x;
  15103. this.y = y;
  15104. this._radius = radius;
  15105. this._diameter = radius * 2;
  15106. return this;
  15107. },
  15108. /**
  15109. * Sets this Circle to be empty with a radius of zero.
  15110. * Does not change its position.
  15111. *
  15112. * @method Phaser.Geom.Circle#setEmpty
  15113. * @since 3.0.0
  15114. *
  15115. * @return {Phaser.Geom.Circle} This Circle object.
  15116. */
  15117. setEmpty: function ()
  15118. {
  15119. this._radius = 0;
  15120. this._diameter = 0;
  15121. return this;
  15122. },
  15123. /**
  15124. * Sets the position of this Circle.
  15125. *
  15126. * @method Phaser.Geom.Circle#setPosition
  15127. * @since 3.0.0
  15128. *
  15129. * @param {number} [x=0] - The x position of the center of the circle.
  15130. * @param {number} [y=0] - The y position of the center of the circle.
  15131. *
  15132. * @return {Phaser.Geom.Circle} This Circle object.
  15133. */
  15134. setPosition: function (x, y)
  15135. {
  15136. if (y === undefined) { y = x; }
  15137. this.x = x;
  15138. this.y = y;
  15139. return this;
  15140. },
  15141. /**
  15142. * Checks to see if the Circle is empty: has a radius of zero.
  15143. *
  15144. * @method Phaser.Geom.Circle#isEmpty
  15145. * @since 3.0.0
  15146. *
  15147. * @return {boolean} True if the Circle is empty, otherwise false.
  15148. */
  15149. isEmpty: function ()
  15150. {
  15151. return (this._radius <= 0);
  15152. },
  15153. /**
  15154. * The radius of the Circle.
  15155. *
  15156. * @name Phaser.Geom.Circle#radius
  15157. * @type {number}
  15158. * @since 3.0.0
  15159. */
  15160. radius: {
  15161. get: function ()
  15162. {
  15163. return this._radius;
  15164. },
  15165. set: function (value)
  15166. {
  15167. this._radius = value;
  15168. this._diameter = value * 2;
  15169. }
  15170. },
  15171. /**
  15172. * The diameter of the Circle.
  15173. *
  15174. * @name Phaser.Geom.Circle#diameter
  15175. * @type {number}
  15176. * @since 3.0.0
  15177. */
  15178. diameter: {
  15179. get: function ()
  15180. {
  15181. return this._diameter;
  15182. },
  15183. set: function (value)
  15184. {
  15185. this._diameter = value;
  15186. this._radius = value * 0.5;
  15187. }
  15188. },
  15189. /**
  15190. * The left position of the Circle.
  15191. *
  15192. * @name Phaser.Geom.Circle#left
  15193. * @type {number}
  15194. * @since 3.0.0
  15195. */
  15196. left: {
  15197. get: function ()
  15198. {
  15199. return this.x - this._radius;
  15200. },
  15201. set: function (value)
  15202. {
  15203. this.x = value + this._radius;
  15204. }
  15205. },
  15206. /**
  15207. * The right position of the Circle.
  15208. *
  15209. * @name Phaser.Geom.Circle#right
  15210. * @type {number}
  15211. * @since 3.0.0
  15212. */
  15213. right: {
  15214. get: function ()
  15215. {
  15216. return this.x + this._radius;
  15217. },
  15218. set: function (value)
  15219. {
  15220. this.x = value - this._radius;
  15221. }
  15222. },
  15223. /**
  15224. * The top position of the Circle.
  15225. *
  15226. * @name Phaser.Geom.Circle#top
  15227. * @type {number}
  15228. * @since 3.0.0
  15229. */
  15230. top: {
  15231. get: function ()
  15232. {
  15233. return this.y - this._radius;
  15234. },
  15235. set: function (value)
  15236. {
  15237. this.y = value + this._radius;
  15238. }
  15239. },
  15240. /**
  15241. * The bottom position of the Circle.
  15242. *
  15243. * @name Phaser.Geom.Circle#bottom
  15244. * @type {number}
  15245. * @since 3.0.0
  15246. */
  15247. bottom: {
  15248. get: function ()
  15249. {
  15250. return this.y + this._radius;
  15251. },
  15252. set: function (value)
  15253. {
  15254. this.y = value - this._radius;
  15255. }
  15256. }
  15257. });
  15258. module.exports = Circle;
  15259. /***/ }),
  15260. /* 89 */
  15261. /***/ (function(module, exports) {
  15262. /**
  15263. * @author Richard Davey <rich@photonstorm.com>
  15264. * @copyright 2018 Photon Storm Ltd.
  15265. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  15266. */
  15267. /**
  15268. * Returns the center y coordinate from the bounds of the Game Object.
  15269. *
  15270. * @function Phaser.Display.Bounds.GetCenterY
  15271. * @since 3.0.0
  15272. *
  15273. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  15274. *
  15275. * @return {number} The center y coordinate of the bounds of the Game Object.
  15276. */
  15277. var GetCenterY = function (gameObject)
  15278. {
  15279. return gameObject.y - (gameObject.height * gameObject.originY) + (gameObject.height * 0.5);
  15280. };
  15281. module.exports = GetCenterY;
  15282. /***/ }),
  15283. /* 90 */
  15284. /***/ (function(module, exports) {
  15285. /**
  15286. * @author Richard Davey <rich@photonstorm.com>
  15287. * @copyright 2018 Photon Storm Ltd.
  15288. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  15289. */
  15290. /**
  15291. * Positions the Game Object so that the center top of its bounds aligns with the given coordinate.
  15292. *
  15293. * @function Phaser.Display.Bounds.SetCenterY
  15294. * @since 3.0.0
  15295. *
  15296. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  15297. *
  15298. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  15299. * @param {number} y - The coordinate to position the Game Object bounds on.
  15300. *
  15301. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  15302. */
  15303. var SetCenterY = function (gameObject, y)
  15304. {
  15305. var offsetY = gameObject.height * gameObject.originY;
  15306. gameObject.y = (y + offsetY) - (gameObject.height * 0.5);
  15307. return gameObject;
  15308. };
  15309. module.exports = SetCenterY;
  15310. /***/ }),
  15311. /* 91 */
  15312. /***/ (function(module, exports) {
  15313. /**
  15314. * @author Richard Davey <rich@photonstorm.com>
  15315. * @copyright 2018 Photon Storm Ltd.
  15316. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  15317. */
  15318. /**
  15319. * Positions the Game Object so that the center top of its bounds aligns with the given coordinate.
  15320. *
  15321. * @function Phaser.Display.Bounds.SetCenterX
  15322. * @since 3.0.0
  15323. *
  15324. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  15325. *
  15326. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  15327. * @param {number} x - The coordinate to position the Game Object bounds on.
  15328. *
  15329. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  15330. */
  15331. var SetCenterX = function (gameObject, x)
  15332. {
  15333. var offsetX = gameObject.width * gameObject.originX;
  15334. gameObject.x = (x + offsetX) - (gameObject.width * 0.5);
  15335. return gameObject;
  15336. };
  15337. module.exports = SetCenterX;
  15338. /***/ }),
  15339. /* 92 */
  15340. /***/ (function(module, exports) {
  15341. /**
  15342. * @author Richard Davey <rich@photonstorm.com>
  15343. * @copyright 2018 Photon Storm Ltd.
  15344. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  15345. */
  15346. /**
  15347. * Returns the center x coordinate from the bounds of the Game Object.
  15348. *
  15349. * @function Phaser.Display.Bounds.GetCenterX
  15350. * @since 3.0.0
  15351. *
  15352. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  15353. *
  15354. * @return {number} The center x coordinate of the bounds of the Game Object.
  15355. */
  15356. var GetCenterX = function (gameObject)
  15357. {
  15358. return gameObject.x - (gameObject.width * gameObject.originX) + (gameObject.width * 0.5);
  15359. };
  15360. module.exports = GetCenterX;
  15361. /***/ }),
  15362. /* 93 */
  15363. /***/ (function(module, exports, __webpack_require__) {
  15364. /**
  15365. * @author Richard Davey <rich@photonstorm.com>
  15366. * @copyright 2018 Photon Storm Ltd.
  15367. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  15368. */
  15369. var ArrayUtils = __webpack_require__(150);
  15370. var Class = __webpack_require__(0);
  15371. var NOOP = __webpack_require__(3);
  15372. var StableSort = __webpack_require__(83);
  15373. /**
  15374. * @callback EachListCallback
  15375. * @generic I - [item]
  15376. *
  15377. * @param {*} item - [description]
  15378. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  15379. */
  15380. /**
  15381. * @classdesc
  15382. * [description]
  15383. *
  15384. * @class List
  15385. * @memberOf Phaser.Structs
  15386. * @constructor
  15387. * @since 3.0.0
  15388. *
  15389. * @generic T
  15390. *
  15391. * @param {*} parent - [description]
  15392. */
  15393. var List = new Class({
  15394. initialize:
  15395. function List (parent)
  15396. {
  15397. /**
  15398. * The parent of this list.
  15399. *
  15400. * @name Phaser.Structs.List#parent
  15401. * @type {*}
  15402. * @since 3.0.0
  15403. */
  15404. this.parent = parent;
  15405. /**
  15406. * The objects that belong to this collection.
  15407. *
  15408. * @genericUse {T[]} - [$type]
  15409. *
  15410. * @name Phaser.Structs.List#list
  15411. * @type {Array.<*>}
  15412. * @default []
  15413. * @since 3.0.0
  15414. */
  15415. this.list = [];
  15416. /**
  15417. * [description]
  15418. *
  15419. * @name Phaser.Structs.List#position
  15420. * @type {integer}
  15421. * @default 0
  15422. * @since 3.0.0
  15423. */
  15424. this.position = 0;
  15425. /**
  15426. * A callback that is invoked every time a child is added to this list.
  15427. *
  15428. * @name Phaser.Structs.List#addCallback
  15429. * @type {function}
  15430. * @since 3.4.0
  15431. */
  15432. this.addCallback = NOOP;
  15433. /**
  15434. * A callback that is invoked every time a child is removed from this list.
  15435. *
  15436. * @name Phaser.Structs.List#removeCallback
  15437. * @type {function}
  15438. * @since 3.4.0
  15439. */
  15440. this.removeCallback = NOOP;
  15441. /**
  15442. * The property key to sort by.
  15443. *
  15444. * @name Phaser.Structs.List#_sortKey
  15445. * @type {string}
  15446. * @since 3.4.0
  15447. */
  15448. this._sortKey = '';
  15449. },
  15450. /**
  15451. * [description]
  15452. *
  15453. * @method Phaser.Structs.List#add
  15454. * @since 3.0.0
  15455. *
  15456. * @genericUse {T} - [child,$return]
  15457. *
  15458. * @param {*|Array.<*>} child - [description]
  15459. * @param {boolean} [skipCallback=false] - Skip calling the List.addCallback if this child is added successfully.
  15460. *
  15461. * @return {*} [description]
  15462. */
  15463. add: function (child, skipCallback)
  15464. {
  15465. if (skipCallback)
  15466. {
  15467. return ArrayUtils.Add(this.list, child);
  15468. }
  15469. else
  15470. {
  15471. return ArrayUtils.Add(this.list, child, 0, this.addCallback, this);
  15472. }
  15473. },
  15474. /**
  15475. * [description]
  15476. *
  15477. * @method Phaser.Structs.List#addAt
  15478. * @since 3.0.0
  15479. *
  15480. * @genericUse {T} - [child,$return]
  15481. *
  15482. * @param {*} child - [description]
  15483. * @param {integer} [index=0] - [description]
  15484. * @param {boolean} [skipCallback=false] - Skip calling the List.addCallback if this child is added successfully.
  15485. *
  15486. * @return {*} [description]
  15487. */
  15488. addAt: function (child, index, skipCallback)
  15489. {
  15490. if (skipCallback)
  15491. {
  15492. return ArrayUtils.AddAt(this.list, child, index);
  15493. }
  15494. else
  15495. {
  15496. return ArrayUtils.AddAt(this.list, child, index, 0, this.addCallback, this);
  15497. }
  15498. },
  15499. /**
  15500. * [description]
  15501. *
  15502. * @method Phaser.Structs.List#getAt
  15503. * @since 3.0.0
  15504. *
  15505. * @genericUse {T} - [$return]
  15506. *
  15507. * @param {integer} index - [description]
  15508. *
  15509. * @return {*} [description]
  15510. */
  15511. getAt: function (index)
  15512. {
  15513. return this.list[index];
  15514. },
  15515. /**
  15516. * [description]
  15517. *
  15518. * @method Phaser.Structs.List#getIndex
  15519. * @since 3.0.0
  15520. *
  15521. * @genericUse {T} - [child]
  15522. *
  15523. * @param {*} child - [description]
  15524. *
  15525. * @return {integer} [description]
  15526. */
  15527. getIndex: function (child)
  15528. {
  15529. // Return -1 if given child isn't a child of this display list
  15530. return this.list.indexOf(child);
  15531. },
  15532. /**
  15533. * Sort the contents of this List so the items are in order based
  15534. * on the given property. For example, `sort('alpha')` would sort the List
  15535. * contents based on the value of their `alpha` property.
  15536. *
  15537. * @method Phaser.Structs.List#sort
  15538. * @since 3.0.0
  15539. *
  15540. * @genericUse {T[]} - [children,$return]
  15541. *
  15542. * @param {string} property - The property to lexically sort by.
  15543. *
  15544. * @return {Array.<*>} [description]
  15545. */
  15546. sort: function (property)
  15547. {
  15548. if (property)
  15549. {
  15550. this._sortKey = property;
  15551. StableSort.inplace(this.list, this.sortHandler);
  15552. }
  15553. return this;
  15554. },
  15555. /**
  15556. * [description]
  15557. *
  15558. * @method Phaser.Structs.List#sortHandler
  15559. * @private
  15560. * @since 3.4.0
  15561. *
  15562. * @genericUse {T} - [childA,childB]
  15563. *
  15564. * @param {*} childA - [description]
  15565. * @param {*} childB - [description]
  15566. *
  15567. * @return {integer} [description]
  15568. */
  15569. sortHandler: function (childA, childB)
  15570. {
  15571. return childA[this._sortKey] - childB[this._sortKey];
  15572. },
  15573. /**
  15574. * Searches for the first instance of a child with its `name`
  15575. * property matching the given argument. Should more than one child have
  15576. * the same name only the first is returned.
  15577. *
  15578. * @method Phaser.Structs.List#getByName
  15579. * @since 3.0.0
  15580. *
  15581. * @genericUse {T | null} - [$return]
  15582. *
  15583. * @param {string} name - The name to search for.
  15584. *
  15585. * @return {?*} The first child with a matching name, or null if none were found.
  15586. */
  15587. getByName: function (name)
  15588. {
  15589. return ArrayUtils.GetFirst(this.list, 'name', name);
  15590. },
  15591. /**
  15592. * Returns a random child from the group.
  15593. *
  15594. * @method Phaser.Structs.List#getRandom
  15595. * @since 3.0.0
  15596. *
  15597. * @genericUse {T | null} - [$return]
  15598. *
  15599. * @param {integer} [startIndex=0] - Offset from the front of the group (lowest child).
  15600. * @param {integer} [length=(to top)] - Restriction on the number of values you want to randomly select from.
  15601. *
  15602. * @return {?*} A random child of this Group.
  15603. */
  15604. getRandom: function (startIndex, length)
  15605. {
  15606. return ArrayUtils.GetRandom(this.list, startIndex, length);
  15607. },
  15608. /**
  15609. * [description]
  15610. *
  15611. * @method Phaser.Structs.List#getFirst
  15612. * @since 3.0.0
  15613. *
  15614. * @genericUse {T} - [value]
  15615. * @genericUse {T | null} - [$return]
  15616. *
  15617. * @param {string} property - [description]
  15618. * @param {*} value - [description]
  15619. * @param {number} [startIndex=0] - [description]
  15620. * @param {number} [endIndex] - [description]
  15621. *
  15622. * @return {?*} [description]
  15623. */
  15624. getFirst: function (property, value, startIndex, endIndex)
  15625. {
  15626. return ArrayUtils.GetFirstElement(this.list, property, value, startIndex, endIndex);
  15627. },
  15628. /**
  15629. * Returns all children in this List.
  15630. *
  15631. * You can optionally specify a matching criteria using the `property` and `value` arguments.
  15632. *
  15633. * For example: `getAll('parent')` would return only children that have a property called `parent`.
  15634. *
  15635. * You can also specify a value to compare the property to:
  15636. *
  15637. * `getAll('visible', true)` would return only children that have their visible property set to `true`.
  15638. *
  15639. * Optionally you can specify a start and end index. For example if this List had 100 children,
  15640. * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only
  15641. * the first 50 children in the List.
  15642. *
  15643. * @method Phaser.Structs.List#getAll
  15644. * @since 3.0.0
  15645. *
  15646. * @genericUse {T} - [value]
  15647. * @genericUse {T[]} - [$return]
  15648. *
  15649. * @param {string} [property] - An optional property to test against the value argument.
  15650. * @param {*} [value] - If property is set then Child.property must strictly equal this value to be included in the results.
  15651. * @param {integer} [startIndex] - The first child index to start the search from.
  15652. * @param {integer} [endIndex] - The last child index to search up until.
  15653. *
  15654. * @return {Array.<*>} [description]
  15655. */
  15656. getAll: function (property, value, startIndex, endIndex)
  15657. {
  15658. return ArrayUtils.GetAll(this.list, property, value, startIndex, endIndex);
  15659. },
  15660. /**
  15661. * [description]
  15662. *
  15663. * @method Phaser.Structs.List#count
  15664. * @since 3.0.0
  15665. *
  15666. * @genericUse {T} - [value]
  15667. *
  15668. * @param {string} property - [description]
  15669. * @param {*} value - [description]
  15670. *
  15671. * @return {integer} [description]
  15672. */
  15673. count: function (property, value)
  15674. {
  15675. return ArrayUtils.CountAllMatching(this.list, property, value);
  15676. },
  15677. /**
  15678. * [description]
  15679. *
  15680. * @method Phaser.Structs.List#swap
  15681. * @since 3.0.0
  15682. *
  15683. * @genericUse {T} - [child1,child2]
  15684. *
  15685. * @param {*} child1 - [description]
  15686. * @param {*} child2 - [description]
  15687. */
  15688. swap: function (child1, child2)
  15689. {
  15690. ArrayUtils.Swap(this.list, child1, child2);
  15691. },
  15692. /**
  15693. * [description]
  15694. *
  15695. * @method Phaser.Structs.List#moveTo
  15696. * @since 3.0.0
  15697. *
  15698. * @genericUse {T} - [child,$return]
  15699. *
  15700. * @param {*} child - [description]
  15701. * @param {integer} index - [description]
  15702. *
  15703. * @return {*} [description]
  15704. */
  15705. moveTo: function (child, index)
  15706. {
  15707. return ArrayUtils.MoveTo(this.list, child, index);
  15708. },
  15709. /**
  15710. * [description]
  15711. *
  15712. * @method Phaser.Structs.List#remove
  15713. * @since 3.0.0
  15714. *
  15715. * @genericUse {T} - [child,$return]
  15716. *
  15717. * @param {*} child - [description]
  15718. * @param {boolean} [skipCallback=false] - Skip calling the List.removeCallback.
  15719. *
  15720. * @return {*} [description]
  15721. */
  15722. remove: function (child, skipCallback)
  15723. {
  15724. if (skipCallback)
  15725. {
  15726. return ArrayUtils.Remove(this.list, child);
  15727. }
  15728. else
  15729. {
  15730. return ArrayUtils.Remove(this.list, child, this.removeCallback, this);
  15731. }
  15732. },
  15733. /**
  15734. * [description]
  15735. *
  15736. * @method Phaser.Structs.List#removeAt
  15737. * @since 3.0.0
  15738. *
  15739. * @genericUse {T} - [$return]
  15740. *
  15741. * @param {integer} index - [description]
  15742. * @param {boolean} [skipCallback=false] - Skip calling the List.removeCallback.
  15743. *
  15744. * @return {*} [description]
  15745. */
  15746. removeAt: function (index, skipCallback)
  15747. {
  15748. if (skipCallback)
  15749. {
  15750. return ArrayUtils.RemoveAt(this.list, index);
  15751. }
  15752. else
  15753. {
  15754. return ArrayUtils.RemoveAt(this.list, index, this.removeCallback, this);
  15755. }
  15756. },
  15757. /**
  15758. * [description]
  15759. *
  15760. * @method Phaser.Structs.List#removeBetween
  15761. * @since 3.0.0
  15762. *
  15763. * @genericUse {T[]} - [$return]
  15764. *
  15765. * @param {integer} [startIndex=0] - [description]
  15766. * @param {integer} [endIndex] - [description]
  15767. * @param {boolean} [skipCallback=false] - Skip calling the List.removeCallback.
  15768. *
  15769. * @return {Array.<*>} [description]
  15770. */
  15771. removeBetween: function (startIndex, endIndex, skipCallback)
  15772. {
  15773. if (skipCallback)
  15774. {
  15775. return ArrayUtils.RemoveBetween(this.list, startIndex, endIndex);
  15776. }
  15777. else
  15778. {
  15779. return ArrayUtils.RemoveBetween(this.list, startIndex, endIndex, this.removeCallback, this);
  15780. }
  15781. },
  15782. /**
  15783. * Removes all the items.
  15784. *
  15785. * @method Phaser.Structs.List#removeAll
  15786. * @since 3.0.0
  15787. *
  15788. * @genericUse {Phaser.Structs.List.<T>} - [$return]
  15789. *
  15790. * @param {boolean} [skipCallback=false] - Skip calling the List.removeCallback.
  15791. *
  15792. * @return {Phaser.Structs.List} This List object.
  15793. */
  15794. removeAll: function (skipCallback)
  15795. {
  15796. var i = this.list.length;
  15797. while (i--)
  15798. {
  15799. this.remove(this.list[i], skipCallback);
  15800. }
  15801. return this;
  15802. },
  15803. /**
  15804. * Brings the given child to the top of this List.
  15805. *
  15806. * @method Phaser.Structs.List#bringToTop
  15807. * @since 3.0.0
  15808. *
  15809. * @genericUse {T} - [child,$return]
  15810. *
  15811. * @param {*} child - [description]
  15812. *
  15813. * @return {*} [description]
  15814. */
  15815. bringToTop: function (child)
  15816. {
  15817. return ArrayUtils.BringToTop(this.list, child);
  15818. },
  15819. /**
  15820. * Sends the given child to the bottom of this List.
  15821. *
  15822. * @method Phaser.Structs.List#sendToBack
  15823. * @since 3.0.0
  15824. *
  15825. * @genericUse {T} - [child,$return]
  15826. *
  15827. * @param {*} child - [description]
  15828. *
  15829. * @return {*} [description]
  15830. */
  15831. sendToBack: function (child)
  15832. {
  15833. return ArrayUtils.SendToBack(this.list, child);
  15834. },
  15835. /**
  15836. * Moves the given child up one place in this group unless it's already at the top.
  15837. *
  15838. * @method Phaser.Structs.List#moveUp
  15839. * @since 3.0.0
  15840. *
  15841. * @genericUse {T} - [child,$return]
  15842. *
  15843. * @param {*} child - [description]
  15844. *
  15845. * @return {*} [description]
  15846. */
  15847. moveUp: function (child)
  15848. {
  15849. ArrayUtils.MoveUp(this.list, child);
  15850. return child;
  15851. },
  15852. /**
  15853. * Moves the given child down one place in this group unless it's already at the bottom.
  15854. *
  15855. * @method Phaser.Structs.List#moveDown
  15856. * @since 3.0.0
  15857. *
  15858. * @genericUse {T} - [child,$return]
  15859. *
  15860. * @param {*} child - [description]
  15861. *
  15862. * @return {*} [description]
  15863. */
  15864. moveDown: function (child)
  15865. {
  15866. ArrayUtils.MoveDown(this.list, child);
  15867. return child;
  15868. },
  15869. /**
  15870. * Reverses the order of all children in this List.
  15871. *
  15872. * @method Phaser.Structs.List#reverse
  15873. * @since 3.0.0
  15874. *
  15875. * @genericUse {Phaser.Structs.List.<T>} - [$return]
  15876. *
  15877. * @return {Phaser.Structs.List} This List object.
  15878. */
  15879. reverse: function ()
  15880. {
  15881. this.list.reverse();
  15882. return this;
  15883. },
  15884. /**
  15885. * [description]
  15886. *
  15887. * @method Phaser.Structs.List#shuffle
  15888. * @since 3.0.0
  15889. *
  15890. * @genericUse {Phaser.Structs.List.<T>} - [$return]
  15891. *
  15892. * @return {Phaser.Structs.List} This List object.
  15893. */
  15894. shuffle: function ()
  15895. {
  15896. ArrayUtils.Shuffle(this.list);
  15897. return this;
  15898. },
  15899. /**
  15900. * Replaces a child of this List with the given newChild. The newChild cannot be a member of this List.
  15901. *
  15902. * @method Phaser.Structs.List#replace
  15903. * @since 3.0.0
  15904. *
  15905. * @genericUse {T} - [oldChild,newChild,$return]
  15906. *
  15907. * @param {*} oldChild - The child in this List that will be replaced.
  15908. * @param {*} newChild - The child to be inserted into this List.
  15909. *
  15910. * @return {*} Returns the oldChild that was replaced within this group.
  15911. */
  15912. replace: function (oldChild, newChild)
  15913. {
  15914. return ArrayUtils.Replace(this.list, oldChild, newChild);
  15915. },
  15916. /**
  15917. * [description]
  15918. *
  15919. * @method Phaser.Structs.List#exists
  15920. * @since 3.0.0
  15921. *
  15922. * @genericUse {T} - [child]
  15923. *
  15924. * @param {*} child - [description]
  15925. *
  15926. * @return {boolean} True if the item is found in the list, otherwise false.
  15927. */
  15928. exists: function (child)
  15929. {
  15930. return (this.list.indexOf(child) > -1);
  15931. },
  15932. /**
  15933. * Sets the property `key` to the given value on all members of this List.
  15934. *
  15935. * @method Phaser.Structs.List#setAll
  15936. * @since 3.0.0
  15937. *
  15938. * @genericUse {T} - [value]
  15939. *
  15940. * @param {string} property - [description]
  15941. * @param {*} value - [description]
  15942. * @param {integer} [startIndex] - The first child index to start the search from.
  15943. * @param {integer} [endIndex] - The last child index to search up until.
  15944. */
  15945. setAll: function (property, value, startIndex, endIndex)
  15946. {
  15947. ArrayUtils.SetAll(this.list, property, value, startIndex, endIndex);
  15948. return this;
  15949. },
  15950. /**
  15951. * Passes all children to the given callback.
  15952. *
  15953. * @method Phaser.Structs.List#each
  15954. * @since 3.0.0
  15955. *
  15956. * @genericUse {EachListCallback.<T>} - [callback]
  15957. *
  15958. * @param {EachListCallback} callback - The function to call.
  15959. * @param {*} [context] - Value to use as `this` when executing callback.
  15960. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  15961. */
  15962. each: function (callback, context)
  15963. {
  15964. var args = [ null ];
  15965. for (var i = 2; i < arguments.length; i++)
  15966. {
  15967. args.push(arguments[i]);
  15968. }
  15969. for (i = 0; i < this.list.length; i++)
  15970. {
  15971. args[0] = this.list[i];
  15972. callback.apply(context, args);
  15973. }
  15974. },
  15975. /**
  15976. * [description]
  15977. *
  15978. * @method Phaser.Structs.List#shutdown
  15979. * @since 3.0.0
  15980. */
  15981. shutdown: function ()
  15982. {
  15983. this.removeAll();
  15984. this.list = [];
  15985. },
  15986. /**
  15987. * [description]
  15988. *
  15989. * @method Phaser.Structs.List#destroy
  15990. * @since 3.0.0
  15991. */
  15992. destroy: function ()
  15993. {
  15994. this.removeAll();
  15995. this.parent = null;
  15996. this.addCallback = null;
  15997. this.removeCallback = null;
  15998. },
  15999. /**
  16000. * [description]
  16001. *
  16002. * @name Phaser.Structs.List#length
  16003. * @type {integer}
  16004. * @readOnly
  16005. * @since 3.0.0
  16006. */
  16007. length: {
  16008. get: function ()
  16009. {
  16010. return this.list.length;
  16011. }
  16012. },
  16013. /**
  16014. * [description]
  16015. *
  16016. * @name Phaser.Structs.List#first
  16017. * @type {integer}
  16018. * @readOnly
  16019. * @since 3.0.0
  16020. */
  16021. first: {
  16022. get: function ()
  16023. {
  16024. this.position = 0;
  16025. if (this.list.length > 0)
  16026. {
  16027. return this.list[0];
  16028. }
  16029. else
  16030. {
  16031. return null;
  16032. }
  16033. }
  16034. },
  16035. /**
  16036. * [description]
  16037. *
  16038. * @name Phaser.Structs.List#last
  16039. * @type {integer}
  16040. * @readOnly
  16041. * @since 3.0.0
  16042. */
  16043. last: {
  16044. get: function ()
  16045. {
  16046. if (this.list.length > 0)
  16047. {
  16048. this.position = this.list.length - 1;
  16049. return this.list[this.position];
  16050. }
  16051. else
  16052. {
  16053. return null;
  16054. }
  16055. }
  16056. },
  16057. /**
  16058. * [description]
  16059. *
  16060. * @name Phaser.Structs.List#next
  16061. * @type {integer}
  16062. * @readOnly
  16063. * @since 3.0.0
  16064. */
  16065. next: {
  16066. get: function ()
  16067. {
  16068. if (this.position < this.list.length)
  16069. {
  16070. this.position++;
  16071. return this.list[this.position];
  16072. }
  16073. else
  16074. {
  16075. return null;
  16076. }
  16077. }
  16078. },
  16079. /**
  16080. * [description]
  16081. *
  16082. * @name Phaser.Structs.List#previous
  16083. * @type {integer}
  16084. * @readOnly
  16085. * @since 3.0.0
  16086. */
  16087. previous: {
  16088. get: function ()
  16089. {
  16090. if (this.position > 0)
  16091. {
  16092. this.position--;
  16093. return this.list[this.position];
  16094. }
  16095. else
  16096. {
  16097. return null;
  16098. }
  16099. }
  16100. }
  16101. });
  16102. module.exports = List;
  16103. /***/ }),
  16104. /* 94 */
  16105. /***/ (function(module, exports, __webpack_require__) {
  16106. /**
  16107. * @author Richard Davey <rich@photonstorm.com>
  16108. * @copyright 2018 Photon Storm Ltd.
  16109. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16110. */
  16111. var Clone = __webpack_require__(34);
  16112. /**
  16113. * Creates a new Object using all values from obj1 and obj2.
  16114. * If a value exists in both obj1 and obj2, the value in obj1 is used.
  16115. *
  16116. * @function Phaser.Utils.Object.Merge
  16117. * @since 3.0.0
  16118. *
  16119. * @param {object} obj1 - [description]
  16120. * @param {object} obj2 - [description]
  16121. *
  16122. * @return {object} [description]
  16123. */
  16124. var Merge = function (obj1, obj2)
  16125. {
  16126. var clone = Clone(obj1);
  16127. for (var key in obj2)
  16128. {
  16129. if (!clone.hasOwnProperty(key))
  16130. {
  16131. clone[key] = obj2[key];
  16132. }
  16133. }
  16134. return clone;
  16135. };
  16136. module.exports = Merge;
  16137. /***/ }),
  16138. /* 95 */
  16139. /***/ (function(module, exports) {
  16140. /**
  16141. * @author Richard Davey <rich@photonstorm.com>
  16142. * @copyright 2018 Photon Storm Ltd.
  16143. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16144. */
  16145. /**
  16146. * Shuffles the contents of the given array using the Fisher-Yates implementation.
  16147. *
  16148. * The original array is modified directly and returned.
  16149. *
  16150. * @function Phaser.Utils.Array.Shuffle
  16151. * @since 3.0.0
  16152. *
  16153. * @param {array} array - The array to shuffle. This array is modified in place.
  16154. *
  16155. * @return {array} The shuffled array.
  16156. */
  16157. var Shuffle = function (array)
  16158. {
  16159. for (var i = array.length - 1; i > 0; i--)
  16160. {
  16161. var j = Math.floor(Math.random() * (i + 1));
  16162. var temp = array[i];
  16163. array[i] = array[j];
  16164. array[j] = temp;
  16165. }
  16166. return array;
  16167. };
  16168. module.exports = Shuffle;
  16169. /***/ }),
  16170. /* 96 */
  16171. /***/ (function(module, exports, __webpack_require__) {
  16172. /**
  16173. * @author Richard Davey <rich@photonstorm.com>
  16174. * @copyright 2018 Photon Storm Ltd.
  16175. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16176. */
  16177. var Class = __webpack_require__(0);
  16178. var GetPoint = __webpack_require__(298);
  16179. var GetPoints = __webpack_require__(161);
  16180. var Random = __webpack_require__(160);
  16181. var Vector2 = __webpack_require__(6);
  16182. /**
  16183. * @classdesc
  16184. * Defines a Line segment, a part of a line between two endpoints.
  16185. *
  16186. * @class Line
  16187. * @memberOf Phaser.Geom
  16188. * @constructor
  16189. * @since 3.0.0
  16190. *
  16191. * @param {number} [x1=0] - The x coordinate of the lines starting point.
  16192. * @param {number} [y1=0] - The y coordinate of the lines starting point.
  16193. * @param {number} [x2=0] - The x coordinate of the lines ending point.
  16194. * @param {number} [y2=0] - The y coordinate of the lines ending point.
  16195. */
  16196. var Line = new Class({
  16197. initialize:
  16198. function Line (x1, y1, x2, y2)
  16199. {
  16200. if (x1 === undefined) { x1 = 0; }
  16201. if (y1 === undefined) { y1 = 0; }
  16202. if (x2 === undefined) { x2 = 0; }
  16203. if (y2 === undefined) { y2 = 0; }
  16204. /**
  16205. * The x coordinate of the lines starting point.
  16206. *
  16207. * @name Phaser.Geom.Line#x1
  16208. * @type {number}
  16209. * @since 3.0.0
  16210. */
  16211. this.x1 = x1;
  16212. /**
  16213. * The y coordinate of the lines starting point.
  16214. *
  16215. * @name Phaser.Geom.Line#y1
  16216. * @type {number}
  16217. * @since 3.0.0
  16218. */
  16219. this.y1 = y1;
  16220. /**
  16221. * The x coordinate of the lines ending point.
  16222. *
  16223. * @name Phaser.Geom.Line#x2
  16224. * @type {number}
  16225. * @since 3.0.0
  16226. */
  16227. this.x2 = x2;
  16228. /**
  16229. * The y coordinate of the lines ending point.
  16230. *
  16231. * @name Phaser.Geom.Line#y2
  16232. * @type {number}
  16233. * @since 3.0.0
  16234. */
  16235. this.y2 = y2;
  16236. },
  16237. /**
  16238. * Get a point on a line that's a given percentage along its length.
  16239. *
  16240. * @method Phaser.Geom.Line#getPoint
  16241. * @since 3.0.0
  16242. *
  16243. * @generic {Phaser.Geom.Point} O - [output,$return]
  16244. *
  16245. * @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.
  16246. * @param {(Phaser.Geom.Point|object)} [output] - An optional point, or point-like object, to store the coordinates of the point on the line.
  16247. *
  16248. * @return {(Phaser.Geom.Point|object)} A Point, or point-like object, containing the coordinates of the point on the line.
  16249. */
  16250. getPoint: function (position, output)
  16251. {
  16252. return GetPoint(this, position, output);
  16253. },
  16254. /**
  16255. * Get a number of points along a line's length.
  16256. *
  16257. * Provide a `quantity` to get an exact number of points along the line.
  16258. *
  16259. * Provide a `stepRate` to ensure a specific distance between each point on the line. Set `quantity` to `0` when
  16260. * providing a `stepRate`.
  16261. *
  16262. * @method Phaser.Geom.Line#getPoints
  16263. * @since 3.0.0
  16264. *
  16265. * @generic {Phaser.Geom.Point} O - [output,$return]
  16266. *
  16267. * @param {integer} quantity - The number of points to place on the line. Set to `0` to use `stepRate` instead.
  16268. * @param {integer} [stepRate] - The distance between each point on the line. When set, `quantity` is implied and should be set to `0`.
  16269. * @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.
  16270. *
  16271. * @return {(array|Phaser.Geom.Point[])} An array of Points, or point-like objects, containing the coordinates of the points on the line.
  16272. */
  16273. getPoints: function (quantity, stepRate, output)
  16274. {
  16275. return GetPoints(this, quantity, stepRate, output);
  16276. },
  16277. /**
  16278. * Get a random Point on the Line.
  16279. *
  16280. * @method Phaser.Geom.Line#getRandomPoint
  16281. * @since 3.0.0
  16282. *
  16283. * @generic {Phaser.Geom.Point} O - [point,$return]
  16284. *
  16285. * @param {(Phaser.Geom.Point|object)} [point] - An instance of a Point to be modified.
  16286. *
  16287. * @return {Phaser.Geom.Point} A random Point on the Line.
  16288. */
  16289. getRandomPoint: function (point)
  16290. {
  16291. return Random(this, point);
  16292. },
  16293. /**
  16294. * Set new coordinates for the line endpoints.
  16295. *
  16296. * @method Phaser.Geom.Line#setTo
  16297. * @since 3.0.0
  16298. *
  16299. * @param {number} [x1=0] - The x coordinate of the lines starting point.
  16300. * @param {number} [y1=0] - The y coordinate of the lines starting point.
  16301. * @param {number} [x2=0] - The x coordinate of the lines ending point.
  16302. * @param {number} [y2=0] - The y coordinate of the lines ending point.
  16303. *
  16304. * @return {Phaser.Geom.Line} This Line object.
  16305. */
  16306. setTo: function (x1, y1, x2, y2)
  16307. {
  16308. if (x1 === undefined) { x1 = 0; }
  16309. if (y1 === undefined) { y1 = 0; }
  16310. if (x2 === undefined) { x2 = 0; }
  16311. if (y2 === undefined) { y2 = 0; }
  16312. this.x1 = x1;
  16313. this.y1 = y1;
  16314. this.x2 = x2;
  16315. this.y2 = y2;
  16316. return this;
  16317. },
  16318. /**
  16319. * Returns a Vector2 object that corresponds to the start of this Line.
  16320. *
  16321. * @method Phaser.Geom.Line#getPointA
  16322. * @since 3.0.0
  16323. *
  16324. * @generic {Phaser.Math.Vector2} O - [vec2,$return]
  16325. *
  16326. * @param {Phaser.Math.Vector2} [vec2] - A Vector2 object to set the results in. If `undefined` a new Vector2 will be created.
  16327. *
  16328. * @return {Phaser.Math.Vector2} A Vector2 object that corresponds to the start of this Line.
  16329. */
  16330. getPointA: function (vec2)
  16331. {
  16332. if (vec2 === undefined) { vec2 = new Vector2(); }
  16333. vec2.set(this.x1, this.y1);
  16334. return vec2;
  16335. },
  16336. /**
  16337. * Returns a Vector2 object that corresponds to the end of this Line.
  16338. *
  16339. * @method Phaser.Geom.Line#getPointB
  16340. * @since 3.0.0
  16341. *
  16342. * @generic {Phaser.Math.Vector2} O - [vec2,$return]
  16343. *
  16344. * @param {Phaser.Math.Vector2} [vec2] - A Vector2 object to set the results in. If `undefined` a new Vector2 will be created.
  16345. *
  16346. * @return {Phaser.Math.Vector2} A Vector2 object that corresponds to the end of this Line.
  16347. */
  16348. getPointB: function (vec2)
  16349. {
  16350. if (vec2 === undefined) { vec2 = new Vector2(); }
  16351. vec2.set(this.x2, this.y2);
  16352. return vec2;
  16353. },
  16354. /**
  16355. * The left position of the Line.
  16356. *
  16357. * @name Phaser.Geom.Line#left
  16358. * @type {number}
  16359. * @since 3.0.0
  16360. */
  16361. left: {
  16362. get: function ()
  16363. {
  16364. return Math.min(this.x1, this.x2);
  16365. },
  16366. set: function (value)
  16367. {
  16368. if (this.x1 <= this.x2)
  16369. {
  16370. this.x1 = value;
  16371. }
  16372. else
  16373. {
  16374. this.x2 = value;
  16375. }
  16376. }
  16377. },
  16378. /**
  16379. * The right position of the Line.
  16380. *
  16381. * @name Phaser.Geom.Line#right
  16382. * @type {number}
  16383. * @since 3.0.0
  16384. */
  16385. right: {
  16386. get: function ()
  16387. {
  16388. return Math.max(this.x1, this.x2);
  16389. },
  16390. set: function (value)
  16391. {
  16392. if (this.x1 > this.x2)
  16393. {
  16394. this.x1 = value;
  16395. }
  16396. else
  16397. {
  16398. this.x2 = value;
  16399. }
  16400. }
  16401. },
  16402. /**
  16403. * The top position of the Line.
  16404. *
  16405. * @name Phaser.Geom.Line#top
  16406. * @type {number}
  16407. * @since 3.0.0
  16408. */
  16409. top: {
  16410. get: function ()
  16411. {
  16412. return Math.min(this.y1, this.y2);
  16413. },
  16414. set: function (value)
  16415. {
  16416. if (this.y1 <= this.y2)
  16417. {
  16418. this.y1 = value;
  16419. }
  16420. else
  16421. {
  16422. this.y2 = value;
  16423. }
  16424. }
  16425. },
  16426. /**
  16427. * The bottom position of the Line.
  16428. *
  16429. * @name Phaser.Geom.Line#bottom
  16430. * @type {number}
  16431. * @since 3.0.0
  16432. */
  16433. bottom: {
  16434. get: function ()
  16435. {
  16436. return Math.max(this.y1, this.y2);
  16437. },
  16438. set: function (value)
  16439. {
  16440. if (this.y1 > this.y2)
  16441. {
  16442. this.y1 = value;
  16443. }
  16444. else
  16445. {
  16446. this.y2 = value;
  16447. }
  16448. }
  16449. }
  16450. });
  16451. module.exports = Line;
  16452. /***/ }),
  16453. /* 97 */
  16454. /***/ (function(module, exports) {
  16455. /**
  16456. * @author Richard Davey <rich@photonstorm.com>
  16457. * @copyright 2018 Photon Storm Ltd.
  16458. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16459. */
  16460. /**
  16461. * [description]
  16462. *
  16463. * @function Phaser.Geom.Rectangle.Perimeter
  16464. * @since 3.0.0
  16465. *
  16466. * @param {Phaser.Geom.Rectangle} rect - [description]
  16467. *
  16468. * @return {number} [description]
  16469. */
  16470. var Perimeter = function (rect)
  16471. {
  16472. return 2 * (rect.width + rect.height);
  16473. };
  16474. module.exports = Perimeter;
  16475. /***/ }),
  16476. /* 98 */
  16477. /***/ (function(module, exports) {
  16478. /**
  16479. * @author Richard Davey <rich@photonstorm.com>
  16480. * @copyright 2018 Photon Storm Ltd.
  16481. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16482. */
  16483. /**
  16484. * @typedef {object} TweenDataGenConfig
  16485. *
  16486. * @property {function} delay - [description]
  16487. * @property {function} duration - [description]
  16488. * @property {function} hold - [description]
  16489. * @property {function} repeat - [description]
  16490. * @property {function} repeatDelay - [description]
  16491. */
  16492. /**
  16493. * @typedef {object} Phaser.Tweens.TweenDataConfig
  16494. *
  16495. * @property {object} target - The target to tween.
  16496. * @property {string} key - The property of the target being tweened.
  16497. * @property {function} getEndValue - The returned value sets what the property will be at the END of the Tween.
  16498. * @property {function} getStartValue - The returned value sets what the property will be at the START of the Tween.
  16499. * @property {function} ease - The ease function this tween uses.
  16500. * @property {number} [duration=0] - Duration of the tween in ms/frames, excludes time for yoyo or repeats.
  16501. * @property {number} [totalDuration=0] - The total calculated duration of this TweenData (based on duration, repeat, delay and yoyo)
  16502. * @property {number} [delay=0] - Time in ms/frames before tween will start.
  16503. * @property {boolean} [yoyo=false] - Cause the tween to return back to its start value after hold has expired.
  16504. * @property {number} [hold=0] - Time in ms/frames the tween will pause before running the yoyo or starting a repeat.
  16505. * @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.
  16506. * @property {number} [repeatDelay=0] - Time in ms/frames before the repeat will start.
  16507. * @property {boolean} [flipX=false] - Automatically call toggleFlipX when the TweenData yoyos or repeats
  16508. * @property {boolean} [flipY=false] - Automatically call toggleFlipY when the TweenData yoyos or repeats
  16509. * @property {number} [progress=0] - Between 0 and 1 showing completion of this TweenData.
  16510. * @property {number} [elapsed=0] - Delta counter
  16511. * @property {integer} [repeatCounter=0] - How many repeats are left to run?
  16512. * @property {number} [start=0] - Ease value data.
  16513. * @property {number} [current=0] - Ease value data.
  16514. * @property {number} [end=0] - Ease value data.
  16515. * @property {number} [t1=0] - Time duration 1.
  16516. * @property {number} [t2=0] - Time duration 2.
  16517. * @property {TweenDataGenConfig} [gen] - LoadValue generation functions.
  16518. * @property {integer} [state=0] - TWEEN_CONST.CREATED
  16519. */
  16520. /**
  16521. * [description]
  16522. *
  16523. * @function Phaser.Tweens.TweenData
  16524. * @since 3.0.0
  16525. *
  16526. * @param {object} target - [description]
  16527. * @param {string} key - [description]
  16528. * @param {function} getEnd - [description]
  16529. * @param {function} getStart - [description]
  16530. * @param {function} ease - [description]
  16531. * @param {number} delay - [description]
  16532. * @param {number} duration - [description]
  16533. * @param {boolean} yoyo - [description]
  16534. * @param {number} hold - [description]
  16535. * @param {number} repeat - [description]
  16536. * @param {number} repeatDelay - [description]
  16537. * @param {boolean} flipX - [description]
  16538. * @param {boolean} flipY - [description]
  16539. *
  16540. * @return {TweenDataConfig} [description]
  16541. */
  16542. var TweenData = function (target, key, getEnd, getStart, ease, delay, duration, yoyo, hold, repeat, repeatDelay, flipX, flipY)
  16543. {
  16544. return {
  16545. // The target to tween
  16546. target: target,
  16547. // The property of the target to tween
  16548. key: key,
  16549. // The returned value sets what the property will be at the END of the Tween.
  16550. getEndValue: getEnd,
  16551. // The returned value sets what the property will be at the START of the Tween.
  16552. getStartValue: getStart,
  16553. // The ease function this tween uses.
  16554. ease: ease,
  16555. // Duration of the tween in ms/frames, excludes time for yoyo or repeats.
  16556. duration: 0,
  16557. // The total calculated duration of this TweenData (based on duration, repeat, delay and yoyo)
  16558. totalDuration: 0,
  16559. // Time in ms/frames before tween will start.
  16560. delay: 0,
  16561. // Cause the tween to return back to its start value after hold has expired.
  16562. yoyo: yoyo,
  16563. // Time in ms/frames the tween will pause before running the yoyo or starting a repeat.
  16564. hold: 0,
  16565. // 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.
  16566. repeat: 0,
  16567. // Time in ms/frames before the repeat will start.
  16568. repeatDelay: 0,
  16569. // Automatically call toggleFlipX when the TweenData yoyos or repeats
  16570. flipX: flipX,
  16571. // Automatically call toggleFlipY when the TweenData yoyos or repeats
  16572. flipY: flipY,
  16573. // Between 0 and 1 showing completion of this TweenData.
  16574. progress: 0,
  16575. // Delta counter.
  16576. elapsed: 0,
  16577. // How many repeats are left to run?
  16578. repeatCounter: 0,
  16579. // Ease Value Data:
  16580. start: 0,
  16581. current: 0,
  16582. end: 0,
  16583. // Time Durations
  16584. t1: 0,
  16585. t2: 0,
  16586. // LoadValue generation functions
  16587. gen: {
  16588. delay: delay,
  16589. duration: duration,
  16590. hold: hold,
  16591. repeat: repeat,
  16592. repeatDelay: repeatDelay
  16593. },
  16594. // TWEEN_CONST.CREATED
  16595. state: 0
  16596. };
  16597. };
  16598. module.exports = TweenData;
  16599. /***/ }),
  16600. /* 99 */
  16601. /***/ (function(module, exports, __webpack_require__) {
  16602. /**
  16603. * @author Richard Davey <rich@photonstorm.com>
  16604. * @copyright 2018 Photon Storm Ltd.
  16605. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  16606. */
  16607. var Class = __webpack_require__(0);
  16608. var GameObjectCreator = __webpack_require__(14);
  16609. var GameObjectFactory = __webpack_require__(11);
  16610. var TWEEN_CONST = __webpack_require__(61);
  16611. /**
  16612. * @classdesc
  16613. * [description]
  16614. *
  16615. * @class Tween
  16616. * @memberOf Phaser.Tweens
  16617. * @constructor
  16618. * @since 3.0.0
  16619. *
  16620. * @param {(Phaser.Tweens.TweenManager|Phaser.Tweens.Timeline)} parent - [description]
  16621. * @param {Phaser.Tweens.TweenDataConfig[]} data - [description]
  16622. * @param {array} targets - [description]
  16623. */
  16624. var Tween = new Class({
  16625. initialize:
  16626. function Tween (parent, data, targets)
  16627. {
  16628. /**
  16629. * [description]
  16630. *
  16631. * @name Phaser.Tweens.Tween#parent
  16632. * @type {(Phaser.Tweens.TweenManager|Phaser.Tweens.Timeline)}
  16633. * @since 3.0.0
  16634. */
  16635. this.parent = parent;
  16636. /**
  16637. * Is the parent of this Tween a Timeline?
  16638. *
  16639. * @name Phaser.Tweens.Tween#parentIsTimeline
  16640. * @type {boolean}
  16641. * @since 3.0.0
  16642. */
  16643. this.parentIsTimeline = parent.hasOwnProperty('isTimeline');
  16644. /**
  16645. * An array of TweenData objects, each containing a unique property and target being tweened.
  16646. *
  16647. * @name Phaser.Tweens.Tween#data
  16648. * @type {Phaser.Tweens.TweenDataConfig[]}
  16649. * @since 3.0.0
  16650. */
  16651. this.data = data;
  16652. /**
  16653. * data array doesn't change, so we can cache the length
  16654. *
  16655. * @name Phaser.Tweens.Tween#totalData
  16656. * @type {integer}
  16657. * @since 3.0.0
  16658. */
  16659. this.totalData = data.length;
  16660. /**
  16661. * An array of references to the target/s this Tween is operating on
  16662. *
  16663. * @name Phaser.Tweens.Tween#targets
  16664. * @type {object[]}
  16665. * @since 3.0.0
  16666. */
  16667. this.targets = targets;
  16668. /**
  16669. * Cached target total (not necessarily the same as the data total)
  16670. *
  16671. * @name Phaser.Tweens.Tween#totalTargets
  16672. * @type {integer}
  16673. * @since 3.0.0
  16674. */
  16675. this.totalTargets = targets.length;
  16676. /**
  16677. * If true then duration, delay, etc values are all frame totals.
  16678. *
  16679. * @name Phaser.Tweens.Tween#useFrames
  16680. * @type {boolean}
  16681. * @default false
  16682. * @since 3.0.0
  16683. */
  16684. this.useFrames = false;
  16685. /**
  16686. * 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.
  16687. * Value isn't used when calculating total duration of the tween, it's a run-time delta adjustment only.
  16688. *
  16689. * @name Phaser.Tweens.Tween#timeScale
  16690. * @type {number}
  16691. * @default 1
  16692. * @since 3.0.0
  16693. */
  16694. this.timeScale = 1;
  16695. /**
  16696. * Loop this tween? Can be -1 for an infinite loop, or an integer.
  16697. * When enabled it will play through ALL TweenDatas again (use TweenData.repeat to loop a single TD)
  16698. *
  16699. * @name Phaser.Tweens.Tween#loop
  16700. * @type {number}
  16701. * @default 0
  16702. * @since 3.0.0
  16703. */
  16704. this.loop = 0;
  16705. /**
  16706. * Time in ms/frames before the tween loops.
  16707. *
  16708. * @name Phaser.Tweens.Tween#loopDelay
  16709. * @type {number}
  16710. * @default 0
  16711. * @since 3.0.0
  16712. */
  16713. this.loopDelay = 0;
  16714. /**
  16715. * How many loops are left to run?
  16716. *
  16717. * @name Phaser.Tweens.Tween#loopCounter
  16718. * @type {number}
  16719. * @default 0
  16720. * @since 3.0.0
  16721. */
  16722. this.loopCounter = 0;
  16723. /**
  16724. * Time in ms/frames before the 'onComplete' event fires. This never fires if loop = -1 (as it never completes)
  16725. *
  16726. * @name Phaser.Tweens.Tween#completeDelay
  16727. * @type {number}
  16728. * @default 0
  16729. * @since 3.0.0
  16730. */
  16731. this.completeDelay = 0;
  16732. /**
  16733. * Countdown timer (used by timeline offset, loopDelay and completeDelay)
  16734. *
  16735. * @name Phaser.Tweens.Tween#countdown
  16736. * @type {number}
  16737. * @default 0
  16738. * @since 3.0.0
  16739. */
  16740. this.countdown = 0;
  16741. /**
  16742. * Set only if this Tween is part of a Timeline.
  16743. *
  16744. * @name Phaser.Tweens.Tween#offset
  16745. * @type {number}
  16746. * @default 0
  16747. * @since 3.0.0
  16748. */
  16749. this.offset = 0;
  16750. /**
  16751. * Set only if this Tween is part of a Timeline. The calculated offset amount.
  16752. *
  16753. * @name Phaser.Tweens.Tween#calculatedOffset
  16754. * @type {number}
  16755. * @default 0
  16756. * @since 3.0.0
  16757. */
  16758. this.calculatedOffset = 0;
  16759. /**
  16760. * The current state of the tween
  16761. *
  16762. * @name Phaser.Tweens.Tween#state
  16763. * @type {integer}
  16764. * @since 3.0.0
  16765. */
  16766. this.state = TWEEN_CONST.PENDING_ADD;
  16767. /**
  16768. * The state of the tween when it was paused (used by Resume)
  16769. *
  16770. * @name Phaser.Tweens.Tween#_pausedState
  16771. * @type {integer}
  16772. * @private
  16773. * @since 3.0.0
  16774. */
  16775. this._pausedState = TWEEN_CONST.PENDING_ADD;
  16776. /**
  16777. * Does the Tween start off paused? (if so it needs to be started with Tween.play)
  16778. *
  16779. * @name Phaser.Tweens.Tween#paused
  16780. * @type {boolean}
  16781. * @default false
  16782. * @since 3.0.0
  16783. */
  16784. this.paused = false;
  16785. /**
  16786. * Elapsed time in ms/frames of this run through the Tween.
  16787. *
  16788. * @name Phaser.Tweens.Tween#elapsed
  16789. * @type {number}
  16790. * @default 0
  16791. * @since 3.0.0
  16792. */
  16793. this.elapsed = 0;
  16794. /**
  16795. * Total elapsed time in ms/frames of the entire Tween, including looping.
  16796. *
  16797. * @name Phaser.Tweens.Tween#totalElapsed
  16798. * @type {number}
  16799. * @default 0
  16800. * @since 3.0.0
  16801. */
  16802. this.totalElapsed = 0;
  16803. /**
  16804. * Time in ms/frames for the whole Tween to play through once, excluding loop amounts and loop delays.
  16805. *
  16806. * @name Phaser.Tweens.Tween#duration
  16807. * @type {number}
  16808. * @default 0
  16809. * @since 3.0.0
  16810. */
  16811. this.duration = 0;
  16812. /**
  16813. * Value between 0 and 1. The amount through the Tween, excluding loops.
  16814. *
  16815. * @name Phaser.Tweens.Tween#progress
  16816. * @type {number}
  16817. * @default 0
  16818. * @since 3.0.0
  16819. */
  16820. this.progress = 0;
  16821. /**
  16822. * Time in ms/frames for the Tween to complete (including looping)
  16823. *
  16824. * @name Phaser.Tweens.Tween#totalDuration
  16825. * @type {number}
  16826. * @default 0
  16827. * @since 3.0.0
  16828. */
  16829. this.totalDuration = 0;
  16830. /**
  16831. * Value between 0 and 1. The amount through the entire Tween, including looping.
  16832. *
  16833. * @name Phaser.Tweens.Tween#totalProgress
  16834. * @type {number}
  16835. * @default 0
  16836. * @since 3.0.0
  16837. */
  16838. this.totalProgress = 0;
  16839. /**
  16840. * An object containing the various Tween callback references.
  16841. *
  16842. * @name Phaser.Tweens.Tween#callbacks
  16843. * @type {object}
  16844. * @default 0
  16845. * @since 3.0.0
  16846. */
  16847. this.callbacks = {
  16848. onComplete: null,
  16849. onLoop: null,
  16850. onRepeat: null,
  16851. onStart: null,
  16852. onUpdate: null,
  16853. onYoyo: null
  16854. };
  16855. this.callbackScope;
  16856. },
  16857. /**
  16858. * [description]
  16859. *
  16860. * @method Phaser.Tweens.Tween#getValue
  16861. * @since 3.0.0
  16862. *
  16863. * @return {number} [description]
  16864. */
  16865. getValue: function ()
  16866. {
  16867. return this.data[0].current;
  16868. },
  16869. /**
  16870. * [description]
  16871. *
  16872. * @method Phaser.Tweens.Tween#setTimeScale
  16873. * @since 3.0.0
  16874. *
  16875. * @param {number} value - [description]
  16876. *
  16877. * @return {Phaser.Tweens.Tween} This Tween object.
  16878. */
  16879. setTimeScale: function (value)
  16880. {
  16881. this.timeScale = value;
  16882. return this;
  16883. },
  16884. /**
  16885. * [description]
  16886. *
  16887. * @method Phaser.Tweens.Tween#getTimeScale
  16888. * @since 3.0.0
  16889. *
  16890. * @return {number} [description]
  16891. */
  16892. getTimeScale: function ()
  16893. {
  16894. return this.timeScale;
  16895. },
  16896. /**
  16897. * [description]
  16898. *
  16899. * @method Phaser.Tweens.Tween#isPlaying
  16900. * @since 3.0.0
  16901. *
  16902. * @return {boolean} [description]
  16903. */
  16904. isPlaying: function ()
  16905. {
  16906. return (this.state === TWEEN_CONST.ACTIVE);
  16907. },
  16908. /**
  16909. * [description]
  16910. *
  16911. * @method Phaser.Tweens.Tween#isPaused
  16912. * @since 3.0.0
  16913. *
  16914. * @return {boolean} [description]
  16915. */
  16916. isPaused: function ()
  16917. {
  16918. return (this.state === TWEEN_CONST.PAUSED);
  16919. },
  16920. /**
  16921. * [description]
  16922. *
  16923. * @method Phaser.Tweens.Tween#hasTarget
  16924. * @since 3.0.0
  16925. *
  16926. * @param {object} target - [description]
  16927. *
  16928. * @return {boolean} [description]
  16929. */
  16930. hasTarget: function (target)
  16931. {
  16932. return (this.targets.indexOf(target) !== -1);
  16933. },
  16934. /**
  16935. * [description]
  16936. *
  16937. * @method Phaser.Tweens.Tween#updateTo
  16938. * @since 3.0.0
  16939. *
  16940. * @param {string} key - [description]
  16941. * @param {*} value - [description]
  16942. * @param {boolean} startToCurrent - [description]
  16943. *
  16944. * @return {Phaser.Tweens.Tween} This Tween object.
  16945. */
  16946. updateTo: function (key, value, startToCurrent)
  16947. {
  16948. for (var i = 0; i < this.totalData; i++)
  16949. {
  16950. var tweenData = this.data[i];
  16951. if (tweenData.key === key)
  16952. {
  16953. tweenData.end = value;
  16954. if (startToCurrent)
  16955. {
  16956. tweenData.start = tweenData.current;
  16957. }
  16958. break;
  16959. }
  16960. }
  16961. return this;
  16962. },
  16963. /**
  16964. * [description]
  16965. *
  16966. * @method Phaser.Tweens.Tween#restart
  16967. * @since 3.0.0
  16968. */
  16969. restart: function ()
  16970. {
  16971. if (this.state === TWEEN_CONST.REMOVED)
  16972. {
  16973. this.seek(0);
  16974. this.parent.makeActive(this);
  16975. }
  16976. else
  16977. {
  16978. this.stop();
  16979. this.play();
  16980. }
  16981. },
  16982. /**
  16983. * [description]
  16984. *
  16985. * @method Phaser.Tweens.Tween#calcDuration
  16986. * @since 3.0.0
  16987. */
  16988. calcDuration: function ()
  16989. {
  16990. var max = 0;
  16991. var data = this.data;
  16992. for (var i = 0; i < this.totalData; i++)
  16993. {
  16994. var tweenData = data[i];
  16995. // Set t1 (duration + hold + yoyo)
  16996. tweenData.t1 = tweenData.duration + tweenData.hold;
  16997. if (tweenData.yoyo)
  16998. {
  16999. tweenData.t1 += tweenData.duration;
  17000. }
  17001. // Set t2 (repeatDelay + duration + hold + yoyo)
  17002. tweenData.t2 = tweenData.t1 + tweenData.repeatDelay;
  17003. // Total Duration
  17004. tweenData.totalDuration = tweenData.delay + tweenData.t1;
  17005. if (tweenData.repeat === -1)
  17006. {
  17007. tweenData.totalDuration += (tweenData.t2 * 999999999999);
  17008. }
  17009. else if (tweenData.repeat > 0)
  17010. {
  17011. tweenData.totalDuration += (tweenData.t2 * tweenData.repeat);
  17012. }
  17013. if (tweenData.totalDuration > max)
  17014. {
  17015. // Get the longest TweenData from the Tween, used to calculate the Tween TD
  17016. max = tweenData.totalDuration;
  17017. }
  17018. }
  17019. // Excludes loop values
  17020. this.duration = max;
  17021. this.loopCounter = (this.loop === -1) ? 999999999999 : this.loop;
  17022. if (this.loopCounter > 0)
  17023. {
  17024. this.totalDuration = this.duration + this.completeDelay + ((this.duration + this.loopDelay) * this.loopCounter);
  17025. }
  17026. else
  17027. {
  17028. this.totalDuration = this.duration + this.completeDelay;
  17029. }
  17030. },
  17031. /**
  17032. * Called by TweenManager.preUpdate as part of its loop to check pending and active tweens.
  17033. * Should not be called directly.
  17034. *
  17035. * @method Phaser.Tweens.Tween#init
  17036. * @since 3.0.0
  17037. *
  17038. * @return {boolean} Returns `true` if this Tween should be moved from the pending list to the active list by the Tween Manager.
  17039. */
  17040. init: function ()
  17041. {
  17042. var data = this.data;
  17043. var totalTargets = this.totalTargets;
  17044. for (var i = 0; i < this.totalData; i++)
  17045. {
  17046. var tweenData = data[i];
  17047. var target = tweenData.target;
  17048. var gen = tweenData.gen;
  17049. tweenData.delay = gen.delay(i, totalTargets, target);
  17050. tweenData.duration = gen.duration(i, totalTargets, target);
  17051. tweenData.hold = gen.hold(i, totalTargets, target);
  17052. tweenData.repeat = gen.repeat(i, totalTargets, target);
  17053. tweenData.repeatDelay = gen.repeatDelay(i, totalTargets, target);
  17054. }
  17055. this.calcDuration();
  17056. this.progress = 0;
  17057. this.totalProgress = 0;
  17058. this.elapsed = 0;
  17059. this.totalElapsed = 0;
  17060. // You can't have a paused Tween if it's part of a Timeline
  17061. if (this.paused && !this.parentIsTimeline)
  17062. {
  17063. this.state = TWEEN_CONST.PENDING_ADD;
  17064. this._pausedState = TWEEN_CONST.INIT;
  17065. return false;
  17066. }
  17067. else
  17068. {
  17069. this.state = TWEEN_CONST.INIT;
  17070. return true;
  17071. }
  17072. },
  17073. /**
  17074. * [description]
  17075. *
  17076. * @method Phaser.Tweens.Tween#nextState
  17077. * @since 3.0.0
  17078. */
  17079. nextState: function ()
  17080. {
  17081. if (this.loopCounter > 0)
  17082. {
  17083. this.elapsed = 0;
  17084. this.progress = 0;
  17085. this.loopCounter--;
  17086. var onLoop = this.callbacks.onLoop;
  17087. if (onLoop)
  17088. {
  17089. onLoop.params[1] = this.targets;
  17090. onLoop.func.apply(onLoop.scope, onLoop.params);
  17091. }
  17092. this.resetTweenData(true);
  17093. if (this.loopDelay > 0)
  17094. {
  17095. this.countdown = this.loopDelay;
  17096. this.state = TWEEN_CONST.LOOP_DELAY;
  17097. }
  17098. else
  17099. {
  17100. this.state = TWEEN_CONST.ACTIVE;
  17101. }
  17102. }
  17103. else if (this.completeDelay > 0)
  17104. {
  17105. this.countdown = this.completeDelay;
  17106. this.state = TWEEN_CONST.COMPLETE_DELAY;
  17107. }
  17108. else
  17109. {
  17110. var onComplete = this.callbacks.onComplete;
  17111. if (onComplete)
  17112. {
  17113. onComplete.params[1] = this.targets;
  17114. onComplete.func.apply(onComplete.scope, onComplete.params);
  17115. }
  17116. this.state = TWEEN_CONST.PENDING_REMOVE;
  17117. }
  17118. },
  17119. /**
  17120. * [description]
  17121. *
  17122. * @method Phaser.Tweens.Tween#pause
  17123. * @since 3.0.0
  17124. *
  17125. * @return {Phaser.Tweens.Tween} This Tween object.
  17126. */
  17127. pause: function ()
  17128. {
  17129. if (this.state === TWEEN_CONST.PAUSED)
  17130. {
  17131. return;
  17132. }
  17133. this.paused = true;
  17134. this._pausedState = this.state;
  17135. this.state = TWEEN_CONST.PAUSED;
  17136. return this;
  17137. },
  17138. /**
  17139. * [description]
  17140. *
  17141. * @method Phaser.Tweens.Tween#play
  17142. * @since 3.0.0
  17143. *
  17144. * @param {boolean} resetFromTimeline - [description]
  17145. */
  17146. play: function (resetFromTimeline)
  17147. {
  17148. if (this.state === TWEEN_CONST.ACTIVE)
  17149. {
  17150. return;
  17151. }
  17152. else if (this.state === TWEEN_CONST.PENDING_REMOVE || this.state === TWEEN_CONST.REMOVED)
  17153. {
  17154. this.init();
  17155. this.parent.makeActive(this);
  17156. resetFromTimeline = true;
  17157. }
  17158. var onStart = this.callbacks.onStart;
  17159. if (this.parentIsTimeline)
  17160. {
  17161. this.resetTweenData(resetFromTimeline);
  17162. if (this.calculatedOffset === 0)
  17163. {
  17164. if (onStart)
  17165. {
  17166. onStart.params[1] = this.targets;
  17167. onStart.func.apply(onStart.scope, onStart.params);
  17168. }
  17169. this.state = TWEEN_CONST.ACTIVE;
  17170. }
  17171. else
  17172. {
  17173. this.countdown = this.calculatedOffset;
  17174. this.state = TWEEN_CONST.OFFSET_DELAY;
  17175. }
  17176. }
  17177. else if (this.paused)
  17178. {
  17179. this.paused = false;
  17180. this.parent.makeActive(this);
  17181. }
  17182. else
  17183. {
  17184. this.resetTweenData(resetFromTimeline);
  17185. this.state = TWEEN_CONST.ACTIVE;
  17186. if (onStart)
  17187. {
  17188. onStart.params[1] = this.targets;
  17189. onStart.func.apply(onStart.scope, onStart.params);
  17190. }
  17191. this.parent.makeActive(this);
  17192. }
  17193. },
  17194. /**
  17195. * [description]
  17196. *
  17197. * @method Phaser.Tweens.Tween#resetTweenData
  17198. * @since 3.0.0
  17199. *
  17200. * @param {boolean} resetFromLoop - [description]
  17201. */
  17202. resetTweenData: function (resetFromLoop)
  17203. {
  17204. var data = this.data;
  17205. for (var i = 0; i < this.totalData; i++)
  17206. {
  17207. var tweenData = data[i];
  17208. tweenData.progress = 0;
  17209. tweenData.elapsed = 0;
  17210. tweenData.repeatCounter = (tweenData.repeat === -1) ? 999999999999 : tweenData.repeat;
  17211. if (resetFromLoop)
  17212. {
  17213. tweenData.start = tweenData.getStartValue(tweenData.target, tweenData.key, tweenData.start);
  17214. tweenData.end = tweenData.getEndValue(tweenData.target, tweenData.key, tweenData.end);
  17215. tweenData.current = tweenData.start;
  17216. tweenData.state = TWEEN_CONST.PLAYING_FORWARD;
  17217. }
  17218. else if (tweenData.delay > 0)
  17219. {
  17220. tweenData.elapsed = tweenData.delay;
  17221. tweenData.state = TWEEN_CONST.DELAY;
  17222. }
  17223. else
  17224. {
  17225. tweenData.state = TWEEN_CONST.PENDING_RENDER;
  17226. }
  17227. }
  17228. },
  17229. /**
  17230. * [description]
  17231. *
  17232. * @method Phaser.Tweens.Tween#resume
  17233. * @since 3.0.0
  17234. *
  17235. * @return {Phaser.Tweens.Tween} This Tween object.
  17236. */
  17237. resume: function ()
  17238. {
  17239. if (this.state === TWEEN_CONST.PAUSED)
  17240. {
  17241. this.paused = false;
  17242. this.state = this._pausedState;
  17243. }
  17244. else
  17245. {
  17246. this.play();
  17247. }
  17248. return this;
  17249. },
  17250. /**
  17251. * [description]
  17252. *
  17253. * @method Phaser.Tweens.Tween#seek
  17254. * @since 3.0.0
  17255. *
  17256. * @param {number} toPosition - A value between 0 and 1.
  17257. */
  17258. seek: function (toPosition)
  17259. {
  17260. var data = this.data;
  17261. for (var i = 0; i < this.totalData; i++)
  17262. {
  17263. // This won't work with loop > 0 yet
  17264. var ms = this.totalDuration * toPosition;
  17265. var tweenData = data[i];
  17266. var progress = 0;
  17267. var elapsed = 0;
  17268. if (ms <= tweenData.delay)
  17269. {
  17270. progress = 0;
  17271. elapsed = 0;
  17272. }
  17273. else if (ms >= tweenData.totalDuration)
  17274. {
  17275. progress = 1;
  17276. elapsed = tweenData.duration;
  17277. }
  17278. else if (ms > tweenData.delay && ms <= tweenData.t1)
  17279. {
  17280. // Keep it zero bound
  17281. ms = Math.max(0, ms - tweenData.delay);
  17282. // Somewhere in the first playthru range
  17283. progress = ms / tweenData.t1;
  17284. elapsed = tweenData.duration * progress;
  17285. }
  17286. else if (ms > tweenData.t1 && ms < tweenData.totalDuration)
  17287. {
  17288. // Somewhere in repeat land
  17289. ms -= tweenData.delay;
  17290. ms -= tweenData.t1;
  17291. // var repeats = Math.floor(ms / tweenData.t2);
  17292. // remainder
  17293. ms = ((ms / tweenData.t2) % 1) * tweenData.t2;
  17294. if (ms > tweenData.repeatDelay)
  17295. {
  17296. progress = ms / tweenData.t1;
  17297. elapsed = tweenData.duration * progress;
  17298. }
  17299. }
  17300. tweenData.progress = progress;
  17301. tweenData.elapsed = elapsed;
  17302. var v = tweenData.ease(tweenData.progress);
  17303. tweenData.current = tweenData.start + ((tweenData.end - tweenData.start) * v);
  17304. // console.log(tweenData.key, 'Seek', tweenData.target[tweenData.key], 'to', tweenData.current, 'pro', tweenData.progress, 'marker', toPosition, progress);
  17305. // if (tweenData.current === 0)
  17306. // {
  17307. // console.log('zero', tweenData.start, tweenData.end, v, 'progress', progress);
  17308. // }
  17309. tweenData.target[tweenData.key] = tweenData.current;
  17310. }
  17311. },
  17312. /**
  17313. * [description]
  17314. *
  17315. * @method Phaser.Tweens.Tween#setCallback
  17316. * @since 3.0.0
  17317. *
  17318. * @param {string} type - [description]
  17319. * @param {function} callback - [description]
  17320. * @param {array} [params] - [description]
  17321. * @param {object} [scope] - [description]
  17322. *
  17323. * @return {Phaser.Tweens.Tween} This Tween object.
  17324. */
  17325. setCallback: function (type, callback, params, scope)
  17326. {
  17327. this.callbacks[type] = { func: callback, scope: scope, params: params };
  17328. return this;
  17329. },
  17330. /**
  17331. * Flags the Tween as being complete, whatever stage of progress it is at.
  17332. *
  17333. * If an onComplete callback has been defined it will automatically invoke it, unless a `delay`
  17334. * argument is provided, in which case the Tween will delay for that period of time before calling the callback.
  17335. *
  17336. * If you don't need a delay, or have an onComplete callback, then call `Tween.stop` instead.
  17337. *
  17338. * @method Phaser.Tweens.Tween#complete
  17339. * @since 3.2.0
  17340. *
  17341. * @param {number} [delay=0] - The time to wait before invoking the complete callback. If zero it will fire immediately.
  17342. */
  17343. complete: function (delay)
  17344. {
  17345. if (delay === undefined) { delay = 0; }
  17346. if (delay)
  17347. {
  17348. this.countdown = delay;
  17349. this.state = TWEEN_CONST.COMPLETE_DELAY;
  17350. }
  17351. else
  17352. {
  17353. var onComplete = this.callbacks.onComplete;
  17354. if (onComplete)
  17355. {
  17356. onComplete.params[1] = this.targets;
  17357. onComplete.func.apply(onComplete.scope, onComplete.params);
  17358. }
  17359. this.state = TWEEN_CONST.PENDING_REMOVE;
  17360. }
  17361. },
  17362. /**
  17363. * Stops the Tween immediately, whatever stage of progress it is at and flags it for removal by the TweenManager.
  17364. *
  17365. * @method Phaser.Tweens.Tween#stop
  17366. * @since 3.0.0
  17367. *
  17368. * @param {number} [resetTo] - A value between 0 and 1.
  17369. */
  17370. stop: function (resetTo)
  17371. {
  17372. if (this.state === TWEEN_CONST.ACTIVE)
  17373. {
  17374. if (resetTo !== undefined)
  17375. {
  17376. this.seek(resetTo);
  17377. }
  17378. }
  17379. if (this.state !== TWEEN_CONST.REMOVED)
  17380. {
  17381. this.state = TWEEN_CONST.PENDING_REMOVE;
  17382. }
  17383. },
  17384. /**
  17385. * [description]
  17386. *
  17387. * @method Phaser.Tweens.Tween#update
  17388. * @since 3.0.0
  17389. *
  17390. * @param {number} timestamp - [description]
  17391. * @param {number} delta - [description]
  17392. *
  17393. * @return {boolean} Returns `true` if this Tween has finished and should be removed from the Tween Manager, otherwise returns `false`.
  17394. */
  17395. update: function (timestamp, delta)
  17396. {
  17397. if (this.state === TWEEN_CONST.PAUSED)
  17398. {
  17399. return false;
  17400. }
  17401. if (this.useFrames)
  17402. {
  17403. delta = 1 * this.parent.timeScale;
  17404. }
  17405. delta *= this.timeScale;
  17406. this.elapsed += delta;
  17407. this.progress = Math.min(this.elapsed / this.duration, 1);
  17408. this.totalElapsed += delta;
  17409. this.totalProgress = Math.min(this.totalElapsed / this.totalDuration, 1);
  17410. switch (this.state)
  17411. {
  17412. case TWEEN_CONST.ACTIVE:
  17413. var stillRunning = false;
  17414. for (var i = 0; i < this.totalData; i++)
  17415. {
  17416. if (this.updateTweenData(this, this.data[i], delta))
  17417. {
  17418. stillRunning = true;
  17419. }
  17420. }
  17421. // Anything still running? If not, we're done
  17422. if (!stillRunning)
  17423. {
  17424. this.nextState();
  17425. }
  17426. break;
  17427. case TWEEN_CONST.LOOP_DELAY:
  17428. this.countdown -= delta;
  17429. if (this.countdown <= 0)
  17430. {
  17431. this.state = TWEEN_CONST.ACTIVE;
  17432. }
  17433. break;
  17434. case TWEEN_CONST.OFFSET_DELAY:
  17435. this.countdown -= delta;
  17436. if (this.countdown <= 0)
  17437. {
  17438. var onStart = this.callbacks.onStart;
  17439. if (onStart)
  17440. {
  17441. onStart.params[1] = this.targets;
  17442. onStart.func.apply(onStart.scope, onStart.params);
  17443. }
  17444. this.state = TWEEN_CONST.ACTIVE;
  17445. }
  17446. break;
  17447. case TWEEN_CONST.COMPLETE_DELAY:
  17448. this.countdown -= delta;
  17449. if (this.countdown <= 0)
  17450. {
  17451. var onComplete = this.callbacks.onComplete;
  17452. if (onComplete)
  17453. {
  17454. onComplete.func.apply(onComplete.scope, onComplete.params);
  17455. }
  17456. this.state = TWEEN_CONST.PENDING_REMOVE;
  17457. }
  17458. break;
  17459. }
  17460. return (this.state === TWEEN_CONST.PENDING_REMOVE);
  17461. },
  17462. /**
  17463. * [description]
  17464. *
  17465. * @method Phaser.Tweens.Tween#setStateFromEnd
  17466. * @since 3.0.0
  17467. *
  17468. * @param {Phaser.Tweens.Tween} tween - [description]
  17469. * @param {Phaser.Tweens.TweenDataConfig} tweenData - [description]
  17470. * @param {number} diff - [description]
  17471. *
  17472. * @return {integer} The state of this Tween.
  17473. */
  17474. setStateFromEnd: function (tween, tweenData, diff)
  17475. {
  17476. if (tweenData.yoyo)
  17477. {
  17478. // We've hit the end of a Playing Forward TweenData and we have a yoyo
  17479. // Account for any extra time we got from the previous frame
  17480. tweenData.elapsed = diff;
  17481. tweenData.progress = diff / tweenData.duration;
  17482. if (tweenData.flipX)
  17483. {
  17484. tweenData.target.toggleFlipX();
  17485. }
  17486. // Problem: The flip and callback and so on gets called for every TweenData that triggers it at the same time.
  17487. // If you're tweening several properties it can fire for all of them, at once.
  17488. if (tweenData.flipY)
  17489. {
  17490. tweenData.target.toggleFlipY();
  17491. }
  17492. var onYoyo = tween.callbacks.onYoyo;
  17493. if (onYoyo)
  17494. {
  17495. // Element 1 is reserved for the target of the yoyo (and needs setting here)
  17496. onYoyo.params[1] = tweenData.target;
  17497. onYoyo.func.apply(onYoyo.scope, onYoyo.params);
  17498. }
  17499. tweenData.start = tweenData.getStartValue(tweenData.target, tweenData.key, tweenData.start);
  17500. return TWEEN_CONST.PLAYING_BACKWARD;
  17501. }
  17502. else if (tweenData.repeatCounter > 0)
  17503. {
  17504. // We've hit the end of a Playing Forward TweenData and we have a Repeat.
  17505. // So we're going to go right back to the start to repeat it again.
  17506. tweenData.repeatCounter--;
  17507. // Account for any extra time we got from the previous frame
  17508. tweenData.elapsed = diff;
  17509. tweenData.progress = diff / tweenData.duration;
  17510. if (tweenData.flipX)
  17511. {
  17512. tweenData.target.toggleFlipX();
  17513. }
  17514. if (tweenData.flipY)
  17515. {
  17516. tweenData.target.toggleFlipY();
  17517. }
  17518. var onRepeat = tween.callbacks.onRepeat;
  17519. if (onRepeat)
  17520. {
  17521. // Element 1 is reserved for the target of the repeat (and needs setting here)
  17522. onRepeat.params[1] = tweenData.target;
  17523. onRepeat.func.apply(onRepeat.scope, onRepeat.params);
  17524. }
  17525. tweenData.start = tweenData.getStartValue(tweenData.target, tweenData.key, tweenData.start);
  17526. tweenData.end = tweenData.getEndValue(tweenData.target, tweenData.key, tweenData.start);
  17527. // Delay?
  17528. if (tweenData.repeatDelay > 0)
  17529. {
  17530. tweenData.elapsed = tweenData.repeatDelay - diff;
  17531. tweenData.current = tweenData.start;
  17532. tweenData.target[tweenData.key] = tweenData.current;
  17533. return TWEEN_CONST.REPEAT_DELAY;
  17534. }
  17535. else
  17536. {
  17537. return TWEEN_CONST.PLAYING_FORWARD;
  17538. }
  17539. }
  17540. return TWEEN_CONST.COMPLETE;
  17541. },
  17542. /**
  17543. * Was PLAYING_BACKWARD and has hit the start.
  17544. *
  17545. * @method Phaser.Tweens.Tween#setStateFromStart
  17546. * @since 3.0.0
  17547. *
  17548. * @param {Phaser.Tweens.Tween} tween - [description]
  17549. * @param {Phaser.Tweens.TweenDataConfig} tweenData - [description]
  17550. * @param {number} diff - [description]
  17551. *
  17552. * @return {integer} The state of this Tween.
  17553. */
  17554. setStateFromStart: function (tween, tweenData, diff)
  17555. {
  17556. if (tweenData.repeatCounter > 0)
  17557. {
  17558. tweenData.repeatCounter--;
  17559. // Account for any extra time we got from the previous frame
  17560. tweenData.elapsed = diff;
  17561. tweenData.progress = diff / tweenData.duration;
  17562. if (tweenData.flipX)
  17563. {
  17564. tweenData.target.toggleFlipX();
  17565. }
  17566. if (tweenData.flipY)
  17567. {
  17568. tweenData.target.toggleFlipY();
  17569. }
  17570. var onRepeat = tween.callbacks.onRepeat;
  17571. if (onRepeat)
  17572. {
  17573. // Element 1 is reserved for the target of the repeat (and needs setting here)
  17574. onRepeat.params[1] = tweenData.target;
  17575. onRepeat.func.apply(onRepeat.scope, onRepeat.params);
  17576. }
  17577. tweenData.end = tweenData.getEndValue(tweenData.target, tweenData.key, tweenData.start);
  17578. // Delay?
  17579. if (tweenData.repeatDelay > 0)
  17580. {
  17581. tweenData.elapsed = tweenData.repeatDelay - diff;
  17582. tweenData.current = tweenData.start;
  17583. tweenData.target[tweenData.key] = tweenData.current;
  17584. return TWEEN_CONST.REPEAT_DELAY;
  17585. }
  17586. else
  17587. {
  17588. return TWEEN_CONST.PLAYING_FORWARD;
  17589. }
  17590. }
  17591. return TWEEN_CONST.COMPLETE;
  17592. },
  17593. //
  17594. /**
  17595. * [description]
  17596. *
  17597. * @method Phaser.Tweens.Tween#updateTweenData
  17598. * @since 3.0.0
  17599. *
  17600. * @param {Phaser.Tweens.Tween} tween - [description]
  17601. * @param {Phaser.Tweens.TweenDataConfig} tweenData - [description]
  17602. * @param {number} delta - Either a value in ms, or 1 if Tween.useFrames is true
  17603. *
  17604. * @return {boolean} [description]
  17605. */
  17606. updateTweenData: function (tween, tweenData, delta)
  17607. {
  17608. switch (tweenData.state)
  17609. {
  17610. case TWEEN_CONST.PLAYING_FORWARD:
  17611. case TWEEN_CONST.PLAYING_BACKWARD:
  17612. if (!tweenData.target)
  17613. {
  17614. tweenData.state = TWEEN_CONST.COMPLETE;
  17615. break;
  17616. }
  17617. var elapsed = tweenData.elapsed;
  17618. var duration = tweenData.duration;
  17619. var diff = 0;
  17620. elapsed += delta;
  17621. if (elapsed > duration)
  17622. {
  17623. diff = elapsed - duration;
  17624. elapsed = duration;
  17625. }
  17626. var forward = (tweenData.state === TWEEN_CONST.PLAYING_FORWARD);
  17627. var progress = elapsed / duration;
  17628. var v;
  17629. if (forward)
  17630. {
  17631. v = tweenData.ease(progress);
  17632. }
  17633. else
  17634. {
  17635. v = tweenData.ease(1 - progress);
  17636. }
  17637. tweenData.current = tweenData.start + ((tweenData.end - tweenData.start) * v);
  17638. tweenData.target[tweenData.key] = tweenData.current;
  17639. tweenData.elapsed = elapsed;
  17640. tweenData.progress = progress;
  17641. var onUpdate = tween.callbacks.onUpdate;
  17642. if (onUpdate)
  17643. {
  17644. onUpdate.params[1] = tweenData.target;
  17645. onUpdate.func.apply(onUpdate.scope, onUpdate.params);
  17646. }
  17647. if (progress === 1)
  17648. {
  17649. if (forward)
  17650. {
  17651. if (tweenData.hold > 0)
  17652. {
  17653. tweenData.elapsed = tweenData.hold - diff;
  17654. tweenData.state = TWEEN_CONST.HOLD_DELAY;
  17655. }
  17656. else
  17657. {
  17658. tweenData.state = this.setStateFromEnd(tween, tweenData, diff);
  17659. }
  17660. }
  17661. else
  17662. {
  17663. tweenData.state = this.setStateFromStart(tween, tweenData, diff);
  17664. }
  17665. }
  17666. break;
  17667. case TWEEN_CONST.DELAY:
  17668. tweenData.elapsed -= delta;
  17669. if (tweenData.elapsed <= 0)
  17670. {
  17671. tweenData.elapsed = Math.abs(tweenData.elapsed);
  17672. tweenData.state = TWEEN_CONST.PENDING_RENDER;
  17673. }
  17674. break;
  17675. case TWEEN_CONST.REPEAT_DELAY:
  17676. tweenData.elapsed -= delta;
  17677. if (tweenData.elapsed <= 0)
  17678. {
  17679. tweenData.elapsed = Math.abs(tweenData.elapsed);
  17680. tweenData.state = TWEEN_CONST.PLAYING_FORWARD;
  17681. }
  17682. break;
  17683. case TWEEN_CONST.HOLD_DELAY:
  17684. tweenData.elapsed -= delta;
  17685. if (tweenData.elapsed <= 0)
  17686. {
  17687. tweenData.state = this.setStateFromEnd(tween, tweenData, Math.abs(tweenData.elapsed));
  17688. }
  17689. break;
  17690. case TWEEN_CONST.PENDING_RENDER:
  17691. if (tweenData.target)
  17692. {
  17693. tweenData.start = tweenData.getStartValue(tweenData.target, tweenData.key, tweenData.target[tweenData.key]);
  17694. tweenData.end = tweenData.getEndValue(tweenData.target, tweenData.key, tweenData.start);
  17695. tweenData.current = tweenData.start;
  17696. tweenData.target[tweenData.key] = tweenData.start;
  17697. tweenData.state = TWEEN_CONST.PLAYING_FORWARD;
  17698. }
  17699. else
  17700. {
  17701. tweenData.state = TWEEN_CONST.COMPLETE;
  17702. }
  17703. break;
  17704. }
  17705. // Return TRUE if this TweenData still playing, otherwise return FALSE
  17706. return (tweenData.state !== TWEEN_CONST.COMPLETE);
  17707. }
  17708. });
  17709. Tween.TYPES = [
  17710. 'onComplete',
  17711. 'onLoop',
  17712. 'onRepeat',
  17713. 'onStart',
  17714. 'onUpdate',
  17715. 'onYoyo'
  17716. ];
  17717. /**
  17718. * Creates a new Tween object.
  17719. *
  17720. * Note: This method will only be available Tweens have been built into Phaser.
  17721. *
  17722. * @method Phaser.GameObjects.GameObjectFactory#tween
  17723. * @since 3.0.0
  17724. *
  17725. * @param {object} config - The Tween configuration.
  17726. *
  17727. * @return {Phaser.Tweens.Tween} The Tween that was created.
  17728. */
  17729. GameObjectFactory.register('tween', function (config)
  17730. {
  17731. return this.scene.sys.tweens.add(config);
  17732. });
  17733. // When registering a factory function 'this' refers to the GameObjectFactory context.
  17734. //
  17735. // There are several properties available to use:
  17736. //
  17737. // this.scene - a reference to the Scene that owns the GameObjectFactory
  17738. // this.displayList - a reference to the Display List the Scene owns
  17739. // this.updateList - a reference to the Update List the Scene owns
  17740. /**
  17741. * Creates a new Tween object and returns it.
  17742. *
  17743. * Note: This method will only be available if Tweens have been built into Phaser.
  17744. *
  17745. * @method Phaser.GameObjects.GameObjectCreator#tween
  17746. * @since 3.0.0
  17747. *
  17748. * @param {object} config - The Tween configuration.
  17749. *
  17750. * @return {Phaser.Tweens.Tween} The Tween that was created.
  17751. */
  17752. GameObjectCreator.register('tween', function (config)
  17753. {
  17754. return this.scene.sys.tweens.create(config);
  17755. });
  17756. // When registering a factory function 'this' refers to the GameObjectCreator context.
  17757. module.exports = Tween;
  17758. /***/ }),
  17759. /* 100 */
  17760. /***/ (function(module, exports) {
  17761. /**
  17762. * @author Richard Davey <rich@photonstorm.com>
  17763. * @copyright 2018 Photon Storm Ltd.
  17764. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17765. */
  17766. /**
  17767. * @typedef {object} Phaser.Tweens.TweenConfigDefaults
  17768. *
  17769. * @property {(object|object[])} targets - [description]
  17770. * @property {number} [delay=0] - [description]
  17771. * @property {number} [duration=1000] - [description]
  17772. * @property {string} [ease='Power0'] - [description]
  17773. * @property {array} [easeParams] - [description]
  17774. * @property {number} [hold=0] - [description]
  17775. * @property {number} [repeat=0] - [description]
  17776. * @property {number} [repeatDelay=0] - [description]
  17777. * @property {boolean} [yoyo=false] - [description]
  17778. * @property {boolean} [flipX=false] - [description]
  17779. * @property {boolean} [flipY=false] - [description]
  17780. */
  17781. var TWEEN_DEFAULTS = {
  17782. targets: null,
  17783. delay: 0,
  17784. duration: 1000,
  17785. ease: 'Power0',
  17786. easeParams: null,
  17787. hold: 0,
  17788. repeat: 0,
  17789. repeatDelay: 0,
  17790. yoyo: false,
  17791. flipX: false,
  17792. flipY: false
  17793. };
  17794. module.exports = TWEEN_DEFAULTS;
  17795. /***/ }),
  17796. /* 101 */
  17797. /***/ (function(module, exports) {
  17798. /**
  17799. * @author Richard Davey <rich@photonstorm.com>
  17800. * @copyright 2018 Photon Storm Ltd.
  17801. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17802. */
  17803. function hasGetStart (def)
  17804. {
  17805. return (!!def.getStart && typeof def.getStart === 'function');
  17806. }
  17807. function hasGetEnd (def)
  17808. {
  17809. return (!!def.getEnd && typeof def.getEnd === 'function');
  17810. }
  17811. function hasGetters (def)
  17812. {
  17813. return hasGetStart(def) || hasGetEnd(def);
  17814. }
  17815. /**
  17816. * [description]
  17817. *
  17818. * @function Phaser.Tweens.Builders.GetValueOp
  17819. * @since 3.0.0
  17820. *
  17821. * @param {string} key - [description]
  17822. * @param {*} propertyValue - [description]
  17823. *
  17824. * @return {function} [description]
  17825. */
  17826. var GetValueOp = function (key, propertyValue)
  17827. {
  17828. var callbacks;
  17829. // The returned value sets what the property will be at the END of the Tween (usually called at the start of the Tween)
  17830. var getEnd = function (target, key, value) { return value; };
  17831. // The returned value sets what the property will be at the START of the Tween (usually called at the end of the Tween)
  17832. var getStart = function (target, key, value) { return value; };
  17833. var t = typeof(propertyValue);
  17834. if (t === 'number')
  17835. {
  17836. // props: {
  17837. // x: 400,
  17838. // y: 300
  17839. // }
  17840. getEnd = function ()
  17841. {
  17842. return propertyValue;
  17843. };
  17844. }
  17845. else if (t === 'string')
  17846. {
  17847. // props: {
  17848. // x: '+=400',
  17849. // y: '-=300',
  17850. // z: '*=2',
  17851. // w: '/=2'
  17852. // }
  17853. var op = propertyValue[0];
  17854. var num = parseFloat(propertyValue.substr(2));
  17855. switch (op)
  17856. {
  17857. case '+':
  17858. getEnd = function (target, key, value)
  17859. {
  17860. return value + num;
  17861. };
  17862. break;
  17863. case '-':
  17864. getEnd = function (target, key, value)
  17865. {
  17866. return value - num;
  17867. };
  17868. break;
  17869. case '*':
  17870. getEnd = function (target, key, value)
  17871. {
  17872. return value * num;
  17873. };
  17874. break;
  17875. case '/':
  17876. getEnd = function (target, key, value)
  17877. {
  17878. return value / num;
  17879. };
  17880. break;
  17881. default:
  17882. getEnd = function ()
  17883. {
  17884. return parseFloat(propertyValue);
  17885. };
  17886. }
  17887. }
  17888. else if (t === 'function')
  17889. {
  17890. // The same as setting just the getEnd function and no getStart
  17891. // props: {
  17892. // x: function (target, key, value) { return value + 50); },
  17893. // }
  17894. getEnd = propertyValue;
  17895. }
  17896. else if (t === 'object' && hasGetters(propertyValue))
  17897. {
  17898. /*
  17899. x: {
  17900. // Called at the start of the Tween. The returned value sets what the property will be at the END of the Tween.
  17901. getEnd: function (target, key, value)
  17902. {
  17903. return value;
  17904. },
  17905. // Called at the end of the Tween. The returned value sets what the property will be at the START of the Tween.
  17906. getStart: function (target, key, value)
  17907. {
  17908. return value;
  17909. }
  17910. }
  17911. */
  17912. if (hasGetEnd(propertyValue))
  17913. {
  17914. getEnd = propertyValue.getEnd;
  17915. }
  17916. if (hasGetStart(propertyValue))
  17917. {
  17918. getStart = propertyValue.getStart;
  17919. }
  17920. }
  17921. else if (propertyValue.hasOwnProperty('value'))
  17922. {
  17923. // Value may still be a string, function or a number
  17924. // props: {
  17925. // x: { value: 400, ... },
  17926. // y: { value: 300, ... }
  17927. // }
  17928. callbacks = GetValueOp(key, propertyValue.value);
  17929. }
  17930. // If callback not set by the else if block above then set it here and return it
  17931. if (!callbacks)
  17932. {
  17933. callbacks = {
  17934. getEnd: getEnd,
  17935. getStart: getStart
  17936. };
  17937. }
  17938. return callbacks;
  17939. };
  17940. module.exports = GetValueOp;
  17941. /***/ }),
  17942. /* 102 */
  17943. /***/ (function(module, exports, __webpack_require__) {
  17944. /**
  17945. * @author Richard Davey <rich@photonstorm.com>
  17946. * @copyright 2018 Photon Storm Ltd.
  17947. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17948. */
  17949. var GetValue = __webpack_require__(4);
  17950. /**
  17951. * [description]
  17952. *
  17953. * @function Phaser.Tweens.Builders.GetTargets
  17954. * @since 3.0.0
  17955. *
  17956. * @param {object} config - [description]
  17957. *
  17958. * @return {array} [description]
  17959. */
  17960. var GetTargets = function (config)
  17961. {
  17962. var targets = GetValue(config, 'targets', null);
  17963. if (targets === null)
  17964. {
  17965. return targets;
  17966. }
  17967. if (typeof targets === 'function')
  17968. {
  17969. targets = targets.call();
  17970. }
  17971. if (!Array.isArray(targets))
  17972. {
  17973. targets = [ targets ];
  17974. }
  17975. return targets;
  17976. };
  17977. module.exports = GetTargets;
  17978. /***/ }),
  17979. /* 103 */
  17980. /***/ (function(module, exports, __webpack_require__) {
  17981. /**
  17982. * @author Richard Davey <rich@photonstorm.com>
  17983. * @copyright 2018 Photon Storm Ltd.
  17984. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  17985. */
  17986. var Class = __webpack_require__(0);
  17987. var GetFastValue = __webpack_require__(1);
  17988. /**
  17989. * @classdesc
  17990. * A class for representing data about a map. Maps are parsed from CSV, Tiled, etc. into this
  17991. * format. A Tilemap object get a copy of this data and then unpacks the needed properties into
  17992. * itself.
  17993. *
  17994. * @class MapData
  17995. * @memberOf Phaser.Tilemaps
  17996. * @constructor
  17997. * @since 3.0.0
  17998. *
  17999. * @param {object} [config] - [description]
  18000. */
  18001. var MapData = new Class({
  18002. initialize:
  18003. function MapData (config)
  18004. {
  18005. if (config === undefined) { config = {}; }
  18006. /**
  18007. * [description]
  18008. *
  18009. * @name Phaser.Tilemaps.MapData#name
  18010. * @type {string}
  18011. * @since 3.0.0
  18012. */
  18013. this.name = GetFastValue(config, 'name', 'map');
  18014. /**
  18015. * [description]
  18016. *
  18017. * @name Phaser.Tilemaps.MapData#width
  18018. * @type {number}
  18019. * @since 3.0.0
  18020. */
  18021. this.width = GetFastValue(config, 'width', 0);
  18022. /**
  18023. * [description]
  18024. *
  18025. * @name Phaser.Tilemaps.MapData#height
  18026. * @type {number}
  18027. * @since 3.0.0
  18028. */
  18029. this.height = GetFastValue(config, 'height', 0);
  18030. /**
  18031. * [description]
  18032. *
  18033. * @name Phaser.Tilemaps.MapData#tileWidth
  18034. * @type {number}
  18035. * @since 3.0.0
  18036. */
  18037. this.tileWidth = GetFastValue(config, 'tileWidth', 0);
  18038. /**
  18039. * [description]
  18040. *
  18041. * @name Phaser.Tilemaps.MapData#tileHeight
  18042. * @type {number}
  18043. * @since 3.0.0
  18044. */
  18045. this.tileHeight = GetFastValue(config, 'tileHeight', 0);
  18046. /**
  18047. * [description]
  18048. *
  18049. * @name Phaser.Tilemaps.MapData#widthInPixels
  18050. * @type {number}
  18051. * @since 3.0.0
  18052. */
  18053. this.widthInPixels = GetFastValue(config, 'widthInPixels', this.width * this.tileWidth);
  18054. /**
  18055. * [description]
  18056. *
  18057. * @name Phaser.Tilemaps.MapData#heightInPixels
  18058. * @type {number}
  18059. * @since 3.0.0
  18060. */
  18061. this.heightInPixels = GetFastValue(config, 'heightInPixels', this.height * this.tileHeight);
  18062. /**
  18063. * [description]
  18064. *
  18065. * @name Phaser.Tilemaps.MapData#format
  18066. * @type {integer}
  18067. * @since 3.0.0
  18068. */
  18069. this.format = GetFastValue(config, 'format', null);
  18070. /**
  18071. * [description]
  18072. *
  18073. * @name Phaser.Tilemaps.MapData#orientation
  18074. * @type {string}
  18075. * @since 3.0.0
  18076. */
  18077. this.orientation = GetFastValue(config, 'orientation', 'orthogonal');
  18078. /**
  18079. * [description]
  18080. *
  18081. * @name Phaser.Tilemaps.MapData#version
  18082. * @type {string}
  18083. * @since 3.0.0
  18084. */
  18085. this.version = GetFastValue(config, 'version', '1');
  18086. /**
  18087. * [description]
  18088. *
  18089. * @name Phaser.Tilemaps.MapData#properties
  18090. * @type {object}
  18091. * @since 3.0.0
  18092. */
  18093. this.properties = GetFastValue(config, 'properties', {});
  18094. /**
  18095. * [description]
  18096. *
  18097. * @name Phaser.Tilemaps.MapData#layers
  18098. * @type {array}
  18099. * @since 3.0.0
  18100. */
  18101. this.layers = GetFastValue(config, 'layers', []);
  18102. /**
  18103. * [description]
  18104. *
  18105. * @name Phaser.Tilemaps.MapData#images
  18106. * @type {array}
  18107. * @since 3.0.0
  18108. */
  18109. this.images = GetFastValue(config, 'images', []);
  18110. /**
  18111. * [description]
  18112. *
  18113. * @name Phaser.Tilemaps.MapData#objects
  18114. * @type {object}
  18115. * @since 3.0.0
  18116. */
  18117. this.objects = GetFastValue(config, 'objects', {});
  18118. /**
  18119. * [description]
  18120. *
  18121. * @name Phaser.Tilemaps.MapData#collision
  18122. * @type {object}
  18123. * @since 3.0.0
  18124. */
  18125. this.collision = GetFastValue(config, 'collision', {});
  18126. /**
  18127. * [description]
  18128. *
  18129. * @name Phaser.Tilemaps.MapData#tilesets
  18130. * @type {array}
  18131. * @since 3.0.0
  18132. */
  18133. this.tilesets = GetFastValue(config, 'tilesets', []);
  18134. /**
  18135. * [description]
  18136. *
  18137. * @name Phaser.Tilemaps.MapData#imageCollections
  18138. * @type {array}
  18139. * @since 3.0.0
  18140. */
  18141. this.imageCollections = GetFastValue(config, 'imageCollections', []);
  18142. /**
  18143. * [description]
  18144. *
  18145. * @name Phaser.Tilemaps.MapData#tiles
  18146. * @type {array}
  18147. * @since 3.0.0
  18148. */
  18149. this.tiles = GetFastValue(config, 'tiles', []);
  18150. }
  18151. });
  18152. module.exports = MapData;
  18153. /***/ }),
  18154. /* 104 */
  18155. /***/ (function(module, exports, __webpack_require__) {
  18156. /**
  18157. * @author Richard Davey <rich@photonstorm.com>
  18158. * @copyright 2018 Photon Storm Ltd.
  18159. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  18160. */
  18161. var Class = __webpack_require__(0);
  18162. var GetFastValue = __webpack_require__(1);
  18163. /**
  18164. * @classdesc
  18165. * A class for representing data about about a layer in a map. Maps are parsed from CSV, Tiled,
  18166. * etc. into this format. Tilemap, StaticTilemapLayer and DynamicTilemapLayer have a reference
  18167. * to this data and use it to look up and perform operations on tiles.
  18168. *
  18169. * @class LayerData
  18170. * @memberOf Phaser.Tilemaps
  18171. * @constructor
  18172. * @since 3.0.0
  18173. *
  18174. * @param {object} [config] - [description]
  18175. */
  18176. var LayerData = new Class({
  18177. initialize:
  18178. function LayerData (config)
  18179. {
  18180. if (config === undefined) { config = {}; }
  18181. /**
  18182. * [description]
  18183. *
  18184. * @name Phaser.Tilemaps.LayerData#name
  18185. * @type {string}
  18186. * @since 3.0.0
  18187. */
  18188. this.name = GetFastValue(config, 'name', 'layer');
  18189. /**
  18190. * [description]
  18191. *
  18192. * @name Phaser.Tilemaps.LayerData#x
  18193. * @type {number}
  18194. * @since 3.0.0
  18195. */
  18196. this.x = GetFastValue(config, 'x', 0);
  18197. /**
  18198. * [description]
  18199. *
  18200. * @name Phaser.Tilemaps.LayerData#y
  18201. * @type {number}
  18202. * @since 3.0.0
  18203. */
  18204. this.y = GetFastValue(config, 'y', 0);
  18205. /**
  18206. * [description]
  18207. *
  18208. * @name Phaser.Tilemaps.LayerData#width
  18209. * @type {number}
  18210. * @since 3.0.0
  18211. */
  18212. this.width = GetFastValue(config, 'width', 0);
  18213. /**
  18214. * [description]
  18215. *
  18216. * @name Phaser.Tilemaps.LayerData#height
  18217. * @type {number}
  18218. * @since 3.0.0
  18219. */
  18220. this.height = GetFastValue(config, 'height', 0);
  18221. /**
  18222. * [description]
  18223. *
  18224. * @name Phaser.Tilemaps.LayerData#tileWidth
  18225. * @type {number}
  18226. * @since 3.0.0
  18227. */
  18228. this.tileWidth = GetFastValue(config, 'tileWidth', 0);
  18229. /**
  18230. * [description]
  18231. *
  18232. * @name Phaser.Tilemaps.LayerData#tileHeight
  18233. * @type {number}
  18234. * @since 3.0.0
  18235. */
  18236. this.tileHeight = GetFastValue(config, 'tileHeight', 0);
  18237. /**
  18238. * [description]
  18239. *
  18240. * @name Phaser.Tilemaps.LayerData#baseTileWidth
  18241. * @type {number}
  18242. * @since 3.0.0
  18243. */
  18244. this.baseTileWidth = GetFastValue(config, 'baseTileWidth', this.tileWidth);
  18245. /**
  18246. * [description]
  18247. *
  18248. * @name Phaser.Tilemaps.LayerData#baseTileHeight
  18249. * @type {number}
  18250. * @since 3.0.0
  18251. */
  18252. this.baseTileHeight = GetFastValue(config, 'baseTileHeight', this.tileHeight);
  18253. /**
  18254. * [description]
  18255. *
  18256. * @name Phaser.Tilemaps.LayerData#widthInPixels
  18257. * @type {number}
  18258. * @since 3.0.0
  18259. */
  18260. this.widthInPixels = GetFastValue(config, 'widthInPixels', this.width * this.baseTileWidth);
  18261. /**
  18262. * [description]
  18263. *
  18264. * @name Phaser.Tilemaps.LayerData#heightInPixels
  18265. * @type {number}
  18266. * @since 3.0.0
  18267. */
  18268. this.heightInPixels = GetFastValue(config, 'heightInPixels', this.height * this.baseTileHeight);
  18269. /**
  18270. * [description]
  18271. *
  18272. * @name Phaser.Tilemaps.LayerData#alpha
  18273. * @type {number}
  18274. * @since 3.0.0
  18275. */
  18276. this.alpha = GetFastValue(config, 'alpha', 1);
  18277. /**
  18278. * [description]
  18279. *
  18280. * @name Phaser.Tilemaps.LayerData#visible
  18281. * @type {boolean}
  18282. * @since 3.0.0
  18283. */
  18284. this.visible = GetFastValue(config, 'visible', true);
  18285. /**
  18286. * [description]
  18287. *
  18288. * @name Phaser.Tilemaps.LayerData#properties
  18289. * @type {object}
  18290. * @since 3.0.0
  18291. */
  18292. this.properties = GetFastValue(config, 'properties', {});
  18293. /**
  18294. * [description]
  18295. *
  18296. * @name Phaser.Tilemaps.LayerData#indexes
  18297. * @type {array}
  18298. * @since 3.0.0
  18299. */
  18300. this.indexes = GetFastValue(config, 'indexes', []);
  18301. /**
  18302. * [description]
  18303. *
  18304. * @name Phaser.Tilemaps.LayerData#collideIndexes
  18305. * @type {array}
  18306. * @since 3.0.0
  18307. */
  18308. this.collideIndexes = GetFastValue(config, 'collideIndexes', []);
  18309. /**
  18310. * [description]
  18311. *
  18312. * @name Phaser.Tilemaps.LayerData#callbacks
  18313. * @type {array}
  18314. * @since 3.0.0
  18315. */
  18316. this.callbacks = GetFastValue(config, 'callbacks', []);
  18317. /**
  18318. * [description]
  18319. *
  18320. * @name Phaser.Tilemaps.LayerData#bodies
  18321. * @type {array}
  18322. * @since 3.0.0
  18323. */
  18324. this.bodies = GetFastValue(config, 'bodies', []);
  18325. /**
  18326. * [description]
  18327. *
  18328. * @name Phaser.Tilemaps.LayerData#data
  18329. * @type {array}
  18330. * @since 3.0.0
  18331. */
  18332. this.data = GetFastValue(config, 'data', []);
  18333. /**
  18334. * [description]
  18335. *
  18336. * @name Phaser.Tilemaps.LayerData#tilemapLayer
  18337. * @type {(Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)}
  18338. * @since 3.0.0
  18339. */
  18340. this.tilemapLayer = GetFastValue(config, 'tilemapLayer', null);
  18341. }
  18342. });
  18343. module.exports = LayerData;
  18344. /***/ }),
  18345. /* 105 */
  18346. /***/ (function(module, exports) {
  18347. /**
  18348. * @author Richard Davey <rich@photonstorm.com>
  18349. * @copyright 2018 Photon Storm Ltd.
  18350. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  18351. */
  18352. /**
  18353. * Checks if the given tile coordinates are within the bounds of the layer.
  18354. *
  18355. * @function Phaser.Tilemaps.Components.IsInLayerBounds
  18356. * @private
  18357. * @since 3.0.0
  18358. *
  18359. * @param {integer} tileX - [description]
  18360. * @param {integer} tileY - [description]
  18361. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  18362. *
  18363. * @return {boolean}
  18364. */
  18365. var IsInLayerBounds = function (tileX, tileY, layer)
  18366. {
  18367. return (tileX >= 0 && tileX < layer.width && tileY >= 0 && tileY < layer.height);
  18368. };
  18369. module.exports = IsInLayerBounds;
  18370. /***/ }),
  18371. /* 106 */
  18372. /***/ (function(module, exports) {
  18373. /**
  18374. * The `Matter.Vector` module contains methods for creating and manipulating vectors.
  18375. * Vectors are the basis of all the geometry related operations in the engine.
  18376. * A `Matter.Vector` object is of the form `{ x: 0, y: 0 }`.
  18377. *
  18378. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  18379. *
  18380. * @class Vector
  18381. */
  18382. // TODO: consider params for reusing vector objects
  18383. var Vector = {};
  18384. module.exports = Vector;
  18385. (function() {
  18386. /**
  18387. * Creates a new vector.
  18388. * @method create
  18389. * @param {number} x
  18390. * @param {number} y
  18391. * @return {vector} A new vector
  18392. */
  18393. Vector.create = function(x, y) {
  18394. return { x: x || 0, y: y || 0 };
  18395. };
  18396. /**
  18397. * Returns a new vector with `x` and `y` copied from the given `vector`.
  18398. * @method clone
  18399. * @param {vector} vector
  18400. * @return {vector} A new cloned vector
  18401. */
  18402. Vector.clone = function(vector) {
  18403. return { x: vector.x, y: vector.y };
  18404. };
  18405. /**
  18406. * Returns the magnitude (length) of a vector.
  18407. * @method magnitude
  18408. * @param {vector} vector
  18409. * @return {number} The magnitude of the vector
  18410. */
  18411. Vector.magnitude = function(vector) {
  18412. return Math.sqrt((vector.x * vector.x) + (vector.y * vector.y));
  18413. };
  18414. /**
  18415. * Returns the magnitude (length) of a vector (therefore saving a `sqrt` operation).
  18416. * @method magnitudeSquared
  18417. * @param {vector} vector
  18418. * @return {number} The squared magnitude of the vector
  18419. */
  18420. Vector.magnitudeSquared = function(vector) {
  18421. return (vector.x * vector.x) + (vector.y * vector.y);
  18422. };
  18423. /**
  18424. * Rotates the vector about (0, 0) by specified angle.
  18425. * @method rotate
  18426. * @param {vector} vector
  18427. * @param {number} angle
  18428. * @param {vector} [output]
  18429. * @return {vector} The vector rotated about (0, 0)
  18430. */
  18431. Vector.rotate = function(vector, angle, output) {
  18432. var cos = Math.cos(angle), sin = Math.sin(angle);
  18433. if (!output) output = {};
  18434. var x = vector.x * cos - vector.y * sin;
  18435. output.y = vector.x * sin + vector.y * cos;
  18436. output.x = x;
  18437. return output;
  18438. };
  18439. /**
  18440. * Rotates the vector about a specified point by specified angle.
  18441. * @method rotateAbout
  18442. * @param {vector} vector
  18443. * @param {number} angle
  18444. * @param {vector} point
  18445. * @param {vector} [output]
  18446. * @return {vector} A new vector rotated about the point
  18447. */
  18448. Vector.rotateAbout = function(vector, angle, point, output) {
  18449. var cos = Math.cos(angle), sin = Math.sin(angle);
  18450. if (!output) output = {};
  18451. var x = point.x + ((vector.x - point.x) * cos - (vector.y - point.y) * sin);
  18452. output.y = point.y + ((vector.x - point.x) * sin + (vector.y - point.y) * cos);
  18453. output.x = x;
  18454. return output;
  18455. };
  18456. /**
  18457. * Normalises a vector (such that its magnitude is `1`).
  18458. * @method normalise
  18459. * @param {vector} vector
  18460. * @return {vector} A new vector normalised
  18461. */
  18462. Vector.normalise = function(vector) {
  18463. var magnitude = Vector.magnitude(vector);
  18464. if (magnitude === 0)
  18465. return { x: 0, y: 0 };
  18466. return { x: vector.x / magnitude, y: vector.y / magnitude };
  18467. };
  18468. /**
  18469. * Returns the dot-product of two vectors.
  18470. * @method dot
  18471. * @param {vector} vectorA
  18472. * @param {vector} vectorB
  18473. * @return {number} The dot product of the two vectors
  18474. */
  18475. Vector.dot = function(vectorA, vectorB) {
  18476. return (vectorA.x * vectorB.x) + (vectorA.y * vectorB.y);
  18477. };
  18478. /**
  18479. * Returns the cross-product of two vectors.
  18480. * @method cross
  18481. * @param {vector} vectorA
  18482. * @param {vector} vectorB
  18483. * @return {number} The cross product of the two vectors
  18484. */
  18485. Vector.cross = function(vectorA, vectorB) {
  18486. return (vectorA.x * vectorB.y) - (vectorA.y * vectorB.x);
  18487. };
  18488. /**
  18489. * Returns the cross-product of three vectors.
  18490. * @method cross3
  18491. * @param {vector} vectorA
  18492. * @param {vector} vectorB
  18493. * @param {vector} vectorC
  18494. * @return {number} The cross product of the three vectors
  18495. */
  18496. Vector.cross3 = function(vectorA, vectorB, vectorC) {
  18497. return (vectorB.x - vectorA.x) * (vectorC.y - vectorA.y) - (vectorB.y - vectorA.y) * (vectorC.x - vectorA.x);
  18498. };
  18499. /**
  18500. * Adds the two vectors.
  18501. * @method add
  18502. * @param {vector} vectorA
  18503. * @param {vector} vectorB
  18504. * @param {vector} [output]
  18505. * @return {vector} A new vector of vectorA and vectorB added
  18506. */
  18507. Vector.add = function(vectorA, vectorB, output) {
  18508. if (!output) output = {};
  18509. output.x = vectorA.x + vectorB.x;
  18510. output.y = vectorA.y + vectorB.y;
  18511. return output;
  18512. };
  18513. /**
  18514. * Subtracts the two vectors.
  18515. * @method sub
  18516. * @param {vector} vectorA
  18517. * @param {vector} vectorB
  18518. * @param {vector} [output]
  18519. * @return {vector} A new vector of vectorA and vectorB subtracted
  18520. */
  18521. Vector.sub = function(vectorA, vectorB, output) {
  18522. if (!output) output = {};
  18523. output.x = vectorA.x - vectorB.x;
  18524. output.y = vectorA.y - vectorB.y;
  18525. return output;
  18526. };
  18527. /**
  18528. * Multiplies a vector and a scalar.
  18529. * @method mult
  18530. * @param {vector} vector
  18531. * @param {number} scalar
  18532. * @return {vector} A new vector multiplied by scalar
  18533. */
  18534. Vector.mult = function(vector, scalar) {
  18535. return { x: vector.x * scalar, y: vector.y * scalar };
  18536. };
  18537. /**
  18538. * Divides a vector and a scalar.
  18539. * @method div
  18540. * @param {vector} vector
  18541. * @param {number} scalar
  18542. * @return {vector} A new vector divided by scalar
  18543. */
  18544. Vector.div = function(vector, scalar) {
  18545. return { x: vector.x / scalar, y: vector.y / scalar };
  18546. };
  18547. /**
  18548. * Returns the perpendicular vector. Set `negate` to true for the perpendicular in the opposite direction.
  18549. * @method perp
  18550. * @param {vector} vector
  18551. * @param {bool} [negate=false]
  18552. * @return {vector} The perpendicular vector
  18553. */
  18554. Vector.perp = function(vector, negate) {
  18555. negate = negate === true ? -1 : 1;
  18556. return { x: negate * -vector.y, y: negate * vector.x };
  18557. };
  18558. /**
  18559. * Negates both components of a vector such that it points in the opposite direction.
  18560. * @method neg
  18561. * @param {vector} vector
  18562. * @return {vector} The negated vector
  18563. */
  18564. Vector.neg = function(vector) {
  18565. return { x: -vector.x, y: -vector.y };
  18566. };
  18567. /**
  18568. * Returns the angle in radians between the two vectors relative to the x-axis.
  18569. * @method angle
  18570. * @param {vector} vectorA
  18571. * @param {vector} vectorB
  18572. * @return {number} The angle in radians
  18573. */
  18574. Vector.angle = function(vectorA, vectorB) {
  18575. return Math.atan2(vectorB.y - vectorA.y, vectorB.x - vectorA.x);
  18576. };
  18577. /**
  18578. * Temporary vector pool (not thread-safe).
  18579. * @property _temp
  18580. * @type {vector[]}
  18581. * @private
  18582. */
  18583. Vector._temp = [
  18584. Vector.create(), Vector.create(),
  18585. Vector.create(), Vector.create(),
  18586. Vector.create(), Vector.create()
  18587. ];
  18588. })();
  18589. /***/ }),
  18590. /* 107 */
  18591. /***/ (function(module, exports, __webpack_require__) {
  18592. /**
  18593. * @author Richard Davey <rich@photonstorm.com>
  18594. * @copyright 2018 Photon Storm Ltd.
  18595. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  18596. */
  18597. var Extend = __webpack_require__(16);
  18598. var XHRSettings = __webpack_require__(74);
  18599. /**
  18600. * Takes two XHRSettings Objects and creates a new XHRSettings object from them.
  18601. *
  18602. * The new object is seeded by the values given in the global settings, but any setting in
  18603. * the local object overrides the global ones.
  18604. *
  18605. * @function Phaser.Loader.MergeXHRSettings
  18606. * @since 3.0.0
  18607. *
  18608. * @param {XHRSettingsObject} global - The global XHRSettings object.
  18609. * @param {XHRSettingsObject} local - The local XHRSettings object.
  18610. *
  18611. * @return {XHRSettingsObject} A newly formed XHRSettings object.
  18612. */
  18613. var MergeXHRSettings = function (global, local)
  18614. {
  18615. var output = (global === undefined) ? XHRSettings() : Extend({}, global);
  18616. if (local)
  18617. {
  18618. for (var setting in local)
  18619. {
  18620. if (local[setting] !== undefined)
  18621. {
  18622. output[setting] = local[setting];
  18623. }
  18624. }
  18625. }
  18626. return output;
  18627. };
  18628. module.exports = MergeXHRSettings;
  18629. /***/ }),
  18630. /* 108 */
  18631. /***/ (function(module, exports) {
  18632. /**
  18633. * @author Richard Davey <rich@photonstorm.com>
  18634. * @copyright 2018 Photon Storm Ltd.
  18635. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  18636. */
  18637. /**
  18638. * Given a File and a baseURL value this returns the URL the File will use to download from.
  18639. *
  18640. * @function Phaser.Loader.GetURL
  18641. * @since 3.0.0
  18642. *
  18643. * @param {Phaser.Loader.File} file - The File object.
  18644. * @param {string} baseURL - A default base URL.
  18645. *
  18646. * @return {string} The URL the File will use.
  18647. */
  18648. var GetURL = function (file, baseURL)
  18649. {
  18650. if (!file.url)
  18651. {
  18652. return false;
  18653. }
  18654. if (file.url.match(/^(?:blob:|data:|http:\/\/|https:\/\/|\/\/)/))
  18655. {
  18656. return file.url;
  18657. }
  18658. else
  18659. {
  18660. return baseURL + file.url;
  18661. }
  18662. };
  18663. module.exports = GetURL;
  18664. /***/ }),
  18665. /* 109 */
  18666. /***/ (function(module, exports) {
  18667. /**
  18668. * @author Richard Davey <rich@photonstorm.com>
  18669. * @copyright 2018 Photon Storm Ltd.
  18670. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  18671. */
  18672. /**
  18673. * Keyboard Codes.
  18674. *
  18675. * @name Phaser.Input.Keyboard.KeyCodes
  18676. * @enum {integer}
  18677. * @memberOf Phaser.Input.Keyboard
  18678. * @readOnly
  18679. * @since 3.0.0
  18680. */
  18681. var KeyCodes = {
  18682. /**
  18683. * @name Phaser.Input.Keyboard.KeyCodes.BACKSPACE
  18684. */
  18685. BACKSPACE: 8,
  18686. /**
  18687. * @name Phaser.Input.Keyboard.KeyCodes.TAB
  18688. */
  18689. TAB: 9,
  18690. /**
  18691. * @name Phaser.Input.Keyboard.KeyCodes.ENTER
  18692. */
  18693. ENTER: 13,
  18694. /**
  18695. * @name Phaser.Input.Keyboard.KeyCodes.SHIFT
  18696. */
  18697. SHIFT: 16,
  18698. /**
  18699. * @name Phaser.Input.Keyboard.KeyCodes.CTRL
  18700. */
  18701. CTRL: 17,
  18702. /**
  18703. * @name Phaser.Input.Keyboard.KeyCodes.ALT
  18704. */
  18705. ALT: 18,
  18706. /**
  18707. * @name Phaser.Input.Keyboard.KeyCodes.PAUSE
  18708. */
  18709. PAUSE: 19,
  18710. /**
  18711. * @name Phaser.Input.Keyboard.KeyCodes.CAPS_LOCK
  18712. */
  18713. CAPS_LOCK: 20,
  18714. /**
  18715. * @name Phaser.Input.Keyboard.KeyCodes.ESC
  18716. */
  18717. ESC: 27,
  18718. /**
  18719. * @name Phaser.Input.Keyboard.KeyCodes.SPACE
  18720. */
  18721. SPACE: 32,
  18722. /**
  18723. * @name Phaser.Input.Keyboard.KeyCodes.PAGE_UP
  18724. */
  18725. PAGE_UP: 33,
  18726. /**
  18727. * @name Phaser.Input.Keyboard.KeyCodes.PAGE_DOWN
  18728. */
  18729. PAGE_DOWN: 34,
  18730. /**
  18731. * @name Phaser.Input.Keyboard.KeyCodes.END
  18732. */
  18733. END: 35,
  18734. /**
  18735. * @name Phaser.Input.Keyboard.KeyCodes.HOME
  18736. */
  18737. HOME: 36,
  18738. /**
  18739. * @name Phaser.Input.Keyboard.KeyCodes.LEFT
  18740. */
  18741. LEFT: 37,
  18742. /**
  18743. * @name Phaser.Input.Keyboard.KeyCodes.UP
  18744. */
  18745. UP: 38,
  18746. /**
  18747. * @name Phaser.Input.Keyboard.KeyCodes.RIGHT
  18748. */
  18749. RIGHT: 39,
  18750. /**
  18751. * @name Phaser.Input.Keyboard.KeyCodes.DOWN
  18752. */
  18753. DOWN: 40,
  18754. /**
  18755. * @name Phaser.Input.Keyboard.KeyCodes.PRINT_SCREEN
  18756. */
  18757. PRINT_SCREEN: 42,
  18758. /**
  18759. * @name Phaser.Input.Keyboard.KeyCodes.INSERT
  18760. */
  18761. INSERT: 45,
  18762. /**
  18763. * @name Phaser.Input.Keyboard.KeyCodes.DELETE
  18764. */
  18765. DELETE: 46,
  18766. /**
  18767. * @name Phaser.Input.Keyboard.KeyCodes.ZERO
  18768. */
  18769. ZERO: 48,
  18770. /**
  18771. * @name Phaser.Input.Keyboard.KeyCodes.ONE
  18772. */
  18773. ONE: 49,
  18774. /**
  18775. * @name Phaser.Input.Keyboard.KeyCodes.TWO
  18776. */
  18777. TWO: 50,
  18778. /**
  18779. * @name Phaser.Input.Keyboard.KeyCodes.THREE
  18780. */
  18781. THREE: 51,
  18782. /**
  18783. * @name Phaser.Input.Keyboard.KeyCodes.FOUR
  18784. */
  18785. FOUR: 52,
  18786. /**
  18787. * @name Phaser.Input.Keyboard.KeyCodes.FIVE
  18788. */
  18789. FIVE: 53,
  18790. /**
  18791. * @name Phaser.Input.Keyboard.KeyCodes.SIX
  18792. */
  18793. SIX: 54,
  18794. /**
  18795. * @name Phaser.Input.Keyboard.KeyCodes.SEVEN
  18796. */
  18797. SEVEN: 55,
  18798. /**
  18799. * @name Phaser.Input.Keyboard.KeyCodes.EIGHT
  18800. */
  18801. EIGHT: 56,
  18802. /**
  18803. * @name Phaser.Input.Keyboard.KeyCodes.NINE
  18804. */
  18805. NINE: 57,
  18806. /**
  18807. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_ZERO
  18808. */
  18809. NUMPAD_ZERO: 96,
  18810. /**
  18811. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_ONE
  18812. */
  18813. NUMPAD_ONE: 97,
  18814. /**
  18815. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_TWO
  18816. */
  18817. NUMPAD_TWO: 98,
  18818. /**
  18819. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_THREE
  18820. */
  18821. NUMPAD_THREE: 99,
  18822. /**
  18823. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_FOUR
  18824. */
  18825. NUMPAD_FOUR: 100,
  18826. /**
  18827. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_FIVE
  18828. */
  18829. NUMPAD_FIVE: 101,
  18830. /**
  18831. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_SIX
  18832. */
  18833. NUMPAD_SIX: 102,
  18834. /**
  18835. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_SEVEN
  18836. */
  18837. NUMPAD_SEVEN: 103,
  18838. /**
  18839. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_EIGHT
  18840. */
  18841. NUMPAD_EIGHT: 104,
  18842. /**
  18843. * @name Phaser.Input.Keyboard.KeyCodes.NUMPAD_NINE
  18844. */
  18845. NUMPAD_NINE: 105,
  18846. /**
  18847. * @name Phaser.Input.Keyboard.KeyCodes.A
  18848. */
  18849. A: 65,
  18850. /**
  18851. * @name Phaser.Input.Keyboard.KeyCodes.B
  18852. */
  18853. B: 66,
  18854. /**
  18855. * @name Phaser.Input.Keyboard.KeyCodes.C
  18856. */
  18857. C: 67,
  18858. /**
  18859. * @name Phaser.Input.Keyboard.KeyCodes.D
  18860. */
  18861. D: 68,
  18862. /**
  18863. * @name Phaser.Input.Keyboard.KeyCodes.E
  18864. */
  18865. E: 69,
  18866. /**
  18867. * @name Phaser.Input.Keyboard.KeyCodes.F
  18868. */
  18869. F: 70,
  18870. /**
  18871. * @name Phaser.Input.Keyboard.KeyCodes.G
  18872. */
  18873. G: 71,
  18874. /**
  18875. * @name Phaser.Input.Keyboard.KeyCodes.H
  18876. */
  18877. H: 72,
  18878. /**
  18879. * @name Phaser.Input.Keyboard.KeyCodes.I
  18880. */
  18881. I: 73,
  18882. /**
  18883. * @name Phaser.Input.Keyboard.KeyCodes.J
  18884. */
  18885. J: 74,
  18886. /**
  18887. * @name Phaser.Input.Keyboard.KeyCodes.K
  18888. */
  18889. K: 75,
  18890. /**
  18891. * @name Phaser.Input.Keyboard.KeyCodes.L
  18892. */
  18893. L: 76,
  18894. /**
  18895. * @name Phaser.Input.Keyboard.KeyCodes.M
  18896. */
  18897. M: 77,
  18898. /**
  18899. * @name Phaser.Input.Keyboard.KeyCodes.N
  18900. */
  18901. N: 78,
  18902. /**
  18903. * @name Phaser.Input.Keyboard.KeyCodes.O
  18904. */
  18905. O: 79,
  18906. /**
  18907. * @name Phaser.Input.Keyboard.KeyCodes.P
  18908. */
  18909. P: 80,
  18910. /**
  18911. * @name Phaser.Input.Keyboard.KeyCodes.Q
  18912. */
  18913. Q: 81,
  18914. /**
  18915. * @name Phaser.Input.Keyboard.KeyCodes.R
  18916. */
  18917. R: 82,
  18918. /**
  18919. * @name Phaser.Input.Keyboard.KeyCodes.S
  18920. */
  18921. S: 83,
  18922. /**
  18923. * @name Phaser.Input.Keyboard.KeyCodes.T
  18924. */
  18925. T: 84,
  18926. /**
  18927. * @name Phaser.Input.Keyboard.KeyCodes.U
  18928. */
  18929. U: 85,
  18930. /**
  18931. * @name Phaser.Input.Keyboard.KeyCodes.V
  18932. */
  18933. V: 86,
  18934. /**
  18935. * @name Phaser.Input.Keyboard.KeyCodes.W
  18936. */
  18937. W: 87,
  18938. /**
  18939. * @name Phaser.Input.Keyboard.KeyCodes.X
  18940. */
  18941. X: 88,
  18942. /**
  18943. * @name Phaser.Input.Keyboard.KeyCodes.Y
  18944. */
  18945. Y: 89,
  18946. /**
  18947. * @name Phaser.Input.Keyboard.KeyCodes.Z
  18948. */
  18949. Z: 90,
  18950. /**
  18951. * @name Phaser.Input.Keyboard.KeyCodes.F1
  18952. */
  18953. F1: 112,
  18954. /**
  18955. * @name Phaser.Input.Keyboard.KeyCodes.F2
  18956. */
  18957. F2: 113,
  18958. /**
  18959. * @name Phaser.Input.Keyboard.KeyCodes.F3
  18960. */
  18961. F3: 114,
  18962. /**
  18963. * @name Phaser.Input.Keyboard.KeyCodes.F4
  18964. */
  18965. F4: 115,
  18966. /**
  18967. * @name Phaser.Input.Keyboard.KeyCodes.F5
  18968. */
  18969. F5: 116,
  18970. /**
  18971. * @name Phaser.Input.Keyboard.KeyCodes.F6
  18972. */
  18973. F6: 117,
  18974. /**
  18975. * @name Phaser.Input.Keyboard.KeyCodes.F7
  18976. */
  18977. F7: 118,
  18978. /**
  18979. * @name Phaser.Input.Keyboard.KeyCodes.F8
  18980. */
  18981. F8: 119,
  18982. /**
  18983. * @name Phaser.Input.Keyboard.KeyCodes.F9
  18984. */
  18985. F9: 120,
  18986. /**
  18987. * @name Phaser.Input.Keyboard.KeyCodes.F10
  18988. */
  18989. F10: 121,
  18990. /**
  18991. * @name Phaser.Input.Keyboard.KeyCodes.F11
  18992. */
  18993. F11: 122,
  18994. /**
  18995. * @name Phaser.Input.Keyboard.KeyCodes.F12
  18996. */
  18997. F12: 123,
  18998. /**
  18999. * @name Phaser.Input.Keyboard.KeyCodes.SEMICOLON
  19000. */
  19001. SEMICOLON: 186,
  19002. /**
  19003. * @name Phaser.Input.Keyboard.KeyCodes.PLUS
  19004. */
  19005. PLUS: 187,
  19006. /**
  19007. * @name Phaser.Input.Keyboard.KeyCodes.COMMA
  19008. */
  19009. COMMA: 188,
  19010. /**
  19011. * @name Phaser.Input.Keyboard.KeyCodes.MINUS
  19012. */
  19013. MINUS: 189,
  19014. /**
  19015. * @name Phaser.Input.Keyboard.KeyCodes.PERIOD
  19016. */
  19017. PERIOD: 190,
  19018. /**
  19019. * @name Phaser.Input.Keyboard.KeyCodes.FORWARD_SLASH
  19020. */
  19021. FORWARD_SLASH: 191,
  19022. /**
  19023. * @name Phaser.Input.Keyboard.KeyCodes.BACK_SLASH
  19024. */
  19025. BACK_SLASH: 220,
  19026. /**
  19027. * @name Phaser.Input.Keyboard.KeyCodes.QUOTES
  19028. */
  19029. QUOTES: 222,
  19030. /**
  19031. * @name Phaser.Input.Keyboard.KeyCodes.BACKTICK
  19032. */
  19033. BACKTICK: 192,
  19034. /**
  19035. * @name Phaser.Input.Keyboard.KeyCodes.OPEN_BRACKET
  19036. */
  19037. OPEN_BRACKET: 219,
  19038. /**
  19039. * @name Phaser.Input.Keyboard.KeyCodes.CLOSED_BRACKET
  19040. */
  19041. CLOSED_BRACKET: 221
  19042. };
  19043. module.exports = KeyCodes;
  19044. /***/ }),
  19045. /* 110 */
  19046. /***/ (function(module, exports, __webpack_require__) {
  19047. /**
  19048. * @author Richard Davey <rich@photonstorm.com>
  19049. * @copyright 2018 Photon Storm Ltd.
  19050. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  19051. */
  19052. var AddToDOM = __webpack_require__(131);
  19053. var CanvasPool = __webpack_require__(24);
  19054. var Class = __webpack_require__(0);
  19055. var Components = __webpack_require__(17);
  19056. var CONST = __webpack_require__(22);
  19057. var GameObject = __webpack_require__(2);
  19058. var GetTextSize = __webpack_require__(421);
  19059. var GetValue = __webpack_require__(4);
  19060. var RemoveFromDOM = __webpack_require__(263);
  19061. var TextRender = __webpack_require__(420);
  19062. var TextStyle = __webpack_require__(417);
  19063. /**
  19064. * @classdesc
  19065. * [description]
  19066. *
  19067. * @class Text
  19068. * @extends Phaser.GameObjects.GameObject
  19069. * @memberOf Phaser.GameObjects
  19070. * @constructor
  19071. * @since 3.0.0
  19072. *
  19073. * @extends Phaser.GameObjects.Components.Alpha
  19074. * @extends Phaser.GameObjects.Components.BlendMode
  19075. * @extends Phaser.GameObjects.Components.ComputedSize
  19076. * @extends Phaser.GameObjects.Components.Depth
  19077. * @extends Phaser.GameObjects.Components.Flip
  19078. * @extends Phaser.GameObjects.Components.GetBounds
  19079. * @extends Phaser.GameObjects.Components.Mask
  19080. * @extends Phaser.GameObjects.Components.Origin
  19081. * @extends Phaser.GameObjects.Components.Pipeline
  19082. * @extends Phaser.GameObjects.Components.ScaleMode
  19083. * @extends Phaser.GameObjects.Components.ScrollFactor
  19084. * @extends Phaser.GameObjects.Components.Tint
  19085. * @extends Phaser.GameObjects.Components.Transform
  19086. * @extends Phaser.GameObjects.Components.Visible
  19087. *
  19088. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  19089. * @param {number} x - The horizontal position of this Game Object in the world.
  19090. * @param {number} y - The vertical position of this Game Object in the world.
  19091. * @param {(string|string[])} text - The text this Text object will display.
  19092. * @param {object} style - The text style configuration object.
  19093. */
  19094. var Text = new Class({
  19095. Extends: GameObject,
  19096. Mixins: [
  19097. Components.Alpha,
  19098. Components.BlendMode,
  19099. Components.ComputedSize,
  19100. Components.Depth,
  19101. Components.Flip,
  19102. Components.GetBounds,
  19103. Components.Mask,
  19104. Components.Origin,
  19105. Components.Pipeline,
  19106. Components.ScaleMode,
  19107. Components.ScrollFactor,
  19108. Components.Tint,
  19109. Components.Transform,
  19110. Components.Visible,
  19111. TextRender
  19112. ],
  19113. initialize:
  19114. function Text (scene, x, y, text, style)
  19115. {
  19116. if (x === undefined) { x = 0; }
  19117. if (y === undefined) { y = 0; }
  19118. GameObject.call(this, scene, 'Text');
  19119. this.setPosition(x, y);
  19120. this.setOrigin(0, 0);
  19121. this.initPipeline('TextureTintPipeline');
  19122. /**
  19123. * The canvas element that the text is rendered to.
  19124. *
  19125. * @name Phaser.GameObjects.Text#canvas
  19126. * @type {HTMLCanvasElement}
  19127. * @since 3.0.0
  19128. */
  19129. this.canvas = CanvasPool.create(this);
  19130. /**
  19131. * The context of the canvas element that the text is rendered to.
  19132. *
  19133. * @name Phaser.GameObjects.Text#context
  19134. * @type {CanvasRenderingContext2D}
  19135. * @since 3.0.0
  19136. */
  19137. this.context = this.canvas.getContext('2d');
  19138. /**
  19139. * The Text Style object.
  19140. *
  19141. * Manages the style of this Text object.
  19142. *
  19143. * @name Phaser.GameObjects.Text#style
  19144. * @type {Phaser.GameObjects.Text.TextStyle}
  19145. * @since 3.0.0
  19146. */
  19147. this.style = new TextStyle(this, style);
  19148. /**
  19149. * Whether to automatically round line positions.
  19150. *
  19151. * @name Phaser.GameObjects.Text#autoRound
  19152. * @type {boolean}
  19153. * @default true
  19154. * @since 3.0.0
  19155. */
  19156. this.autoRound = true;
  19157. /**
  19158. * The Regular Expression that is used to split the text up into lines, in
  19159. * multi-line text. By default this is `/(?:\r\n|\r|\n)/`.
  19160. * You can change this RegExp to be anything else that you may need.
  19161. *
  19162. * @name Phaser.GameObjects.Text#splitRegExp
  19163. * @type {object}
  19164. * @since 3.0.0
  19165. */
  19166. this.splitRegExp = /(?:\r\n|\r|\n)/;
  19167. /**
  19168. * The text to display.
  19169. *
  19170. * @name Phaser.GameObjects.Text#text
  19171. * @type {string}
  19172. * @since 3.0.0
  19173. */
  19174. this.text = '';
  19175. /**
  19176. * The resolution of the text.
  19177. *
  19178. * @name Phaser.GameObjects.Text#resolution
  19179. * @type {number}
  19180. * @default 1
  19181. * @since 3.0.0
  19182. */
  19183. this.resolution = 1;
  19184. /**
  19185. * Specify a padding value which is added to the line width and height when calculating the Text size.
  19186. * Allows you to add extra spacing if the browser is unable to accurately determine the true font dimensions.
  19187. *
  19188. * @name Phaser.GameObjects.Text#padding
  19189. * @type {{left:number,right:number,top:number,bottom:number}}
  19190. * @since 3.0.0
  19191. */
  19192. this.padding = { left: 0, right: 0, top: 0, bottom: 0 };
  19193. /**
  19194. * The width of this Text object.
  19195. *
  19196. * @name Phaser.GameObjects.Text#width
  19197. * @type {number}
  19198. * @default 1
  19199. * @since 3.0.0
  19200. */
  19201. this.width = 1;
  19202. /**
  19203. * The height of this Text object.
  19204. *
  19205. * @name Phaser.GameObjects.Text#height
  19206. * @type {number}
  19207. * @default 1
  19208. * @since 3.0.0
  19209. */
  19210. this.height = 1;
  19211. /**
  19212. * The Canvas Texture that the text is rendered to for WebGL rendering.
  19213. *
  19214. * @name Phaser.GameObjects.Text#canvasTexture
  19215. * @type {HTMLCanvasElement}
  19216. * @default null
  19217. * @since 3.0.0
  19218. */
  19219. this.canvasTexture = null;
  19220. /**
  19221. * Whether the text or its settings have changed and need updating.
  19222. *
  19223. * @name Phaser.GameObjects.Text#dirty
  19224. * @type {boolean}
  19225. * @default false
  19226. * @since 3.0.0
  19227. */
  19228. this.dirty = false;
  19229. this.initRTL();
  19230. if (style && style.padding)
  19231. {
  19232. this.setPadding(style.padding);
  19233. }
  19234. if (style && style.lineSpacing)
  19235. {
  19236. this._lineSpacing = style.lineSpacing;
  19237. }
  19238. this.setText(text);
  19239. if (scene.sys.game.config.renderType === CONST.WEBGL)
  19240. {
  19241. scene.sys.game.renderer.onContextRestored(function ()
  19242. {
  19243. this.canvasTexture = null;
  19244. this.dirty = true;
  19245. }, this);
  19246. }
  19247. },
  19248. /**
  19249. * Initialize right to left text.
  19250. *
  19251. * @method Phaser.GameObjects.Text#initRTL
  19252. * @since 3.0.0
  19253. */
  19254. initRTL: function ()
  19255. {
  19256. if (!this.style.rtl)
  19257. {
  19258. return;
  19259. }
  19260. // Here is where the crazy starts.
  19261. //
  19262. // Due to browser implementation issues, you cannot fillText BiDi text to a canvas
  19263. // that is not part of the DOM. It just completely ignores the direction property.
  19264. this.canvas.dir = 'rtl';
  19265. // Experimental atm, but one day ...
  19266. this.context.direction = 'rtl';
  19267. // Add it to the DOM, but hidden within the parent canvas.
  19268. this.canvas.style.display = 'none';
  19269. AddToDOM(this.canvas, this.scene.sys.canvas);
  19270. // And finally we set the x origin
  19271. this.originX = 1;
  19272. },
  19273. /**
  19274. * Greedy wrapping algorithm that will wrap words as the line grows longer than its horizontal
  19275. * bounds.
  19276. *
  19277. * @method Phaser.GameObjects.Text#runWordWrap
  19278. * @since 3.0.0
  19279. *
  19280. * @param {string} text - The text to perform word wrap detection against.
  19281. *
  19282. * @return {string} The text after wrapping has been applied.
  19283. */
  19284. runWordWrap: function (text)
  19285. {
  19286. var style = this.style;
  19287. if (style.wordWrapCallback)
  19288. {
  19289. var wrappedLines = style.wordWrapCallback.call(style.wordWrapCallbackScope, text, this);
  19290. if (Array.isArray(wrappedLines))
  19291. {
  19292. wrappedLines = wrappedLines.join('\n');
  19293. }
  19294. return wrappedLines;
  19295. }
  19296. else if (style.wordWrapWidth)
  19297. {
  19298. if (style.wordWrapUseAdvanced)
  19299. {
  19300. return this.advancedWordWrap(text, this.context, this.style.wordWrapWidth);
  19301. }
  19302. else
  19303. {
  19304. return this.basicWordWrap(text, this.context, this.style.wordWrapWidth);
  19305. }
  19306. }
  19307. else
  19308. {
  19309. return text;
  19310. }
  19311. },
  19312. /**
  19313. * Advanced wrapping algorithm that will wrap words as the line grows longer than its horizontal
  19314. * bounds. Consecutive spaces will be collapsed and replaced with a single space. Lines will be
  19315. * trimmed of white space before processing. Throws an error if wordWrapWidth is less than a
  19316. * single character.
  19317. *
  19318. * @method Phaser.GameObjects.Text#advancedWordWrap
  19319. * @since 3.0.0
  19320. *
  19321. * @param {string} text - The text to perform word wrap detection against.
  19322. * @param {CanvasRenderingContext2D} context - The Canvas Rendering Context.
  19323. * @param {number} wordWrapWidth - The word wrap width.
  19324. *
  19325. * @return {string} The wrapped text.
  19326. */
  19327. advancedWordWrap: function (text, context, wordWrapWidth)
  19328. {
  19329. var output = '';
  19330. // Condense consecutive spaces and split into lines
  19331. var lines = text
  19332. .replace(/ +/gi, ' ')
  19333. .split(this.splitRegExp);
  19334. var linesCount = lines.length;
  19335. for (var i = 0; i < linesCount; i++)
  19336. {
  19337. var line = lines[i];
  19338. var out = '';
  19339. // Trim whitespace
  19340. line = line.replace(/^ *|\s*$/gi, '');
  19341. // If entire line is less than wordWrapWidth append the entire line and exit early
  19342. var lineWidth = context.measureText(line).width;
  19343. if (lineWidth < wordWrapWidth)
  19344. {
  19345. output += line + '\n';
  19346. continue;
  19347. }
  19348. // Otherwise, calculate new lines
  19349. var currentLineWidth = wordWrapWidth;
  19350. // Split into words
  19351. var words = line.split(' ');
  19352. for (var j = 0; j < words.length; j++)
  19353. {
  19354. var word = words[j];
  19355. var wordWithSpace = word + ' ';
  19356. var wordWidth = context.measureText(wordWithSpace).width;
  19357. if (wordWidth > currentLineWidth)
  19358. {
  19359. // Break word
  19360. if (j === 0)
  19361. {
  19362. // Shave off letters from word until it's small enough
  19363. var newWord = wordWithSpace;
  19364. while (newWord.length)
  19365. {
  19366. newWord = newWord.slice(0, -1);
  19367. wordWidth = context.measureText(newWord).width;
  19368. if (wordWidth <= currentLineWidth)
  19369. {
  19370. break;
  19371. }
  19372. }
  19373. // If wordWrapWidth is too small for even a single letter, shame user
  19374. // failure with a fatal error
  19375. if (!newWord.length)
  19376. {
  19377. throw new Error('This text\'s wordWrapWidth setting is less than a single character!');
  19378. }
  19379. // Replace current word in array with remainder
  19380. var secondPart = word.substr(newWord.length);
  19381. words[j] = secondPart;
  19382. // Append first piece to output
  19383. out += newWord;
  19384. }
  19385. // If existing word length is 0, don't include it
  19386. var offset = (words[j].length) ? j : j + 1;
  19387. // Collapse rest of sentence and remove any trailing white space
  19388. var remainder = words.slice(offset).join(' ')
  19389. .replace(/[ \n]*$/gi, '');
  19390. // Prepend remainder to next line
  19391. lines[i + 1] = remainder + ' ' + (lines[i + 1] || '');
  19392. linesCount = lines.length;
  19393. break; // Processing on this line
  19394. // Append word with space to output
  19395. }
  19396. else
  19397. {
  19398. out += wordWithSpace;
  19399. currentLineWidth -= wordWidth;
  19400. }
  19401. }
  19402. // Append processed line to output
  19403. output += out.replace(/[ \n]*$/gi, '') + '\n';
  19404. }
  19405. // Trim the end of the string
  19406. output = output.replace(/[\s|\n]*$/gi, '');
  19407. return output;
  19408. },
  19409. /**
  19410. * Greedy wrapping algorithm that will wrap words as the line grows longer than its horizontal
  19411. * bounds. Spaces are not collapsed and whitespace is not trimmed.
  19412. *
  19413. * @method Phaser.GameObjects.Text#basicWordWrap
  19414. * @since 3.0.0
  19415. *
  19416. * @param {string} text - The text to perform word wrap detection against.
  19417. * @param {CanvasRenderingContext2D} context - The Canvas Rendering Context.
  19418. * @param {number} wordWrapWidth - The word wrap width.
  19419. *
  19420. * @return {string} The wrapped text.
  19421. */
  19422. basicWordWrap: function (text, context, wordWrapWidth)
  19423. {
  19424. var result = '';
  19425. var lines = text.split(this.splitRegExp);
  19426. for (var i = 0; i < lines.length; i++)
  19427. {
  19428. var spaceLeft = wordWrapWidth;
  19429. var words = lines[i].split(' ');
  19430. for (var j = 0; j < words.length; j++)
  19431. {
  19432. var wordWidth = context.measureText(words[j]).width;
  19433. var wordWidthWithSpace = wordWidth + context.measureText(' ').width;
  19434. if (wordWidthWithSpace > spaceLeft)
  19435. {
  19436. // Skip printing the newline if it's the first word of the line that is greater
  19437. // than the word wrap width.
  19438. if (j > 0)
  19439. {
  19440. result += '\n';
  19441. }
  19442. result += words[j] + ' ';
  19443. spaceLeft = wordWrapWidth - wordWidth;
  19444. }
  19445. else
  19446. {
  19447. spaceLeft -= wordWidthWithSpace;
  19448. result += words[j];
  19449. if (j < (words.length - 1))
  19450. {
  19451. result += ' ';
  19452. }
  19453. }
  19454. }
  19455. if (i < lines.length - 1)
  19456. {
  19457. result += '\n';
  19458. }
  19459. }
  19460. return result;
  19461. },
  19462. /**
  19463. * Runs the given text through this Text objects word wrapping and returns the results as an
  19464. * array, where each element of the array corresponds to a wrapped line of text.
  19465. *
  19466. * @method Phaser.GameObjects.Text#getWrappedText
  19467. * @since 3.0.0
  19468. *
  19469. * @param {string} text - The text for which the wrapping will be calculated. If unspecified, the Text objects current text will be used.
  19470. *
  19471. * @return {string[]} An array of strings with the pieces of wrapped text.
  19472. */
  19473. getWrappedText: function (text)
  19474. {
  19475. if (text === undefined) { text = this.text; }
  19476. this.style.syncFont(this.canvas, this.context);
  19477. var wrappedLines = this.runWordWrap(text);
  19478. return wrappedLines.split(this.splitRegExp);
  19479. },
  19480. /**
  19481. * Set the text to display.
  19482. *
  19483. * An array of strings will be joined with `\n` line breaks.
  19484. *
  19485. * @method Phaser.GameObjects.Text#setText
  19486. * @since 3.0.0
  19487. *
  19488. * @param {(string|string[])} value - The string, or array of strings, to be set as the content of this Text object.
  19489. *
  19490. * @return {Phaser.GameObjects.Text} This Text object.
  19491. */
  19492. setText: function (value)
  19493. {
  19494. if (!value && value !== 0)
  19495. {
  19496. value = '';
  19497. }
  19498. if (Array.isArray(value))
  19499. {
  19500. value = value.join('\n');
  19501. }
  19502. if (value !== this.text)
  19503. {
  19504. this.text = value.toString();
  19505. this.updateText();
  19506. }
  19507. return this;
  19508. },
  19509. /**
  19510. * Set the text style.
  19511. *
  19512. * @example
  19513. * text.setStyle({
  19514. * fontSize: '64px',
  19515. * fontFamily: 'Arial',
  19516. * color: '#ffffff',
  19517. * align: 'center',
  19518. * backgroundColor: '#ff00ff'
  19519. * });
  19520. *
  19521. * @method Phaser.GameObjects.Text#setStyle
  19522. * @since 3.0.0
  19523. *
  19524. * @param {object} style - The style settings to set.
  19525. *
  19526. * @return {Phaser.GameObjects.Text} This Text object.
  19527. */
  19528. setStyle: function (style)
  19529. {
  19530. return this.style.setStyle(style);
  19531. },
  19532. /**
  19533. * Set the font.
  19534. *
  19535. * If a string is given, the font family is set.
  19536. *
  19537. * If an object is given, the `fontFamily`, `fontSize` and `fontStyle`
  19538. * properties of that object are set.
  19539. *
  19540. * @method Phaser.GameObjects.Text#setFont
  19541. * @since 3.0.0
  19542. *
  19543. * @param {string} font - The font family or font settings to set.
  19544. *
  19545. * @return {Phaser.GameObjects.Text} This Text object.
  19546. */
  19547. setFont: function (font)
  19548. {
  19549. return this.style.setFont(font);
  19550. },
  19551. /**
  19552. * Set the font family.
  19553. *
  19554. * @method Phaser.GameObjects.Text#setFontFamily
  19555. * @since 3.0.0
  19556. *
  19557. * @param {string} family - The font family.
  19558. *
  19559. * @return {Phaser.GameObjects.Text} This Text object.
  19560. */
  19561. setFontFamily: function (family)
  19562. {
  19563. return this.style.setFontFamily(family);
  19564. },
  19565. /**
  19566. * Set the font size.
  19567. *
  19568. * @method Phaser.GameObjects.Text#setFontSize
  19569. * @since 3.0.0
  19570. *
  19571. * @param {number} size - The font size.
  19572. *
  19573. * @return {Phaser.GameObjects.Text} This Text object.
  19574. */
  19575. setFontSize: function (size)
  19576. {
  19577. return this.style.setFontSize(size);
  19578. },
  19579. /**
  19580. * Set the font style.
  19581. *
  19582. * @method Phaser.GameObjects.Text#setFontStyle
  19583. * @since 3.0.0
  19584. *
  19585. * @param {string} style - The font style.
  19586. *
  19587. * @return {Phaser.GameObjects.Text} This Text object.
  19588. */
  19589. setFontStyle: function (style)
  19590. {
  19591. return this.style.setFontStyle(style);
  19592. },
  19593. /**
  19594. * Set a fixed width and height for the text.
  19595. *
  19596. * Pass in `0` for either of these parameters to disable fixed width or height respectively.
  19597. *
  19598. * @method Phaser.GameObjects.Text#setFixedSize
  19599. * @since 3.0.0
  19600. *
  19601. * @param {number} width - The fixed width to set. `0` disables fixed width.
  19602. * @param {number} height - The fixed height to set. `0` disables fixed height.
  19603. *
  19604. * @return {Phaser.GameObjects.Text} This Text object.
  19605. */
  19606. setFixedSize: function (width, height)
  19607. {
  19608. return this.style.setFixedSize(width, height);
  19609. },
  19610. /**
  19611. * Set the background color.
  19612. *
  19613. * @method Phaser.GameObjects.Text#setBackgroundColor
  19614. * @since 3.0.0
  19615. *
  19616. * @param {string} color - The background color.
  19617. *
  19618. * @return {Phaser.GameObjects.Text} This Text object.
  19619. */
  19620. setBackgroundColor: function (color)
  19621. {
  19622. return this.style.setBackgroundColor(color);
  19623. },
  19624. /**
  19625. * Set the text fill color.
  19626. *
  19627. * @method Phaser.GameObjects.Text#setFill
  19628. * @since 3.0.0
  19629. *
  19630. * @param {string} color - The text fill color.
  19631. *
  19632. * @return {Phaser.GameObjects.Text} This Text object.
  19633. */
  19634. setFill: function (color)
  19635. {
  19636. return this.style.setFill(color);
  19637. },
  19638. /**
  19639. * Set the text fill color.
  19640. *
  19641. * @method Phaser.GameObjects.Text#setColor
  19642. * @since 3.0.0
  19643. *
  19644. * @param {string} color - The text fill color.
  19645. *
  19646. * @return {Phaser.GameObjects.Text} This Text object.
  19647. */
  19648. setColor: function (color)
  19649. {
  19650. return this.style.setColor(color);
  19651. },
  19652. /**
  19653. * Set the stroke settings.
  19654. *
  19655. * @method Phaser.GameObjects.Text#setStroke
  19656. * @since 3.0.0
  19657. *
  19658. * @param {string} color - The stroke color.
  19659. * @param {number} thickness - The stroke thickness.
  19660. *
  19661. * @return {Phaser.GameObjects.Text} This Text object.
  19662. */
  19663. setStroke: function (color, thickness)
  19664. {
  19665. return this.style.setStroke(color, thickness);
  19666. },
  19667. /**
  19668. * Set the shadow settings.
  19669. *
  19670. * @method Phaser.GameObjects.Text#setShadow
  19671. * @since 3.0.0
  19672. *
  19673. * @param {number} [x=0] - The horizontal shadow offset.
  19674. * @param {number} [y=0] - The vertical shadow offset.
  19675. * @param {string} [color='#000'] - The shadow color.
  19676. * @param {number} [blur=0] - The shadow blur radius.
  19677. * @param {boolean} [shadowStroke=false] - Whether to stroke the shadow.
  19678. * @param {boolean} [shadowFill=true] - Whether to fill the shadow.
  19679. *
  19680. * @return {Phaser.GameObjects.Text} This Text object.
  19681. */
  19682. setShadow: function (x, y, color, blur, shadowStroke, shadowFill)
  19683. {
  19684. return this.style.setShadow(x, y, color, blur, shadowStroke, shadowFill);
  19685. },
  19686. /**
  19687. * Set the shadow offset.
  19688. *
  19689. * @method Phaser.GameObjects.Text#setShadowOffset
  19690. * @since 3.0.0
  19691. *
  19692. * @param {number} x - The horizontal shadow offset.
  19693. * @param {number} y - The vertical shadow offset.
  19694. *
  19695. * @return {Phaser.GameObjects.Text} This Text object.
  19696. */
  19697. setShadowOffset: function (x, y)
  19698. {
  19699. return this.style.setShadowOffset(x, y);
  19700. },
  19701. /**
  19702. * Set the shadow color.
  19703. *
  19704. * @method Phaser.GameObjects.Text#setShadowColor
  19705. * @since 3.0.0
  19706. *
  19707. * @param {string} color - The shadow color.
  19708. *
  19709. * @return {Phaser.GameObjects.Text} This Text object.
  19710. */
  19711. setShadowColor: function (color)
  19712. {
  19713. return this.style.setShadowColor(color);
  19714. },
  19715. /**
  19716. * Set the shadow blur radius.
  19717. *
  19718. * @method Phaser.GameObjects.Text#setShadowBlur
  19719. * @since 3.0.0
  19720. *
  19721. * @param {number} blur - The shadow blur radius.
  19722. *
  19723. * @return {Phaser.GameObjects.Text} This Text object.
  19724. */
  19725. setShadowBlur: function (blur)
  19726. {
  19727. return this.style.setShadowBlur(blur);
  19728. },
  19729. /**
  19730. * Enable or disable shadow stroke.
  19731. *
  19732. * @method Phaser.GameObjects.Text#setShadowStroke
  19733. * @since 3.0.0
  19734. *
  19735. * @param {boolean} enabled - Whether shadow stroke is enabled or not.
  19736. *
  19737. * @return {Phaser.GameObjects.Text} This Text object.
  19738. */
  19739. setShadowStroke: function (enabled)
  19740. {
  19741. return this.style.setShadowStroke(enabled);
  19742. },
  19743. /**
  19744. * Enable or disable shadow fill.
  19745. *
  19746. * @method Phaser.GameObjects.Text#setShadowFill
  19747. * @since 3.0.0
  19748. *
  19749. * @param {boolean} enabled - Whether shadow fill is enabled or not.
  19750. *
  19751. * @return {Phaser.GameObjects.Text} This Text object.
  19752. */
  19753. setShadowFill: function (enabled)
  19754. {
  19755. return this.style.setShadowFill(enabled);
  19756. },
  19757. /**
  19758. * Set the width (in pixels) to use for wrapping lines. Pass in null to remove wrapping by width.
  19759. *
  19760. * @method Phaser.GameObjects.Text#setWordWrapWidth
  19761. * @since 3.0.0
  19762. *
  19763. * @param {?number} width - The maximum width of a line in pixels. Set to null to remove wrapping.
  19764. * @param {boolean} [useAdvancedWrap=false] - Whether or not to use the advanced wrapping
  19765. * algorithm. If true, spaces are collapsed and whitespace is trimmed from lines. If false,
  19766. * spaces and whitespace are left as is.
  19767. *
  19768. * @return {Phaser.GameObjects.Text} This Text object.
  19769. */
  19770. setWordWrapWidth: function (width, useAdvancedWrap)
  19771. {
  19772. return this.style.setWordWrapWidth(width, useAdvancedWrap);
  19773. },
  19774. /**
  19775. * Set a custom callback for wrapping lines. Pass in null to remove wrapping by callback.
  19776. *
  19777. * @method Phaser.GameObjects.Text#setWordWrapCallback
  19778. * @since 3.0.0
  19779. *
  19780. * @param {TextStyleWordWrapCallback} callback - A custom function that will be responsible for wrapping the
  19781. * text. It will receive two arguments: text (the string to wrap), textObject (this Text
  19782. * instance). It should return the wrapped lines either as an array of lines or as a string with
  19783. * newline characters in place to indicate where breaks should happen.
  19784. * @param {object} [scope=null] - The scope that will be applied when the callback is invoked.
  19785. *
  19786. * @return {Phaser.GameObjects.Text} This Text object.
  19787. */
  19788. setWordWrapCallback: function (callback, scope)
  19789. {
  19790. return this.style.setWordWrapCallback(callback, scope);
  19791. },
  19792. /**
  19793. * Set the text alignment.
  19794. *
  19795. * Expects values like `'left'`, `'right'`, `'center'` or `'justified'`.
  19796. *
  19797. * @method Phaser.GameObjects.Text#setAlign
  19798. * @since 3.0.0
  19799. *
  19800. * @param {string} align - The text alignment.
  19801. *
  19802. * @return {Phaser.GameObjects.Text} This Text object.
  19803. */
  19804. setAlign: function (align)
  19805. {
  19806. return this.style.setAlign(align);
  19807. },
  19808. /**
  19809. * Set the text padding.
  19810. *
  19811. * 'left' can be an object.
  19812. *
  19813. * If only 'left' and 'top' are given they are treated as 'x' and 'y'.
  19814. *
  19815. * @method Phaser.GameObjects.Text#setPadding
  19816. * @since 3.0.0
  19817. *
  19818. * @param {(number|object)} left - The left padding value, or a padding config object.
  19819. * @param {number} top - The top padding value.
  19820. * @param {number} right - The right padding value.
  19821. * @param {number} bottom - The bottom padding value.
  19822. *
  19823. * @return {Phaser.GameObjects.Text} This Text object.
  19824. */
  19825. setPadding: function (left, top, right, bottom)
  19826. {
  19827. if (typeof left === 'object')
  19828. {
  19829. var config = left;
  19830. // If they specify x and/or y this applies to all
  19831. var x = GetValue(config, 'x', null);
  19832. if (x !== null)
  19833. {
  19834. left = x;
  19835. right = x;
  19836. }
  19837. else
  19838. {
  19839. left = GetValue(config, 'left', 0);
  19840. right = GetValue(config, 'right', left);
  19841. }
  19842. var y = GetValue(config, 'y', null);
  19843. if (y !== null)
  19844. {
  19845. top = y;
  19846. bottom = y;
  19847. }
  19848. else
  19849. {
  19850. top = GetValue(config, 'top', 0);
  19851. bottom = GetValue(config, 'bottom', top);
  19852. }
  19853. }
  19854. else
  19855. {
  19856. if (left === undefined) { left = 0; }
  19857. if (top === undefined) { top = left; }
  19858. if (right === undefined) { right = left; }
  19859. if (bottom === undefined) { bottom = top; }
  19860. }
  19861. this.padding.left = left;
  19862. this.padding.top = top;
  19863. this.padding.right = right;
  19864. this.padding.bottom = bottom;
  19865. return this.updateText();
  19866. },
  19867. /**
  19868. * Set the maximum number of lines to draw.
  19869. *
  19870. * @method Phaser.GameObjects.Text#setMaxLines
  19871. * @since 3.0.0
  19872. *
  19873. * @param {integer} [max=0] - The maximum number of lines to draw.
  19874. *
  19875. * @return {Phaser.GameObjects.Text} This Text object.
  19876. */
  19877. setMaxLines: function (max)
  19878. {
  19879. return this.style.setMaxLines(max);
  19880. },
  19881. /**
  19882. * Update the displayed text.
  19883. *
  19884. * @method Phaser.GameObjects.Text#updateText
  19885. * @since 3.0.0
  19886. *
  19887. * @return {Phaser.GameObjects.Text} This Text object.
  19888. */
  19889. updateText: function ()
  19890. {
  19891. var canvas = this.canvas;
  19892. var context = this.context;
  19893. var style = this.style;
  19894. var resolution = this.resolution;
  19895. var size = style.metrics;
  19896. style.syncFont(canvas, context);
  19897. var outputText = this.text;
  19898. if (style.wordWrapWidth || style.wordWrapCallback)
  19899. {
  19900. outputText = this.runWordWrap(this.text);
  19901. }
  19902. // Split text into lines
  19903. var lines = outputText.split(this.splitRegExp);
  19904. var textSize = GetTextSize(this, size, lines);
  19905. var padding = this.padding;
  19906. var w = textSize.width + padding.left + padding.right;
  19907. var h = textSize.height + padding.top + padding.bottom;
  19908. if (style.fixedWidth === 0)
  19909. {
  19910. this.width = w;
  19911. }
  19912. if (style.fixedHeight === 0)
  19913. {
  19914. this.height = h;
  19915. }
  19916. this.updateDisplayOrigin();
  19917. w *= resolution;
  19918. h *= resolution;
  19919. w = Math.max(w, 1);
  19920. h = Math.max(h, 1);
  19921. if (canvas.width !== w || canvas.height !== h)
  19922. {
  19923. canvas.width = w;
  19924. canvas.height = h;
  19925. style.syncFont(canvas, context); // Resizing resets the context
  19926. }
  19927. else
  19928. {
  19929. context.clearRect(0, 0, w, h);
  19930. }
  19931. context.save();
  19932. // context.scale(resolution, resolution);
  19933. if (style.backgroundColor)
  19934. {
  19935. context.fillStyle = style.backgroundColor;
  19936. context.fillRect(0, 0, w, h);
  19937. }
  19938. style.syncStyle(canvas, context);
  19939. context.textBaseline = 'alphabetic';
  19940. // Apply padding
  19941. context.translate(padding.left, padding.top);
  19942. var linePositionX;
  19943. var linePositionY;
  19944. // Draw text line by line
  19945. for (var i = 0; i < textSize.lines; i++)
  19946. {
  19947. linePositionX = style.strokeThickness / 2;
  19948. linePositionY = (style.strokeThickness / 2 + i * textSize.lineHeight) + size.ascent;
  19949. if (i > 0)
  19950. {
  19951. linePositionY += (textSize.lineSpacing * i);
  19952. }
  19953. if (style.rtl)
  19954. {
  19955. linePositionX = w - linePositionX;
  19956. }
  19957. else if (style.align === 'right')
  19958. {
  19959. linePositionX += textSize.width - textSize.lineWidths[i];
  19960. }
  19961. else if (style.align === 'center')
  19962. {
  19963. linePositionX += (textSize.width - textSize.lineWidths[i]) / 2;
  19964. }
  19965. if (this.autoRound)
  19966. {
  19967. linePositionX = Math.round(linePositionX);
  19968. linePositionY = Math.round(linePositionY);
  19969. }
  19970. if (style.strokeThickness)
  19971. {
  19972. this.style.syncShadow(context, style.shadowStroke);
  19973. context.strokeText(lines[i], linePositionX, linePositionY);
  19974. }
  19975. if (style.color)
  19976. {
  19977. this.style.syncShadow(context, style.shadowFill);
  19978. context.fillText(lines[i], linePositionX, linePositionY);
  19979. }
  19980. }
  19981. context.restore();
  19982. this.dirty = true;
  19983. return this;
  19984. },
  19985. /**
  19986. * Get the current text metrics.
  19987. *
  19988. * @method Phaser.GameObjects.Text#getTextMetrics
  19989. * @since 3.0.0
  19990. *
  19991. * @return {object} The text metrics.
  19992. */
  19993. getTextMetrics: function ()
  19994. {
  19995. return this.style.getTextMetrics();
  19996. },
  19997. /**
  19998. * Build a JSON representation of the Text object.
  19999. *
  20000. * @method Phaser.GameObjects.Text#toJSON
  20001. * @since 3.0.0
  20002. *
  20003. * @return {JSONGameObject} A JSON representation of the Text object.
  20004. */
  20005. toJSON: function ()
  20006. {
  20007. var out = Components.ToJSON(this);
  20008. // Extra Text data is added here
  20009. var data = {
  20010. autoRound: this.autoRound,
  20011. text: this.text,
  20012. style: this.style.toJSON(),
  20013. resolution: this.resolution,
  20014. padding: {
  20015. left: this.padding.left,
  20016. right: this.padding.right,
  20017. top: this.padding.top,
  20018. bottom: this.padding.bottom
  20019. }
  20020. };
  20021. out.data = data;
  20022. return out;
  20023. },
  20024. /**
  20025. * Internal destroy handler, called as part of the destroy process.
  20026. *
  20027. * @method Phaser.GameObjects.Text#preDestroy
  20028. * @protected
  20029. * @since 3.0.0
  20030. */
  20031. preDestroy: function ()
  20032. {
  20033. if (this.style.rtl)
  20034. {
  20035. RemoveFromDOM(this.canvas);
  20036. }
  20037. CanvasPool.remove(this.canvas);
  20038. }
  20039. });
  20040. module.exports = Text;
  20041. /***/ }),
  20042. /* 111 */
  20043. /***/ (function(module, exports) {
  20044. /**
  20045. * @author Richard Davey <rich@photonstorm.com>
  20046. * @copyright 2018 Photon Storm Ltd.
  20047. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  20048. */
  20049. /**
  20050. * [description]
  20051. *
  20052. * @function Phaser.Utils.Object.HasValue
  20053. * @since 3.0.0
  20054. *
  20055. * @param {object} source - [description]
  20056. * @param {string} key - [description]
  20057. *
  20058. * @return {boolean} [description]
  20059. */
  20060. var HasValue = function (source, key)
  20061. {
  20062. return (source.hasOwnProperty(key));
  20063. };
  20064. module.exports = HasValue;
  20065. /***/ }),
  20066. /* 112 */
  20067. /***/ (function(module, exports, __webpack_require__) {
  20068. /**
  20069. * @author Richard Davey <rich@photonstorm.com>
  20070. * @copyright 2018 Photon Storm Ltd.
  20071. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  20072. */
  20073. var Actions = __webpack_require__(604);
  20074. var Class = __webpack_require__(0);
  20075. var GetFastValue = __webpack_require__(1);
  20076. var GetValue = __webpack_require__(4);
  20077. var Range = __webpack_require__(247);
  20078. var Set = __webpack_require__(69);
  20079. var Sprite = __webpack_require__(35);
  20080. /**
  20081. * @callback GroupCallback
  20082. *
  20083. * @param {Phaser.GameObjects.GameObject} item - A group member
  20084. */
  20085. /**
  20086. * @callback GroupMultipleCreateCallback
  20087. *
  20088. * @param {Phaser.GameObjects.GameObject[]} items - The newly created group members
  20089. */
  20090. /**
  20091. * @typedef {object} GroupConfig
  20092. *
  20093. * @property {?object} [classType=Sprite] - Sets {@link Phaser.GameObjects.Group#classType}.
  20094. * @property {?boolean} [active=true] - Sets {@link Phaser.GameObjects.Group#active}.
  20095. * @property {?number} [maxSize=-1] - Sets {@link Phaser.GameObjects.Group#maxSize}.
  20096. * @property {?string} [defaultKey=null] - Sets {@link Phaser.GameObjects.Group#defaultKey}.
  20097. * @property {?(string|integer)} [defaultFrame=null] - Sets {@link Phaser.GameObjects.Group#defaultFrame}.
  20098. * @property {?boolean} [runChildUpdate=false] - Sets {@link Phaser.GameObjects.Group#runChildUpdate}.
  20099. * @property {?GroupCallback} [createCallback=null] - Sets {@link Phaser.GameObjects.Group#createCallback}.
  20100. * @property {?GroupCallback} [removeCallback=null] - Sets {@link Phaser.GameObjects.Group#removeCallback}.
  20101. * @property {?GroupMultipleCreateCallback} [createMultipleCallback=null] - Sets {@link Phaser.GameObjects.Group#createMultipleCallback}.
  20102. */
  20103. /**
  20104. * @typedef {object} GroupCreateConfig
  20105. *
  20106. * The total number of objects created will be
  20107. *
  20108. * key.length * frame.length * frameQuantity * (yoyo ? 2 : 1) * (1 + repeat)
  20109. *
  20110. * In the simplest case, 1 + `repeat` objects will be created.
  20111. *
  20112. * If `max` is positive, then the total created will not exceed `max`.
  20113. *
  20114. * `key` is required. {@link Phaser.GameObjects.Group#defaultKey} is not used.
  20115. *
  20116. * @property {?object} [classType] - The class of each new Game Object.
  20117. * @property {string} [key] - The texture key of each new Game Object.
  20118. * @property {?(string|integer)} [frame=null] - The texture frame of each new Game Object.
  20119. * @property {?boolean} [visible=true] - The visible state of each new Game Object.
  20120. * @property {?boolean} [active=true] - The active state of each new Game Object.
  20121. * @property {?number} [repeat=0] - The number of times each `key` × `frame` combination will be *repeated* (after the first combination).
  20122. * @property {?boolean} [randomKey=false] - Select a `key` at random.
  20123. * @property {?boolean} [randomFrame=false] - Select a `frame` at random.
  20124. * @property {?boolean} [yoyo=false] - Select keys and frames by moving forward then backward through `key` and `frame`.
  20125. * @property {?number} [frameQuantity=1] - The number of times each `frame` should be combined with one `key`.
  20126. * @property {?number} [max=0] - The maximum number of new Game Objects to create. 0 is no maximum.
  20127. * @property {?object} [setXY]
  20128. * @property {?number} [setXY.x=0] - The horizontal position of each new Game Object.
  20129. * @property {?number} [setXY.y=0] - The vertical position of each new Game Object.
  20130. * @property {?number} [setXY.stepX=0] - Increment each Game Object's horizontal position from the previous by this amount, starting from `setXY.x`.
  20131. * @property {?number} [setXY.stepY=0] - Increment each Game Object's vertical position from the previous by this amount, starting from `setXY.y`.
  20132. * @property {?object} [setRotation]
  20133. * @property {?number} [setRotation.value=0] - Rotation of each new Game Object.
  20134. * @property {?number} [setRotation.step=0] - Increment each Game Object's rotation from the previous by this amount, starting at `setRotation.value`.
  20135. * @property {?object} [setScale]
  20136. * @property {?number} [setScale.x=0] - The horizontal scale of each new Game Object.
  20137. * @property {?number} [setScale.y=0] - The vertical scale of each new Game Object.
  20138. * @property {?number} [setScale.stepX=0] - Increment each Game Object's horizontal scale from the previous by this amount, starting from `setScale.x`.
  20139. * @property {?number} [setScale.stepY=0] - Increment each Game object's vertical scale from the previous by this amount, starting from `setScale.y`.
  20140. * @property {?object} [setAlpha]
  20141. * @property {?number} [setAlpha.value=0] - The alpha value of each new Game Object.
  20142. * @property {?number} [setAlpha.step=0] - Increment each Game Object's alpha from the previous by this amount, starting from `setAlpha.value`.
  20143. * @property {?*} [hitArea] - A geometric shape that defines the hit area for the Game Object.
  20144. * @property {?HitAreaCallback} [hitAreaCallback] - A callback to be invoked when the Game Object is interacted with.
  20145. * @property {?(false|GridAlignConfig)} [gridAlign=false] - Align the new Game Objects in a grid using these settings.
  20146. *
  20147. * @see Phaser.Actions.GridAlign
  20148. * @see Phaser.Actions.SetAlpha
  20149. * @see Phaser.Actions.SetHitArea
  20150. * @see Phaser.Actions.SetRotation
  20151. * @see Phaser.Actions.SetScale
  20152. * @see Phaser.Actions.SetXY
  20153. * @see Phaser.GameObjects.Group#createFromConfig
  20154. * @see Phaser.Utils.Array.Range
  20155. */
  20156. /**
  20157. * @classdesc A Group is a way for you to create, manipulate, or recycle similar Game Objects.
  20158. *
  20159. * Group membership is non-exclusive. A Game Object can belong to several groups, one group, or none.
  20160. *
  20161. * Groups themselves aren't displayable, and can't be positioned, rotated, scaled, or hidden.
  20162. *
  20163. * @class Group
  20164. * @memberOf Phaser.GameObjects
  20165. * @constructor
  20166. * @since 3.0.0
  20167. * @param {Phaser.Scene} scene - The scene this group belongs to.
  20168. * @param {(Phaser.GameObjects.GameObject[]|GroupConfig)} [children] - Game objects to add to this group; or the `config` argument.
  20169. * @param {GroupConfig|GroupCreateConfig} [config] - Settings for this group. If `key` is set, Phaser.GameObjects.Group#createMultiple is also called with these settings.
  20170. *
  20171. * @see Phaser.Physics.Arcade.Group
  20172. * @see Phaser.Physics.Arcade.StaticGroup
  20173. */
  20174. var Group = new Class({
  20175. initialize:
  20176. function Group (scene, children, config)
  20177. {
  20178. if (config === undefined && !Array.isArray(children) && typeof children === 'object')
  20179. {
  20180. config = children;
  20181. children = null;
  20182. }
  20183. /**
  20184. * This scene this group belongs to.
  20185. *
  20186. * @name Phaser.GameObjects.Group#scene
  20187. * @type {Phaser.Scene}
  20188. * @since 3.0.0
  20189. */
  20190. this.scene = scene;
  20191. /**
  20192. * Members of this group.
  20193. *
  20194. * @name Phaser.GameObjects.Group#children
  20195. * @type {Phaser.Structs.Set.<Phaser.GameObjects.GameObject>}
  20196. * @since 3.0.0
  20197. */
  20198. this.children = new Set(children);
  20199. /**
  20200. * A flag identifying this object as a group.
  20201. *
  20202. * @name Phaser.GameObjects.Group#isParent
  20203. * @type {boolean}
  20204. * @default true
  20205. * @since 3.0.0
  20206. */
  20207. this.isParent = true;
  20208. /**
  20209. * The class to create new group members from.
  20210. *
  20211. * @name Phaser.GameObjects.Group#classType
  20212. * @type {object}
  20213. * @since 3.0.0
  20214. * @default Phaser.GameObjects.Sprite
  20215. */
  20216. this.classType = GetFastValue(config, 'classType', Sprite);
  20217. /**
  20218. * Whether this group runs its {@link Phaser.GameObjects.Group#preUpdate} method
  20219. * (which may update any members).
  20220. *
  20221. * @name Phaser.GameObjects.Group#active
  20222. * @type {boolean}
  20223. * @since 3.0.0
  20224. */
  20225. this.active = GetFastValue(config, 'active', true);
  20226. /**
  20227. * The maximum size of this group, if used as a pool. -1 is no limit.
  20228. *
  20229. * @name Phaser.GameObjects.Group#maxSize
  20230. * @type {integer}
  20231. * @since 3.0.0
  20232. * @default -1
  20233. */
  20234. this.maxSize = GetFastValue(config, 'maxSize', -1);
  20235. /**
  20236. * A default texture key to use when creating new group members.
  20237. *
  20238. * This is used in {@link Phaser.GameObjects.Group#create}
  20239. * but not in {@link Phaser.GameObjects.Group#createMultiple}.
  20240. *
  20241. * @name Phaser.GameObjects.Group#defaultKey
  20242. * @type {string}
  20243. * @since 3.0.0
  20244. */
  20245. this.defaultKey = GetFastValue(config, 'defaultKey', null);
  20246. /**
  20247. * A default texture frame to use when creating new group members.
  20248. *
  20249. * @name Phaser.GameObjects.Group#defaultFrame
  20250. * @type {(string|integer)}
  20251. * @since 3.0.0
  20252. */
  20253. this.defaultFrame = GetFastValue(config, 'defaultFrame', null);
  20254. /**
  20255. * Whether to call the update method of any members.
  20256. *
  20257. * @name Phaser.GameObjects.Group#runChildUpdate
  20258. * @type {boolean}
  20259. * @default false
  20260. * @since 3.0.0
  20261. * @see Phaser.GameObjects.Group#preUpdate
  20262. */
  20263. this.runChildUpdate = GetFastValue(config, 'runChildUpdate', false);
  20264. /**
  20265. * A function to be called when adding or creating group members.
  20266. *
  20267. * @name Phaser.GameObjects.Group#createCallback
  20268. * @type {?GroupCallback}
  20269. * @since 3.0.0
  20270. */
  20271. this.createCallback = GetFastValue(config, 'createCallback', null);
  20272. /**
  20273. * A function to be called when removing group members.
  20274. *
  20275. * @name Phaser.GameObjects.Group#removeCallback
  20276. * @type {?GroupCallback}
  20277. * @since 3.0.0
  20278. */
  20279. this.removeCallback = GetFastValue(config, 'removeCallback', null);
  20280. /**
  20281. * A function to be called when creating several group members at once.
  20282. *
  20283. * @name Phaser.GameObjects.Group#createMultipleCallback
  20284. * @type {?GroupMultipleCreateCallback}
  20285. * @since 3.0.0
  20286. */
  20287. this.createMultipleCallback = GetFastValue(config, 'createMultipleCallback', null);
  20288. if (config)
  20289. {
  20290. this.createMultiple(config);
  20291. }
  20292. },
  20293. /**
  20294. * Creates a new Game Object and adds it to this group, unless the group {@link Phaser.GameObjects.Group#isFull is full}.
  20295. *
  20296. * Calls {@link Phaser.GameObjects.Group#createCallback}.
  20297. *
  20298. * @method Phaser.GameObjects.Group#create
  20299. * @since 3.0.0
  20300. *
  20301. * @param {number} [x=0] - The horizontal position of the new Game Object in the world.
  20302. * @param {number} [y=0] - The vertical position of the new Game Object in the world.
  20303. * @param {string} [key=defaultKey] - The texture key of the new Game Object.
  20304. * @param {(string|integer)} [frame=defaultFrame] - The texture frame of the new Game Object.
  20305. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of the new Game Object.
  20306. * @param {boolean} [active=true] - The {@link Phaser.GameObjects.GameObject#active} state of the new Game Object.
  20307. *
  20308. * @return {any} The new Game Object (usually a Sprite, etc.).
  20309. */
  20310. create: function (x, y, key, frame, visible, active)
  20311. {
  20312. if (x === undefined) { x = 0; }
  20313. if (y === undefined) { y = 0; }
  20314. if (key === undefined) { key = this.defaultKey; }
  20315. if (frame === undefined) { frame = this.defaultFrame; }
  20316. if (visible === undefined) { visible = true; }
  20317. if (active === undefined) { active = true; }
  20318. // Pool?
  20319. if (this.isFull())
  20320. {
  20321. return null;
  20322. }
  20323. var child = new this.classType(this.scene, x, y, key, frame);
  20324. this.scene.sys.displayList.add(child);
  20325. if (child.preUpdate)
  20326. {
  20327. this.scene.sys.updateList.add(child);
  20328. }
  20329. child.visible = visible;
  20330. child.setActive(active);
  20331. this.add(child);
  20332. return child;
  20333. },
  20334. /**
  20335. * Creates several Game Objects and adds them to this group.
  20336. *
  20337. * If the group becomes {@link Phaser.GameObjects.Group#isFull}, no further Game Objects are created.
  20338. *
  20339. * Calls {@link Phaser.GameObjects.Group#createMultipleCallback} and {@link Phaser.GameObjects.Group#createCallback}.
  20340. *
  20341. * @method Phaser.GameObjects.Group#createMultiple
  20342. * @since 3.0.0
  20343. *
  20344. * @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.
  20345. *
  20346. * @return {any[]} The newly created Game Objects.
  20347. */
  20348. createMultiple: function (config)
  20349. {
  20350. if (this.isFull())
  20351. {
  20352. return [];
  20353. }
  20354. if (!Array.isArray(config))
  20355. {
  20356. config = [ config ];
  20357. }
  20358. if (config[0].key === undefined)
  20359. {
  20360. return [];
  20361. }
  20362. var output = [];
  20363. for (var i = 0; i < config.length; i++)
  20364. {
  20365. var entries = this.createFromConfig(config[i]);
  20366. output = output.concat(entries);
  20367. }
  20368. return output;
  20369. },
  20370. /**
  20371. * A helper for {@link Phaser.GameObjects.Group#createMultiple}.
  20372. *
  20373. * @method Phaser.GameObjects.Group#createFromConfig
  20374. * @since 3.0.0
  20375. *
  20376. * @param {GroupCreateConfig} options - Creation settings.
  20377. *
  20378. * @return {any[]} The newly created Game Objects.
  20379. */
  20380. createFromConfig: function (options)
  20381. {
  20382. if (this.isFull())
  20383. {
  20384. return [];
  20385. }
  20386. this.classType = GetFastValue(options, 'classType', this.classType);
  20387. var key = GetFastValue(options, 'key', undefined);
  20388. var frame = GetFastValue(options, 'frame', null);
  20389. var visible = GetFastValue(options, 'visible', true);
  20390. var active = GetFastValue(options, 'active', true);
  20391. var entries = [];
  20392. // Can't do anything without at least a key
  20393. if (key === undefined)
  20394. {
  20395. return entries;
  20396. }
  20397. else
  20398. {
  20399. if (!Array.isArray(key))
  20400. {
  20401. key = [ key ];
  20402. }
  20403. if (!Array.isArray(frame))
  20404. {
  20405. frame = [ frame ];
  20406. }
  20407. }
  20408. // Build an array of key frame pairs to loop through
  20409. var repeat = GetFastValue(options, 'repeat', 0);
  20410. var randomKey = GetFastValue(options, 'randomKey', false);
  20411. var randomFrame = GetFastValue(options, 'randomFrame', false);
  20412. var yoyo = GetFastValue(options, 'yoyo', false);
  20413. var quantity = GetFastValue(options, 'frameQuantity', 1);
  20414. var max = GetFastValue(options, 'max', 0);
  20415. // If a grid is set we use that to override the quantity?
  20416. var range = Range(key, frame, {
  20417. max: max,
  20418. qty: quantity,
  20419. random: randomKey,
  20420. randomB: randomFrame,
  20421. repeat: repeat,
  20422. yoyo: yoyo
  20423. });
  20424. for (var c = 0; c < range.length; c++)
  20425. {
  20426. var created = this.create(0, 0, range[c].a, range[c].b, visible, active);
  20427. if (!created)
  20428. {
  20429. break;
  20430. }
  20431. entries.push(created);
  20432. }
  20433. // Post-creation options (applied only to those items created in this call):
  20434. var x = GetValue(options, 'setXY.x', 0);
  20435. var y = GetValue(options, 'setXY.y', 0);
  20436. var stepX = GetValue(options, 'setXY.stepX', 0);
  20437. var stepY = GetValue(options, 'setXY.stepY', 0);
  20438. Actions.SetXY(entries, x, y, stepX, stepY);
  20439. var rotation = GetValue(options, 'setRotation.value', 0);
  20440. var stepRotation = GetValue(options, 'setRotation.step', 0);
  20441. Actions.SetRotation(entries, rotation, stepRotation);
  20442. var scaleX = GetValue(options, 'setScale.x', 1);
  20443. var scaleY = GetValue(options, 'setScale.y', scaleX);
  20444. var stepScaleX = GetValue(options, 'setScale.stepX', 0);
  20445. var stepScaleY = GetValue(options, 'setScale.stepY', 0);
  20446. Actions.SetScale(entries, scaleX, scaleY, stepScaleX, stepScaleY);
  20447. var alpha = GetValue(options, 'setAlpha.value', 1);
  20448. var stepAlpha = GetValue(options, 'setAlpha.step', 0);
  20449. Actions.SetAlpha(entries, alpha, stepAlpha);
  20450. var hitArea = GetFastValue(options, 'hitArea', null);
  20451. var hitAreaCallback = GetFastValue(options, 'hitAreaCallback', null);
  20452. if (hitArea)
  20453. {
  20454. Actions.SetHitArea(entries, hitArea, hitAreaCallback);
  20455. }
  20456. var grid = GetFastValue(options, 'gridAlign', false);
  20457. if (grid)
  20458. {
  20459. Actions.GridAlign(entries, grid);
  20460. }
  20461. if (this.createMultipleCallback)
  20462. {
  20463. this.createMultipleCallback.call(this, entries);
  20464. }
  20465. return entries;
  20466. },
  20467. /**
  20468. * Updates any group members, if {@link Phaser.GameObjects.Group#runChildUpdate} is enabled.
  20469. *
  20470. * @method Phaser.GameObjects.Group#preUpdate
  20471. * @since 3.0.0
  20472. *
  20473. * @param {number} time - The current timestamp.
  20474. * @param {number} delta - The delta time elapsed since the last frame.
  20475. */
  20476. preUpdate: function (time, delta)
  20477. {
  20478. if (!this.runChildUpdate || this.children.size === 0)
  20479. {
  20480. return;
  20481. }
  20482. // Because a Group child may mess with the length of the Group during its update
  20483. var temp = this.children.entries.slice();
  20484. for (var i = 0; i < temp.length; i++)
  20485. {
  20486. var item = temp[i];
  20487. if (item.active)
  20488. {
  20489. item.update(time, delta);
  20490. }
  20491. }
  20492. },
  20493. /**
  20494. * Adds a Game Object to this group.
  20495. *
  20496. * Calls {@link Phaser.GameObjects.Group#createCallback}.
  20497. *
  20498. * @method Phaser.GameObjects.Group#add
  20499. * @since 3.0.0
  20500. *
  20501. * @param {Phaser.GameObjects.GameObject} child - The Game Object to add.
  20502. * @param {boolean} [addToScene=false] - Also add the Game Object to the scene.
  20503. *
  20504. * @return {Phaser.GameObjects.Group} This Group object.
  20505. */
  20506. add: function (child, addToScene)
  20507. {
  20508. if (addToScene === undefined) { addToScene = false; }
  20509. if (this.isFull())
  20510. {
  20511. return this;
  20512. }
  20513. this.children.set(child);
  20514. if (this.createCallback)
  20515. {
  20516. this.createCallback.call(this, child);
  20517. }
  20518. if (addToScene)
  20519. {
  20520. this.scene.sys.displayList.add(child);
  20521. if (child.preUpdate)
  20522. {
  20523. this.scene.sys.updateList.add(child);
  20524. }
  20525. }
  20526. child.on('destroy', this.remove, this);
  20527. return this;
  20528. },
  20529. /**
  20530. * Adds several Game Objects to this group.
  20531. *
  20532. * Calls {@link Phaser.GameObjects.Group#createCallback}.
  20533. *
  20534. * @method Phaser.GameObjects.Group#addMultiple
  20535. * @since 3.0.0
  20536. *
  20537. * @param {Phaser.GameObjects.GameObject[]} children - The Game Objects to add.
  20538. * @param {boolean} [addToScene=false] - Also add the Game Objects to the scene.
  20539. *
  20540. * @return {Phaser.GameObjects.Group} This group.
  20541. */
  20542. addMultiple: function (children, addToScene)
  20543. {
  20544. if (addToScene === undefined) { addToScene = false; }
  20545. if (Array.isArray(children))
  20546. {
  20547. for (var i = 0; i < children.length; i++)
  20548. {
  20549. this.add(children[i], addToScene);
  20550. }
  20551. }
  20552. return this;
  20553. },
  20554. /**
  20555. * Removes a member of this Group and optionally removes it from the Scene and / or destroys it.
  20556. *
  20557. * Calls {@link Phaser.GameObjects.Group#removeCallback}.
  20558. *
  20559. * @method Phaser.GameObjects.Group#remove
  20560. * @since 3.0.0
  20561. *
  20562. * @param {Phaser.GameObjects.GameObject} child - The Game Object to remove.
  20563. * @param {boolean} [removeFromScene=false] - Optionally remove the Group member from the Scene it belongs to.
  20564. * @param {boolean} [destroyChild=false] - Optionally call destroy on the removed Group member.
  20565. *
  20566. * @return {Phaser.GameObjects.Group} This Group object.
  20567. */
  20568. remove: function (child, removeFromScene, destroyChild)
  20569. {
  20570. if (removeFromScene === undefined) { removeFromScene = false; }
  20571. if (destroyChild === undefined) { destroyChild = false; }
  20572. if (!this.children.contains(child))
  20573. {
  20574. return this;
  20575. }
  20576. this.children.delete(child);
  20577. if (this.removeCallback)
  20578. {
  20579. this.removeCallback.call(this, child);
  20580. }
  20581. child.off('destroy', this.remove, this);
  20582. if (destroyChild)
  20583. {
  20584. child.destroy();
  20585. }
  20586. else if (removeFromScene)
  20587. {
  20588. child.scene.sys.displayList.remove(child);
  20589. if (child.preUpdate)
  20590. {
  20591. child.scene.sys.updateList.remove(child);
  20592. }
  20593. }
  20594. return this;
  20595. },
  20596. /**
  20597. * Removes all members of this Group and optionally removes them from the Scene and / or destroys them.
  20598. *
  20599. * Does not call {@link Phaser.GameObjects.Group#removeCallback}.
  20600. *
  20601. * @method Phaser.GameObjects.Group#clear
  20602. * @since 3.0.0
  20603. *
  20604. * @param {boolean} [removeFromScene=false] - Optionally remove each Group member from the Scene.
  20605. * @param {boolean} [destroyChild=false] - Optionally call destroy on the removed Group members.
  20606. *
  20607. * @return {Phaser.GameObjects.Group} This group.
  20608. */
  20609. clear: function (removeFromScene, destroyChild)
  20610. {
  20611. if (removeFromScene === undefined) { removeFromScene = false; }
  20612. if (destroyChild === undefined) { destroyChild = false; }
  20613. var children = this.children;
  20614. for (var i = 0; i < children.size; i++)
  20615. {
  20616. var gameObject = children.entries[i];
  20617. gameObject.off('destroy', this.remove, this);
  20618. if (destroyChild)
  20619. {
  20620. gameObject.destroy();
  20621. }
  20622. else if (removeFromScene)
  20623. {
  20624. gameObject.scene.sys.displayList.remove(gameObject);
  20625. if (gameObject.preUpdate)
  20626. {
  20627. gameObject.scene.sys.updateList.remove(gameObject);
  20628. }
  20629. }
  20630. }
  20631. this.children.clear();
  20632. return this;
  20633. },
  20634. /**
  20635. * Tests if a Game Object is a member of this group.
  20636. *
  20637. * @method Phaser.GameObjects.Group#contains
  20638. * @since 3.0.0
  20639. *
  20640. * @param {Phaser.GameObjects.GameObject} child - A Game Object.
  20641. *
  20642. * @return {boolean} True if the Game Object is a member of this group.
  20643. */
  20644. contains: function (child)
  20645. {
  20646. return this.children.contains(child);
  20647. },
  20648. /**
  20649. * All members of the group.
  20650. *
  20651. * @method Phaser.GameObjects.Group#getChildren
  20652. * @since 3.0.0
  20653. *
  20654. * @return {Phaser.GameObjects.GameObject[]} The group members.
  20655. */
  20656. getChildren: function ()
  20657. {
  20658. return this.children.entries;
  20659. },
  20660. /**
  20661. * The number of members of the group.
  20662. *
  20663. * @method Phaser.GameObjects.Group#getLength
  20664. * @since 3.0.0
  20665. *
  20666. * @return {integer}
  20667. */
  20668. getLength: function ()
  20669. {
  20670. return this.children.size;
  20671. },
  20672. /**
  20673. * Scans the Group, from top to bottom, for the first member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument,
  20674. * assigns `x` and `y`, and returns the member.
  20675. *
  20676. * 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`.
  20677. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  20678. *
  20679. * @method Phaser.GameObjects.Group#getFirst
  20680. * @since 3.0.0
  20681. *
  20682. * @param {boolean} [state=false] - The {@link Phaser.GameObjects.GameObject#active} value to match.
  20683. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  20684. * @param {number} [x] - The horizontal position of the Game Object in the world.
  20685. * @param {number} [y] - The vertical position of the Game Object in the world.
  20686. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  20687. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  20688. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  20689. *
  20690. * @return {?any} The first matching group member, or a newly created member, or null.
  20691. */
  20692. getFirst: function (state, createIfNull, x, y, key, frame, visible)
  20693. {
  20694. return this.getHandler(true, 1, state, createIfNull, x, y, key, frame, visible);
  20695. },
  20696. /**
  20697. * Scans the Group, from top to bottom, for the nth member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument,
  20698. * assigns `x` and `y`, and returns the member.
  20699. *
  20700. * 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`.
  20701. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  20702. *
  20703. * @method Phaser.GameObjects.Group#getFirstNth
  20704. * @since 3.6.0
  20705. *
  20706. * @param {integer} nth - The nth matching Group member to search for.
  20707. * @param {boolean} [state=false] - The {@link Phaser.GameObjects.GameObject#active} value to match.
  20708. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  20709. * @param {number} [x] - The horizontal position of the Game Object in the world.
  20710. * @param {number} [y] - The vertical position of the Game Object in the world.
  20711. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  20712. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  20713. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  20714. *
  20715. * @return {?any} The first matching group member, or a newly created member, or null.
  20716. */
  20717. getFirstNth: function (nth, state, createIfNull, x, y, key, frame, visible)
  20718. {
  20719. return this.getHandler(true, nth, state, createIfNull, x, y, key, frame, visible);
  20720. },
  20721. /**
  20722. * Scans the Group for the last member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument,
  20723. * assigns `x` and `y`, and returns the member.
  20724. *
  20725. * 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`.
  20726. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  20727. *
  20728. * @method Phaser.GameObjects.Group#getLast
  20729. * @since 3.6.0
  20730. *
  20731. * @param {boolean} [state=false] - The {@link Phaser.GameObjects.GameObject#active} value to match.
  20732. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  20733. * @param {number} [x] - The horizontal position of the Game Object in the world.
  20734. * @param {number} [y] - The vertical position of the Game Object in the world.
  20735. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  20736. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  20737. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  20738. *
  20739. * @return {?any} The first matching group member, or a newly created member, or null.
  20740. */
  20741. getLast: function (state, createIfNull, x, y, key, frame, visible)
  20742. {
  20743. return this.getHandler(false, 1, state, createIfNull, x, y, key, frame, visible);
  20744. },
  20745. /**
  20746. * Scans the Group for the last nth member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument,
  20747. * assigns `x` and `y`, and returns the member.
  20748. *
  20749. * 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`.
  20750. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  20751. *
  20752. * @method Phaser.GameObjects.Group#getLastNth
  20753. * @since 3.6.0
  20754. *
  20755. * @param {integer} nth - The nth matching Group member to search for.
  20756. * @param {boolean} [state=false] - The {@link Phaser.GameObjects.GameObject#active} value to match.
  20757. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  20758. * @param {number} [x] - The horizontal position of the Game Object in the world.
  20759. * @param {number} [y] - The vertical position of the Game Object in the world.
  20760. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  20761. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  20762. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  20763. *
  20764. * @return {?any} The first matching group member, or a newly created member, or null.
  20765. */
  20766. getLastNth: function (nth, state, createIfNull, x, y, key, frame, visible)
  20767. {
  20768. return this.getHandler(false, nth, state, createIfNull, x, y, key, frame, visible);
  20769. },
  20770. /**
  20771. * Scans the group for the last member that has an {@link Phaser.GameObjects.GameObject#active} state matching the argument,
  20772. * assigns `x` and `y`, and returns the member.
  20773. *
  20774. * 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`.
  20775. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  20776. *
  20777. * @method Phaser.GameObjects.Group#getHandler
  20778. * @private
  20779. * @since 3.6.0
  20780. *
  20781. * @param {boolean} forwards - Search front to back or back to front?
  20782. * @param {integer} nth - Stop matching after nth successful matches.
  20783. * @param {boolean} [state=false] - The {@link Phaser.GameObjects.GameObject#active} value to match.
  20784. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  20785. * @param {number} [x] - The horizontal position of the Game Object in the world.
  20786. * @param {number} [y] - The vertical position of the Game Object in the world.
  20787. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  20788. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  20789. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  20790. *
  20791. * @return {?any} The first matching group member, or a newly created member, or null.
  20792. */
  20793. getHandler: function (forwards, nth, state, createIfNull, x, y, key, frame, visible)
  20794. {
  20795. if (state === undefined) { state = false; }
  20796. if (createIfNull === undefined) { createIfNull = false; }
  20797. var gameObject;
  20798. var i;
  20799. var total = 0;
  20800. var children = this.children.entries;
  20801. if (forwards)
  20802. {
  20803. for (i = 0; i < children.length; i++)
  20804. {
  20805. gameObject = children[i];
  20806. if (gameObject.active === state)
  20807. {
  20808. total++;
  20809. if (total === nth)
  20810. {
  20811. break;
  20812. }
  20813. }
  20814. else
  20815. {
  20816. gameObject = null;
  20817. }
  20818. }
  20819. }
  20820. else
  20821. {
  20822. for (i = children.length - 1; i >= 0; i--)
  20823. {
  20824. gameObject = children[i];
  20825. if (gameObject.active === state)
  20826. {
  20827. total++;
  20828. if (total === nth)
  20829. {
  20830. break;
  20831. }
  20832. }
  20833. else
  20834. {
  20835. gameObject = null;
  20836. }
  20837. }
  20838. }
  20839. if (gameObject)
  20840. {
  20841. if (typeof(x) === 'number')
  20842. {
  20843. gameObject.x = x;
  20844. }
  20845. if (typeof(y) === 'number')
  20846. {
  20847. gameObject.y = y;
  20848. }
  20849. return gameObject;
  20850. }
  20851. // Got this far? We need to create or bail
  20852. if (createIfNull)
  20853. {
  20854. return this.create(x, y, key, frame, visible);
  20855. }
  20856. else
  20857. {
  20858. return null;
  20859. }
  20860. },
  20861. /**
  20862. * Scans the group for the first member that has an {@link Phaser.GameObjects.GameObject#active} state set to `false`,
  20863. * assigns `x` and `y`, and returns the member.
  20864. *
  20865. * 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`.
  20866. * The new Game Object will have its active state set to `true`.
  20867. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  20868. *
  20869. * @method Phaser.GameObjects.Group#get
  20870. * @since 3.0.0
  20871. *
  20872. * @param {number} [x] - The horizontal position of the Game Object in the world.
  20873. * @param {number} [y] - The vertical position of the Game Object in the world.
  20874. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  20875. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  20876. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  20877. *
  20878. * @return {?any} The first inactive group member, or a newly created member, or null.
  20879. */
  20880. get: function (x, y, key, frame, visible)
  20881. {
  20882. return this.getFirst(false, true, x, y, key, frame, visible);
  20883. },
  20884. /**
  20885. * Scans the group for the first member that has an {@link Phaser.GameObjects.GameObject#active} state set to `true`,
  20886. * assigns `x` and `y`, and returns the member.
  20887. *
  20888. * 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`.
  20889. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  20890. *
  20891. * @method Phaser.GameObjects.Group#getFirstAlive
  20892. * @since 3.0.0
  20893. *
  20894. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  20895. * @param {number} [x] - The horizontal position of the Game Object in the world.
  20896. * @param {number} [y] - The vertical position of the Game Object in the world.
  20897. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  20898. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  20899. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  20900. *
  20901. * @return {any} The first active group member, or a newly created member, or null.
  20902. */
  20903. getFirstAlive: function (createIfNull, x, y, key, frame, visible)
  20904. {
  20905. return this.getFirst(true, createIfNull, x, y, key, frame, visible);
  20906. },
  20907. /**
  20908. * Scans the group for the first member that has an {@link Phaser.GameObjects.GameObject#active} state set to `false`,
  20909. * assigns `x` and `y`, and returns the member.
  20910. *
  20911. * 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`.
  20912. * The new Game Object will have an active state set to `true`.
  20913. * Unless a new member is created, `key`, `frame`, and `visible` are ignored.
  20914. *
  20915. * @method Phaser.GameObjects.Group#getFirstDead
  20916. * @since 3.0.0
  20917. *
  20918. * @param {boolean} [createIfNull=false] - Create a new Game Object if no matching members are found, using the following arguments.
  20919. * @param {number} [x] - The horizontal position of the Game Object in the world.
  20920. * @param {number} [y] - The vertical position of the Game Object in the world.
  20921. * @param {string} [key=defaultKey] - The texture key assigned to a new Game Object (if one is created).
  20922. * @param {(string|integer)} [frame=defaultFrame] - A texture frame assigned to a new Game Object (if one is created).
  20923. * @param {boolean} [visible=true] - The {@link Phaser.GameObjects.Components.Visible#visible} state of a new Game Object (if one is created).
  20924. *
  20925. * @return {any} The first inactive group member, or a newly created member, or null.
  20926. */
  20927. getFirstDead: function (createIfNull, x, y, key, frame, visible)
  20928. {
  20929. return this.getFirst(false, createIfNull, x, y, key, frame, visible);
  20930. },
  20931. /**
  20932. * {@link Phaser.GameObjects.Components.Animation#play Plays} an animation for all members of this group.
  20933. *
  20934. * @method Phaser.GameObjects.Group#playAnimation
  20935. * @since 3.0.0
  20936. *
  20937. * @param {string} key - The string-based key of the animation to play.
  20938. * @param {string} [startFrame=0] - Optionally start the animation playing from this frame index.
  20939. *
  20940. * @return {Phaser.GameObjects.Group} This Group object.
  20941. */
  20942. playAnimation: function (key, startFrame)
  20943. {
  20944. Actions.PlayAnimation(this.children.entries, key, startFrame);
  20945. return this;
  20946. },
  20947. /**
  20948. * Whether this group's size at its {@link Phaser.GameObjects.Group#maxSize maximum}.
  20949. *
  20950. * @method Phaser.GameObjects.Group#isFull
  20951. * @since 3.0.0
  20952. *
  20953. * @return {boolean} True if the number of members equals {@link Phaser.GameObjects.Group#maxSize}.
  20954. */
  20955. isFull: function ()
  20956. {
  20957. if (this.maxSize === -1)
  20958. {
  20959. return false;
  20960. }
  20961. else
  20962. {
  20963. return (this.children.size >= this.maxSize);
  20964. }
  20965. },
  20966. /**
  20967. * Counts the number of active (or inactive) group members.
  20968. *
  20969. * @method Phaser.GameObjects.Group#countActive
  20970. * @since 3.0.0
  20971. *
  20972. * @param {boolean} [value=true] - Count active (true) or inactive (false) group members.
  20973. *
  20974. * @return {integer} The number of group members with an active state matching the `active` argument.
  20975. */
  20976. countActive: function (value)
  20977. {
  20978. if (value === undefined) { value = true; }
  20979. var total = 0;
  20980. for (var i = 0; i < this.children.size; i++)
  20981. {
  20982. if (this.children.entries[i].active === value)
  20983. {
  20984. total++;
  20985. }
  20986. }
  20987. return total;
  20988. },
  20989. /**
  20990. * Counts the number of in-use (active) group members.
  20991. *
  20992. * @method Phaser.GameObjects.Group#getTotalUsed
  20993. * @since 3.0.0
  20994. *
  20995. * @return {integer} The number of group members with an active state of true.
  20996. */
  20997. getTotalUsed: function ()
  20998. {
  20999. return this.countActive();
  21000. },
  21001. /**
  21002. * The difference of {@link Phaser.GameObjects.Group#maxSize} and the number of active group members.
  21003. *
  21004. * This represents the number of group members that could be created or reactivated before reaching the size limit.
  21005. *
  21006. * @method Phaser.GameObjects.Group#getTotalFree
  21007. * @since 3.0.0
  21008. *
  21009. * @return {integer} maxSize minus the number of active group numbers; or a large number (if maxSize is -1).
  21010. */
  21011. getTotalFree: function ()
  21012. {
  21013. var used = this.getTotalUsed();
  21014. var capacity = (this.maxSize === -1) ? 999999999999 : this.maxSize;
  21015. return (capacity - used);
  21016. },
  21017. /**
  21018. * Sets the depth of each group member.
  21019. *
  21020. * @method Phaser.GameObjects.Group#setDepth
  21021. * @since 3.0.0
  21022. *
  21023. * @param {number} value - The amount to set the property to.
  21024. * @param {number} step - This is added to the `value` amount, multiplied by the iteration counter.
  21025. *
  21026. * @return {Phaser.GameObjects.Group} This Group object.
  21027. */
  21028. setDepth: function (value, step)
  21029. {
  21030. Actions.SetDepth(this.children.entries, value, step);
  21031. return this;
  21032. },
  21033. /**
  21034. * Deactivates a member of this group.
  21035. *
  21036. * @method Phaser.GameObjects.Group#kill
  21037. * @since 3.0.0
  21038. *
  21039. * @param {Phaser.GameObjects.GameObject} gameObject - A member of this group.
  21040. */
  21041. kill: function (gameObject)
  21042. {
  21043. if (this.children.contains(gameObject))
  21044. {
  21045. gameObject.setActive(false);
  21046. }
  21047. },
  21048. /**
  21049. * Deactivates and hides a member of this group.
  21050. *
  21051. * @method Phaser.GameObjects.Group#killAndHide
  21052. * @since 3.0.0
  21053. *
  21054. * @param {Phaser.GameObjects.GameObject} gameObject - A member of this group.
  21055. */
  21056. killAndHide: function (gameObject)
  21057. {
  21058. if (this.children.contains(gameObject))
  21059. {
  21060. gameObject.setActive(false);
  21061. gameObject.setVisible(false);
  21062. }
  21063. },
  21064. /**
  21065. * Toggles (flips) the visible state of each member of this group.
  21066. *
  21067. * @method Phaser.GameObjects.Group#toggleVisible
  21068. * @since 3.0.0
  21069. *
  21070. * @return {Phaser.GameObjects.Group} This Group object.
  21071. */
  21072. toggleVisible: function ()
  21073. {
  21074. Actions.ToggleVisible(this.children.entries);
  21075. return this;
  21076. },
  21077. /**
  21078. * Empties this group and removes it from the Scene.
  21079. *
  21080. * Does not call {@link Phaser.GameObjects.Group#removeCallback}.
  21081. *
  21082. * @method Phaser.GameObjects.Group#destroy
  21083. * @since 3.0.0
  21084. *
  21085. * @param {boolean} [destroyChildren=false] - Also {@link Phaser.GameObjects.GameObject#destroy} each group member.
  21086. */
  21087. destroy: function (destroyChildren)
  21088. {
  21089. if (destroyChildren === undefined) { destroyChildren = false; }
  21090. // This Game Object had already been destroyed
  21091. if (!this.scene || this.ignoreDestroy)
  21092. {
  21093. return;
  21094. }
  21095. if (destroyChildren)
  21096. {
  21097. var children = this.children;
  21098. for (var i = 0; i < children.size; i++)
  21099. {
  21100. var gameObject = children.entries[i];
  21101. // Remove the event hook first or it'll go all recursive hell on us
  21102. gameObject.off('destroy', this.remove, this);
  21103. gameObject.destroy();
  21104. }
  21105. }
  21106. this.children.clear();
  21107. this.scene = undefined;
  21108. this.children = undefined;
  21109. }
  21110. });
  21111. module.exports = Group;
  21112. /***/ }),
  21113. /* 113 */
  21114. /***/ (function(module, exports, __webpack_require__) {
  21115. /**
  21116. * @author Richard Davey <rich@photonstorm.com>
  21117. * @copyright 2018 Photon Storm Ltd.
  21118. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  21119. */
  21120. var Point = __webpack_require__(5);
  21121. /**
  21122. * Returns a Point object containing the coordinates of a point on the circumference of the Ellipse based on the given angle.
  21123. *
  21124. * @function Phaser.Geom.Ellipse.CircumferencePoint
  21125. * @since 3.0.0
  21126. *
  21127. * @generic {Phaser.Geom.Point} O - [out,$return]
  21128. *
  21129. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get the circumference point on.
  21130. * @param {number} angle - The angle from the center of the Ellipse to the circumference to return the point from. Given in radians.
  21131. * @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.
  21132. *
  21133. * @return {(Phaser.Geom.Point|object)} A Point object where the `x` and `y` properties are the point on the circumference.
  21134. */
  21135. var CircumferencePoint = function (ellipse, angle, out)
  21136. {
  21137. if (out === undefined) { out = new Point(); }
  21138. var halfWidth = ellipse.width / 2;
  21139. var halfHeight = ellipse.height / 2;
  21140. out.x = ellipse.x + halfWidth * Math.cos(angle);
  21141. out.y = ellipse.y + halfHeight * Math.sin(angle);
  21142. return out;
  21143. };
  21144. module.exports = CircumferencePoint;
  21145. /***/ }),
  21146. /* 114 */
  21147. /***/ (function(module, exports, __webpack_require__) {
  21148. /**
  21149. * @author Richard Davey <rich@photonstorm.com>
  21150. * @copyright 2018 Photon Storm Ltd.
  21151. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  21152. */
  21153. var Class = __webpack_require__(0);
  21154. var Contains = __webpack_require__(55);
  21155. var GetPoint = __webpack_require__(184);
  21156. var GetPoints = __webpack_require__(183);
  21157. var Random = __webpack_require__(135);
  21158. /**
  21159. * @classdesc
  21160. * An Ellipse object.
  21161. *
  21162. * This is a geometry object, containing numerical values and related methods to inspect and modify them.
  21163. * It is not a Game Object, in that you cannot add it to the display list, and it has no texture.
  21164. * To render an Ellipse you should look at the capabilities of the Graphics class.
  21165. *
  21166. * @class Ellipse
  21167. * @memberOf Phaser.Geom
  21168. * @constructor
  21169. * @since 3.0.0
  21170. *
  21171. * @param {number} [x=0] - The x position of the center of the ellipse.
  21172. * @param {number} [y=0] - The y position of the center of the ellipse.
  21173. * @param {number} [width=0] - The width of the ellipse.
  21174. * @param {number} [height=0] - The height of the ellipse.
  21175. */
  21176. var Ellipse = new Class({
  21177. initialize:
  21178. function Ellipse (x, y, width, height)
  21179. {
  21180. if (x === undefined) { x = 0; }
  21181. if (y === undefined) { y = 0; }
  21182. if (width === undefined) { width = 0; }
  21183. if (height === undefined) { height = 0; }
  21184. /**
  21185. * The x position of the center of the ellipse.
  21186. *
  21187. * @name Phaser.Geom.Ellipse#x
  21188. * @type {number}
  21189. * @default 0
  21190. * @since 3.0.0
  21191. */
  21192. this.x = x;
  21193. /**
  21194. * The y position of the center of the ellipse.
  21195. *
  21196. * @name Phaser.Geom.Ellipse#y
  21197. * @type {number}
  21198. * @default 0
  21199. * @since 3.0.0
  21200. */
  21201. this.y = y;
  21202. /**
  21203. * The width of the ellipse.
  21204. *
  21205. * @name Phaser.Geom.Ellipse#width
  21206. * @type {number}
  21207. * @default 0
  21208. * @since 3.0.0
  21209. */
  21210. this.width = width;
  21211. /**
  21212. * The height of the ellipse.
  21213. *
  21214. * @name Phaser.Geom.Ellipse#height
  21215. * @type {number}
  21216. * @default 0
  21217. * @since 3.0.0
  21218. */
  21219. this.height = height;
  21220. },
  21221. /**
  21222. * Check to see if the Ellipse contains the given x / y coordinates.
  21223. *
  21224. * @method Phaser.Geom.Ellipse#contains
  21225. * @since 3.0.0
  21226. *
  21227. * @param {number} x - The x coordinate to check within the ellipse.
  21228. * @param {number} y - The y coordinate to check within the ellipse.
  21229. *
  21230. * @return {boolean} True if the coordinates are within the ellipse, otherwise false.
  21231. */
  21232. contains: function (x, y)
  21233. {
  21234. return Contains(this, x, y);
  21235. },
  21236. /**
  21237. * Returns a Point object containing the coordinates of a point on the circumference of the Ellipse
  21238. * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point
  21239. * at 180 degrees around the circle.
  21240. *
  21241. * @method Phaser.Geom.Ellipse#getPoint
  21242. * @since 3.0.0
  21243. *
  21244. * @generic {Phaser.Geom.Point} O - [out,$return]
  21245. *
  21246. * @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.
  21247. * @param {(Phaser.Geom.Point|object)} [out] - An object to store the return values in. If not given a Point object will be created.
  21248. *
  21249. * @return {(Phaser.Geom.Point|object)} A Point, or point-like object, containing the coordinates of the point around the ellipse.
  21250. */
  21251. getPoint: function (position, point)
  21252. {
  21253. return GetPoint(this, position, point);
  21254. },
  21255. /**
  21256. * Returns an array of Point objects containing the coordinates of the points around the circumference of the Ellipse,
  21257. * based on the given quantity or stepRate values.
  21258. *
  21259. * @method Phaser.Geom.Ellipse#getPoints
  21260. * @since 3.0.0
  21261. *
  21262. * @param {integer} quantity - The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead.
  21263. * @param {number} [stepRate] - Sets the quantity by getting the circumference of the ellipse and dividing it by the stepRate.
  21264. * @param {array} [output] - An array to insert the points in to. If not provided a new array will be created.
  21265. *
  21266. * @return {Phaser.Geom.Point[]} An array of Point objects pertaining to the points around the circumference of the ellipse.
  21267. */
  21268. getPoints: function (quantity, stepRate, output)
  21269. {
  21270. return GetPoints(this, quantity, stepRate, output);
  21271. },
  21272. /**
  21273. * Returns a uniformly distributed random point from anywhere within the given Ellipse.
  21274. *
  21275. * @method Phaser.Geom.Ellipse#getRandomPoint
  21276. * @since 3.0.0
  21277. *
  21278. * @generic {Phaser.Geom.Point} O - [point,$return]
  21279. *
  21280. * @param {(Phaser.Geom.Point|object)} [point] - A Point or point-like object to set the random `x` and `y` values in.
  21281. *
  21282. * @return {(Phaser.Geom.Point|object)} A Point object with the random values set in the `x` and `y` properties.
  21283. */
  21284. getRandomPoint: function (point)
  21285. {
  21286. return Random(this, point);
  21287. },
  21288. /**
  21289. * Sets the x, y, width and height of this ellipse.
  21290. *
  21291. * @method Phaser.Geom.Ellipse#setTo
  21292. * @since 3.0.0
  21293. *
  21294. * @param {number} x - The x position of the center of the ellipse.
  21295. * @param {number} y - The y position of the center of the ellipse.
  21296. * @param {number} width - The width of the ellipse.
  21297. * @param {number} height - The height of the ellipse.
  21298. *
  21299. * @return {Phaser.Geom.Ellipse} This Ellipse object.
  21300. */
  21301. setTo: function (x, y, width, height)
  21302. {
  21303. this.x = x;
  21304. this.y = y;
  21305. this.width = width;
  21306. this.height = height;
  21307. return this;
  21308. },
  21309. /**
  21310. * Sets this Ellipse to be empty with a width and height of zero.
  21311. * Does not change its position.
  21312. *
  21313. * @method Phaser.Geom.Ellipse#setEmpty
  21314. * @since 3.0.0
  21315. *
  21316. * @return {Phaser.Geom.Ellipse} This Ellipse object.
  21317. */
  21318. setEmpty: function ()
  21319. {
  21320. this.width = 0;
  21321. this.height = 0;
  21322. return this;
  21323. },
  21324. /**
  21325. * Sets the position of this Ellipse.
  21326. *
  21327. * @method Phaser.Geom.Ellipse#setPosition
  21328. * @since 3.0.0
  21329. *
  21330. * @param {number} x - The x position of the center of the ellipse.
  21331. * @param {number} y - The y position of the center of the ellipse.
  21332. *
  21333. * @return {Phaser.Geom.Ellipse} This Ellipse object.
  21334. */
  21335. setPosition: function (x, y)
  21336. {
  21337. if (y === undefined) { y = x; }
  21338. this.x = x;
  21339. this.y = y;
  21340. return this;
  21341. },
  21342. /**
  21343. * Sets the size of this Ellipse.
  21344. * Does not change its position.
  21345. *
  21346. * @method Phaser.Geom.Ellipse#setSize
  21347. * @since 3.0.0
  21348. *
  21349. * @param {number} width - The width of the ellipse.
  21350. * @param {number} [height=width] - The height of the ellipse.
  21351. *
  21352. * @return {Phaser.Geom.Ellipse} This Ellipse object.
  21353. */
  21354. setSize: function (width, height)
  21355. {
  21356. if (height === undefined) { height = width; }
  21357. this.width = width;
  21358. this.height = height;
  21359. return this;
  21360. },
  21361. /**
  21362. * Checks to see if the Ellipse is empty: has a width or height equal to zero.
  21363. *
  21364. * @method Phaser.Geom.Ellipse#isEmpty
  21365. * @since 3.0.0
  21366. *
  21367. * @return {boolean} True if the Ellipse is empty, otherwise false.
  21368. */
  21369. isEmpty: function ()
  21370. {
  21371. return (this.width <= 0 || this.height <= 0);
  21372. },
  21373. /**
  21374. * Returns the minor radius of the ellipse. Also known as the Semi Minor Axis.
  21375. *
  21376. * @method Phaser.Geom.Ellipse#getMinorRadius
  21377. * @since 3.0.0
  21378. *
  21379. * @return {number} The minor radius.
  21380. */
  21381. getMinorRadius: function ()
  21382. {
  21383. return Math.min(this.width, this.height) / 2;
  21384. },
  21385. /**
  21386. * Returns the major radius of the ellipse. Also known as the Semi Major Axis.
  21387. *
  21388. * @method Phaser.Geom.Ellipse#getMajorRadius
  21389. * @since 3.0.0
  21390. *
  21391. * @return {number} The major radius.
  21392. */
  21393. getMajorRadius: function ()
  21394. {
  21395. return Math.max(this.width, this.height) / 2;
  21396. },
  21397. /**
  21398. * The left position of the Ellipse.
  21399. *
  21400. * @name Phaser.Geom.Ellipse#left
  21401. * @type {number}
  21402. * @since 3.0.0
  21403. */
  21404. left: {
  21405. get: function ()
  21406. {
  21407. return this.x - (this.width / 2);
  21408. },
  21409. set: function (value)
  21410. {
  21411. this.x = value + (this.width / 2);
  21412. }
  21413. },
  21414. /**
  21415. * The right position of the Ellipse.
  21416. *
  21417. * @name Phaser.Geom.Ellipse#right
  21418. * @type {number}
  21419. * @since 3.0.0
  21420. */
  21421. right: {
  21422. get: function ()
  21423. {
  21424. return this.x + (this.width / 2);
  21425. },
  21426. set: function (value)
  21427. {
  21428. this.x = value - (this.width / 2);
  21429. }
  21430. },
  21431. /**
  21432. * The top position of the Ellipse.
  21433. *
  21434. * @name Phaser.Geom.Ellipse#top
  21435. * @type {number}
  21436. * @since 3.0.0
  21437. */
  21438. top: {
  21439. get: function ()
  21440. {
  21441. return this.y - (this.height / 2);
  21442. },
  21443. set: function (value)
  21444. {
  21445. this.y = value + (this.height / 2);
  21446. }
  21447. },
  21448. /**
  21449. * The bottom position of the Ellipse.
  21450. *
  21451. * @name Phaser.Geom.Ellipse#bottom
  21452. * @type {number}
  21453. * @since 3.0.0
  21454. */
  21455. bottom: {
  21456. get: function ()
  21457. {
  21458. return this.y + (this.height / 2);
  21459. },
  21460. set: function (value)
  21461. {
  21462. this.y = value - (this.height / 2);
  21463. }
  21464. }
  21465. });
  21466. module.exports = Ellipse;
  21467. /***/ }),
  21468. /* 115 */
  21469. /***/ (function(module, exports, __webpack_require__) {
  21470. /**
  21471. * @author Richard Davey <rich@photonstorm.com>
  21472. * @copyright 2018 Photon Storm Ltd.
  21473. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  21474. */
  21475. var Camera = __webpack_require__(124);
  21476. var Class = __webpack_require__(0);
  21477. var Commands = __webpack_require__(119);
  21478. var Components = __webpack_require__(17);
  21479. var Ellipse = __webpack_require__(243);
  21480. var GameObject = __webpack_require__(2);
  21481. var GetFastValue = __webpack_require__(1);
  21482. var GetValue = __webpack_require__(4);
  21483. var MATH_CONST = __webpack_require__(15);
  21484. var Render = __webpack_require__(434);
  21485. /**
  21486. * Graphics line style (or stroke style) settings.
  21487. *
  21488. * @typedef {object} GraphicsLineStyle
  21489. *
  21490. * @property {number} [width] - The stroke width.
  21491. * @property {number} [color] - The stroke color.
  21492. * @property {number} [alpha] - The stroke alpha.
  21493. */
  21494. /**
  21495. * Graphics fill style settings.
  21496. *
  21497. * @typedef {object} GraphicsFillStyle
  21498. *
  21499. * @property {number} [color] - The fill color.
  21500. * @property {number} [alpha] - The fill alpha.
  21501. */
  21502. /**
  21503. * Graphics style settings.
  21504. *
  21505. * @typedef {object} GraphicsStyles
  21506. *
  21507. * @property {GraphicsLineStyle} [lineStyle] - The style applied to shape outlines.
  21508. * @property {GraphicsFillStyle} [fillStyle] - The style applied to shape areas.
  21509. */
  21510. /**
  21511. * Options for the Graphics game Object.
  21512. *
  21513. * @typedef {object} GraphicsOptions
  21514. * @extends GraphicsStyles
  21515. *
  21516. * @property {number} [x] - The x coordinate of the Graphics.
  21517. * @property {number} [y] - The y coordinate of the Graphics.
  21518. */
  21519. /**
  21520. * @classdesc
  21521. * A Graphics object is a way to draw primitive shapes to you game. Primitives include forms of geometry, such as
  21522. * Rectangles, Circles, and Polygons. They also include lines, arcs and curves. When you initially create a Graphics
  21523. * object it will be empty.
  21524. *
  21525. * To draw to it you must first specify a line style or fill style (or both), draw shapes using paths, and finally
  21526. * fill or stroke them. For example:
  21527. *
  21528. * ```javascript
  21529. * graphics.lineStyle(5, 0xFF00FF, 1.0);
  21530. * graphics.beginPath();
  21531. * graphics.moveTo(100, 100);
  21532. * graphics.lineTo(200, 200);
  21533. * graphics.closePath();
  21534. * graphics.strokePath();
  21535. * ```
  21536. *
  21537. * There are also many helpful methods that draw and fill/stroke common shapes for you.
  21538. *
  21539. * ```javascript
  21540. * graphics.lineStyle(5, 0xFF00FF, 1.0);
  21541. * graphics.fillStyle(0xFFFFFF, 1.0);
  21542. * graphics.fillRect(50, 50, 400, 200);
  21543. * graphics.strokeRect(50, 50, 400, 200);
  21544. * ```
  21545. *
  21546. * When a Graphics object is rendered it will render differently based on if the game is running under Canvas or WebGL.
  21547. * Under Canvas it will use the HTML Canvas context drawing operations to draw the path.
  21548. * Under WebGL the graphics data is decomposed into polygons. Both of these are expensive processes, especially with
  21549. * complex shapes.
  21550. *
  21551. * If your Graphics object doesn't change much (or at all) once you've drawn your shape to it, then you will help
  21552. * performance by calling {@link Phaser.GameObjects.Graphics#generateTexture}. This will 'bake' the Graphics object into
  21553. * a Texture, and return it. You can then use this Texture for Sprites or other display objects. If your Graphics object
  21554. * updates frequently then you should avoid doing this, as it will constantly generate new textures, which will consume
  21555. * memory.
  21556. *
  21557. * As you can tell, Graphics objects are a bit of a trade-off. While they are extremely useful, you need to be careful
  21558. * in their complexity and quantity of them in your game.
  21559. *
  21560. * @class Graphics
  21561. * @extends Phaser.GameObjects.GameObject
  21562. * @memberOf Phaser.GameObjects
  21563. * @constructor
  21564. * @since 3.0.0
  21565. *
  21566. * @extends Phaser.GameObjects.Components.Alpha
  21567. * @extends Phaser.GameObjects.Components.BlendMode
  21568. * @extends Phaser.GameObjects.Components.Depth
  21569. * @extends Phaser.GameObjects.Components.Mask
  21570. * @extends Phaser.GameObjects.Components.Pipeline
  21571. * @extends Phaser.GameObjects.Components.Transform
  21572. * @extends Phaser.GameObjects.Components.Visible
  21573. * @extends Phaser.GameObjects.Components.ScrollFactor
  21574. *
  21575. * @param {Phaser.Scene} scene - The Scene to which this Graphics object belongs.
  21576. * @param {GraphicsOptions} [options] - Options that set the position and default style of this Graphics object.
  21577. */
  21578. var Graphics = new Class({
  21579. Extends: GameObject,
  21580. Mixins: [
  21581. Components.Alpha,
  21582. Components.BlendMode,
  21583. Components.Depth,
  21584. Components.Mask,
  21585. Components.Pipeline,
  21586. Components.Transform,
  21587. Components.Visible,
  21588. Components.ScrollFactor,
  21589. Render
  21590. ],
  21591. initialize:
  21592. function Graphics (scene, options)
  21593. {
  21594. var x = GetValue(options, 'x', 0);
  21595. var y = GetValue(options, 'y', 0);
  21596. GameObject.call(this, scene, 'Graphics');
  21597. this.setPosition(x, y);
  21598. this.initPipeline('FlatTintPipeline');
  21599. /**
  21600. * The horizontal display origin of the Graphics.
  21601. *
  21602. * @name Phaser.GameObjects.Graphics#displayOriginX
  21603. * @type {number}
  21604. * @default 0
  21605. * @since 3.0.0
  21606. */
  21607. this.displayOriginX = 0;
  21608. /**
  21609. * The vertical display origin of the Graphics.
  21610. *
  21611. * @name Phaser.GameObjects.Graphics#displayOriginY
  21612. * @type {number}
  21613. * @default 0
  21614. * @since 3.0.0
  21615. */
  21616. this.displayOriginY = 0;
  21617. /**
  21618. * The array of commands used to render the Graphics.
  21619. *
  21620. * @name Phaser.GameObjects.Graphics#commandBuffer
  21621. * @type {array}
  21622. * @default []
  21623. * @since 3.0.0
  21624. */
  21625. this.commandBuffer = [];
  21626. /**
  21627. * The default fill color for shapes rendered by this Graphics object.
  21628. *
  21629. * @name Phaser.GameObjects.Graphics#defaultFillColor
  21630. * @type {number}
  21631. * @default -1
  21632. * @since 3.0.0
  21633. */
  21634. this.defaultFillColor = -1;
  21635. /**
  21636. * The default fill alpha for shapes rendered by this Graphics object.
  21637. *
  21638. * @name Phaser.GameObjects.Graphics#defaultFillAlpha
  21639. * @type {number}
  21640. * @default 1
  21641. * @since 3.0.0
  21642. */
  21643. this.defaultFillAlpha = 1;
  21644. /**
  21645. * The default stroke width for shapes rendered by this Graphics object.
  21646. *
  21647. * @name Phaser.GameObjects.Graphics#defaultStrokeWidth
  21648. * @type {number}
  21649. * @default 1
  21650. * @since 3.0.0
  21651. */
  21652. this.defaultStrokeWidth = 1;
  21653. /**
  21654. * The default stroke color for shapes rendered by this Graphics object.
  21655. *
  21656. * @name Phaser.GameObjects.Graphics#defaultStrokeColor
  21657. * @type {number}
  21658. * @default -1
  21659. * @since 3.0.0
  21660. */
  21661. this.defaultStrokeColor = -1;
  21662. /**
  21663. * The default stroke alpha for shapes rendered by this Graphics object.
  21664. *
  21665. * @name Phaser.GameObjects.Graphics#defaultStrokeAlpha
  21666. * @type {number}
  21667. * @default 1
  21668. * @since 3.0.0
  21669. */
  21670. this.defaultStrokeAlpha = 1;
  21671. /**
  21672. * Internal property that keeps track of the line width style setting.
  21673. *
  21674. * @name Phaser.GameObjects.Graphics#_lineWidth
  21675. * @type {number}
  21676. * @private
  21677. * @since 3.0.0
  21678. */
  21679. this._lineWidth = 1.0;
  21680. this.setDefaultStyles(options);
  21681. },
  21682. /**
  21683. * Set the default style settings for this Graphics object.
  21684. *
  21685. * @method Phaser.GameObjects.Graphics#setDefaultStyles
  21686. * @since 3.0.0
  21687. *
  21688. * @param {GraphicsStyles} options - The styles to set as defaults.
  21689. *
  21690. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21691. */
  21692. setDefaultStyles: function (options)
  21693. {
  21694. if (GetValue(options, 'lineStyle', null))
  21695. {
  21696. this.defaultStrokeWidth = GetValue(options, 'lineStyle.width', 1);
  21697. this.defaultStrokeColor = GetValue(options, 'lineStyle.color', 0xffffff);
  21698. this.defaultStrokeAlpha = GetValue(options, 'lineStyle.alpha', 1);
  21699. this.lineStyle(this.defaultStrokeWidth, this.defaultStrokeColor, this.defaultStrokeAlpha);
  21700. }
  21701. if (GetValue(options, 'fillStyle', null))
  21702. {
  21703. this.defaultFillColor = GetValue(options, 'fillStyle.color', 0xffffff);
  21704. this.defaultFillAlpha = GetValue(options, 'fillStyle.alpha', 1);
  21705. this.fillStyle(this.defaultFillColor, this.defaultFillAlpha);
  21706. }
  21707. return this;
  21708. },
  21709. /**
  21710. * Set the current line style.
  21711. *
  21712. * @method Phaser.GameObjects.Graphics#lineStyle
  21713. * @since 3.0.0
  21714. *
  21715. * @param {number} lineWidth - The stroke width.
  21716. * @param {number} color - The stroke color.
  21717. * @param {number} [alpha=1] - The stroke alpha.
  21718. *
  21719. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21720. */
  21721. lineStyle: function (lineWidth, color, alpha)
  21722. {
  21723. if (alpha === undefined) { alpha = 1; }
  21724. this.commandBuffer.push(
  21725. Commands.LINE_STYLE,
  21726. lineWidth, color, alpha
  21727. );
  21728. this._lineWidth = lineWidth;
  21729. return this;
  21730. },
  21731. /**
  21732. * Set the current fill style.
  21733. *
  21734. * @method Phaser.GameObjects.Graphics#fillStyle
  21735. * @since 3.0.0
  21736. *
  21737. * @param {number} color - The fill color.
  21738. * @param {number} [alpha=1] - The fill alpha.
  21739. *
  21740. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21741. */
  21742. fillStyle: function (color, alpha)
  21743. {
  21744. if (alpha === undefined) { alpha = 1; }
  21745. this.commandBuffer.push(
  21746. Commands.FILL_STYLE,
  21747. color, alpha
  21748. );
  21749. return this;
  21750. },
  21751. /**
  21752. * Start a new shape path.
  21753. *
  21754. * @method Phaser.GameObjects.Graphics#beginPath
  21755. * @since 3.0.0
  21756. *
  21757. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21758. */
  21759. beginPath: function ()
  21760. {
  21761. this.commandBuffer.push(
  21762. Commands.BEGIN_PATH
  21763. );
  21764. return this;
  21765. },
  21766. /**
  21767. * Close the current path.
  21768. *
  21769. * @method Phaser.GameObjects.Graphics#closePath
  21770. * @since 3.0.0
  21771. *
  21772. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21773. */
  21774. closePath: function ()
  21775. {
  21776. this.commandBuffer.push(
  21777. Commands.CLOSE_PATH
  21778. );
  21779. return this;
  21780. },
  21781. /**
  21782. * Fill the current path.
  21783. *
  21784. * @method Phaser.GameObjects.Graphics#fillPath
  21785. * @since 3.0.0
  21786. *
  21787. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21788. */
  21789. fillPath: function ()
  21790. {
  21791. this.commandBuffer.push(
  21792. Commands.FILL_PATH
  21793. );
  21794. return this;
  21795. },
  21796. /**
  21797. * Stroke the current path.
  21798. *
  21799. * @method Phaser.GameObjects.Graphics#strokePath
  21800. * @since 3.0.0
  21801. *
  21802. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21803. */
  21804. strokePath: function ()
  21805. {
  21806. this.commandBuffer.push(
  21807. Commands.STROKE_PATH
  21808. );
  21809. return this;
  21810. },
  21811. /**
  21812. * Fill the given circle.
  21813. *
  21814. * @method Phaser.GameObjects.Graphics#fillCircleShape
  21815. * @since 3.0.0
  21816. *
  21817. * @param {Phaser.Geom.Circle} circle - The circle to fill.
  21818. *
  21819. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21820. */
  21821. fillCircleShape: function (circle)
  21822. {
  21823. return this.fillCircle(circle.x, circle.y, circle.radius);
  21824. },
  21825. /**
  21826. * Stroke the given circle.
  21827. *
  21828. * @method Phaser.GameObjects.Graphics#strokeCircleShape
  21829. * @since 3.0.0
  21830. *
  21831. * @param {Phaser.Geom.Circle} circle - The circle to stroke.
  21832. *
  21833. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21834. */
  21835. strokeCircleShape: function (circle)
  21836. {
  21837. return this.strokeCircle(circle.x, circle.y, circle.radius);
  21838. },
  21839. /**
  21840. * Fill a circle with the given position and radius.
  21841. *
  21842. * @method Phaser.GameObjects.Graphics#fillCircle
  21843. * @since 3.0.0
  21844. *
  21845. * @param {number} x - The x coordinate of the center of the circle.
  21846. * @param {number} y - The y coordinate of the center of the circle.
  21847. * @param {number} radius - The radius of the circle.
  21848. *
  21849. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21850. */
  21851. fillCircle: function (x, y, radius)
  21852. {
  21853. this.beginPath();
  21854. this.arc(x, y, radius, 0, MATH_CONST.PI2);
  21855. this.fillPath();
  21856. return this;
  21857. },
  21858. /**
  21859. * Stroke a circle with the given position and radius.
  21860. *
  21861. * @method Phaser.GameObjects.Graphics#strokeCircle
  21862. * @since 3.0.0
  21863. *
  21864. * @param {number} x - The x coordinate of the center of the circle.
  21865. * @param {number} y - The y coordinate of the center of the circle.
  21866. * @param {number} radius - The radius of the circle.
  21867. *
  21868. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21869. */
  21870. strokeCircle: function (x, y, radius)
  21871. {
  21872. this.beginPath();
  21873. this.arc(x, y, radius, 0, MATH_CONST.PI2);
  21874. this.strokePath();
  21875. return this;
  21876. },
  21877. /**
  21878. * Fill the given rectangle.
  21879. *
  21880. * @method Phaser.GameObjects.Graphics#fillRectShape
  21881. * @since 3.0.0
  21882. *
  21883. * @param {Phaser.Geom.Rectangle} rect - The rectangle to fill.
  21884. *
  21885. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21886. */
  21887. fillRectShape: function (rect)
  21888. {
  21889. return this.fillRect(rect.x, rect.y, rect.width, rect.height);
  21890. },
  21891. /**
  21892. * Stroke the given rectangle.
  21893. *
  21894. * @method Phaser.GameObjects.Graphics#strokeRectShape
  21895. * @since 3.0.0
  21896. *
  21897. * @param {Phaser.Geom.Rectangle} rect - The rectangle to stroke.
  21898. *
  21899. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21900. */
  21901. strokeRectShape: function (rect)
  21902. {
  21903. return this.strokeRect(rect.x, rect.y, rect.width, rect.height);
  21904. },
  21905. /**
  21906. * Fill a rectangle with the given position and size.
  21907. *
  21908. * @method Phaser.GameObjects.Graphics#fillRect
  21909. * @since 3.0.0
  21910. *
  21911. * @param {number} x - The x coordinate of the top-left of the rectangle.
  21912. * @param {number} y - The y coordinate of the top-left of the rectangle.
  21913. * @param {number} width - The width of the rectangle.
  21914. * @param {number} height - The height of the rectangle.
  21915. *
  21916. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21917. */
  21918. fillRect: function (x, y, width, height)
  21919. {
  21920. this.commandBuffer.push(
  21921. Commands.FILL_RECT,
  21922. x, y, width, height
  21923. );
  21924. return this;
  21925. },
  21926. /**
  21927. * Stroke a rectangle with the given position and size.
  21928. *
  21929. * @method Phaser.GameObjects.Graphics#strokeRect
  21930. * @since 3.0.0
  21931. *
  21932. * @param {number} x - The x coordinate of the top-left of the rectangle.
  21933. * @param {number} y - The y coordinate of the top-left of the rectangle.
  21934. * @param {number} width - The width of the rectangle.
  21935. * @param {number} height - The height of the rectangle.
  21936. *
  21937. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21938. */
  21939. strokeRect: function (x, y, width, height)
  21940. {
  21941. var lineWidthHalf = this._lineWidth / 2;
  21942. var minx = x - lineWidthHalf;
  21943. var maxx = x + lineWidthHalf;
  21944. this.beginPath();
  21945. this.moveTo(x, y);
  21946. this.lineTo(x, y + height);
  21947. this.strokePath();
  21948. this.beginPath();
  21949. this.moveTo(x + width, y);
  21950. this.lineTo(x + width, y + height);
  21951. this.strokePath();
  21952. this.beginPath();
  21953. this.moveTo(minx, y);
  21954. this.lineTo(maxx + width, y);
  21955. this.strokePath();
  21956. this.beginPath();
  21957. this.moveTo(minx, y + height);
  21958. this.lineTo(maxx + width, y + height);
  21959. this.strokePath();
  21960. return this;
  21961. },
  21962. /**
  21963. * Fill a rounded rectangle with the given position, size and radius.
  21964. *
  21965. * @method Phaser.GameObjects.Graphics#fillRoundedRect
  21966. * @since 3.11.0
  21967. *
  21968. * @param {number} x - The x coordinate of the top-left of the rectangle.
  21969. * @param {number} y - The y coordinate of the top-left of the rectangle.
  21970. * @param {number} width - The width of the rectangle.
  21971. * @param {number} height - The height of the rectangle.
  21972. * @param {number} [radius = 20] - The corner radius; It can also be an object to specify different radii for corners
  21973. * @param {number} [radius.tl = 20] Top left
  21974. * @param {number} [radius.tr = 20] Top right
  21975. * @param {number} [radius.br = 20] Bottom right
  21976. * @param {number} [radius.bl = 20] Bottom left
  21977. *
  21978. * @return {Phaser.GameObjects.Graphics} This Game Object.
  21979. */
  21980. fillRoundedRect: function (x, y, width, height, radius)
  21981. {
  21982. if (radius === undefined) { radius = 20; }
  21983. var tl = radius;
  21984. var tr = radius;
  21985. var bl = radius;
  21986. var br = radius;
  21987. if (typeof radius !== 'number')
  21988. {
  21989. tl = GetFastValue(radius, 'tl', 20);
  21990. tr = GetFastValue(radius, 'tr', 20);
  21991. bl = GetFastValue(radius, 'bl', 20);
  21992. br = GetFastValue(radius, 'br', 20);
  21993. }
  21994. this.beginPath();
  21995. this.moveTo(x + tl, y);
  21996. this.lineTo(x + width - tr, y);
  21997. this.arc(x + width - tr, y + tr, tr, -MATH_CONST.TAU, 0);
  21998. this.lineTo(x + width, y + height - br);
  21999. this.arc(x + width - br, y + height - br, br, 0, MATH_CONST.TAU);
  22000. this.lineTo(x + bl, y + height);
  22001. this.arc(x + bl, y + height - bl, bl, MATH_CONST.TAU, Math.PI);
  22002. this.lineTo(x, y + tl);
  22003. this.arc(x + tl, y + tl, tl, -Math.PI, -MATH_CONST.TAU);
  22004. this.fillPath();
  22005. return this;
  22006. },
  22007. /**
  22008. * Stroke a rounded rectangle with the given position, size and radius.
  22009. *
  22010. * @method Phaser.GameObjects.Graphics#strokeRoundedRect
  22011. * @since 3.11.0
  22012. *
  22013. * @param {number} x - The x coordinate of the top-left of the rectangle.
  22014. * @param {number} y - The y coordinate of the top-left of the rectangle.
  22015. * @param {number} width - The width of the rectangle.
  22016. * @param {number} height - The height of the rectangle.
  22017. * @param {number} [radius = 20] - The corner radius; It can also be an object to specify different radii for corners
  22018. * @param {number} [radius.tl = 20] Top left
  22019. * @param {number} [radius.tr = 20] Top right
  22020. * @param {number} [radius.br = 20] Bottom right
  22021. * @param {number} [radius.bl = 20] Bottom left
  22022. *
  22023. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22024. */
  22025. strokeRoundedRect: function (x, y, width, height, radius)
  22026. {
  22027. if (radius === undefined) { radius = 20; }
  22028. var tl = radius;
  22029. var tr = radius;
  22030. var bl = radius;
  22031. var br = radius;
  22032. if (typeof radius !== 'number')
  22033. {
  22034. tl = GetFastValue(radius, 'tl', 20);
  22035. tr = GetFastValue(radius, 'tr', 20);
  22036. bl = GetFastValue(radius, 'bl', 20);
  22037. br = GetFastValue(radius, 'br', 20);
  22038. }
  22039. this.beginPath();
  22040. this.moveTo(x + tl, y);
  22041. this.lineTo(x + width - tr, y);
  22042. this.arc(x + width - tr, y + tr, tr, -MATH_CONST.TAU, 0);
  22043. this.lineTo(x + width, y + height - br);
  22044. this.arc(x + width - br, y + height - br, br, 0, MATH_CONST.TAU);
  22045. this.lineTo(x + bl, y + height);
  22046. this.arc(x + bl, y + height - bl, bl, MATH_CONST.TAU, Math.PI);
  22047. this.lineTo(x, y + tl);
  22048. this.arc(x + tl, y + tl, tl, -Math.PI, -MATH_CONST.TAU);
  22049. this.strokePath();
  22050. return this;
  22051. },
  22052. /**
  22053. * Fill the given point.
  22054. *
  22055. * Draws a square at the given position, 1 pixel in size by default.
  22056. *
  22057. * @method Phaser.GameObjects.Graphics#fillPointShape
  22058. * @since 3.0.0
  22059. *
  22060. * @param {(Phaser.Geom.Point|Phaser.Math.Vector2|object)} point - The point to fill.
  22061. * @param {number} [size=1] - The size of the square to draw.
  22062. *
  22063. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22064. */
  22065. fillPointShape: function (point, size)
  22066. {
  22067. return this.fillPoint(point.x, point.y, size);
  22068. },
  22069. /**
  22070. * Fill a point at the given position.
  22071. *
  22072. * Draws a square at the given position, 1 pixel in size by default.
  22073. *
  22074. * @method Phaser.GameObjects.Graphics#fillPoint
  22075. * @since 3.0.0
  22076. *
  22077. * @param {number} x - The x coordinate of the point.
  22078. * @param {number} y - The y coordinate of the point.
  22079. * @param {number} [size=1] - The size of the square to draw.
  22080. *
  22081. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22082. */
  22083. fillPoint: function (x, y, size)
  22084. {
  22085. if (!size || size < 1)
  22086. {
  22087. size = 1;
  22088. }
  22089. else
  22090. {
  22091. x -= (size / 2);
  22092. y -= (size / 2);
  22093. }
  22094. this.commandBuffer.push(
  22095. Commands.FILL_RECT,
  22096. x, y, size, size
  22097. );
  22098. return this;
  22099. },
  22100. /**
  22101. * Fill the given triangle.
  22102. *
  22103. * @method Phaser.GameObjects.Graphics#fillTriangleShape
  22104. * @since 3.0.0
  22105. *
  22106. * @param {Phaser.Geom.Triangle} triangle - The triangle to fill.
  22107. *
  22108. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22109. */
  22110. fillTriangleShape: function (triangle)
  22111. {
  22112. return this.fillTriangle(triangle.x1, triangle.y1, triangle.x2, triangle.y2, triangle.x3, triangle.y3);
  22113. },
  22114. /**
  22115. * Stroke the given triangle.
  22116. *
  22117. * @method Phaser.GameObjects.Graphics#strokeTriangleShape
  22118. * @since 3.0.0
  22119. *
  22120. * @param {Phaser.Geom.Triangle} triangle - The triangle to stroke.
  22121. *
  22122. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22123. */
  22124. strokeTriangleShape: function (triangle)
  22125. {
  22126. return this.strokeTriangle(triangle.x1, triangle.y1, triangle.x2, triangle.y2, triangle.x3, triangle.y3);
  22127. },
  22128. /**
  22129. * Fill a triangle with the given points.
  22130. *
  22131. * @method Phaser.GameObjects.Graphics#fillTriangle
  22132. * @since 3.0.0
  22133. *
  22134. * @param {number} x0 - The x coordinate of the first point.
  22135. * @param {number} y0 - The y coordinate of the first point.
  22136. * @param {number} x1 - The x coordinate of the second point.
  22137. * @param {number} y1 - The y coordinate of the second point.
  22138. * @param {number} x2 - The x coordinate of the third point.
  22139. * @param {number} y2 - The y coordinate of the third point.
  22140. *
  22141. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22142. */
  22143. fillTriangle: function (x0, y0, x1, y1, x2, y2)
  22144. {
  22145. this.commandBuffer.push(
  22146. Commands.FILL_TRIANGLE,
  22147. x0, y0, x1, y1, x2, y2
  22148. );
  22149. return this;
  22150. },
  22151. /**
  22152. * Stroke a triangle with the given points.
  22153. *
  22154. * @method Phaser.GameObjects.Graphics#strokeTriangle
  22155. * @since 3.0.0
  22156. *
  22157. * @param {number} x0 - The x coordinate of the first point.
  22158. * @param {number} y0 - The y coordinate of the first point.
  22159. * @param {number} x1 - The x coordinate of the second point.
  22160. * @param {number} y1 - The y coordinate of the second point.
  22161. * @param {number} x2 - The x coordinate of the third point.
  22162. * @param {number} y2 - The y coordinate of the third point.
  22163. *
  22164. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22165. */
  22166. strokeTriangle: function (x0, y0, x1, y1, x2, y2)
  22167. {
  22168. this.commandBuffer.push(
  22169. Commands.STROKE_TRIANGLE,
  22170. x0, y0, x1, y1, x2, y2
  22171. );
  22172. return this;
  22173. },
  22174. /**
  22175. * Draw the given line.
  22176. *
  22177. * @method Phaser.GameObjects.Graphics#strokeLineShape
  22178. * @since 3.0.0
  22179. *
  22180. * @param {Phaser.Geom.Line} line - The line to stroke.
  22181. *
  22182. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22183. */
  22184. strokeLineShape: function (line)
  22185. {
  22186. return this.lineBetween(line.x1, line.y1, line.x2, line.y2);
  22187. },
  22188. /**
  22189. * Draw a line between the given points.
  22190. *
  22191. * @method Phaser.GameObjects.Graphics#lineBetween
  22192. * @since 3.0.0
  22193. *
  22194. * @param {number} x1 - The x coordinate of the start point of the line.
  22195. * @param {number} y1 - The y coordinate of the start point of the line.
  22196. * @param {number} x2 - The x coordinate of the end point of the line.
  22197. * @param {number} y2 - The y coordinate of the end point of the line.
  22198. *
  22199. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22200. */
  22201. lineBetween: function (x1, y1, x2, y2)
  22202. {
  22203. this.beginPath();
  22204. this.moveTo(x1, y1);
  22205. this.lineTo(x2, y2);
  22206. this.strokePath();
  22207. return this;
  22208. },
  22209. /**
  22210. * Draw a line from the current drawing position to the given position.
  22211. *
  22212. * Moves the current drawing position to the given position.
  22213. *
  22214. * @method Phaser.GameObjects.Graphics#lineTo
  22215. * @since 3.0.0
  22216. *
  22217. * @param {number} x - The x coordinate to draw the line to.
  22218. * @param {number} y - The y coordinate to draw the line to.
  22219. *
  22220. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22221. */
  22222. lineTo: function (x, y)
  22223. {
  22224. this.commandBuffer.push(
  22225. Commands.LINE_TO,
  22226. x, y
  22227. );
  22228. return this;
  22229. },
  22230. /**
  22231. * Move the current drawing position to the given position.
  22232. *
  22233. * @method Phaser.GameObjects.Graphics#moveTo
  22234. * @since 3.0.0
  22235. *
  22236. * @param {number} x - The x coordinate to move to.
  22237. * @param {number} y - The y coordinate to move to.
  22238. *
  22239. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22240. */
  22241. moveTo: function (x, y)
  22242. {
  22243. this.commandBuffer.push(
  22244. Commands.MOVE_TO,
  22245. x, y
  22246. );
  22247. return this;
  22248. },
  22249. /**
  22250. * [description]
  22251. *
  22252. * @method Phaser.GameObjects.Graphics#lineFxTo
  22253. * @since 3.0.0
  22254. *
  22255. * @param {number} x - [description]
  22256. * @param {number} y - [description]
  22257. * @param {number} width - [description]
  22258. * @param {number} rgb - [description]
  22259. *
  22260. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22261. */
  22262. lineFxTo: function (x, y, width, rgb)
  22263. {
  22264. this.commandBuffer.push(
  22265. Commands.LINE_FX_TO,
  22266. x, y, width, rgb, 1
  22267. );
  22268. return this;
  22269. },
  22270. /**
  22271. * [description]
  22272. *
  22273. * @method Phaser.GameObjects.Graphics#moveFxTo
  22274. * @since 3.0.0
  22275. *
  22276. * @param {number} x - [description]
  22277. * @param {number} y - [description]
  22278. * @param {number} width - [description]
  22279. * @param {number} rgb - [description]
  22280. *
  22281. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22282. */
  22283. moveFxTo: function (x, y, width, rgb)
  22284. {
  22285. this.commandBuffer.push(
  22286. Commands.MOVE_FX_TO,
  22287. x, y, width, rgb, 1
  22288. );
  22289. return this;
  22290. },
  22291. /**
  22292. * Stroke the shape represented by the given array of points.
  22293. *
  22294. * Pass `true` to `autoClose` to close the shape automatically.
  22295. *
  22296. * @method Phaser.GameObjects.Graphics#strokePoints
  22297. * @since 3.0.0
  22298. *
  22299. * @param {(array|Phaser.Geom.Point[])} points - The points to stroke.
  22300. * @param {boolean} [autoClose=false] - When `true`, the shape is closed by joining the last point to the first point.
  22301. * @param {integer} [endIndex] - The index of `points` to stop drawing at. Defaults to `points.length`.
  22302. *
  22303. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22304. */
  22305. strokePoints: function (points, autoClose, endIndex)
  22306. {
  22307. if (autoClose === undefined) { autoClose = false; }
  22308. if (endIndex === undefined) { endIndex = points.length; }
  22309. this.beginPath();
  22310. this.moveTo(points[0].x, points[0].y);
  22311. for (var i = 1; i < endIndex; i++)
  22312. {
  22313. this.lineTo(points[i].x, points[i].y);
  22314. }
  22315. if (autoClose)
  22316. {
  22317. this.lineTo(points[0].x, points[0].y);
  22318. }
  22319. this.strokePath();
  22320. return this;
  22321. },
  22322. /**
  22323. * Fill the shape represented by the given array of points.
  22324. *
  22325. * Pass `true` to `autoClose` to close the shape automatically.
  22326. *
  22327. * @method Phaser.GameObjects.Graphics#fillPoints
  22328. * @since 3.0.0
  22329. *
  22330. * @param {(array|Phaser.Geom.Point[])} points - The points to fill.
  22331. * @param {boolean} [autoClose=false] - Whether to automatically close the polygon.
  22332. * @param {integer} [endIndex] - The index of `points` to stop at. Defaults to `points.length`.
  22333. *
  22334. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22335. */
  22336. fillPoints: function (points, autoClose, endIndex)
  22337. {
  22338. if (autoClose === undefined) { autoClose = false; }
  22339. if (endIndex === undefined) { endIndex = points.length; }
  22340. this.beginPath();
  22341. this.moveTo(points[0].x, points[0].y);
  22342. for (var i = 1; i < endIndex; i++)
  22343. {
  22344. this.lineTo(points[i].x, points[i].y);
  22345. }
  22346. if (autoClose)
  22347. {
  22348. this.lineTo(points[0].x, points[0].y);
  22349. }
  22350. this.fillPath();
  22351. return this;
  22352. },
  22353. /**
  22354. * Stroke the given ellipse.
  22355. *
  22356. * @method Phaser.GameObjects.Graphics#strokeEllipseShape
  22357. * @since 3.0.0
  22358. *
  22359. * @param {Phaser.Geom.Ellipse} ellipse - The ellipse to stroke.
  22360. * @param {integer} [smoothness=32] - The number of points to draw the ellipse with.
  22361. *
  22362. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22363. */
  22364. strokeEllipseShape: function (ellipse, smoothness)
  22365. {
  22366. if (smoothness === undefined) { smoothness = 32; }
  22367. var points = ellipse.getPoints(smoothness);
  22368. return this.strokePoints(points, true);
  22369. },
  22370. /**
  22371. * Stroke an ellipse with the given position and size.
  22372. *
  22373. * @method Phaser.GameObjects.Graphics#strokeEllipse
  22374. * @since 3.0.0
  22375. *
  22376. * @param {number} x - The x coordinate of the center of the ellipse.
  22377. * @param {number} y - The y coordinate of the center of the ellipse.
  22378. * @param {number} width - The width of the ellipse.
  22379. * @param {number} height - The height of the ellipse.
  22380. * @param {integer} [smoothness=32] - The number of points to draw the ellipse with.
  22381. *
  22382. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22383. */
  22384. strokeEllipse: function (x, y, width, height, smoothness)
  22385. {
  22386. if (smoothness === undefined) { smoothness = 32; }
  22387. var ellipse = new Ellipse(x, y, width, height);
  22388. var points = ellipse.getPoints(smoothness);
  22389. return this.strokePoints(points, true);
  22390. },
  22391. /**
  22392. * Fill the given ellipse.
  22393. *
  22394. * @method Phaser.GameObjects.Graphics#fillEllipseShape
  22395. * @since 3.0.0
  22396. *
  22397. * @param {Phaser.Geom.Ellipse} ellipse - The ellipse to fill.
  22398. * @param {integer} [smoothness=32] - The number of points to draw the ellipse with.
  22399. *
  22400. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22401. */
  22402. fillEllipseShape: function (ellipse, smoothness)
  22403. {
  22404. if (smoothness === undefined) { smoothness = 32; }
  22405. var points = ellipse.getPoints(smoothness);
  22406. return this.fillPoints(points, true);
  22407. },
  22408. /**
  22409. * Fill an ellipse with the given position and size.
  22410. *
  22411. * @method Phaser.GameObjects.Graphics#fillEllipse
  22412. * @since 3.0.0
  22413. *
  22414. * @param {number} x - The x coordinate of the center of the ellipse.
  22415. * @param {number} y - The y coordinate of the center of the ellipse.
  22416. * @param {number} width - The width of the ellipse.
  22417. * @param {number} height - The height of the ellipse.
  22418. * @param {integer} [smoothness=32] - The number of points to draw the ellipse with.
  22419. *
  22420. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22421. */
  22422. fillEllipse: function (x, y, width, height, smoothness)
  22423. {
  22424. if (smoothness === undefined) { smoothness = 32; }
  22425. var ellipse = new Ellipse(x, y, width, height);
  22426. var points = ellipse.getPoints(smoothness);
  22427. return this.fillPoints(points, true);
  22428. },
  22429. /**
  22430. * Draw an arc.
  22431. *
  22432. * This method can be used to create circles, or parts of circles.
  22433. *
  22434. * Use the optional `overshoot` argument to allow the arc to extend beyond 360 degrees. This is useful if you're drawing
  22435. * an arc with an especially thick line, as it will allow the arc to fully join-up. Try small values at first, i.e. 0.01.
  22436. *
  22437. * Call {@link Phaser.GameObjects.Graphics#fillPath} or {@link Phaser.GameObjects.Graphics#strokePath} after calling
  22438. * this method to draw the arc.
  22439. *
  22440. * @method Phaser.GameObjects.Graphics#arc
  22441. * @since 3.0.0
  22442. *
  22443. * @param {number} x - The x coordinate of the center of the circle.
  22444. * @param {number} y - The y coordinate of the center of the circle.
  22445. * @param {number} radius - The radius of the circle.
  22446. * @param {number} startAngle - The starting angle, in radians.
  22447. * @param {number} endAngle - The ending angle, in radians.
  22448. * @param {boolean} [anticlockwise=false] - Whether the drawing should be anticlockwise or clockwise.
  22449. * @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.
  22450. *
  22451. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22452. */
  22453. arc: function (x, y, radius, startAngle, endAngle, anticlockwise, overshoot)
  22454. {
  22455. if (anticlockwise === undefined) { anticlockwise = false; }
  22456. if (overshoot === undefined) { overshoot = 0; }
  22457. var PI2 = Math.PI * 2;
  22458. if (anticlockwise)
  22459. {
  22460. if (endAngle < -PI2)
  22461. {
  22462. endAngle = -PI2 - overshoot;
  22463. }
  22464. else if (endAngle >= 0)
  22465. {
  22466. endAngle = -PI2 + endAngle % PI2 - overshoot;
  22467. }
  22468. }
  22469. else
  22470. {
  22471. endAngle -= startAngle;
  22472. endAngle += overshoot;
  22473. if (endAngle > PI2 + overshoot)
  22474. {
  22475. endAngle = PI2 + overshoot;
  22476. }
  22477. else if (endAngle < -overshoot)
  22478. {
  22479. endAngle = PI2 + endAngle % PI2 - overshoot;
  22480. }
  22481. }
  22482. this.commandBuffer.push(
  22483. Commands.ARC,
  22484. x, y, radius, startAngle, endAngle, anticlockwise
  22485. );
  22486. return this;
  22487. },
  22488. /**
  22489. * Creates a pie-chart slice shape centered at `x`, `y` with the given radius.
  22490. * You must define the start and end angle of the slice.
  22491. *
  22492. * Setting the `anticlockwise` argument to `true` creates a shape similar to Pacman.
  22493. * Setting it to `false` creates a shape like a slice of pie.
  22494. *
  22495. * This method will begin a new path and close the path at the end of it.
  22496. * To display the actual slice you need to call either `strokePath` or `fillPath` after it.
  22497. *
  22498. * @method Phaser.GameObjects.Graphics#slice
  22499. * @since 3.4.0
  22500. *
  22501. * @param {number} x - The horizontal center of the slice.
  22502. * @param {number} y - The vertical center of the slice.
  22503. * @param {number} radius - The radius of the slice.
  22504. * @param {number} startAngle - The start angle of the slice, given in radians.
  22505. * @param {number} endAngle - The end angle of the slice, given in radians.
  22506. * @param {boolean} [anticlockwise=false] - Whether the drawing should be anticlockwise or clockwise.
  22507. * @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.
  22508. *
  22509. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22510. */
  22511. slice: function (x, y, radius, startAngle, endAngle, anticlockwise, overshoot)
  22512. {
  22513. if (anticlockwise === undefined) { anticlockwise = false; }
  22514. if (overshoot === undefined) { overshoot = 0; }
  22515. var PI2 = Math.PI * 2;
  22516. if (anticlockwise)
  22517. {
  22518. if (endAngle < -PI2)
  22519. {
  22520. endAngle = -PI2 - overshoot;
  22521. }
  22522. else if (endAngle >= 0)
  22523. {
  22524. endAngle = -PI2 + endAngle % PI2 - overshoot;
  22525. }
  22526. }
  22527. else
  22528. {
  22529. endAngle -= startAngle;
  22530. endAngle += overshoot;
  22531. if (endAngle > PI2 + overshoot)
  22532. {
  22533. endAngle = PI2 + overshoot;
  22534. }
  22535. else if (endAngle <= -overshoot)
  22536. {
  22537. endAngle = PI2 + endAngle % PI2 - overshoot;
  22538. }
  22539. }
  22540. this.commandBuffer.push(Commands.BEGIN_PATH);
  22541. this.commandBuffer.push(Commands.MOVE_TO, x, y);
  22542. this.commandBuffer.push(Commands.ARC, x, y, radius, startAngle, endAngle, anticlockwise);
  22543. this.commandBuffer.push(Commands.CLOSE_PATH);
  22544. return this;
  22545. },
  22546. /**
  22547. * Saves the state of the Graphics by pushing the current state onto a stack.
  22548. *
  22549. * The most recently saved state can then be restored with {@link Phaser.GameObjects.Graphics#restore}.
  22550. *
  22551. * @method Phaser.GameObjects.Graphics#save
  22552. * @since 3.0.0
  22553. *
  22554. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22555. */
  22556. save: function ()
  22557. {
  22558. this.commandBuffer.push(
  22559. Commands.SAVE
  22560. );
  22561. return this;
  22562. },
  22563. /**
  22564. * Restores the most recently saved state of the Graphics by popping from the state stack.
  22565. *
  22566. * Use {@link Phaser.GameObjects.Graphics#save} to save the current state, and call this afterwards to restore that state.
  22567. *
  22568. * If there is no saved state, this command does nothing.
  22569. *
  22570. * @method Phaser.GameObjects.Graphics#restore
  22571. * @since 3.0.0
  22572. *
  22573. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22574. */
  22575. restore: function ()
  22576. {
  22577. this.commandBuffer.push(
  22578. Commands.RESTORE
  22579. );
  22580. return this;
  22581. },
  22582. /**
  22583. * Translate the graphics.
  22584. *
  22585. * @method Phaser.GameObjects.Graphics#translate
  22586. * @since 3.0.0
  22587. *
  22588. * @param {number} x - The horizontal translation to apply.
  22589. * @param {number} y - The vertical translation to apply.
  22590. *
  22591. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22592. */
  22593. translate: function (x, y)
  22594. {
  22595. this.commandBuffer.push(
  22596. Commands.TRANSLATE,
  22597. x, y
  22598. );
  22599. return this;
  22600. },
  22601. /**
  22602. * Scale the graphics.
  22603. *
  22604. * @method Phaser.GameObjects.Graphics#scale
  22605. * @since 3.0.0
  22606. *
  22607. * @param {number} x - The horizontal scale to apply.
  22608. * @param {number} y - The vertical scale to apply.
  22609. *
  22610. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22611. */
  22612. scale: function (x, y)
  22613. {
  22614. this.commandBuffer.push(
  22615. Commands.SCALE,
  22616. x, y
  22617. );
  22618. return this;
  22619. },
  22620. /**
  22621. * Rotate the graphics.
  22622. *
  22623. * @method Phaser.GameObjects.Graphics#rotate
  22624. * @since 3.0.0
  22625. *
  22626. * @param {number} radians - The rotation angle, in radians.
  22627. *
  22628. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22629. */
  22630. rotate: function (radians)
  22631. {
  22632. this.commandBuffer.push(
  22633. Commands.ROTATE,
  22634. radians
  22635. );
  22636. return this;
  22637. },
  22638. /**
  22639. * Clear the command buffer and reset the fill style and line style to their defaults.
  22640. *
  22641. * @method Phaser.GameObjects.Graphics#clear
  22642. * @since 3.0.0
  22643. *
  22644. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22645. */
  22646. clear: function ()
  22647. {
  22648. this.commandBuffer.length = 0;
  22649. if (this.defaultFillColor > -1)
  22650. {
  22651. this.fillStyle(this.defaultFillColor, this.defaultFillAlpha);
  22652. }
  22653. if (this.defaultStrokeColor > -1)
  22654. {
  22655. this.lineStyle(this.defaultStrokeWidth, this.defaultStrokeColor, this.defaultStrokeAlpha);
  22656. }
  22657. return this;
  22658. },
  22659. /**
  22660. * Generate a texture from this Graphics object.
  22661. *
  22662. * If `key` is a string it'll generate a new texture using it and add it into the
  22663. * Texture Manager (assuming no key conflict happens).
  22664. *
  22665. * If `key` is a Canvas it will draw the texture to that canvas context. Note that it will NOT
  22666. * automatically upload it to the GPU in WebGL mode.
  22667. *
  22668. * @method Phaser.GameObjects.Graphics#generateTexture
  22669. * @since 3.0.0
  22670. *
  22671. * @param {(string|HTMLCanvasElement)} key - The key to store the texture with in the Texture Manager, or a Canvas to draw to.
  22672. * @param {integer} [width] - The width of the graphics to generate.
  22673. * @param {integer} [height] - The height of the graphics to generate.
  22674. *
  22675. * @return {Phaser.GameObjects.Graphics} This Game Object.
  22676. */
  22677. generateTexture: function (key, width, height)
  22678. {
  22679. var sys = this.scene.sys;
  22680. if (width === undefined) { width = sys.game.config.width; }
  22681. if (height === undefined) { height = sys.game.config.height; }
  22682. Graphics.TargetCamera.setViewport(0, 0, width, height);
  22683. Graphics.TargetCamera.scrollX = this.x;
  22684. Graphics.TargetCamera.scrollY = this.y;
  22685. var texture;
  22686. var ctx;
  22687. if (typeof key === 'string')
  22688. {
  22689. if (sys.textures.exists(key))
  22690. {
  22691. // Key is a string, it DOES exist in the Texture Manager AND is a canvas, so draw to it
  22692. texture = sys.textures.get(key);
  22693. var src = texture.getSourceImage();
  22694. if (src instanceof HTMLCanvasElement)
  22695. {
  22696. ctx = src.getContext('2d');
  22697. }
  22698. }
  22699. else
  22700. {
  22701. // Key is a string and doesn't exist in the Texture Manager, so generate and save it
  22702. texture = sys.textures.createCanvas(key, width, height);
  22703. ctx = texture.getSourceImage().getContext('2d');
  22704. }
  22705. }
  22706. else if (key instanceof HTMLCanvasElement)
  22707. {
  22708. // Key is a Canvas, so draw to it
  22709. ctx = key.getContext('2d');
  22710. }
  22711. if (ctx)
  22712. {
  22713. this.renderCanvas(sys.game.renderer, this, 0.0, Graphics.TargetCamera, null, ctx);
  22714. if (sys.game.renderer.gl && texture)
  22715. {
  22716. texture.source[0].glTexture = sys.game.renderer.canvasToTexture(ctx.canvas, texture.source[0].glTexture);
  22717. }
  22718. }
  22719. return this;
  22720. },
  22721. /**
  22722. * Internal destroy handler, called as part of the destroy process.
  22723. *
  22724. * @method Phaser.GameObjects.Graphics#preDestroy
  22725. * @protected
  22726. * @since 3.9.0
  22727. */
  22728. preDestroy: function ()
  22729. {
  22730. this.commandBuffer = [];
  22731. }
  22732. });
  22733. /**
  22734. * A Camera used specifically by the Graphics system for rendering to textures.
  22735. *
  22736. * @name Phaser.GameObjects.Graphics.TargetCamera
  22737. * @type {Phaser.Cameras.Scene2D.Camera}
  22738. * @since 3.1.0
  22739. */
  22740. Graphics.TargetCamera = new Camera(0, 0, 0, 0);
  22741. module.exports = Graphics;
  22742. /***/ }),
  22743. /* 116 */
  22744. /***/ (function(module, exports) {
  22745. /**
  22746. * @author Richard Davey <rich@photonstorm.com>
  22747. * @copyright 2018 Photon Storm Ltd.
  22748. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  22749. */
  22750. /**
  22751. * A Matrix is simply an array of arrays, where each sub-array (the rows) have the same length:
  22752. *
  22753. * let matrix2 = [
  22754. * [ 1, 1, 1, 1, 1, 1 ],
  22755. * [ 2, 0, 0, 0, 0, 4 ],
  22756. * [ 2, 0, 1, 2, 0, 4 ],
  22757. * [ 2, 0, 3, 4, 0, 4 ],
  22758. * [ 2, 0, 0, 0, 0, 4 ],
  22759. * [ 3, 3, 3, 3, 3, 3 ]
  22760. *];
  22761. */
  22762. /**
  22763. * [description]
  22764. *
  22765. * @function Phaser.Utils.Array.Matrix.CheckMatrix
  22766. * @since 3.0.0
  22767. *
  22768. * @param {array} matrix - [description]
  22769. *
  22770. * @return {boolean} [description]
  22771. */
  22772. var CheckMatrix = function (matrix)
  22773. {
  22774. if (!Array.isArray(matrix) || matrix.length < 2 || !Array.isArray(matrix[0]))
  22775. {
  22776. return false;
  22777. }
  22778. // How long is the first row?
  22779. var size = matrix[0].length;
  22780. // Validate the rest of the rows are the same length
  22781. for (var i = 1; i < matrix.length; i++)
  22782. {
  22783. if (matrix[i].length !== size)
  22784. {
  22785. return false;
  22786. }
  22787. }
  22788. return true;
  22789. };
  22790. module.exports = CheckMatrix;
  22791. /***/ }),
  22792. /* 117 */
  22793. /***/ (function(module, exports, __webpack_require__) {
  22794. /**
  22795. * @author Richard Davey <rich@photonstorm.com>
  22796. * @copyright 2018 Photon Storm Ltd.
  22797. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  22798. */
  22799. var Class = __webpack_require__(0);
  22800. var Frame = __webpack_require__(129);
  22801. var TextureSource = __webpack_require__(188);
  22802. /**
  22803. * @classdesc
  22804. * A Texture consists of a source, usually an Image from the Cache, and a collection of Frames.
  22805. * The Frames represent the different areas of the Texture. For example a texture atlas
  22806. * may have many Frames, one for each element within the atlas. Where-as a single image would have
  22807. * just one frame, that encompasses the whole image.
  22808. *
  22809. * Textures are managed by the global TextureManager. This is a singleton class that is
  22810. * responsible for creating and delivering Textures and their corresponding Frames to Game Objects.
  22811. *
  22812. * Sprites and other Game Objects get the texture data they need from the TextureManager.
  22813. *
  22814. * @class Texture
  22815. * @memberOf Phaser.Textures
  22816. * @constructor
  22817. * @since 3.0.0
  22818. *
  22819. * @param {Phaser.Textures.TextureManager} manager - A reference to the Texture Manager this Texture belongs to.
  22820. * @param {string} key - The unique string-based key of this Texture.
  22821. * @param {(HTMLImageElement[]|HTMLCanvasElement[])} source - An array of sources that are used to create the texture. Usually Images, but can also be a Canvas.
  22822. * @param {number} [width] - The width of the Texture. This is optional and automatically derived from the source images.
  22823. * @param {number} [height] - The height of the Texture. This is optional and automatically derived from the source images.
  22824. */
  22825. var Texture = new Class({
  22826. initialize:
  22827. function Texture (manager, key, source, width, height)
  22828. {
  22829. if (!Array.isArray(source))
  22830. {
  22831. source = [ source ];
  22832. }
  22833. /**
  22834. * A reference to the Texture Manager this Texture belongs to.
  22835. *
  22836. * @name Phaser.Textures.Texture#manager
  22837. * @type {Phaser.Textures.TextureManager}
  22838. * @since 3.0.0
  22839. */
  22840. this.manager = manager;
  22841. /**
  22842. * The unique string-based key of this Texture.
  22843. *
  22844. * @name Phaser.Textures.Texture#key
  22845. * @type {string}
  22846. * @since 3.0.0
  22847. */
  22848. this.key = key;
  22849. /**
  22850. * An array of TextureSource instances.
  22851. * These are unique to this Texture and contain the actual Image (or Canvas) data.
  22852. *
  22853. * @name Phaser.Textures.Texture#source
  22854. * @type {Phaser.Textures.TextureSource[]}
  22855. * @since 3.0.0
  22856. */
  22857. this.source = [];
  22858. /**
  22859. * An array of TextureSource data instances.
  22860. * Used to store additional data images, such as normal maps or specular maps.
  22861. *
  22862. * @name Phaser.Textures.Texture#dataSource
  22863. * @type {array}
  22864. * @since 3.0.0
  22865. */
  22866. this.dataSource = [];
  22867. /**
  22868. * A key-value object pair associating the unique Frame keys with the Frames objects.
  22869. *
  22870. * @name Phaser.Textures.Texture#frames
  22871. * @type {object}
  22872. * @since 3.0.0
  22873. */
  22874. this.frames = {};
  22875. /**
  22876. * Any additional data that was set in the source JSON (if any),
  22877. * or any extra data you'd like to store relating to this texture
  22878. *
  22879. * @name Phaser.Textures.Texture#customData
  22880. * @type {object}
  22881. * @since 3.0.0
  22882. */
  22883. this.customData = {};
  22884. /**
  22885. * The name of the first frame of the Texture.
  22886. *
  22887. * @name Phaser.Textures.Texture#firstFrame
  22888. * @type {string}
  22889. * @since 3.0.0
  22890. */
  22891. this.firstFrame = '__BASE';
  22892. /**
  22893. * The total number of Frames in this Texture.
  22894. *
  22895. * @name Phaser.Textures.Texture#frameTotal
  22896. * @type {integer}
  22897. * @default 0
  22898. * @since 3.0.0
  22899. */
  22900. this.frameTotal = 0;
  22901. // Load the Sources
  22902. for (var i = 0; i < source.length; i++)
  22903. {
  22904. this.source.push(new TextureSource(this, source[i], width, height));
  22905. }
  22906. },
  22907. /**
  22908. * Adds a new Frame to this Texture.
  22909. *
  22910. * A Frame is a rectangular region of a TextureSource with a unique index or string-based key.
  22911. *
  22912. * @method Phaser.Textures.Texture#add
  22913. * @since 3.0.0
  22914. *
  22915. * @param {(integer|string)} name - The name of this Frame. The name is unique within the Texture.
  22916. * @param {integer} sourceIndex - The index of the TextureSource that this Frame is a part of.
  22917. * @param {number} x - The x coordinate of the top-left of this Frame.
  22918. * @param {number} y - The y coordinate of the top-left of this Frame.
  22919. * @param {number} width - The width of this Frame.
  22920. * @param {number} height - The height of this Frame.
  22921. *
  22922. * @return {Phaser.Textures.Frame} The Frame that was added to this Texture.
  22923. */
  22924. add: function (name, sourceIndex, x, y, width, height)
  22925. {
  22926. var frame = new Frame(this, name, sourceIndex, x, y, width, height);
  22927. this.frames[name] = frame;
  22928. // Set the first frame of the Texture (other than __BASE)
  22929. // This is used to ensure we don't spam the display with entire
  22930. // atlases of sprite sheets, but instead just the first frame of them
  22931. // should the dev incorrectly specify the frame index
  22932. if (this.frameTotal === 1)
  22933. {
  22934. this.firstFrame = name;
  22935. }
  22936. this.frameTotal++;
  22937. return frame;
  22938. },
  22939. /**
  22940. * Checks to see if a Frame matching the given key exists within this Texture.
  22941. *
  22942. * @method Phaser.Textures.Texture#has
  22943. * @since 3.0.0
  22944. *
  22945. * @param {string} name - The key of the Frame to check for.
  22946. *
  22947. * @return {boolean} True if a Frame with the matching key exists in this Texture.
  22948. */
  22949. has: function (name)
  22950. {
  22951. return (this.frames[name]);
  22952. },
  22953. /**
  22954. * Gets a Frame from this Texture based on either the key or the index of the Frame.
  22955. *
  22956. * In a Texture Atlas Frames are typically referenced by a key.
  22957. * In a Sprite Sheet Frames are referenced by an index.
  22958. * Passing no value for the name returns the base texture.
  22959. *
  22960. * @method Phaser.Textures.Texture#get
  22961. * @since 3.0.0
  22962. *
  22963. * @param {(string|integer)} [name] - The string-based name, or integer based index, of the Frame to get from this Texture.
  22964. *
  22965. * @return {Phaser.Textures.Frame} The Texture Frame.
  22966. */
  22967. get: function (name)
  22968. {
  22969. // null, undefined, empty string, zero
  22970. if (!name)
  22971. {
  22972. name = this.firstFrame;
  22973. }
  22974. var frame = this.frames[name];
  22975. if (!frame)
  22976. {
  22977. console.warn('No Texture.frame found with name ' + name);
  22978. frame = this.frames[this.firstFrame];
  22979. }
  22980. return frame;
  22981. },
  22982. /**
  22983. * Takes the given TextureSource and returns the index of it within this Texture.
  22984. * If it's not in this Texture, it returns -1.
  22985. * Unless this Texture has multiple TextureSources, such as with a multi-atlas, this
  22986. * method will always return zero or -1.
  22987. *
  22988. * @method Phaser.Textures.Texture#getTextureSourceIndex
  22989. * @since 3.0.0
  22990. *
  22991. * @param {Phaser.Textures.TextureSource} source - The TextureSource to check.
  22992. *
  22993. * @return {integer} The index of the TextureSource within this Texture, or -1 if not in this Texture.
  22994. */
  22995. getTextureSourceIndex: function (source)
  22996. {
  22997. for (var i = 0; i < this.source.length; i++)
  22998. {
  22999. if (this.source[i] === source)
  23000. {
  23001. return i;
  23002. }
  23003. }
  23004. return -1;
  23005. },
  23006. /**
  23007. * Returns an array of all the Frames in the given TextureSource.
  23008. *
  23009. * @method Phaser.Textures.Texture#getFramesFromTextureSource
  23010. * @since 3.0.0
  23011. *
  23012. * @param {integer} sourceIndex - The index of the TextureSource to get the Frames from.
  23013. *
  23014. * @return {Phaser.Textures.Frame[]} An array of Texture Frames.
  23015. */
  23016. getFramesFromTextureSource: function (sourceIndex)
  23017. {
  23018. var out = [];
  23019. for (var frameName in this.frames)
  23020. {
  23021. if (frameName === '__BASE')
  23022. {
  23023. continue;
  23024. }
  23025. var frame = this.frames[frameName];
  23026. if (frame.sourceIndex === sourceIndex)
  23027. {
  23028. out.push(frame.name);
  23029. }
  23030. }
  23031. return out;
  23032. },
  23033. /**
  23034. * Returns an array with all of the names of the Frames in this Texture.
  23035. *
  23036. * Useful if you want to randomly assign a Frame to a Game Object, as you can
  23037. * pick a random element from the returned array.
  23038. *
  23039. * @method Phaser.Textures.Texture#getFrameNames
  23040. * @since 3.0.0
  23041. *
  23042. * @param {boolean} [includeBase=false] - Include the `__BASE` Frame in the output array?
  23043. *
  23044. * @return {string[]} An array of all Frame names in this Texture.
  23045. */
  23046. getFrameNames: function (includeBase)
  23047. {
  23048. if (includeBase === undefined) { includeBase = false; }
  23049. var out = Object.keys(this.frames);
  23050. if (!includeBase)
  23051. {
  23052. var idx = out.indexOf('__BASE');
  23053. if (idx !== -1)
  23054. {
  23055. out.splice(idx, 1);
  23056. }
  23057. }
  23058. return out;
  23059. },
  23060. /**
  23061. * Given a Frame name, return the source image it uses to render with.
  23062. *
  23063. * This will return the actual DOM Image or Canvas element.
  23064. *
  23065. * @method Phaser.Textures.Texture#getSourceImage
  23066. * @since 3.0.0
  23067. *
  23068. * @param {(string|integer)} [name] - The string-based name, or integer based index, of the Frame to get from this Texture.
  23069. *
  23070. * @return {(HTMLImageElement|HTMLCanvasElement)} The DOM Image or Canvas Element.
  23071. */
  23072. getSourceImage: function (name)
  23073. {
  23074. if (name === undefined || name === null || this.frameTotal === 1)
  23075. {
  23076. name = '__BASE';
  23077. }
  23078. var frame = this.frames[name];
  23079. if (!frame)
  23080. {
  23081. console.warn('No Texture.frame found with name ' + name);
  23082. return this.frames['__BASE'].source.image;
  23083. }
  23084. else
  23085. {
  23086. return frame.source.image;
  23087. }
  23088. },
  23089. /**
  23090. * Given a Frame name, return the data source image it uses to render with.
  23091. * You can use this to get the normal map for an image for example.
  23092. *
  23093. * This will return the actual DOM Image.
  23094. *
  23095. * @method Phaser.Textures.Texture#getDataSourceImage
  23096. * @since 3.7.0
  23097. *
  23098. * @param {(string|integer)} [name] - The string-based name, or integer based index, of the Frame to get from this Texture.
  23099. *
  23100. * @return {(HTMLImageElement|HTMLCanvasElement)} The DOM Image or Canvas Element.
  23101. */
  23102. getDataSourceImage: function (name)
  23103. {
  23104. if (name === undefined || name === null || this.frameTotal === 1)
  23105. {
  23106. name = '__BASE';
  23107. }
  23108. var frame = this.frames[name];
  23109. var idx;
  23110. if (!frame)
  23111. {
  23112. console.warn('No Texture.frame found with name ' + name);
  23113. idx = this.frames['__BASE'].sourceIndex;
  23114. }
  23115. else
  23116. {
  23117. idx = frame.sourceIndex;
  23118. }
  23119. return this.dataSource[idx].image;
  23120. },
  23121. /**
  23122. * Adds a data source image to this Texture.
  23123. *
  23124. * An example of a data source image would be a normal map, where all of the Frames for this Texture
  23125. * equally apply to the normal map.
  23126. *
  23127. * @method Phaser.Textures.Texture#setDataSource
  23128. * @since 3.0.0
  23129. *
  23130. * @param {(HTMLImageElement|HTMLCanvasElement)} data - The source image.
  23131. */
  23132. setDataSource: function (data)
  23133. {
  23134. if (!Array.isArray(data))
  23135. {
  23136. data = [ data ];
  23137. }
  23138. for (var i = 0; i < data.length; i++)
  23139. {
  23140. var source = this.source[i];
  23141. this.dataSource.push(new TextureSource(this, data[i], source.width, source.height));
  23142. }
  23143. },
  23144. /**
  23145. * Sets the Filter Mode for this Texture.
  23146. *
  23147. * The mode can be either Linear, the default, or Nearest.
  23148. *
  23149. * For pixel-art you should use Nearest.
  23150. *
  23151. * The mode applies to the entire Texture, not just a specific Frame of it.
  23152. *
  23153. * @method Phaser.Textures.Texture#setFilter
  23154. * @since 3.0.0
  23155. *
  23156. * @param {Phaser.Textures.FilterMode} filterMode - The Filter Mode.
  23157. */
  23158. setFilter: function (filterMode)
  23159. {
  23160. var i;
  23161. for (i = 0; i < this.source.length; i++)
  23162. {
  23163. this.source[i].setFilter(filterMode);
  23164. }
  23165. for (i = 0; i < this.dataSource.length; i++)
  23166. {
  23167. this.dataSource[i].setFilter(filterMode);
  23168. }
  23169. },
  23170. /**
  23171. * Destroys this Texture and releases references to its sources and frames.
  23172. *
  23173. * @method Phaser.Textures.Texture#destroy
  23174. * @since 3.0.0
  23175. */
  23176. destroy: function ()
  23177. {
  23178. var i;
  23179. for (i = 0; i < this.source.length; i++)
  23180. {
  23181. this.source[i].destroy();
  23182. }
  23183. for (i = 0; i < this.dataSource.length; i++)
  23184. {
  23185. this.dataSource[i].destroy();
  23186. }
  23187. for (var frameName in this.frames)
  23188. {
  23189. var frame = this.frames[frameName];
  23190. frame.destroy();
  23191. }
  23192. this.source = [];
  23193. this.dataSource = [];
  23194. this.frames = {};
  23195. this.manager = null;
  23196. }
  23197. });
  23198. module.exports = Texture;
  23199. /***/ }),
  23200. /* 118 */
  23201. /***/ (function(module, exports, __webpack_require__) {
  23202. /**
  23203. * @author Richard Davey <rich@photonstorm.com>
  23204. * @copyright 2018 Photon Storm Ltd.
  23205. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  23206. */
  23207. var Class = __webpack_require__(0);
  23208. var CONST = __webpack_require__(79);
  23209. var DefaultPlugins = __webpack_require__(121);
  23210. var GetPhysicsPlugins = __webpack_require__(488);
  23211. var GetScenePlugins = __webpack_require__(487);
  23212. var NOOP = __webpack_require__(3);
  23213. var Settings = __webpack_require__(197);
  23214. /**
  23215. * @classdesc
  23216. * The Scene Systems class.
  23217. *
  23218. * This class is available from within a Scene under the property `sys`.
  23219. * It is responsible for managing all of the plugins a Scene has running, including the display list, and
  23220. * handling the update step and renderer. It also contains references to global systems belonging to Game.
  23221. *
  23222. * @class Systems
  23223. * @memberOf Phaser.Scenes
  23224. * @constructor
  23225. * @since 3.0.0
  23226. *
  23227. * @param {Phaser.Scene} scene - The Scene that owns this Systems instance.
  23228. * @param {(string|Phaser.Scenes.Settings.Config)} config - Scene specific configuration settings.
  23229. */
  23230. var Systems = new Class({
  23231. initialize:
  23232. function Systems (scene, config)
  23233. {
  23234. /**
  23235. * [description]
  23236. *
  23237. * @name Phaser.Scenes.Systems#scene
  23238. * @type {Phaser.Scene}
  23239. * @since 3.0.0
  23240. */
  23241. this.scene = scene;
  23242. /**
  23243. * [description]
  23244. *
  23245. * @name Phaser.Scenes.Systems#game
  23246. * @type {Phaser.Game}
  23247. * @since 3.0.0
  23248. */
  23249. this.game;
  23250. /**
  23251. * [description]
  23252. *
  23253. * @name Phaser.Scenes.Systems#config
  23254. * @type {(string|Phaser.Scenes.Settings.Config)}
  23255. * @since 3.0.0
  23256. */
  23257. this.config = config;
  23258. /**
  23259. * [description]
  23260. *
  23261. * @name Phaser.Scenes.Systems#settings
  23262. * @type {Phaser.Scenes.Settings.Object}
  23263. * @since 3.0.0
  23264. */
  23265. this.settings = Settings.create(config);
  23266. /**
  23267. * A handy reference to the Scene canvas / context.
  23268. *
  23269. * @name Phaser.Scenes.Systems#canvas
  23270. * @type {HTMLCanvasElement}
  23271. * @since 3.0.0
  23272. */
  23273. this.canvas;
  23274. /**
  23275. * [description]
  23276. *
  23277. * @name Phaser.Scenes.Systems#context
  23278. * @type {CanvasRenderingContext2D}
  23279. * @since 3.0.0
  23280. */
  23281. this.context;
  23282. // Global Systems - these are single-instance global managers that belong to Game
  23283. /**
  23284. * [description]
  23285. *
  23286. * @name Phaser.Scenes.Systems#anims
  23287. * @type {Phaser.Animations.AnimationManager}
  23288. * @since 3.0.0
  23289. */
  23290. this.anims;
  23291. /**
  23292. * [description]
  23293. *
  23294. * @name Phaser.Scenes.Systems#cache
  23295. * @type {Phaser.Cache.CacheManager}
  23296. * @since 3.0.0
  23297. */
  23298. this.cache;
  23299. /**
  23300. * [description]
  23301. *
  23302. * @name Phaser.Scenes.Systems#plugins
  23303. * @type {Phaser.Plugins.PluginManager}
  23304. * @since 3.0.0
  23305. */
  23306. this.plugins;
  23307. /**
  23308. * [description]
  23309. *
  23310. * @name Phaser.Scenes.Systems#registry
  23311. * @type {Phaser.Data.DataManager}
  23312. * @since 3.0.0
  23313. */
  23314. this.registry;
  23315. /**
  23316. * [description]
  23317. *
  23318. * @name Phaser.Scenes.Systems#sound
  23319. * @type {Phaser.Sound.BaseSoundManager}
  23320. * @since 3.0.0
  23321. */
  23322. this.sound;
  23323. /**
  23324. * [description]
  23325. *
  23326. * @name Phaser.Scenes.Systems#textures
  23327. * @type {Phaser.Textures.TextureManager}
  23328. * @since 3.0.0
  23329. */
  23330. this.textures;
  23331. // Core Plugins - these are non-optional Scene plugins, needed by lots of the other systems
  23332. /**
  23333. * [description]
  23334. *
  23335. * @name Phaser.Scenes.Systems#add
  23336. * @type {Phaser.GameObjects.GameObjectFactory}
  23337. * @since 3.0.0
  23338. */
  23339. this.add;
  23340. /**
  23341. * [description]
  23342. *
  23343. * @name Phaser.Scenes.Systems#cameras
  23344. * @type {Phaser.Cameras.Scene2D.CameraManager}
  23345. * @since 3.0.0
  23346. */
  23347. this.cameras;
  23348. /**
  23349. * [description]
  23350. *
  23351. * @name Phaser.Scenes.Systems#displayList
  23352. * @type {Phaser.GameObjects.DisplayList}
  23353. * @since 3.0.0
  23354. */
  23355. this.displayList;
  23356. /**
  23357. * [description]
  23358. *
  23359. * @name Phaser.Scenes.Systems#events
  23360. * @type {Phaser.Events.EventEmitter}
  23361. * @since 3.0.0
  23362. */
  23363. this.events;
  23364. /**
  23365. * [description]
  23366. *
  23367. * @name Phaser.Scenes.Systems#make
  23368. * @type {Phaser.GameObjects.GameObjectCreator}
  23369. * @since 3.0.0
  23370. */
  23371. this.make;
  23372. /**
  23373. * [description]
  23374. *
  23375. * @name Phaser.Scenes.Systems#scenePlugin
  23376. * @type {Phaser.Scenes.ScenePlugin}
  23377. * @since 3.0.0
  23378. */
  23379. this.scenePlugin;
  23380. /**
  23381. * [description]
  23382. *
  23383. * @name Phaser.Scenes.Systems#updateList
  23384. * @type {Phaser.GameObjects.UpdateList}
  23385. * @since 3.0.0
  23386. */
  23387. this.updateList;
  23388. /**
  23389. * The Scene Update function.
  23390. *
  23391. * This starts out as NOOP during init, preload and create, and at the end of create
  23392. * it swaps to be whatever the Scene.update function is.
  23393. *
  23394. * @name Phaser.Scenes.Systems#sceneUpdate
  23395. * @type {function}
  23396. * @private
  23397. * @since 3.10.0
  23398. */
  23399. this.sceneUpdate = NOOP;
  23400. },
  23401. /**
  23402. * This method is called only once by the Scene Manager when the Scene is instantiated.
  23403. * It is responsible for setting up all of the Scene plugins and references.
  23404. * It should never be called directly.
  23405. *
  23406. * @method Phaser.Scenes.Systems#init
  23407. * @protected
  23408. * @since 3.0.0
  23409. *
  23410. * @param {Phaser.Game} game - A reference to the Phaser Game instance.
  23411. */
  23412. init: function (game)
  23413. {
  23414. this.settings.status = CONST.INIT;
  23415. // This will get replaced by the SceneManager with the actual update function, if it exists, once create is over.
  23416. this.sceneUpdate = NOOP;
  23417. this.game = game;
  23418. this.canvas = game.canvas;
  23419. this.context = game.context;
  23420. var pluginManager = game.plugins;
  23421. this.plugins = pluginManager;
  23422. pluginManager.addToScene(this, DefaultPlugins.Global, [ DefaultPlugins.CoreScene, GetScenePlugins(this), GetPhysicsPlugins(this) ]);
  23423. this.events.emit('boot', this);
  23424. this.settings.isBooted = true;
  23425. },
  23426. /**
  23427. * Called by a plugin, it tells the System to install the plugin locally.
  23428. *
  23429. * @method Phaser.Scenes.Systems#install
  23430. * @private
  23431. * @since 3.0.0
  23432. *
  23433. * @param {array} plugin - An array of plugins to install into this Scene.
  23434. */
  23435. install: function (plugin)
  23436. {
  23437. if (!Array.isArray(plugin))
  23438. {
  23439. plugin = [ plugin ];
  23440. }
  23441. this.plugins.installLocal(this, plugin);
  23442. },
  23443. /**
  23444. * A single game step. Called automatically by the Scene Manager as a result of a Request Animation
  23445. * Frame or Set Timeout call to the main Game instance.
  23446. *
  23447. * @method Phaser.Scenes.Systems#step
  23448. * @since 3.0.0
  23449. *
  23450. * @param {number} time - The time value from the most recent Game step. Typically a high-resolution timer value, or Date.now().
  23451. * @param {number} delta - The delta value since the last frame. This is smoothed to avoid delta spikes by the TimeStep class.
  23452. */
  23453. step: function (time, delta)
  23454. {
  23455. this.events.emit('preupdate', time, delta);
  23456. this.events.emit('update', time, delta);
  23457. this.sceneUpdate.call(this.scene, time, delta);
  23458. this.events.emit('postupdate', time, delta);
  23459. },
  23460. /**
  23461. * Called automatically by the Scene Manager. Instructs the Scene to render itself via
  23462. * its Camera Manager to the renderer given.
  23463. *
  23464. * @method Phaser.Scenes.Systems#render
  23465. * @since 3.0.0
  23466. *
  23467. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - [description]
  23468. */
  23469. render: function (renderer)
  23470. {
  23471. var displayList = this.displayList;
  23472. displayList.depthSort();
  23473. this.cameras.render(renderer, displayList);
  23474. this.events.emit('render', renderer);
  23475. },
  23476. /**
  23477. * Force a sort of the display list on the next render.
  23478. *
  23479. * @method Phaser.Scenes.Systems#queueDepthSort
  23480. * @since 3.0.0
  23481. */
  23482. queueDepthSort: function ()
  23483. {
  23484. this.displayList.queueDepthSort();
  23485. },
  23486. /**
  23487. * Immediately sorts the display list if the flag is set.
  23488. *
  23489. * @method Phaser.Scenes.Systems#depthSort
  23490. * @since 3.0.0
  23491. */
  23492. depthSort: function ()
  23493. {
  23494. this.displayList.depthSort();
  23495. },
  23496. /**
  23497. * Pause this Scene.
  23498. * A paused Scene still renders, it just doesn't run ANY of its update handlers or systems.
  23499. *
  23500. * @method Phaser.Scenes.Systems#pause
  23501. * @since 3.0.0
  23502. *
  23503. * @param {object} [data] - A data object that will be passed in the 'pause' event.
  23504. *
  23505. * @return {Phaser.Scenes.Systems} This Systems object.
  23506. */
  23507. pause: function (data)
  23508. {
  23509. if (this.settings.active)
  23510. {
  23511. this.settings.status = CONST.PAUSED;
  23512. this.settings.active = false;
  23513. this.events.emit('pause', this, data);
  23514. }
  23515. return this;
  23516. },
  23517. /**
  23518. * Resume this Scene from a paused state.
  23519. *
  23520. * @method Phaser.Scenes.Systems#resume
  23521. * @since 3.0.0
  23522. *
  23523. * @param {object} [data] - A data object that will be passed in the 'resume' event.
  23524. *
  23525. * @return {Phaser.Scenes.Systems} This Systems object.
  23526. */
  23527. resume: function (data)
  23528. {
  23529. if (!this.settings.active)
  23530. {
  23531. this.settings.status = CONST.RUNNING;
  23532. this.settings.active = true;
  23533. this.events.emit('resume', this, data);
  23534. }
  23535. return this;
  23536. },
  23537. /**
  23538. * Send this Scene to sleep.
  23539. *
  23540. * A sleeping Scene doesn't run it's update step or render anything, but it also isn't shut down
  23541. * or have any of its systems or children removed, meaning it can be re-activated at any point and
  23542. * will carry on from where it left off. It also keeps everything in memory and events and callbacks
  23543. * from other Scenes may still invoke changes within it, so be careful what is left active.
  23544. *
  23545. * @method Phaser.Scenes.Systems#sleep
  23546. * @since 3.0.0
  23547. *
  23548. * @param {object} [data] - A data object that will be passed in the 'sleep' event.
  23549. *
  23550. * @return {Phaser.Scenes.Systems} This Systems object.
  23551. */
  23552. sleep: function (data)
  23553. {
  23554. this.settings.status = CONST.SLEEPING;
  23555. this.settings.active = false;
  23556. this.settings.visible = false;
  23557. this.events.emit('sleep', this, data);
  23558. return this;
  23559. },
  23560. /**
  23561. * Wake-up this Scene if it was previously asleep.
  23562. *
  23563. * @method Phaser.Scenes.Systems#wake
  23564. * @since 3.0.0
  23565. *
  23566. * @param {object} [data] - A data object that will be passed in the 'wake' event.
  23567. *
  23568. * @return {Phaser.Scenes.Systems} This Systems object.
  23569. */
  23570. wake: function (data)
  23571. {
  23572. var settings = this.settings;
  23573. settings.status = CONST.RUNNING;
  23574. settings.active = true;
  23575. settings.visible = true;
  23576. this.events.emit('wake', this, data);
  23577. if (settings.isTransition)
  23578. {
  23579. this.events.emit('transitionwake', settings.transitionFrom, settings.transitionDuration);
  23580. }
  23581. return this;
  23582. },
  23583. /**
  23584. * Is this Scene sleeping?
  23585. *
  23586. * @method Phaser.Scenes.Systems#isSleeping
  23587. * @since 3.0.0
  23588. *
  23589. * @return {boolean} [description]
  23590. */
  23591. isSleeping: function ()
  23592. {
  23593. return (this.settings.status === CONST.SLEEPING);
  23594. },
  23595. /**
  23596. * Is this Scene active?
  23597. *
  23598. * @method Phaser.Scenes.Systems#isActive
  23599. * @since 3.0.0
  23600. *
  23601. * @return {boolean} [description]
  23602. */
  23603. isActive: function ()
  23604. {
  23605. return (this.settings.status === CONST.RUNNING);
  23606. },
  23607. /**
  23608. * Is this Scene currently transitioning out to, or in from another Scene?
  23609. *
  23610. * @method Phaser.Scenes.Systems#isTransitioning
  23611. * @since 3.5.0
  23612. *
  23613. * @return {boolean} `true` if this Scene is currently transitioning, otherwise `false`.
  23614. */
  23615. isTransitioning: function ()
  23616. {
  23617. return (this.settings.isTransition || this.scenePlugin._target !== null);
  23618. },
  23619. /**
  23620. * Is this Scene currently transitioning out from itself to another Scene?
  23621. *
  23622. * @method Phaser.Scenes.Systems#isTransitionOut
  23623. * @since 3.5.0
  23624. *
  23625. * @return {boolean} `true` if this Scene is in transition to another Scene, otherwise `false`.
  23626. */
  23627. isTransitionOut: function ()
  23628. {
  23629. return (this.scenePlugin._target !== null && this.scenePlugin._duration > 0);
  23630. },
  23631. /**
  23632. * Is this Scene currently transitioning in from another Scene?
  23633. *
  23634. * @method Phaser.Scenes.Systems#isTransitionIn
  23635. * @since 3.5.0
  23636. *
  23637. * @return {boolean} `true` if this Scene is transitioning in from another Scene, otherwise `false`.
  23638. */
  23639. isTransitionIn: function ()
  23640. {
  23641. return (this.settings.isTransition);
  23642. },
  23643. /**
  23644. * Is this Scene visible and rendering?
  23645. *
  23646. * @method Phaser.Scenes.Systems#isVisible
  23647. * @since 3.0.0
  23648. *
  23649. * @return {boolean} [description]
  23650. */
  23651. isVisible: function ()
  23652. {
  23653. return this.settings.visible;
  23654. },
  23655. /**
  23656. * Sets the visible state of this Scene.
  23657. * An invisible Scene will not render, but will still process updates.
  23658. *
  23659. * @method Phaser.Scenes.Systems#setVisible
  23660. * @since 3.0.0
  23661. *
  23662. * @param {boolean} value - [description]
  23663. *
  23664. * @return {Phaser.Scenes.Systems} This Systems object.
  23665. */
  23666. setVisible: function (value)
  23667. {
  23668. this.settings.visible = value;
  23669. return this;
  23670. },
  23671. /**
  23672. * Set the active state of this Scene.
  23673. *
  23674. * An active Scene will run its core update loop.
  23675. *
  23676. * @method Phaser.Scenes.Systems#setActive
  23677. * @since 3.0.0
  23678. *
  23679. * @param {boolean} value - If `true` the Scene will be resumed, if previously paused. If `false` it will be paused.
  23680. * @param {object} [data] - A data object that will be passed in the 'resume' or 'pause' events.
  23681. *
  23682. * @return {Phaser.Scenes.Systems} This Systems object.
  23683. */
  23684. setActive: function (value, data)
  23685. {
  23686. if (value)
  23687. {
  23688. return this.resume(data);
  23689. }
  23690. else
  23691. {
  23692. return this.pause(data);
  23693. }
  23694. },
  23695. /**
  23696. * Start this Scene running and rendering.
  23697. * Called automatically by the SceneManager.
  23698. *
  23699. * @method Phaser.Scenes.Systems#start
  23700. * @since 3.0.0
  23701. *
  23702. * @param {object} data - Optional data object that may have been passed to this Scene from another.
  23703. */
  23704. start: function (data)
  23705. {
  23706. if (data)
  23707. {
  23708. this.settings.data = data;
  23709. }
  23710. this.settings.status = CONST.START;
  23711. this.settings.active = true;
  23712. this.settings.visible = true;
  23713. // For plugins to listen out for
  23714. this.events.emit('start', this);
  23715. // For user-land code to listen out for
  23716. this.events.emit('ready', this, data);
  23717. },
  23718. /**
  23719. * Called automatically by the SceneManager if the Game resizes.
  23720. * Dispatches an event you can respond to in your game code.
  23721. *
  23722. * @method Phaser.Scenes.Systems#resize
  23723. * @since 3.2.0
  23724. *
  23725. * @param {number} width - The new width of the game.
  23726. * @param {number} height - The new height of the game.
  23727. */
  23728. resize: function (width, height)
  23729. {
  23730. this.events.emit('resize', width, height);
  23731. },
  23732. /**
  23733. * Shutdown this Scene and send a shutdown event to all of its systems.
  23734. * A Scene that has been shutdown will not run its update loop or render, but it does
  23735. * not destroy any of its plugins or references. It is put into hibernation for later use.
  23736. * If you don't ever plan to use this Scene again, then it should be destroyed instead
  23737. * to free-up resources.
  23738. *
  23739. * @method Phaser.Scenes.Systems#shutdown
  23740. * @since 3.0.0
  23741. *
  23742. * @param {object} [data] - A data object that will be passed in the 'shutdown' event.
  23743. */
  23744. shutdown: function (data)
  23745. {
  23746. this.events.off('transitioninit');
  23747. this.events.off('transitionstart');
  23748. this.events.off('transitioncomplete');
  23749. this.events.off('transitionout');
  23750. this.settings.status = CONST.SHUTDOWN;
  23751. this.settings.active = false;
  23752. this.settings.visible = false;
  23753. this.events.emit('shutdown', this, data);
  23754. },
  23755. /**
  23756. * Destroy this Scene and send a destroy event all of its systems.
  23757. * A destroyed Scene cannot be restarted.
  23758. * You should not call this directly, instead use `SceneManager.remove`.
  23759. *
  23760. * @method Phaser.Scenes.Systems#destroy
  23761. * @private
  23762. * @since 3.0.0
  23763. */
  23764. destroy: function ()
  23765. {
  23766. this.settings.status = CONST.DESTROYED;
  23767. this.settings.active = false;
  23768. this.settings.visible = false;
  23769. this.events.emit('destroy', this);
  23770. this.events.removeAllListeners();
  23771. var props = [ 'scene', 'game', 'anims', 'cache', 'plugins', 'registry', 'sound', 'textures', 'add', 'camera', 'displayList', 'events', 'make', 'scenePlugin', 'updateList' ];
  23772. for (var i = 0; i < props.length; i++)
  23773. {
  23774. this[props[i]] = null;
  23775. }
  23776. }
  23777. });
  23778. module.exports = Systems;
  23779. /***/ }),
  23780. /* 119 */
  23781. /***/ (function(module, exports) {
  23782. /**
  23783. * @author Richard Davey <rich@photonstorm.com>
  23784. * @copyright 2018 Photon Storm Ltd.
  23785. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  23786. */
  23787. /**
  23788. * @namespace Phaser.GameObjects.Graphics.Commands
  23789. */
  23790. module.exports = {
  23791. ARC: 0,
  23792. BEGIN_PATH: 1,
  23793. CLOSE_PATH: 2,
  23794. FILL_RECT: 3,
  23795. LINE_TO: 4,
  23796. MOVE_TO: 5,
  23797. LINE_STYLE: 6,
  23798. FILL_STYLE: 7,
  23799. FILL_PATH: 8,
  23800. STROKE_PATH: 9,
  23801. FILL_TRIANGLE: 10,
  23802. STROKE_TRIANGLE: 11,
  23803. LINE_FX_TO: 12,
  23804. MOVE_FX_TO: 13,
  23805. SAVE: 14,
  23806. RESTORE: 15,
  23807. TRANSLATE: 16,
  23808. SCALE: 17,
  23809. ROTATE: 18
  23810. };
  23811. /***/ }),
  23812. /* 120 */
  23813. /***/ (function(module, exports, __webpack_require__) {
  23814. /**
  23815. * @author Richard Davey <rich@photonstorm.com>
  23816. * @copyright 2018 Photon Storm Ltd.
  23817. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  23818. */
  23819. var OS = __webpack_require__(57);
  23820. var Browser = __webpack_require__(80);
  23821. var CanvasPool = __webpack_require__(24);
  23822. /**
  23823. * Determines the features of the browser running this Phaser Game instance.
  23824. * These values are read-only and populated during the boot sequence of the game.
  23825. * They are then referenced by internal game systems and are available for you to access
  23826. * via `this.sys.game.device.features` from within any Scene.
  23827. *
  23828. * @typedef {object} Phaser.Device.Features
  23829. * @since 3.0.0
  23830. *
  23831. * @property {?boolean} canvasBitBltShift - True if canvas supports a 'copy' bitblt onto itself when the source and destination regions overlap.
  23832. * @property {boolean} canvas - Is canvas available?
  23833. * @property {boolean} file - Is file available?
  23834. * @property {boolean} fileSystem - Is fileSystem available?
  23835. * @property {boolean} getUserMedia - Does the device support the getUserMedia API?
  23836. * @property {boolean} littleEndian - Is the device big or little endian? (only detected if the browser supports TypedArrays)
  23837. * @property {boolean} localStorage - Is localStorage available?
  23838. * @property {boolean} pointerLock - Is Pointer Lock available?
  23839. * @property {boolean} support32bit - Does the device context support 32bit pixel manipulation using array buffer views?
  23840. * @property {boolean} vibration - Does the device support the Vibration API?
  23841. * @property {boolean} webGL - Is webGL available?
  23842. * @property {boolean} worker - Is worker available?
  23843. */
  23844. var Features = {
  23845. canvas: false,
  23846. canvasBitBltShift: null,
  23847. file: false,
  23848. fileSystem: false,
  23849. getUserMedia: true,
  23850. littleEndian: false,
  23851. localStorage: false,
  23852. pointerLock: false,
  23853. support32bit: false,
  23854. vibration: false,
  23855. webGL: false,
  23856. worker: false
  23857. };
  23858. // Check Little or Big Endian system.
  23859. // @author Matt DesLauriers (@mattdesl)
  23860. function checkIsLittleEndian ()
  23861. {
  23862. var a = new ArrayBuffer(4);
  23863. var b = new Uint8Array(a);
  23864. var c = new Uint32Array(a);
  23865. b[0] = 0xa1;
  23866. b[1] = 0xb2;
  23867. b[2] = 0xc3;
  23868. b[3] = 0xd4;
  23869. if (c[0] === 0xd4c3b2a1)
  23870. {
  23871. return true;
  23872. }
  23873. if (c[0] === 0xa1b2c3d4)
  23874. {
  23875. return false;
  23876. }
  23877. else
  23878. {
  23879. // Could not determine endianness
  23880. return null;
  23881. }
  23882. }
  23883. function init ()
  23884. {
  23885. Features.canvas = !!window['CanvasRenderingContext2D'] || OS.cocoonJS;
  23886. try
  23887. {
  23888. Features.localStorage = !!localStorage.getItem;
  23889. }
  23890. catch (error)
  23891. {
  23892. Features.localStorage = false;
  23893. }
  23894. Features.file = !!window['File'] && !!window['FileReader'] && !!window['FileList'] && !!window['Blob'];
  23895. Features.fileSystem = !!window['requestFileSystem'];
  23896. var isUint8 = false;
  23897. var testWebGL = function ()
  23898. {
  23899. if (window['WebGLRenderingContext'])
  23900. {
  23901. try
  23902. {
  23903. var canvas = CanvasPool.createWebGL(this);
  23904. if (OS.cocoonJS)
  23905. {
  23906. canvas.screencanvas = false;
  23907. }
  23908. var ctx = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
  23909. var canvas2D = CanvasPool.create2D(this);
  23910. var ctx2D = canvas2D.getContext('2d');
  23911. // Can't be done on a webgl context
  23912. var image = ctx2D.createImageData(1, 1);
  23913. // Test to see if ImageData uses CanvasPixelArray or Uint8ClampedArray.
  23914. // @author Matt DesLauriers (@mattdesl)
  23915. isUint8 = image.data instanceof Uint8ClampedArray;
  23916. CanvasPool.remove(canvas);
  23917. CanvasPool.remove(canvas2D);
  23918. return !!ctx;
  23919. }
  23920. catch (e)
  23921. {
  23922. return false;
  23923. }
  23924. }
  23925. return false;
  23926. };
  23927. Features.webGL = testWebGL();
  23928. Features.worker = !!window['Worker'];
  23929. Features.pointerLock = 'pointerLockElement' in document || 'mozPointerLockElement' in document || 'webkitPointerLockElement' in document;
  23930. navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia || navigator.oGetUserMedia;
  23931. window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
  23932. Features.getUserMedia = Features.getUserMedia && !!navigator.getUserMedia && !!window.URL;
  23933. // Older versions of firefox (< 21) apparently claim support but user media does not actually work
  23934. if (Browser.firefox && Browser.firefoxVersion < 21)
  23935. {
  23936. Features.getUserMedia = false;
  23937. }
  23938. // Excludes iOS versions as they generally wrap UIWebView (eg. Safari WebKit) and it
  23939. // is safer to not try and use the fast copy-over method.
  23940. if (!OS.iOS && (Browser.ie || Browser.firefox || Browser.chrome))
  23941. {
  23942. Features.canvasBitBltShift = true;
  23943. }
  23944. // Known not to work
  23945. if (Browser.safari || Browser.mobileSafari)
  23946. {
  23947. Features.canvasBitBltShift = false;
  23948. }
  23949. navigator.vibrate = navigator.vibrate || navigator.webkitVibrate || navigator.mozVibrate || navigator.msVibrate;
  23950. if (navigator.vibrate)
  23951. {
  23952. Features.vibration = true;
  23953. }
  23954. if (typeof ArrayBuffer !== 'undefined' && typeof Uint8Array !== 'undefined' && typeof Uint32Array !== 'undefined')
  23955. {
  23956. Features.littleEndian = checkIsLittleEndian();
  23957. }
  23958. Features.support32bit = (
  23959. typeof ArrayBuffer !== 'undefined' &&
  23960. typeof Uint8ClampedArray !== 'undefined' &&
  23961. typeof Int32Array !== 'undefined' &&
  23962. Features.littleEndian !== null &&
  23963. isUint8
  23964. );
  23965. return Features;
  23966. }
  23967. module.exports = init();
  23968. /***/ }),
  23969. /* 121 */
  23970. /***/ (function(module, exports) {
  23971. /**
  23972. * @author Richard Davey <rich@photonstorm.com>
  23973. * @copyright 2018 Photon Storm Ltd.
  23974. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  23975. */
  23976. /**
  23977. * @typedef {object} Phaser.Plugins.DefaultPlugins
  23978. *
  23979. * @property {array} Global - These are the Global Managers that are created by the Phaser.Game instance.
  23980. * @property {array} CoreScene - These are the core plugins that are installed into every Scene.Systems instance, no matter what.
  23981. * @property {array} DefaultScene - These plugins are created in Scene.Systems in addition to the CoreScenePlugins.
  23982. */
  23983. var DefaultPlugins = {
  23984. /**
  23985. * These are the Global Managers that are created by the Phaser.Game instance.
  23986. * They are referenced from Scene.Systems so that plugins can use them.
  23987. *
  23988. * @name Phaser.Plugins.Global
  23989. * @type {array}
  23990. * @since 3.0.0
  23991. */
  23992. Global: [
  23993. 'anims',
  23994. 'cache',
  23995. 'plugins',
  23996. 'registry',
  23997. 'sound',
  23998. 'textures'
  23999. ],
  24000. /**
  24001. * These are the core plugins that are installed into every Scene.Systems instance, no matter what.
  24002. * They are optionally exposed in the Scene as well (see the InjectionMap for details)
  24003. *
  24004. * They are created in the order in which they appear in this array and EventEmitter is always first.
  24005. *
  24006. * @name Phaser.Plugins.CoreScene
  24007. * @type {array}
  24008. * @since 3.0.0
  24009. */
  24010. CoreScene: [
  24011. 'EventEmitter',
  24012. 'CameraManager',
  24013. 'GameObjectCreator',
  24014. 'GameObjectFactory',
  24015. 'ScenePlugin',
  24016. 'DisplayList',
  24017. 'UpdateList'
  24018. ],
  24019. /**
  24020. * These plugins are created in Scene.Systems in addition to the CoreScenePlugins.
  24021. *
  24022. * You can elect not to have these plugins by either creating a DefaultPlugins object as part
  24023. * of the Game Config, by creating a Plugins object as part of a Scene Config, or by modifying this array
  24024. * and building your own bundle.
  24025. *
  24026. * They are optionally exposed in the Scene as well (see the InjectionMap for details)
  24027. *
  24028. * They are always created in the order in which they appear in the array.
  24029. *
  24030. * @name Phaser.Plugins.DefaultScene
  24031. * @type {array}
  24032. * @since 3.0.0
  24033. */
  24034. DefaultScene: [
  24035. 'CameraManager3D',
  24036. 'Clock',
  24037. 'DataManagerPlugin',
  24038. 'InputPlugin',
  24039. 'Loader',
  24040. 'TweenManager',
  24041. 'LightsPlugin'
  24042. ]
  24043. };
  24044. module.exports = DefaultPlugins;
  24045. /***/ }),
  24046. /* 122 */
  24047. /***/ (function(module, exports) {
  24048. /**
  24049. * @author Richard Davey <rich@photonstorm.com>
  24050. * @copyright 2018 Photon Storm Ltd.
  24051. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  24052. */
  24053. /**
  24054. * Calculates a linear (interpolation) value over t.
  24055. *
  24056. * @function Phaser.Math.Linear
  24057. * @since 3.0.0
  24058. *
  24059. * @param {number} p0 - The first point.
  24060. * @param {number} p1 - The second point.
  24061. * @param {number} t - The percentage between p0 and p1 to return, represented as a number between 0 and 1.
  24062. *
  24063. * @return {number} The step t% of the way between p0 and p1.
  24064. */
  24065. var Linear = function (p0, p1, t)
  24066. {
  24067. return (p1 - p0) * t + p0;
  24068. };
  24069. module.exports = Linear;
  24070. /***/ }),
  24071. /* 123 */
  24072. /***/ (function(module, exports, __webpack_require__) {
  24073. /**
  24074. * @author Richard Davey <rich@photonstorm.com>
  24075. * @copyright 2018 Photon Storm Ltd.
  24076. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  24077. */
  24078. var Back = __webpack_require__(291);
  24079. var Bounce = __webpack_require__(290);
  24080. var Circular = __webpack_require__(289);
  24081. var Cubic = __webpack_require__(288);
  24082. var Elastic = __webpack_require__(287);
  24083. var Expo = __webpack_require__(286);
  24084. var Linear = __webpack_require__(285);
  24085. var Quadratic = __webpack_require__(284);
  24086. var Quartic = __webpack_require__(283);
  24087. var Quintic = __webpack_require__(282);
  24088. var Sine = __webpack_require__(281);
  24089. var Stepped = __webpack_require__(280);
  24090. // EaseMap
  24091. module.exports = {
  24092. Power0: Linear,
  24093. Power1: Quadratic.Out,
  24094. Power2: Cubic.Out,
  24095. Power3: Quartic.Out,
  24096. Power4: Quintic.Out,
  24097. Linear: Linear,
  24098. Quad: Quadratic.Out,
  24099. Cubic: Cubic.Out,
  24100. Quart: Quartic.Out,
  24101. Quint: Quintic.Out,
  24102. Sine: Sine.Out,
  24103. Expo: Expo.Out,
  24104. Circ: Circular.Out,
  24105. Elastic: Elastic.Out,
  24106. Back: Back.Out,
  24107. Bounce: Bounce.Out,
  24108. Stepped: Stepped,
  24109. 'Quad.easeIn': Quadratic.In,
  24110. 'Cubic.easeIn': Cubic.In,
  24111. 'Quart.easeIn': Quartic.In,
  24112. 'Quint.easeIn': Quintic.In,
  24113. 'Sine.easeIn': Sine.In,
  24114. 'Expo.easeIn': Expo.In,
  24115. 'Circ.easeIn': Circular.In,
  24116. 'Elastic.easeIn': Elastic.In,
  24117. 'Back.easeIn': Back.In,
  24118. 'Bounce.easeIn': Bounce.In,
  24119. 'Quad.easeOut': Quadratic.Out,
  24120. 'Cubic.easeOut': Cubic.Out,
  24121. 'Quart.easeOut': Quartic.Out,
  24122. 'Quint.easeOut': Quintic.Out,
  24123. 'Sine.easeOut': Sine.Out,
  24124. 'Expo.easeOut': Expo.Out,
  24125. 'Circ.easeOut': Circular.Out,
  24126. 'Elastic.easeOut': Elastic.Out,
  24127. 'Back.easeOut': Back.Out,
  24128. 'Bounce.easeOut': Bounce.Out,
  24129. 'Quad.easeInOut': Quadratic.InOut,
  24130. 'Cubic.easeInOut': Cubic.InOut,
  24131. 'Quart.easeInOut': Quartic.InOut,
  24132. 'Quint.easeInOut': Quintic.InOut,
  24133. 'Sine.easeInOut': Sine.InOut,
  24134. 'Expo.easeInOut': Expo.InOut,
  24135. 'Circ.easeInOut': Circular.InOut,
  24136. 'Elastic.easeInOut': Elastic.InOut,
  24137. 'Back.easeInOut': Back.InOut,
  24138. 'Bounce.easeInOut': Bounce.InOut
  24139. };
  24140. /***/ }),
  24141. /* 124 */
  24142. /***/ (function(module, exports, __webpack_require__) {
  24143. /**
  24144. * @author Richard Davey <rich@photonstorm.com>
  24145. * @copyright 2018 Photon Storm Ltd.
  24146. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  24147. */
  24148. var CenterOn = __webpack_require__(156);
  24149. var Clamp = __webpack_require__(19);
  24150. var Class = __webpack_require__(0);
  24151. var DegToRad = __webpack_require__(39);
  24152. var Effects = __webpack_require__(209);
  24153. var EventEmitter = __webpack_require__(9);
  24154. var Linear = __webpack_require__(122);
  24155. var Rectangle = __webpack_require__(13);
  24156. var TransformMatrix = __webpack_require__(32);
  24157. var ValueToColor = __webpack_require__(133);
  24158. var Vector2 = __webpack_require__(6);
  24159. /**
  24160. * @typedef {object} JSONCameraBounds
  24161. * @property {number} x - The horizontal position of camera
  24162. * @property {number} y - The vertical position of camera
  24163. * @property {number} width - The width size of camera
  24164. * @property {number} height - The height size of camera
  24165. */
  24166. /**
  24167. * @typedef {object} JSONCamera
  24168. *
  24169. * @property {string} name - The name of the camera
  24170. * @property {number} x - The horizontal position of camera
  24171. * @property {number} y - The vertical position of camera
  24172. * @property {number} width - The width size of camera
  24173. * @property {number} height - The height size of camera
  24174. * @property {number} zoom - The zoom of camera
  24175. * @property {number} rotation - The rotation of camera
  24176. * @property {boolean} roundPixels - The round pixels st status of camera
  24177. * @property {number} scrollX - The horizontal scroll of camera
  24178. * @property {number} scrollY - The vertical scroll of camera
  24179. * @property {string} backgroundColor - The background color of camera
  24180. * @property {(JSONCameraBounds|undefined)} [bounds] - The bounds of camera
  24181. */
  24182. /**
  24183. * @classdesc
  24184. * A Camera.
  24185. *
  24186. * The Camera is the way in which all games are rendered in Phaser. They provide a view into your game world,
  24187. * and can be positioned, rotated, zoomed and scrolled accordingly.
  24188. *
  24189. * A Camera consists of two elements: The viewport and the scroll values.
  24190. *
  24191. * The viewport is the physical position and size of the Camera within your game. Cameras, by default, are
  24192. * created the same size as your game, but their position and size can be set to anything. This means if you
  24193. * wanted to create a camera that was 320x200 in size, positioned in the bottom-right corner of your game,
  24194. * you'd adjust the viewport to do that (using methods like `setViewport` and `setSize`).
  24195. *
  24196. * If you wish to change where the Camera is looking in your game, then you scroll it. You can do this
  24197. * via the properties `scrollX` and `scrollY` or the method `setScroll`. Scrolling has no impact on the
  24198. * viewport, and changing the viewport has no impact on the scrolling.
  24199. *
  24200. * By default a Camera will render all Game Objects it can see. You can change this using the `ignore` method,
  24201. * allowing you to filter Game Objects out on a per-Camera basis.
  24202. *
  24203. * A Camera also has built-in special effects including Fade, Flash and Camera Shake.
  24204. *
  24205. * @class Camera
  24206. * @extends Phaser.Events.EventEmitter
  24207. * @memberOf Phaser.Cameras.Scene2D
  24208. * @constructor
  24209. * @since 3.0.0
  24210. *
  24211. * @param {number} x - The x position of the Camera, relative to the top-left of the game canvas.
  24212. * @param {number} y - The y position of the Camera, relative to the top-left of the game canvas.
  24213. * @param {number} width - The width of the Camera, in pixels.
  24214. * @param {number} height - The height of the Camera, in pixels.
  24215. */
  24216. var Camera = new Class({
  24217. Extends: EventEmitter,
  24218. initialize:
  24219. function Camera (x, y, width, height)
  24220. {
  24221. EventEmitter.call(this);
  24222. /**
  24223. * A reference to the Scene this camera belongs to.
  24224. *
  24225. * @name Phaser.Cameras.Scene2D.Camera#scene
  24226. * @type {Phaser.Scene}
  24227. * @since 3.0.0
  24228. */
  24229. this.scene;
  24230. /**
  24231. * The Camera ID. Assigned by the Camera Manager and used to handle camera exclusion.
  24232. * This value is a bitmask.
  24233. *
  24234. * @name Phaser.Cameras.Scene2D.Camera#id
  24235. * @type {integer}
  24236. * @readOnly
  24237. * @since 3.11.0
  24238. */
  24239. this.id = 0;
  24240. /**
  24241. * The name of the Camera. This is left empty for your own use.
  24242. *
  24243. * @name Phaser.Cameras.Scene2D.Camera#name
  24244. * @type {string}
  24245. * @default ''
  24246. * @since 3.0.0
  24247. */
  24248. this.name = '';
  24249. /**
  24250. * The x position of the Camera viewport, relative to the top-left of the game canvas.
  24251. * The viewport is the area into which the camera renders.
  24252. * To adjust the position the camera is looking at in the game world, see the `scrollX` value.
  24253. *
  24254. * @name Phaser.Cameras.Scene2D.Camera#x
  24255. * @type {number}
  24256. * @since 3.0.0
  24257. */
  24258. this.x = x;
  24259. /**
  24260. * The y position of the Camera, relative to the top-left of the game canvas.
  24261. * The viewport is the area into which the camera renders.
  24262. * To adjust the position the camera is looking at in the game world, see the `scrollY` value.
  24263. *
  24264. * @name Phaser.Cameras.Scene2D.Camera#y
  24265. * @type {number}
  24266. * @since 3.0.0
  24267. */
  24268. this.y = y;
  24269. /**
  24270. * The width of the Camera viewport, in pixels.
  24271. *
  24272. * The viewport is the area into which the Camera renders. Setting the viewport does
  24273. * not restrict where the Camera can scroll to.
  24274. *
  24275. * @name Phaser.Cameras.Scene2D.Camera#_width
  24276. * @type {number}
  24277. * @private
  24278. * @since 3.11.0
  24279. */
  24280. this._width = width;
  24281. /**
  24282. * The height of the Camera viewport, in pixels.
  24283. *
  24284. * The viewport is the area into which the Camera renders. Setting the viewport does
  24285. * not restrict where the Camera can scroll to.
  24286. *
  24287. * @name Phaser.Cameras.Scene2D.Camera#_height
  24288. * @type {number}
  24289. * @private
  24290. * @since 3.11.0
  24291. */
  24292. this._height = height;
  24293. /**
  24294. * Should this camera round its pixel values to integers?
  24295. *
  24296. * @name Phaser.Cameras.Scene2D.Camera#roundPixels
  24297. * @type {boolean}
  24298. * @default false
  24299. * @since 3.0.0
  24300. */
  24301. this.roundPixels = false;
  24302. /**
  24303. * Is this Camera visible or not?
  24304. *
  24305. * A visible camera will render and perform input tests.
  24306. * An invisible camera will not render anything and will skip input tests.
  24307. *
  24308. * @name Phaser.Cameras.Scene2D.Camera#visible
  24309. * @type {boolean}
  24310. * @default true
  24311. * @since 3.10.0
  24312. */
  24313. this.visible = true;
  24314. /**
  24315. * Is this Camera using a bounds to restrict scrolling movement?
  24316. *
  24317. * Set this property along with the bounds via `Camera.setBounds`.
  24318. *
  24319. * @name Phaser.Cameras.Scene2D.Camera#useBounds
  24320. * @type {boolean}
  24321. * @default false
  24322. * @since 3.0.0
  24323. */
  24324. this.useBounds = false;
  24325. /**
  24326. * The bounds the camera is restrained to during scrolling.
  24327. *
  24328. * @name Phaser.Cameras.Scene2D.Camera#_bounds
  24329. * @type {Phaser.Geom.Rectangle}
  24330. * @private
  24331. * @since 3.0.0
  24332. */
  24333. this._bounds = new Rectangle();
  24334. /**
  24335. * The World View is a Rectangle that defines the area of the 'world' the Camera is currently looking at.
  24336. * This factors in the Camera viewport size, zoom and scroll position and is updated in the Camera preRender step.
  24337. * If you have enabled Camera bounds the worldview will be clamped to those bounds accordingly.
  24338. * You can use it for culling or intersection checks.
  24339. *
  24340. * @name Phaser.Cameras.Scene2D.Camera#worldView
  24341. * @type {Phaser.Geom.Rectangle}
  24342. * @readOnly
  24343. * @since 3.11.0
  24344. */
  24345. this.worldView = new Rectangle();
  24346. /**
  24347. * Is this Camera dirty?
  24348. *
  24349. * A dirty Camera has had either its viewport size, bounds, scroll, rotation or zoom levels changed since the last frame.
  24350. *
  24351. * This flag is cleared during the `postRenderCamera` method of the renderer.
  24352. *
  24353. * @name Phaser.Cameras.Scene2D.Camera#dirty
  24354. * @type {boolean}
  24355. * @default true
  24356. * @since 3.11.0
  24357. */
  24358. this.dirty = true;
  24359. /**
  24360. * Does this Camera allow the Game Objects it renders to receive input events?
  24361. *
  24362. * @name Phaser.Cameras.Scene2D.Camera#inputEnabled
  24363. * @type {boolean}
  24364. * @default true
  24365. * @since 3.0.0
  24366. */
  24367. this.inputEnabled = true;
  24368. /**
  24369. * The horizontal scroll position of this Camera.
  24370. *
  24371. * Change this value to cause the Camera to scroll around your Scene.
  24372. *
  24373. * Alternatively, setting the Camera to follow a Game Object, via the `startFollow` method,
  24374. * will automatically adjust the Camera scroll values accordingly.
  24375. *
  24376. * You can set the bounds within which the Camera can scroll via the `setBounds` method.
  24377. *
  24378. * @name Phaser.Cameras.Scene2D.Camera#_scrollX
  24379. * @type {number}
  24380. * @private
  24381. * @default 0
  24382. * @since 3.11.0
  24383. */
  24384. this._scrollX = 0;
  24385. /**
  24386. * The vertical scroll position of this Camera.
  24387. *
  24388. * Change this value to cause the Camera to scroll around your Scene.
  24389. *
  24390. * Alternatively, setting the Camera to follow a Game Object, via the `startFollow` method,
  24391. * will automatically adjust the Camera scroll values accordingly.
  24392. *
  24393. * You can set the bounds within which the Camera can scroll via the `setBounds` method.
  24394. *
  24395. * @name Phaser.Cameras.Scene2D.Camera#_scrollY
  24396. * @type {number}
  24397. * @private
  24398. * @default 0
  24399. * @since 3.11.0
  24400. */
  24401. this._scrollY = 0;
  24402. /**
  24403. * The Camera zoom value. Change this value to zoom in, or out of, a Scene.
  24404. *
  24405. * A value of 0.5 would zoom the Camera out, so you can now see twice as much
  24406. * of the Scene as before. A value of 2 would zoom the Camera in, so every pixel
  24407. * now takes up 2 pixels when rendered.
  24408. *
  24409. * Set to 1 to return to the default zoom level.
  24410. *
  24411. * Be careful to never set this value to zero.
  24412. *
  24413. * @name Phaser.Cameras.Scene2D.Camera#_zoom
  24414. * @type {number}
  24415. * @private
  24416. * @default 1
  24417. * @since 3.11.0
  24418. */
  24419. this._zoom = 1;
  24420. /**
  24421. * The rotation of the Camera in radians.
  24422. *
  24423. * Camera rotation always takes place based on the Camera viewport. By default, rotation happens
  24424. * in the center of the viewport. You can adjust this with the `originX` and `originY` properties.
  24425. *
  24426. * Rotation influences the rendering of _all_ Game Objects visible by this Camera. However, it does not
  24427. * rotate the Camera viewport itself, which always remains an axis-aligned rectangle.
  24428. *
  24429. * @name Phaser.Cameras.Scene2D.Camera#_rotation
  24430. * @type {number}
  24431. * @private
  24432. * @default 0
  24433. * @since 3.11.0
  24434. */
  24435. this._rotation = 0;
  24436. /**
  24437. * A local transform matrix used for internal calculations.
  24438. *
  24439. * @name Phaser.Cameras.Scene2D.Camera#matrix
  24440. * @type {Phaser.GameObjects.Components.TransformMatrix}
  24441. * @private
  24442. * @since 3.0.0
  24443. */
  24444. this.matrix = new TransformMatrix();
  24445. /**
  24446. * Does this Camera have a transparent background?
  24447. *
  24448. * @name Phaser.Cameras.Scene2D.Camera#transparent
  24449. * @type {boolean}
  24450. * @default true
  24451. * @since 3.0.0
  24452. */
  24453. this.transparent = true;
  24454. /**
  24455. * The background color of this Camera. Only used if `transparent` is `false`.
  24456. *
  24457. * @name Phaser.Cameras.Scene2D.Camera#backgroundColor
  24458. * @type {Phaser.Display.Color}
  24459. * @since 3.0.0
  24460. */
  24461. this.backgroundColor = ValueToColor('rgba(0,0,0,0)');
  24462. /**
  24463. * The Camera alpha value. Setting this property impacts every single object that this Camera
  24464. * renders. You can either set the property directly, i.e. via a Tween, to fade a Camera in or out,
  24465. * or via the chainable `setAlpha` method instead.
  24466. *
  24467. * @name Phaser.Cameras.Scene2D.Camera#alpha
  24468. * @type {number}
  24469. * @default 1
  24470. * @since 3.11.0
  24471. */
  24472. this.alpha = 1;
  24473. /**
  24474. * The Camera Fade effect handler.
  24475. * To fade this camera see the `Camera.fade` methods.
  24476. *
  24477. * @name Phaser.Cameras.Scene2D.Camera#fadeEffect
  24478. * @type {Phaser.Cameras.Scene2D.Effects.Fade}
  24479. * @since 3.5.0
  24480. */
  24481. this.fadeEffect = new Effects.Fade(this);
  24482. /**
  24483. * The Camera Flash effect handler.
  24484. * To flash this camera see the `Camera.flash` method.
  24485. *
  24486. * @name Phaser.Cameras.Scene2D.Camera#flashEffect
  24487. * @type {Phaser.Cameras.Scene2D.Effects.Flash}
  24488. * @since 3.5.0
  24489. */
  24490. this.flashEffect = new Effects.Flash(this);
  24491. /**
  24492. * The Camera Shake effect handler.
  24493. * To shake this camera see the `Camera.shake` method.
  24494. *
  24495. * @name Phaser.Cameras.Scene2D.Camera#shakeEffect
  24496. * @type {Phaser.Cameras.Scene2D.Effects.Shake}
  24497. * @since 3.5.0
  24498. */
  24499. this.shakeEffect = new Effects.Shake(this);
  24500. /**
  24501. * The Camera Pan effect handler.
  24502. * To pan this camera see the `Camera.pan` method.
  24503. *
  24504. * @name Phaser.Cameras.Scene2D.Camera#panEffect
  24505. * @type {Phaser.Cameras.Scene2D.Effects.Pan}
  24506. * @since 3.11.0
  24507. */
  24508. this.panEffect = new Effects.Pan(this);
  24509. /**
  24510. * The Camera Zoom effect handler.
  24511. * To zoom this camera see the `Camera.zoom` method.
  24512. *
  24513. * @name Phaser.Cameras.Scene2D.Camera#zoomEffect
  24514. * @type {Phaser.Cameras.Scene2D.Effects.Zoom}
  24515. * @since 3.11.0
  24516. */
  24517. this.zoomEffect = new Effects.Zoom(this);
  24518. /**
  24519. * Should the camera cull Game Objects before checking them for input hit tests?
  24520. * In some special cases it may be beneficial to disable this.
  24521. *
  24522. * @name Phaser.Cameras.Scene2D.Camera#disableCull
  24523. * @type {boolean}
  24524. * @default false
  24525. * @since 3.0.0
  24526. */
  24527. this.disableCull = false;
  24528. /**
  24529. * A temporary array of culled objects.
  24530. *
  24531. * @name Phaser.Cameras.Scene2D.Camera#culledObjects
  24532. * @type {Phaser.GameObjects.GameObject[]}
  24533. * @default []
  24534. * @private
  24535. * @since 3.0.0
  24536. */
  24537. this.culledObjects = [];
  24538. /**
  24539. * The linear interpolation value to use when following a target.
  24540. *
  24541. * Can also be set via `setLerp` or as part of the `startFollow` call.
  24542. *
  24543. * The default values of 1 means the camera will instantly snap to the target coordinates.
  24544. * A lower value, such as 0.1 means the camera will more slowly track the target, giving
  24545. * a smooth transition. You can set the horizontal and vertical values independently, and also
  24546. * adjust this value in real-time during your game.
  24547. *
  24548. * Be sure to keep the value between 0 and 1. A value of zero will disable tracking on that axis.
  24549. *
  24550. * @name Phaser.Cameras.Scene2D.Camera#lerp
  24551. * @type {Phaser.Math.Vector2}
  24552. * @since 3.9.0
  24553. */
  24554. this.lerp = new Vector2(1, 1);
  24555. /**
  24556. * The values stored in this property are subtracted from the Camera targets position, allowing you to
  24557. * offset the camera from the actual target x/y coordinates by this amount.
  24558. * Can also be set via `setFollowOffset` or as part of the `startFollow` call.
  24559. *
  24560. * @name Phaser.Cameras.Scene2D.Camera#followOffset
  24561. * @type {Phaser.Math.Vector2}
  24562. * @since 3.9.0
  24563. */
  24564. this.followOffset = new Vector2();
  24565. /**
  24566. * The mid-point of the Camera in 'world' coordinates.
  24567. *
  24568. * Use it to obtain exactly where in the world the center of the camera is currently looking.
  24569. *
  24570. * This value is updated in the preRender method, after the scroll values and follower
  24571. * have been processed.
  24572. *
  24573. * @name Phaser.Cameras.Scene2D.Camera#midPoint
  24574. * @type {Phaser.Math.Vector2}
  24575. * @readOnly
  24576. * @since 3.11.0
  24577. */
  24578. this.midPoint = new Vector2(width / 2, height / 2);
  24579. /**
  24580. * The horizontal origin of rotation for this Camera.
  24581. *
  24582. * By default the camera rotates around the center of the viewport.
  24583. *
  24584. * Changing the origin allows you to adjust the point in the viewport from which rotation happens.
  24585. * A value of 0 would rotate from the top-left of the viewport. A value of 1 from the bottom right.
  24586. *
  24587. * See `setOrigin` to set both origins in a single, chainable call.
  24588. *
  24589. * @name Phaser.Cameras.Scene2D.Camera#originX
  24590. * @type {number}
  24591. * @default 0.5
  24592. * @since 3.11.0
  24593. */
  24594. this.originX = 0.5;
  24595. /**
  24596. * The vertical origin of rotation for this Camera.
  24597. *
  24598. * By default the camera rotates around the center of the viewport.
  24599. *
  24600. * Changing the origin allows you to adjust the point in the viewport from which rotation happens.
  24601. * A value of 0 would rotate from the top-left of the viewport. A value of 1 from the bottom right.
  24602. *
  24603. * See `setOrigin` to set both origins in a single, chainable call.
  24604. *
  24605. * @name Phaser.Cameras.Scene2D.Camera#originY
  24606. * @type {number}
  24607. * @default 0.5
  24608. * @since 3.11.0
  24609. */
  24610. this.originY = 0.5;
  24611. /**
  24612. * The Camera dead zone.
  24613. *
  24614. * The deadzone is only used when the camera is following a target.
  24615. *
  24616. * It defines a rectangular region within which if the target is present, the camera will not scroll.
  24617. * If the target moves outside of this area, the camera will begin scrolling in order to follow it.
  24618. *
  24619. * The `lerp` values that you can set for a follower target also apply when using a deadzone.
  24620. *
  24621. * You can directly set this property to be an instance of a Rectangle. Or, you can use the
  24622. * `setDeadzone` method for a chainable approach.
  24623. *
  24624. * The rectangle you provide can have its dimensions adjusted dynamically, however, please
  24625. * note that its position is updated every frame, as it is constantly re-centered on the cameras mid point.
  24626. *
  24627. * Calling `setDeadzone` with no arguments will reset an active deadzone, as will setting this property
  24628. * to `null`.
  24629. *
  24630. * @name Phaser.Cameras.Scene2D.Camera#deadzone
  24631. * @type {?Phaser.Geom.Rectangle}
  24632. * @since 3.11.0
  24633. */
  24634. this.deadzone = null;
  24635. /**
  24636. * Internal follow target reference.
  24637. *
  24638. * @name Phaser.Cameras.Scene2D.Camera#_follow
  24639. * @type {?any}
  24640. * @private
  24641. * @default null
  24642. * @since 3.0.0
  24643. */
  24644. this._follow = null;
  24645. },
  24646. /**
  24647. * Set the Alpha level of this Camera. The alpha controls the opacity of the Camera as it renders.
  24648. * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque.
  24649. *
  24650. * @method Phaser.GameObjects.Components.Origin#setAlpha
  24651. * @since 3.11.0
  24652. *
  24653. * @param {number} [value=1] - The Camera alpha value.
  24654. *
  24655. * @return {this} This Camera instance.
  24656. */
  24657. setAlpha: function (value)
  24658. {
  24659. if (value === undefined) { value = 1; }
  24660. this.alpha = value;
  24661. return this;
  24662. },
  24663. /**
  24664. * Sets the rotation origin of this Camera.
  24665. *
  24666. * The values are given in the range 0 to 1 and are only used when calculating Camera rotation.
  24667. *
  24668. * By default the camera rotates around the center of the viewport.
  24669. *
  24670. * Changing the origin allows you to adjust the point in the viewport from which rotation happens.
  24671. * A value of 0 would rotate from the top-left of the viewport. A value of 1 from the bottom right.
  24672. *
  24673. * @method Phaser.GameObjects.Components.Origin#setOrigin
  24674. * @since 3.11.0
  24675. *
  24676. * @param {number} [x=0.5] - The horizontal origin value.
  24677. * @param {number} [y=x] - The vertical origin value. If not defined it will be set to the value of `x`.
  24678. *
  24679. * @return {this} This Camera instance.
  24680. */
  24681. setOrigin: function (x, y)
  24682. {
  24683. if (x === undefined) { x = 0.5; }
  24684. if (y === undefined) { y = x; }
  24685. this.originX = x;
  24686. this.originY = y;
  24687. return this;
  24688. },
  24689. /**
  24690. * Sets the Camera dead zone.
  24691. *
  24692. * The deadzone is only used when the camera is following a target.
  24693. *
  24694. * It defines a rectangular region within which if the target is present, the camera will not scroll.
  24695. * If the target moves outside of this area, the camera will begin scrolling in order to follow it.
  24696. *
  24697. * The deadzone rectangle is re-positioned every frame so that it is centered on the mid-point
  24698. * of the camera. This allows you to use the object for additional game related checks, such as
  24699. * testing if an object is within it or not via a Rectangle.contains call.
  24700. *
  24701. * The `lerp` values that you can set for a follower target also apply when using a deadzone.
  24702. *
  24703. * Calling this method with no arguments will reset an active deadzone.
  24704. *
  24705. * @method Phaser.Cameras.Scene2D.Camera#setDeadzone
  24706. * @since 3.11.0
  24707. *
  24708. * @param {number} [width] - The width of the deadzone rectangle in pixels. If not specified the deadzone is removed.
  24709. * @param {number} [height] - The height of the deadzone rectangle in pixels.
  24710. *
  24711. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  24712. */
  24713. setDeadzone: function (width, height)
  24714. {
  24715. if (width === undefined)
  24716. {
  24717. this.deadzone = null;
  24718. }
  24719. else
  24720. {
  24721. if (this.deadzone)
  24722. {
  24723. this.deadzone.width = width;
  24724. this.deadzone.height = height;
  24725. }
  24726. else
  24727. {
  24728. this.deadzone = new Rectangle(0, 0, width, height);
  24729. }
  24730. if (this._follow)
  24731. {
  24732. var originX = this.width / 2;
  24733. var originY = this.height / 2;
  24734. var fx = this._follow.x - this.followOffset.x;
  24735. var fy = this._follow.y - this.followOffset.y;
  24736. this.midPoint.set(fx, fy);
  24737. this.scrollX = fx - originX;
  24738. this.scrollY = fy - originY;
  24739. }
  24740. CenterOn(this.deadzone, this.midPoint.x, this.midPoint.y);
  24741. }
  24742. return this;
  24743. },
  24744. /**
  24745. * Calculates what the Camera.scrollX and scrollY values would need to be in order to move
  24746. * the Camera so it is centered on the given x and y coordinates, without actually moving
  24747. * the Camera there. The results are clamped based on the Camera bounds, if set.
  24748. *
  24749. * @method Phaser.Cameras.Scene2D.Camera#getScroll
  24750. * @since 3.11.0
  24751. *
  24752. * @param {number} x - The horizontal coordinate to center on.
  24753. * @param {number} y - The vertical coordinate to center on.
  24754. * @param {Phaser.Math.Vector2} [out] - A Vec2 to store the values in. If not given a new Vec2 is created.
  24755. *
  24756. * @return {Phaser.Math.Vector2} The scroll coordinates stored in the `x` abd `y` properties.
  24757. */
  24758. getScroll: function (x, y, out)
  24759. {
  24760. if (out === undefined) { out = new Vector2(); }
  24761. var originX = this.width * 0.5;
  24762. var originY = this.height * 0.5;
  24763. out.x = x - originX;
  24764. out.y = y - originY;
  24765. if (this.useBounds)
  24766. {
  24767. out.x = this.clampX(out.x);
  24768. out.y = this.clampY(out.y);
  24769. }
  24770. return out;
  24771. },
  24772. /**
  24773. * Moves the Camera so that it is centered on the given coordinates, bounds allowing.
  24774. *
  24775. * @method Phaser.Cameras.Scene2D.Camera#centerOn
  24776. * @since 3.11.0
  24777. *
  24778. * @param {number} x - The horizontal coordinate to center on.
  24779. * @param {number} y - The vertical coordinate to center on.
  24780. *
  24781. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  24782. */
  24783. centerOn: function (x, y)
  24784. {
  24785. var originX = this.width * 0.5;
  24786. var originY = this.height * 0.5;
  24787. this.midPoint.set(x, y);
  24788. this.scrollX = x - originX;
  24789. this.scrollY = y - originY;
  24790. if (this.useBounds)
  24791. {
  24792. this.scrollX = this.clampX(this.scrollX);
  24793. this.scrollY = this.clampY(this.scrollY);
  24794. }
  24795. return this;
  24796. },
  24797. /**
  24798. * Moves the Camera so that it is looking at the center of the Camera Bounds, if enabled.
  24799. *
  24800. * @method Phaser.Cameras.Scene2D.Camera#centerToBounds
  24801. * @since 3.0.0
  24802. *
  24803. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  24804. */
  24805. centerToBounds: function ()
  24806. {
  24807. if (this.useBounds)
  24808. {
  24809. var bounds = this._bounds;
  24810. var originX = this.width * 0.5;
  24811. var originY = this.height * 0.5;
  24812. this.midPoint.set(bounds.centerX, bounds.centerY);
  24813. this.scrollX = bounds.centerX - originX;
  24814. this.scrollY = bounds.centerY - originY;
  24815. }
  24816. return this;
  24817. },
  24818. /**
  24819. * Moves the Camera so that it is re-centered based on its viewport size.
  24820. *
  24821. * @method Phaser.Cameras.Scene2D.Camera#centerToSize
  24822. * @since 3.0.0
  24823. *
  24824. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  24825. */
  24826. centerToSize: function ()
  24827. {
  24828. this.scrollX = this.width * 0.5;
  24829. this.scrollY = this.height * 0.5;
  24830. return this;
  24831. },
  24832. /**
  24833. * Takes an array of Game Objects and returns a new array featuring only those objects
  24834. * visible by this camera.
  24835. *
  24836. * @method Phaser.Cameras.Scene2D.Camera#cull
  24837. * @since 3.0.0
  24838. *
  24839. * @generic {Phaser.GameObjects.GameObject[]} G - [renderableObjects,$return]
  24840. *
  24841. * @param {Phaser.GameObjects.GameObject[]} renderableObjects - An array of Game Objects to cull.
  24842. *
  24843. * @return {Phaser.GameObjects.GameObject[]} An array of Game Objects visible to this Camera.
  24844. */
  24845. cull: function (renderableObjects)
  24846. {
  24847. if (this.disableCull)
  24848. {
  24849. return renderableObjects;
  24850. }
  24851. var cameraMatrix = this.matrix.matrix;
  24852. var mva = cameraMatrix[0];
  24853. var mvb = cameraMatrix[1];
  24854. var mvc = cameraMatrix[2];
  24855. var mvd = cameraMatrix[3];
  24856. /* First Invert Matrix */
  24857. var determinant = (mva * mvd) - (mvb * mvc);
  24858. if (!determinant)
  24859. {
  24860. return renderableObjects;
  24861. }
  24862. var mve = cameraMatrix[4];
  24863. var mvf = cameraMatrix[5];
  24864. var scrollX = this.scrollX;
  24865. var scrollY = this.scrollY;
  24866. var cameraW = this.width;
  24867. var cameraH = this.height;
  24868. var culledObjects = this.culledObjects;
  24869. var length = renderableObjects.length;
  24870. determinant = 1 / determinant;
  24871. culledObjects.length = 0;
  24872. for (var index = 0; index < length; ++index)
  24873. {
  24874. var object = renderableObjects[index];
  24875. if (!object.hasOwnProperty('width') || object.parentContainer)
  24876. {
  24877. culledObjects.push(object);
  24878. continue;
  24879. }
  24880. var objectW = object.width;
  24881. var objectH = object.height;
  24882. var objectX = (object.x - (scrollX * object.scrollFactorX)) - (objectW * object.originX);
  24883. var objectY = (object.y - (scrollY * object.scrollFactorY)) - (objectH * object.originY);
  24884. var tx = (objectX * mva + objectY * mvc + mve);
  24885. var ty = (objectX * mvb + objectY * mvd + mvf);
  24886. var tw = ((objectX + objectW) * mva + (objectY + objectH) * mvc + mve);
  24887. var th = ((objectX + objectW) * mvb + (objectY + objectH) * mvd + mvf);
  24888. var cullW = cameraW + objectW;
  24889. var cullH = cameraH + objectH;
  24890. if (tx > -objectW && ty > -objectH && tx < cullW && ty < cullH &&
  24891. tw > -objectW && th > -objectH && tw < cullW && th < cullH)
  24892. {
  24893. culledObjects.push(object);
  24894. }
  24895. }
  24896. return culledObjects;
  24897. },
  24898. /**
  24899. * Fades the Camera in from the given color over the duration specified.
  24900. *
  24901. * @method Phaser.Cameras.Scene2D.Camera#fadeIn
  24902. * @since 3.3.0
  24903. *
  24904. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  24905. * @param {integer} [red=0] - The amount to fade the red channel towards. A value between 0 and 255.
  24906. * @param {integer} [green=0] - The amount to fade the green channel towards. A value between 0 and 255.
  24907. * @param {integer} [blue=0] - The amount to fade the blue channel towards. A value between 0 and 255.
  24908. * @param {function} [callback] - This callback will be invoked every frame for the duration of the effect.
  24909. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  24910. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  24911. *
  24912. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  24913. */
  24914. fadeIn: function (duration, red, green, blue, callback, context)
  24915. {
  24916. return this.fadeEffect.start(false, duration, red, green, blue, true, callback, context);
  24917. },
  24918. /**
  24919. * Fades the Camera out to the given color over the duration specified.
  24920. * This is an alias for Camera.fade that forces the fade to start, regardless of existing fades.
  24921. *
  24922. * @method Phaser.Cameras.Scene2D.Camera#fadeOut
  24923. * @since 3.3.0
  24924. *
  24925. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  24926. * @param {integer} [red=0] - The amount to fade the red channel towards. A value between 0 and 255.
  24927. * @param {integer} [green=0] - The amount to fade the green channel towards. A value between 0 and 255.
  24928. * @param {integer} [blue=0] - The amount to fade the blue channel towards. A value between 0 and 255.
  24929. * @param {function} [callback] - This callback will be invoked every frame for the duration of the effect.
  24930. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  24931. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  24932. *
  24933. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  24934. */
  24935. fadeOut: function (duration, red, green, blue, callback, context)
  24936. {
  24937. return this.fadeEffect.start(true, duration, red, green, blue, true, callback, context);
  24938. },
  24939. /**
  24940. * Fades the Camera from the given color to transparent over the duration specified.
  24941. *
  24942. * @method Phaser.Cameras.Scene2D.Camera#fadeFrom
  24943. * @since 3.5.0
  24944. *
  24945. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  24946. * @param {integer} [red=0] - The amount to fade the red channel towards. A value between 0 and 255.
  24947. * @param {integer} [green=0] - The amount to fade the green channel towards. A value between 0 and 255.
  24948. * @param {integer} [blue=0] - The amount to fade the blue channel towards. A value between 0 and 255.
  24949. * @param {boolean} [force=false] - Force the effect to start immediately, even if already running.
  24950. * @param {function} [callback] - This callback will be invoked every frame for the duration of the effect.
  24951. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  24952. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  24953. *
  24954. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  24955. */
  24956. fadeFrom: function (duration, red, green, blue, force, callback, context)
  24957. {
  24958. return this.fadeEffect.start(false, duration, red, green, blue, force, callback, context);
  24959. },
  24960. /**
  24961. * Fades the Camera from transparent to the given color over the duration specified.
  24962. *
  24963. * @method Phaser.Cameras.Scene2D.Camera#fade
  24964. * @since 3.0.0
  24965. *
  24966. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  24967. * @param {integer} [red=0] - The amount to fade the red channel towards. A value between 0 and 255.
  24968. * @param {integer} [green=0] - The amount to fade the green channel towards. A value between 0 and 255.
  24969. * @param {integer} [blue=0] - The amount to fade the blue channel towards. A value between 0 and 255.
  24970. * @param {boolean} [force=false] - Force the effect to start immediately, even if already running.
  24971. * @param {function} [callback] - This callback will be invoked every frame for the duration of the effect.
  24972. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  24973. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  24974. *
  24975. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  24976. */
  24977. fade: function (duration, red, green, blue, force, callback, context)
  24978. {
  24979. return this.fadeEffect.start(true, duration, red, green, blue, force, callback, context);
  24980. },
  24981. /**
  24982. * Flashes the Camera by setting it to the given color immediately and then fading it away again quickly over the duration specified.
  24983. *
  24984. * @method Phaser.Cameras.Scene2D.Camera#flash
  24985. * @since 3.0.0
  24986. *
  24987. * @param {integer} [duration=250] - The duration of the effect in milliseconds.
  24988. * @param {integer} [red=255] - The amount to fade the red channel towards. A value between 0 and 255.
  24989. * @param {integer} [green=255] - The amount to fade the green channel towards. A value between 0 and 255.
  24990. * @param {integer} [blue=255] - The amount to fade the blue channel towards. A value between 0 and 255.
  24991. * @param {boolean} [force=false] - Force the effect to start immediately, even if already running.
  24992. * @param {function} [callback] - This callback will be invoked every frame for the duration of the effect.
  24993. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  24994. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  24995. *
  24996. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  24997. */
  24998. flash: function (duration, red, green, blue, force, callback, context)
  24999. {
  25000. return this.flashEffect.start(duration, red, green, blue, force, callback, context);
  25001. },
  25002. /**
  25003. * Shakes the Camera by the given intensity over the duration specified.
  25004. *
  25005. * @method Phaser.Cameras.Scene2D.Camera#shake
  25006. * @since 3.0.0
  25007. *
  25008. * @param {integer} [duration=100] - The duration of the effect in milliseconds.
  25009. * @param {number} [intensity=0.05] - The intensity of the shake.
  25010. * @param {boolean} [force=false] - Force the shake effect to start immediately, even if already running.
  25011. * @param {function} [callback] - This callback will be invoked every frame for the duration of the effect.
  25012. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  25013. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  25014. *
  25015. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25016. */
  25017. shake: function (duration, intensity, force, callback, context)
  25018. {
  25019. return this.shakeEffect.start(duration, intensity, force, callback, context);
  25020. },
  25021. /**
  25022. * This effect will scroll the Camera so that the center of its viewport finishes at the given destination,
  25023. * over the duration and with the ease specified.
  25024. *
  25025. * @method Phaser.Cameras.Scene2D.Camera#pan
  25026. * @since 3.11.0
  25027. *
  25028. * @param {number} x - The destination x coordinate to scroll the center of the Camera viewport to.
  25029. * @param {number} y - The destination y coordinate to scroll the center of the Camera viewport to.
  25030. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  25031. * @param {(string|function)} [ease='Linear'] - The ease to use for the pan. Can be any of the Phaser Easing constants or a custom function.
  25032. * @param {boolean} [force=false] - Force the shake effect to start immediately, even if already running.
  25033. * @param {CameraPanCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  25034. * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is,
  25035. * the current camera scroll x coordinate and the current camera scroll y coordinate.
  25036. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  25037. *
  25038. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25039. */
  25040. pan: function (x, y, duration, ease, force, callback, context)
  25041. {
  25042. return this.panEffect.start(x, y, duration, ease, force, callback, context);
  25043. },
  25044. /**
  25045. * This effect will zoom the Camera to the given scale, over the duration and with the ease specified.
  25046. *
  25047. * @method Phaser.Cameras.Scene2D.Camera#zoomTo
  25048. * @since 3.11.0
  25049. *
  25050. * @param {number} zoom - The target Camera zoom value.
  25051. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  25052. * @param {(string|function)} [ease='Linear'] - The ease to use for the pan. Can be any of the Phaser Easing constants or a custom function.
  25053. * @param {boolean} [force=false] - Force the shake effect to start immediately, even if already running.
  25054. * @param {CameraPanCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  25055. * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is,
  25056. * the current camera scroll x coordinate and the current camera scroll y coordinate.
  25057. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  25058. *
  25059. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25060. */
  25061. zoomTo: function (zoom, duration, ease, force, callback, context)
  25062. {
  25063. return this.zoomEffect.start(zoom, duration, ease, force, callback, context);
  25064. },
  25065. /**
  25066. * Converts the given `x` and `y` coordinates into World space, based on this Cameras transform.
  25067. * You can optionally provide a Vector2, or similar object, to store the results in.
  25068. *
  25069. * @method Phaser.Cameras.Scene2D.Camera#getWorldPoint
  25070. * @since 3.0.0
  25071. *
  25072. * @generic {Phaser.Math.Vector2} O - [output,$return]
  25073. *
  25074. * @param {number} x - The x position to convert to world space.
  25075. * @param {number} y - The y position to convert to world space.
  25076. * @param {(object|Phaser.Math.Vector2)} [output] - An optional object to store the results in. If not provided a new Vector2 will be created.
  25077. *
  25078. * @return {Phaser.Math.Vector2} An object holding the converted values in its `x` and `y` properties.
  25079. */
  25080. getWorldPoint: function (x, y, output)
  25081. {
  25082. if (output === undefined) { output = new Vector2(); }
  25083. var cameraMatrix = this.matrix.matrix;
  25084. var mva = cameraMatrix[0];
  25085. var mvb = cameraMatrix[1];
  25086. var mvc = cameraMatrix[2];
  25087. var mvd = cameraMatrix[3];
  25088. var mve = cameraMatrix[4];
  25089. var mvf = cameraMatrix[5];
  25090. /* First Invert Matrix */
  25091. var determinant = (mva * mvd) - (mvb * mvc);
  25092. if (!determinant)
  25093. {
  25094. output.x = x;
  25095. output.y = y;
  25096. return output;
  25097. }
  25098. determinant = 1 / determinant;
  25099. var ima = mvd * determinant;
  25100. var imb = -mvb * determinant;
  25101. var imc = -mvc * determinant;
  25102. var imd = mva * determinant;
  25103. var ime = (mvc * mvf - mvd * mve) * determinant;
  25104. var imf = (mvb * mve - mva * mvf) * determinant;
  25105. var c = Math.cos(this.rotation);
  25106. var s = Math.sin(this.rotation);
  25107. var zoom = this.zoom;
  25108. var scrollX = this.scrollX;
  25109. var scrollY = this.scrollY;
  25110. var sx = x + ((scrollX * c - scrollY * s) * zoom);
  25111. var sy = y + ((scrollX * s + scrollY * c) * zoom);
  25112. /* Apply transform to point */
  25113. output.x = (sx * ima + sy * imc + ime);
  25114. output.y = (sx * imb + sy * imd + imf);
  25115. return output;
  25116. },
  25117. /**
  25118. * Given a Game Object, or an array of Game Objects, it will update all of their camera filter settings
  25119. * so that they are ignored by this Camera. This means they will not be rendered by this Camera.
  25120. *
  25121. * @method Phaser.Cameras.Scene2D.Camera#ignore
  25122. * @since 3.0.0
  25123. *
  25124. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObject - The Game Object, or array of Game Objects, to be ignored by this Camera.
  25125. *
  25126. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25127. */
  25128. ignore: function (gameObject)
  25129. {
  25130. var id = this.id;
  25131. if (Array.isArray(gameObject))
  25132. {
  25133. for (var i = 0; i < gameObject.length; i++)
  25134. {
  25135. gameObject[i].cameraFilter |= id;
  25136. }
  25137. }
  25138. else
  25139. {
  25140. gameObject.cameraFilter |= id;
  25141. }
  25142. return this;
  25143. },
  25144. /**
  25145. * Internal preRender step.
  25146. *
  25147. * @method Phaser.Cameras.Scene2D.Camera#preRender
  25148. * @protected
  25149. * @since 3.0.0
  25150. *
  25151. * @param {number} baseScale - The base scale, as set in the Camera Manager.
  25152. * @param {number} resolution - The game resolution.
  25153. */
  25154. preRender: function (baseScale, resolution)
  25155. {
  25156. var width = this.width;
  25157. var height = this.height;
  25158. var halfWidth = width * 0.5;
  25159. var halfHeight = height * 0.5;
  25160. var zoom = this.zoom * baseScale;
  25161. var matrix = this.matrix;
  25162. var originX = width * this.originX;
  25163. var originY = height * this.originY;
  25164. var follow = this._follow;
  25165. var deadzone = this.deadzone;
  25166. var sx = this.scrollX;
  25167. var sy = this.scrollY;
  25168. if (deadzone)
  25169. {
  25170. CenterOn(deadzone, this.midPoint.x, this.midPoint.y);
  25171. }
  25172. if (follow)
  25173. {
  25174. var fx = (follow.x - this.followOffset.x);
  25175. var fy = (follow.y - this.followOffset.y);
  25176. if (deadzone)
  25177. {
  25178. if (fx < deadzone.x)
  25179. {
  25180. sx = Linear(sx, sx - (deadzone.x - fx), this.lerp.x);
  25181. }
  25182. else if (fx > deadzone.right)
  25183. {
  25184. sx = Linear(sx, sx + (fx - deadzone.right), this.lerp.x);
  25185. }
  25186. if (fy < deadzone.y)
  25187. {
  25188. sy = Linear(sy, sy - (deadzone.y - fy), this.lerp.y);
  25189. }
  25190. else if (fy > deadzone.bottom)
  25191. {
  25192. sy = Linear(sy, sy + (fy - deadzone.bottom), this.lerp.y);
  25193. }
  25194. }
  25195. else
  25196. {
  25197. sx = Linear(sx, fx - originX, this.lerp.x);
  25198. sy = Linear(sy, fy - originY, this.lerp.y);
  25199. }
  25200. }
  25201. if (this.useBounds)
  25202. {
  25203. sx = this.clampX(sx);
  25204. sy = this.clampY(sy);
  25205. }
  25206. if (this.roundPixels)
  25207. {
  25208. originX = Math.round(originX);
  25209. originY = Math.round(originY);
  25210. }
  25211. // Values are in pixels and not impacted by zooming the Camera
  25212. this.scrollX = sx;
  25213. this.scrollY = sy;
  25214. var midX = sx + halfWidth;
  25215. var midY = sy + halfHeight;
  25216. // The center of the camera, in world space, so taking zoom into account
  25217. // Basically the pixel value of what it's looking at in the middle of the cam
  25218. this.midPoint.set(midX, midY);
  25219. var displayWidth = width / zoom;
  25220. var displayHeight = height / zoom;
  25221. this.worldView.setTo(
  25222. midX - (displayWidth / 2),
  25223. midY - (displayHeight / 2),
  25224. displayWidth,
  25225. displayHeight
  25226. );
  25227. matrix.loadIdentity();
  25228. matrix.scale(resolution, resolution);
  25229. matrix.translate(this.x + originX, this.y + originY);
  25230. matrix.rotate(this.rotation);
  25231. matrix.scale(zoom, zoom);
  25232. matrix.translate(-originX, -originY);
  25233. this.shakeEffect.preRender();
  25234. },
  25235. /**
  25236. * Takes an x value and checks it's within the range of the Camera bounds, adjusting if required.
  25237. * Do not call this method if you are not using camera bounds.
  25238. *
  25239. * @method Phaser.Cameras.Scene2D.Camera#clampX
  25240. * @since 3.11.0
  25241. *
  25242. * @param {number} x - The value to horizontally scroll clamp.
  25243. *
  25244. * @return {number} The adjusted value to use as scrollX.
  25245. */
  25246. clampX: function (x)
  25247. {
  25248. var bounds = this._bounds;
  25249. var dw = this.displayWidth;
  25250. var bx = bounds.x + ((dw - this.width) / 2);
  25251. var bw = Math.max(bx, bx + bounds.width - dw);
  25252. if (x < bx)
  25253. {
  25254. x = bx;
  25255. }
  25256. else if (x > bw)
  25257. {
  25258. x = bw;
  25259. }
  25260. return x;
  25261. },
  25262. /**
  25263. * Takes a y value and checks it's within the range of the Camera bounds, adjusting if required.
  25264. * Do not call this method if you are not using camera bounds.
  25265. *
  25266. * @method Phaser.Cameras.Scene2D.Camera#clampY
  25267. * @since 3.11.0
  25268. *
  25269. * @param {number} y - The value to vertically scroll clamp.
  25270. *
  25271. * @return {number} The adjusted value to use as scrollY.
  25272. */
  25273. clampY: function (y)
  25274. {
  25275. var bounds = this._bounds;
  25276. var dh = this.displayHeight;
  25277. var by = bounds.y + ((dh - this.height) / 2);
  25278. var bh = Math.max(by, by + bounds.height - dh);
  25279. if (y < by)
  25280. {
  25281. y = by;
  25282. }
  25283. else if (y > bh)
  25284. {
  25285. y = bh;
  25286. }
  25287. return y;
  25288. },
  25289. /*
  25290. var gap = this._zoomInversed;
  25291. return gap * Math.round((src.x - this.scrollX * src.scrollFactorX) / gap);
  25292. */
  25293. /**
  25294. * If this Camera has previously had movement bounds set on it, this will remove them.
  25295. *
  25296. * @method Phaser.Cameras.Scene2D.Camera#removeBounds
  25297. * @since 3.0.0
  25298. *
  25299. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25300. */
  25301. removeBounds: function ()
  25302. {
  25303. this.useBounds = false;
  25304. this.dirty = true;
  25305. this._bounds.setEmpty();
  25306. return this;
  25307. },
  25308. /**
  25309. * Set the rotation of this Camera. This causes everything it renders to appear rotated.
  25310. *
  25311. * Rotating a camera does not rotate the viewport itself, it is applied during rendering.
  25312. *
  25313. * @method Phaser.Cameras.Scene2D.Camera#setAngle
  25314. * @since 3.0.0
  25315. *
  25316. * @param {number} [value=0] - The cameras angle of rotation, given in degrees.
  25317. *
  25318. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25319. */
  25320. setAngle: function (value)
  25321. {
  25322. if (value === undefined) { value = 0; }
  25323. this.rotation = DegToRad(value);
  25324. return this;
  25325. },
  25326. /**
  25327. * Sets the linear interpolation value to use when following a target.
  25328. *
  25329. * The default values of 1 means the camera will instantly snap to the target coordinates.
  25330. * A lower value, such as 0.1 means the camera will more slowly track the target, giving
  25331. * a smooth transition. You can set the horizontal and vertical values independently, and also
  25332. * adjust this value in real-time during your game.
  25333. *
  25334. * Be sure to keep the value between 0 and 1. A value of zero will disable tracking on that axis.
  25335. *
  25336. * @method Phaser.Cameras.Scene2D.Camera#setLerp
  25337. * @since 3.9.0
  25338. *
  25339. * @param {number} [x=1] - The amount added to the horizontal linear interpolation of the follow target.
  25340. * @param {number} [y=1] - The amount added to the vertical linear interpolation of the follow target.
  25341. *
  25342. * @return {this} This Camera instance.
  25343. */
  25344. setLerp: function (x, y)
  25345. {
  25346. if (x === undefined) { x = 1; }
  25347. if (y === undefined) { y = x; }
  25348. this.lerp.set(x, y);
  25349. return this;
  25350. },
  25351. /**
  25352. * Sets the horizontal and vertical offset of the camera from its follow target.
  25353. * The values are subtracted from the targets position during the Cameras update step.
  25354. *
  25355. * @method Phaser.Cameras.Scene2D.Camera#setFollowOffset
  25356. * @since 3.9.0
  25357. *
  25358. * @param {number} [x=0] - The horizontal offset from the camera follow target.x position.
  25359. * @param {number} [y=0] - The vertical offset from the camera follow target.y position.
  25360. *
  25361. * @return {this} This Camera instance.
  25362. */
  25363. setFollowOffset: function (x, y)
  25364. {
  25365. if (x === undefined) { x = 0; }
  25366. if (y === undefined) { y = 0; }
  25367. this.followOffset.set(x, y);
  25368. return this;
  25369. },
  25370. /**
  25371. * Sets the background color for this Camera.
  25372. *
  25373. * By default a Camera has a transparent background but it can be given a solid color, with any level
  25374. * of transparency, via this method.
  25375. *
  25376. * The color value can be specified using CSS color notation, hex or numbers.
  25377. *
  25378. * @method Phaser.Cameras.Scene2D.Camera#setBackgroundColor
  25379. * @since 3.0.0
  25380. *
  25381. * @param {(string|number|InputColorObject)} [color='rgba(0,0,0,0)'] - The color value. In CSS, hex or numeric color notation.
  25382. *
  25383. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25384. */
  25385. setBackgroundColor: function (color)
  25386. {
  25387. if (color === undefined) { color = 'rgba(0,0,0,0)'; }
  25388. this.backgroundColor = ValueToColor(color);
  25389. this.transparent = (this.backgroundColor.alpha === 0);
  25390. return this;
  25391. },
  25392. /**
  25393. * Set the bounds of the Camera. The bounds are an axis-aligned rectangle.
  25394. *
  25395. * The Camera bounds controls where the Camera can scroll to, stopping it from scrolling off the
  25396. * edges and into blank space. It does not limit the placement of Game Objects, or where
  25397. * the Camera viewport can be positioned.
  25398. *
  25399. * Temporarily disable the bounds by changing the boolean `Camera.useBounds`.
  25400. *
  25401. * Clear the bounds entirely by calling `Camera.removeBounds`.
  25402. *
  25403. * If you set bounds that are smaller than the viewport it will stop the Camera from being
  25404. * able to scroll. The bounds can be positioned where-ever you wish. By default they are from
  25405. * 0x0 to the canvas width x height. This means that the coordinate 0x0 is the top left of
  25406. * the Camera bounds. However, you can position them anywhere. So if you wanted a game world
  25407. * that was 2048x2048 in size, with 0x0 being the center of it, you can set the bounds x/y
  25408. * to be -1024, -1024, with a width and height of 2048. Depending on your game you may find
  25409. * it easier for 0x0 to be the top-left of the bounds, or you may wish 0x0 to be the middle.
  25410. *
  25411. * @method Phaser.Cameras.Scene2D.Camera#setBounds
  25412. * @since 3.0.0
  25413. *
  25414. * @param {integer} x - The top-left x coordinate of the bounds.
  25415. * @param {integer} y - The top-left y coordinate of the bounds.
  25416. * @param {integer} width - The width of the bounds, in pixels.
  25417. * @param {integer} height - The height of the bounds, in pixels.
  25418. * @param {boolean} [centerOn] - If `true` the Camera will automatically be centered on the new bounds.
  25419. *
  25420. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25421. */
  25422. setBounds: function (x, y, width, height, centerOn)
  25423. {
  25424. this._bounds.setTo(x, y, width, height);
  25425. this.dirty = true;
  25426. this.useBounds = true;
  25427. if (centerOn)
  25428. {
  25429. this.centerToBounds();
  25430. }
  25431. else
  25432. {
  25433. this.scrollX = this.clampX(this.scrollX);
  25434. this.scrollY = this.clampY(this.scrollY);
  25435. }
  25436. return this;
  25437. },
  25438. /**
  25439. * Sets the name of this Camera.
  25440. * This value is for your own use and isn't used internally.
  25441. *
  25442. * @method Phaser.Cameras.Scene2D.Camera#setName
  25443. * @since 3.0.0
  25444. *
  25445. * @param {string} [value=''] - The name of the Camera.
  25446. *
  25447. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25448. */
  25449. setName: function (value)
  25450. {
  25451. if (value === undefined) { value = ''; }
  25452. this.name = value;
  25453. return this;
  25454. },
  25455. /**
  25456. * Set the position of the Camera viewport within the game.
  25457. *
  25458. * This does not change where the camera is 'looking'. See `setScroll` to control that.
  25459. *
  25460. * @method Phaser.Cameras.Scene2D.Camera#setPosition
  25461. * @since 3.0.0
  25462. *
  25463. * @param {number} x - The top-left x coordinate of the Camera viewport.
  25464. * @param {number} [y=x] - The top-left y coordinate of the Camera viewport.
  25465. *
  25466. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25467. */
  25468. setPosition: function (x, y)
  25469. {
  25470. if (y === undefined) { y = x; }
  25471. this.x = x;
  25472. this.y = y;
  25473. return this;
  25474. },
  25475. /**
  25476. * Set the rotation of this Camera. This causes everything it renders to appear rotated.
  25477. *
  25478. * Rotating a camera does not rotate the viewport itself, it is applied during rendering.
  25479. *
  25480. * @method Phaser.Cameras.Scene2D.Camera#setRotation
  25481. * @since 3.0.0
  25482. *
  25483. * @param {number} [value=0] - The rotation of the Camera, in radians.
  25484. *
  25485. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25486. */
  25487. setRotation: function (value)
  25488. {
  25489. if (value === undefined) { value = 0; }
  25490. this.rotation = value;
  25491. return this;
  25492. },
  25493. /**
  25494. * Should the Camera round pixel values to whole integers when rendering Game Objects?
  25495. *
  25496. * In some types of game, especially with pixel art, this is required to prevent sub-pixel aliasing.
  25497. *
  25498. * @method Phaser.Cameras.Scene2D.Camera#setRoundPixels
  25499. * @since 3.0.0
  25500. *
  25501. * @param {boolean} value - `true` to round Camera pixels, `false` to not.
  25502. *
  25503. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25504. */
  25505. setRoundPixels: function (value)
  25506. {
  25507. this.roundPixels = value;
  25508. return this;
  25509. },
  25510. /**
  25511. * Sets the Scene the Camera is bound to.
  25512. *
  25513. * @method Phaser.Cameras.Scene2D.Camera#setScene
  25514. * @since 3.0.0
  25515. *
  25516. * @param {Phaser.Scene} scene - The Scene the camera is bound to.
  25517. *
  25518. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25519. */
  25520. setScene: function (scene)
  25521. {
  25522. this.scene = scene;
  25523. return this;
  25524. },
  25525. /**
  25526. * Set the position of where the Camera is looking within the game.
  25527. * You can also modify the properties `Camera.scrollX` and `Camera.scrollY` directly.
  25528. * Use this method, or the scroll properties, to move your camera around the game world.
  25529. *
  25530. * This does not change where the camera viewport is placed. See `setPosition` to control that.
  25531. *
  25532. * @method Phaser.Cameras.Scene2D.Camera#setScroll
  25533. * @since 3.0.0
  25534. *
  25535. * @param {number} x - The x coordinate of the Camera in the game world.
  25536. * @param {number} [y=x] - The y coordinate of the Camera in the game world.
  25537. *
  25538. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25539. */
  25540. setScroll: function (x, y)
  25541. {
  25542. if (y === undefined) { y = x; }
  25543. this.scrollX = x;
  25544. this.scrollY = y;
  25545. return this;
  25546. },
  25547. /**
  25548. * Set the size of the Camera viewport.
  25549. *
  25550. * By default a Camera is the same size as the game, but can be made smaller via this method,
  25551. * allowing you to create mini-cam style effects by creating and positioning a smaller Camera
  25552. * viewport within your game.
  25553. *
  25554. * @method Phaser.Cameras.Scene2D.Camera#setSize
  25555. * @since 3.0.0
  25556. *
  25557. * @param {integer} width - The width of the Camera viewport.
  25558. * @param {integer} [height=width] - The height of the Camera viewport.
  25559. *
  25560. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25561. */
  25562. setSize: function (width, height)
  25563. {
  25564. if (height === undefined) { height = width; }
  25565. this.width = width;
  25566. this.height = height;
  25567. return this;
  25568. },
  25569. /**
  25570. * This method sets the position and size of the Camera viewport in a single call.
  25571. *
  25572. * If you're trying to change where the Camera is looking at in your game, then see
  25573. * the method `Camera.setScroll` instead. This method is for changing the viewport
  25574. * itself, not what the camera can see.
  25575. *
  25576. * By default a Camera is the same size as the game, but can be made smaller via this method,
  25577. * allowing you to create mini-cam style effects by creating and positioning a smaller Camera
  25578. * viewport within your game.
  25579. *
  25580. * @method Phaser.Cameras.Scene2D.Camera#setViewport
  25581. * @since 3.0.0
  25582. *
  25583. * @param {number} x - The top-left x coordinate of the Camera viewport.
  25584. * @param {number} y - The top-left y coordinate of the Camera viewport.
  25585. * @param {integer} width - The width of the Camera viewport.
  25586. * @param {integer} [height=width] - The height of the Camera viewport.
  25587. *
  25588. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25589. */
  25590. setViewport: function (x, y, width, height)
  25591. {
  25592. this.x = x;
  25593. this.y = y;
  25594. this.width = width;
  25595. this.height = height;
  25596. return this;
  25597. },
  25598. /**
  25599. * Set the zoom value of the Camera.
  25600. *
  25601. * Changing to a smaller value, such as 0.5, will cause the camera to 'zoom out'.
  25602. * Changing to a larger value, such as 2, will cause the camera to 'zoom in'.
  25603. *
  25604. * A value of 1 means 'no zoom' and is the default.
  25605. *
  25606. * Changing the zoom does not impact the Camera viewport in any way, it is only applied during rendering.
  25607. *
  25608. * @method Phaser.Cameras.Scene2D.Camera#setZoom
  25609. * @since 3.0.0
  25610. *
  25611. * @param {number} [value=1] - The zoom value of the Camera. The minimum it can be is 0.001.
  25612. *
  25613. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25614. */
  25615. setZoom: function (value)
  25616. {
  25617. if (value === undefined) { value = 1; }
  25618. if (value === 0)
  25619. {
  25620. value = 0.001;
  25621. }
  25622. this.zoom = value;
  25623. return this;
  25624. },
  25625. /**
  25626. * Sets the visibility of this Camera.
  25627. *
  25628. * An invisible Camera will skip rendering and input tests of everything it can see.
  25629. *
  25630. * @method Phaser.Cameras.Scene2D.Camera#setVisible
  25631. * @since 3.10.0
  25632. *
  25633. * @param {boolean} value - The visible state of the Camera.
  25634. *
  25635. * @return {this} This Camera instance.
  25636. */
  25637. setVisible: function (value)
  25638. {
  25639. this.visible = value;
  25640. return this;
  25641. },
  25642. /**
  25643. * Sets the Camera to follow a Game Object.
  25644. *
  25645. * When enabled the Camera will automatically adjust its scroll position to keep the target Game Object
  25646. * in its center.
  25647. *
  25648. * You can set the linear interpolation value used in the follow code.
  25649. * Use low lerp values (such as 0.1) to automatically smooth the camera motion.
  25650. *
  25651. * If you find you're getting a slight "jitter" effect when following an object it's probably to do with sub-pixel
  25652. * rendering of the targets position. This can be rounded by setting the `roundPixels` argument to `true` to
  25653. * force full pixel rounding rendering. Note that this can still be broken if you have specified a non-integer zoom
  25654. * value on the camera. So be sure to keep the camera zoom to integers.
  25655. *
  25656. * @method Phaser.Cameras.Scene2D.Camera#startFollow
  25657. * @since 3.0.0
  25658. *
  25659. * @param {(Phaser.GameObjects.GameObject|object)} target - The target for the Camera to follow.
  25660. * @param {boolean} [roundPixels=false] - Round the camera position to whole integers to avoid sub-pixel rendering?
  25661. * @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.
  25662. * @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.
  25663. * @param {number} [offsetX=0] - The horizontal offset from the camera follow target.x position.
  25664. * @param {number} [offsetY=0] - The vertical offset from the camera follow target.y position.
  25665. *
  25666. * @return {this} This Camera instance.
  25667. */
  25668. startFollow: function (target, roundPixels, lerpX, lerpY, offsetX, offsetY)
  25669. {
  25670. if (roundPixels === undefined) { roundPixels = false; }
  25671. if (lerpX === undefined) { lerpX = 1; }
  25672. if (lerpY === undefined) { lerpY = lerpX; }
  25673. if (offsetX === undefined) { offsetX = 0; }
  25674. if (offsetY === undefined) { offsetY = offsetX; }
  25675. this._follow = target;
  25676. this.roundPixels = roundPixels;
  25677. lerpX = Clamp(lerpX, 0, 1);
  25678. lerpY = Clamp(lerpY, 0, 1);
  25679. this.lerp.set(lerpX, lerpY);
  25680. this.followOffset.set(offsetX, offsetY);
  25681. var originX = this.width / 2;
  25682. var originY = this.height / 2;
  25683. var fx = target.x - offsetX;
  25684. var fy = target.y - offsetY;
  25685. this.midPoint.set(fx, fy);
  25686. this.scrollX = fx - originX;
  25687. this.scrollY = fy - originY;
  25688. return this;
  25689. },
  25690. /**
  25691. * Stops a Camera from following a Game Object, if previously set via `Camera.startFollow`.
  25692. *
  25693. * @method Phaser.Cameras.Scene2D.Camera#stopFollow
  25694. * @since 3.0.0
  25695. *
  25696. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25697. */
  25698. stopFollow: function ()
  25699. {
  25700. this._follow = null;
  25701. return this;
  25702. },
  25703. /**
  25704. * Returns an Object suitable for JSON storage containing all of the Camera viewport and rendering properties.
  25705. *
  25706. * @method Phaser.Cameras.Scene2D.Camera#toJSON
  25707. * @since 3.0.0
  25708. *
  25709. * @return {JSONCamera} A well-formed object suitable for conversion to JSON.
  25710. */
  25711. toJSON: function ()
  25712. {
  25713. var output = {
  25714. name: this.name,
  25715. x: this.x,
  25716. y: this.y,
  25717. width: this.width,
  25718. height: this.height,
  25719. zoom: this.zoom,
  25720. rotation: this.rotation,
  25721. roundPixels: this.roundPixels,
  25722. scrollX: this.scrollX,
  25723. scrollY: this.scrollY,
  25724. backgroundColor: this.backgroundColor.rgba
  25725. };
  25726. if (this.useBounds)
  25727. {
  25728. output['bounds'] = {
  25729. x: this._bounds.x,
  25730. y: this._bounds.y,
  25731. width: this._bounds.width,
  25732. height: this._bounds.height
  25733. };
  25734. }
  25735. return output;
  25736. },
  25737. /**
  25738. * Resets any active FX, such as a fade, flash or shake. Useful to call after a fade in order to
  25739. * remove the fade.
  25740. *
  25741. * @method Phaser.Cameras.Scene2D.Camera#resetFX
  25742. * @since 3.0.0
  25743. *
  25744. * @return {Phaser.Cameras.Scene2D.Camera} This Camera instance.
  25745. */
  25746. resetFX: function ()
  25747. {
  25748. this.panEffect.reset();
  25749. this.shakeEffect.reset();
  25750. this.flashEffect.reset();
  25751. this.fadeEffect.reset();
  25752. return this;
  25753. },
  25754. /**
  25755. * Internal method called automatically by the Camera Manager.
  25756. *
  25757. * @method Phaser.Cameras.Scene2D.Camera#update
  25758. * @protected
  25759. * @since 3.0.0
  25760. *
  25761. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  25762. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  25763. */
  25764. update: function (time, delta)
  25765. {
  25766. if (this.visible)
  25767. {
  25768. this.panEffect.update(time, delta);
  25769. this.zoomEffect.update(time, delta);
  25770. this.shakeEffect.update(time, delta);
  25771. this.flashEffect.update(time, delta);
  25772. this.fadeEffect.update(time, delta);
  25773. }
  25774. },
  25775. /**
  25776. * This event is fired when a camera is destroyed by the Camera Manager.
  25777. *
  25778. * @event CameraDestroyEvent
  25779. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that was destroyed.
  25780. */
  25781. /**
  25782. * Destroys this Camera instance. You rarely need to call this directly.
  25783. *
  25784. * Called by the Camera Manager. If you wish to destroy a Camera please use `CameraManager.remove` as
  25785. * cameras are stored in a pool, ready for recycling later, and calling this directly will prevent that.
  25786. *
  25787. * @method Phaser.Cameras.Scene2D.Camera#destroy
  25788. * @fires CameraDestroyEvent
  25789. * @since 3.0.0
  25790. */
  25791. destroy: function ()
  25792. {
  25793. this.emit('cameradestroy', this);
  25794. this.removeAllListeners();
  25795. this.resetFX();
  25796. this.matrix.destroy();
  25797. this.culledObjects = [];
  25798. this._follow = null;
  25799. this._bounds = null;
  25800. this.scene = null;
  25801. this.deadzone = null;
  25802. },
  25803. /**
  25804. * The width of the Camera viewport, in pixels.
  25805. *
  25806. * The viewport is the area into which the Camera renders. Setting the viewport does
  25807. * not restrict where the Camera can scroll to.
  25808. *
  25809. * @name Phaser.Cameras.Scene2D.Camera#width
  25810. * @type {number}
  25811. * @since 3.0.0
  25812. */
  25813. width: {
  25814. get: function ()
  25815. {
  25816. return this._width;
  25817. },
  25818. set: function (value)
  25819. {
  25820. this._width = value;
  25821. this.dirty = true;
  25822. }
  25823. },
  25824. /**
  25825. * The height of the Camera viewport, in pixels.
  25826. *
  25827. * The viewport is the area into which the Camera renders. Setting the viewport does
  25828. * not restrict where the Camera can scroll to.
  25829. *
  25830. * @name Phaser.Cameras.Scene2D.Camera#height
  25831. * @type {number}
  25832. * @since 3.0.0
  25833. */
  25834. height: {
  25835. get: function ()
  25836. {
  25837. return this._height;
  25838. },
  25839. set: function (value)
  25840. {
  25841. this._height = value;
  25842. this.dirty = true;
  25843. }
  25844. },
  25845. /**
  25846. * The horizontal scroll position of this Camera.
  25847. *
  25848. * Change this value to cause the Camera to scroll around your Scene.
  25849. *
  25850. * Alternatively, setting the Camera to follow a Game Object, via the `startFollow` method,
  25851. * will automatically adjust the Camera scroll values accordingly.
  25852. *
  25853. * You can set the bounds within which the Camera can scroll via the `setBounds` method.
  25854. *
  25855. * @name Phaser.Cameras.Scene2D.Camera#scrollX
  25856. * @type {number}
  25857. * @default 0
  25858. * @since 3.0.0
  25859. */
  25860. scrollX: {
  25861. get: function ()
  25862. {
  25863. return this._scrollX;
  25864. },
  25865. set: function (value)
  25866. {
  25867. this._scrollX = value;
  25868. this.dirty = true;
  25869. }
  25870. },
  25871. /**
  25872. * The vertical scroll position of this Camera.
  25873. *
  25874. * Change this value to cause the Camera to scroll around your Scene.
  25875. *
  25876. * Alternatively, setting the Camera to follow a Game Object, via the `startFollow` method,
  25877. * will automatically adjust the Camera scroll values accordingly.
  25878. *
  25879. * You can set the bounds within which the Camera can scroll via the `setBounds` method.
  25880. *
  25881. * @name Phaser.Cameras.Scene2D.Camera#scrollY
  25882. * @type {number}
  25883. * @default 0
  25884. * @since 3.0.0
  25885. */
  25886. scrollY: {
  25887. get: function ()
  25888. {
  25889. return this._scrollY;
  25890. },
  25891. set: function (value)
  25892. {
  25893. this._scrollY = value;
  25894. this.dirty = true;
  25895. }
  25896. },
  25897. /**
  25898. * The Camera zoom value. Change this value to zoom in, or out of, a Scene.
  25899. *
  25900. * A value of 0.5 would zoom the Camera out, so you can now see twice as much
  25901. * of the Scene as before. A value of 2 would zoom the Camera in, so every pixel
  25902. * now takes up 2 pixels when rendered.
  25903. *
  25904. * Set to 1 to return to the default zoom level.
  25905. *
  25906. * Be careful to never set this value to zero.
  25907. *
  25908. * @name Phaser.Cameras.Scene2D.Camera#zoom
  25909. * @type {number}
  25910. * @default 1
  25911. * @since 3.0.0
  25912. */
  25913. zoom: {
  25914. get: function ()
  25915. {
  25916. return this._zoom;
  25917. },
  25918. set: function (value)
  25919. {
  25920. this._zoom = value;
  25921. this.dirty = true;
  25922. }
  25923. },
  25924. /**
  25925. * The rotation of the Camera in radians.
  25926. *
  25927. * Camera rotation always takes place based on the Camera viewport. By default, rotation happens
  25928. * in the center of the viewport. You can adjust this with the `originX` and `originY` properties.
  25929. *
  25930. * Rotation influences the rendering of _all_ Game Objects visible by this Camera. However, it does not
  25931. * rotate the Camera viewport itself, which always remains an axis-aligned rectangle.
  25932. *
  25933. * @name Phaser.Cameras.Scene2D.Camera#rotation
  25934. * @type {number}
  25935. * @private
  25936. * @default 0
  25937. * @since 3.11.0
  25938. */
  25939. rotation: {
  25940. get: function ()
  25941. {
  25942. return this._rotation;
  25943. },
  25944. set: function (value)
  25945. {
  25946. this._rotation = value;
  25947. this.dirty = true;
  25948. }
  25949. },
  25950. /**
  25951. * The x position of the center of the Camera's viewport, relative to the top-left of the game canvas.
  25952. *
  25953. * @name Phaser.Cameras.Scene2D.Camera#centerX
  25954. * @type {number}
  25955. * @readOnly
  25956. * @since 3.10.0
  25957. */
  25958. centerX: {
  25959. get: function ()
  25960. {
  25961. return this.x + (0.5 * this.width);
  25962. }
  25963. },
  25964. /**
  25965. * The y position of the center of the Camera's viewport, relative to the top-left of the game canvas.
  25966. *
  25967. * @name Phaser.Cameras.Scene2D.Camera#centerY
  25968. * @type {number}
  25969. * @readOnly
  25970. * @since 3.10.0
  25971. */
  25972. centerY: {
  25973. get: function ()
  25974. {
  25975. return this.y + (0.5 * this.height);
  25976. }
  25977. },
  25978. /**
  25979. * The displayed width of the camera viewport, factoring in the camera zoom level.
  25980. *
  25981. * If a camera has a viewport width of 800 and a zoom of 0.5 then its display width
  25982. * would be 1600, as it's displaying twice as many pixels as zoom level 1.
  25983. *
  25984. * Equally, a camera with a width of 800 and zoom of 2 would have a display width
  25985. * of 400 pixels.
  25986. *
  25987. * @name Phaser.Cameras.Scene2D.Camera#displayWidth
  25988. * @type {number}
  25989. * @readOnly
  25990. * @since 3.11.0
  25991. */
  25992. displayWidth: {
  25993. get: function ()
  25994. {
  25995. return this.width / this.zoom;
  25996. }
  25997. },
  25998. /**
  25999. * The displayed height of the camera viewport, factoring in the camera zoom level.
  26000. *
  26001. * If a camera has a viewport height of 600 and a zoom of 0.5 then its display height
  26002. * would be 1200, as it's displaying twice as many pixels as zoom level 1.
  26003. *
  26004. * Equally, a camera with a height of 600 and zoom of 2 would have a display height
  26005. * of 300 pixels.
  26006. *
  26007. * @name Phaser.Cameras.Scene2D.Camera#displayHeight
  26008. * @type {number}
  26009. * @readOnly
  26010. * @since 3.11.0
  26011. */
  26012. displayHeight: {
  26013. get: function ()
  26014. {
  26015. return this.height / this.zoom;
  26016. }
  26017. }
  26018. });
  26019. module.exports = Camera;
  26020. /***/ }),
  26021. /* 125 */
  26022. /***/ (function(module, exports, __webpack_require__) {
  26023. /**
  26024. * @author Richard Davey <rich@photonstorm.com>
  26025. * @copyright 2018 Photon Storm Ltd.
  26026. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  26027. */
  26028. var Class = __webpack_require__(0);
  26029. /**
  26030. * @callback EachMapCallback
  26031. * @generic E - [entry]
  26032. *
  26033. * @param {string} key - [description]
  26034. * @param {*} entry - [description]
  26035. *
  26036. * @return {?boolean} [description]
  26037. */
  26038. /**
  26039. * @classdesc
  26040. * The keys of a Map can be arbitrary values.
  26041. * var map = new Map([
  26042. * [ 1, 'one' ],
  26043. * [ 2, 'two' ],
  26044. * [ 3, 'three' ]
  26045. * ]);
  26046. *
  26047. * @class Map
  26048. * @memberOf Phaser.Structs
  26049. * @constructor
  26050. * @since 3.0.0
  26051. *
  26052. * @generic K
  26053. * @generic V
  26054. * @genericUse {V[]} - [elements]
  26055. *
  26056. * @param {Array.<*>} elements - [description]
  26057. */
  26058. var Map = new Class({
  26059. initialize:
  26060. function Map (elements)
  26061. {
  26062. /**
  26063. * [description]
  26064. *
  26065. * @genericUse {Object.<string, V>} - [$type]
  26066. *
  26067. * @name Phaser.Structs.Map#entries
  26068. * @type {Object.<string, *>}
  26069. * @default {}
  26070. * @since 3.0.0
  26071. */
  26072. this.entries = {};
  26073. /**
  26074. * [description]
  26075. *
  26076. * @name Phaser.Structs.Map#size
  26077. * @type {number}
  26078. * @default 0
  26079. * @since 3.0.0
  26080. */
  26081. this.size = 0;
  26082. if (Array.isArray(elements))
  26083. {
  26084. for (var i = 0; i < elements.length; i++)
  26085. {
  26086. this.set(elements[i][0], elements[i][1]);
  26087. }
  26088. }
  26089. },
  26090. /**
  26091. * [description]
  26092. *
  26093. * @method Phaser.Structs.Map#set
  26094. * @since 3.0.0
  26095. *
  26096. * @genericUse {K} - [key]
  26097. * @genericUse {V} - [value]
  26098. * @genericUse {Phaser.Structs.Map.<K, V>} - [$return]
  26099. *
  26100. * @param {string} key - [description]
  26101. * @param {*} value - [description]
  26102. *
  26103. * @return {Phaser.Structs.Map} This Map object.
  26104. */
  26105. set: function (key, value)
  26106. {
  26107. if (!this.has(key))
  26108. {
  26109. this.entries[key] = value;
  26110. this.size++;
  26111. }
  26112. return this;
  26113. },
  26114. /**
  26115. * [description]
  26116. *
  26117. * @method Phaser.Structs.Map#get
  26118. * @since 3.0.0
  26119. *
  26120. * @genericUse {K} - [key]
  26121. * @genericUse {V} - [$return]
  26122. *
  26123. * @param {string} key - [description]
  26124. *
  26125. * @return {*} [description]
  26126. */
  26127. get: function (key)
  26128. {
  26129. if (this.has(key))
  26130. {
  26131. return this.entries[key];
  26132. }
  26133. },
  26134. /**
  26135. * [description]
  26136. *
  26137. * @method Phaser.Structs.Map#getArray
  26138. * @since 3.0.0
  26139. *
  26140. * @genericUse {V[]} - [$return]
  26141. *
  26142. * @return {Array.<*>} [description]
  26143. */
  26144. getArray: function ()
  26145. {
  26146. var output = [];
  26147. var entries = this.entries;
  26148. for (var key in entries)
  26149. {
  26150. output.push(entries[key]);
  26151. }
  26152. return output;
  26153. },
  26154. /**
  26155. * [description]
  26156. *
  26157. * @method Phaser.Structs.Map#has
  26158. * @since 3.0.0
  26159. *
  26160. * @genericUse {K} - [key]
  26161. *
  26162. * @param {string} key - [description]
  26163. *
  26164. * @return {boolean} [description]
  26165. */
  26166. has: function (key)
  26167. {
  26168. return (this.entries.hasOwnProperty(key));
  26169. },
  26170. /**
  26171. * [description]
  26172. *
  26173. * @method Phaser.Structs.Map#delete
  26174. * @since 3.0.0
  26175. *
  26176. * @genericUse {K} - [key]
  26177. * @genericUse {Phaser.Structs.Map.<K, V>} - [$return]
  26178. *
  26179. * @param {string} key - [description]
  26180. *
  26181. * @return {Phaser.Structs.Map} This Map object.
  26182. */
  26183. delete: function (key)
  26184. {
  26185. if (this.has(key))
  26186. {
  26187. delete this.entries[key];
  26188. this.size--;
  26189. }
  26190. return this;
  26191. },
  26192. /**
  26193. * [description]
  26194. *
  26195. * @method Phaser.Structs.Map#clear
  26196. * @since 3.0.0
  26197. *
  26198. * @genericUse {Phaser.Structs.Map.<K, V>} - [$return]
  26199. *
  26200. * @return {Phaser.Structs.Map} This Map object.
  26201. */
  26202. clear: function ()
  26203. {
  26204. Object.keys(this.entries).forEach(function (prop)
  26205. {
  26206. delete this.entries[prop];
  26207. }, this);
  26208. this.size = 0;
  26209. return this;
  26210. },
  26211. /**
  26212. * [description]
  26213. *
  26214. * @method Phaser.Structs.Map#keys
  26215. * @since 3.0.0
  26216. *
  26217. * @genericUse {K[]} - [$return]
  26218. *
  26219. * @return {string[]} [description]
  26220. */
  26221. keys: function ()
  26222. {
  26223. return Object.keys(this.entries);
  26224. },
  26225. /**
  26226. * [description]
  26227. *
  26228. * @method Phaser.Structs.Map#values
  26229. * @since 3.0.0
  26230. *
  26231. * @genericUse {V[]} - [$return]
  26232. *
  26233. * @return {Array.<*>} [description]
  26234. */
  26235. values: function ()
  26236. {
  26237. var output = [];
  26238. var entries = this.entries;
  26239. for (var key in entries)
  26240. {
  26241. output.push(entries[key]);
  26242. }
  26243. return output;
  26244. },
  26245. /**
  26246. * [description]
  26247. *
  26248. * @method Phaser.Structs.Map#dump
  26249. * @since 3.0.0
  26250. */
  26251. dump: function ()
  26252. {
  26253. var entries = this.entries;
  26254. // eslint-disable-next-line no-console
  26255. console.group('Map');
  26256. for (var key in entries)
  26257. {
  26258. console.log(key, entries[key]);
  26259. }
  26260. // eslint-disable-next-line no-console
  26261. console.groupEnd();
  26262. },
  26263. /**
  26264. * [description]
  26265. *
  26266. * @method Phaser.Structs.Map#each
  26267. * @since 3.0.0
  26268. *
  26269. * @genericUse {EachMapCallback.<V>} - [callback]
  26270. * @genericUse {Phaser.Structs.Map.<K, V>} - [$return]
  26271. *
  26272. * @param {EachMapCallback} callback - [description]
  26273. *
  26274. * @return {Phaser.Structs.Map} This Map object.
  26275. */
  26276. each: function (callback)
  26277. {
  26278. var entries = this.entries;
  26279. for (var key in entries)
  26280. {
  26281. if (callback(key, entries[key]) === false)
  26282. {
  26283. break;
  26284. }
  26285. }
  26286. return this;
  26287. },
  26288. /**
  26289. * [description]
  26290. *
  26291. * @method Phaser.Structs.Map#contains
  26292. * @since 3.0.0
  26293. *
  26294. * @genericUse {V} - [value]
  26295. *
  26296. * @param {*} value - [description]
  26297. *
  26298. * @return {boolean} [description]
  26299. */
  26300. contains: function (value)
  26301. {
  26302. var entries = this.entries;
  26303. for (var key in entries)
  26304. {
  26305. if (entries[key] === value)
  26306. {
  26307. return true;
  26308. }
  26309. }
  26310. return false;
  26311. },
  26312. /**
  26313. * Merges all new keys from the given Map into this one
  26314. * If it encounters a key that already exists it will be skipped
  26315. * unless override = true.
  26316. *
  26317. * @method Phaser.Structs.Map#merge
  26318. * @since 3.0.0
  26319. *
  26320. * @genericUse {Phaser.Structs.Map.<K, V>} - [map,$return]
  26321. *
  26322. * @param {Phaser.Structs.Map} map - [description]
  26323. * @param {boolean} [override=false] - [description]
  26324. *
  26325. * @return {Phaser.Structs.Map} This Map object.
  26326. */
  26327. merge: function (map, override)
  26328. {
  26329. if (override === undefined) { override = false; }
  26330. var local = this.entries;
  26331. var source = map.entries;
  26332. for (var key in source)
  26333. {
  26334. if (local.hasOwnProperty(key) && override)
  26335. {
  26336. local[key] = source[key];
  26337. }
  26338. else
  26339. {
  26340. this.set(key, source[key]);
  26341. }
  26342. }
  26343. return this;
  26344. }
  26345. });
  26346. module.exports = Map;
  26347. /***/ }),
  26348. /* 126 */
  26349. /***/ (function(module, exports) {
  26350. /**
  26351. * The `Matter.Bounds` module contains methods for creating and manipulating axis-aligned bounding boxes (AABB).
  26352. *
  26353. * @class Bounds
  26354. */
  26355. var Bounds = {};
  26356. module.exports = Bounds;
  26357. (function() {
  26358. /**
  26359. * Creates a new axis-aligned bounding box (AABB) for the given vertices.
  26360. * @method create
  26361. * @param {vertices} vertices
  26362. * @return {bounds} A new bounds object
  26363. */
  26364. Bounds.create = function(vertices) {
  26365. var bounds = {
  26366. min: { x: 0, y: 0 },
  26367. max: { x: 0, y: 0 }
  26368. };
  26369. if (vertices)
  26370. Bounds.update(bounds, vertices);
  26371. return bounds;
  26372. };
  26373. /**
  26374. * Updates bounds using the given vertices and extends the bounds given a velocity.
  26375. * @method update
  26376. * @param {bounds} bounds
  26377. * @param {vertices} vertices
  26378. * @param {vector} velocity
  26379. */
  26380. Bounds.update = function(bounds, vertices, velocity) {
  26381. bounds.min.x = Infinity;
  26382. bounds.max.x = -Infinity;
  26383. bounds.min.y = Infinity;
  26384. bounds.max.y = -Infinity;
  26385. for (var i = 0; i < vertices.length; i++) {
  26386. var vertex = vertices[i];
  26387. if (vertex.x > bounds.max.x) bounds.max.x = vertex.x;
  26388. if (vertex.x < bounds.min.x) bounds.min.x = vertex.x;
  26389. if (vertex.y > bounds.max.y) bounds.max.y = vertex.y;
  26390. if (vertex.y < bounds.min.y) bounds.min.y = vertex.y;
  26391. }
  26392. if (velocity) {
  26393. if (velocity.x > 0) {
  26394. bounds.max.x += velocity.x;
  26395. } else {
  26396. bounds.min.x += velocity.x;
  26397. }
  26398. if (velocity.y > 0) {
  26399. bounds.max.y += velocity.y;
  26400. } else {
  26401. bounds.min.y += velocity.y;
  26402. }
  26403. }
  26404. };
  26405. /**
  26406. * Returns true if the bounds contains the given point.
  26407. * @method contains
  26408. * @param {bounds} bounds
  26409. * @param {vector} point
  26410. * @return {boolean} True if the bounds contain the point, otherwise false
  26411. */
  26412. Bounds.contains = function(bounds, point) {
  26413. return point.x >= bounds.min.x && point.x <= bounds.max.x
  26414. && point.y >= bounds.min.y && point.y <= bounds.max.y;
  26415. };
  26416. /**
  26417. * Returns true if the two bounds intersect.
  26418. * @method overlaps
  26419. * @param {bounds} boundsA
  26420. * @param {bounds} boundsB
  26421. * @return {boolean} True if the bounds overlap, otherwise false
  26422. */
  26423. Bounds.overlaps = function(boundsA, boundsB) {
  26424. return (boundsA.min.x <= boundsB.max.x && boundsA.max.x >= boundsB.min.x
  26425. && boundsA.max.y >= boundsB.min.y && boundsA.min.y <= boundsB.max.y);
  26426. };
  26427. /**
  26428. * Translates the bounds by the given vector.
  26429. * @method translate
  26430. * @param {bounds} bounds
  26431. * @param {vector} vector
  26432. */
  26433. Bounds.translate = function(bounds, vector) {
  26434. bounds.min.x += vector.x;
  26435. bounds.max.x += vector.x;
  26436. bounds.min.y += vector.y;
  26437. bounds.max.y += vector.y;
  26438. };
  26439. /**
  26440. * Shifts the bounds to the given position.
  26441. * @method shift
  26442. * @param {bounds} bounds
  26443. * @param {vector} position
  26444. */
  26445. Bounds.shift = function(bounds, position) {
  26446. var deltaX = bounds.max.x - bounds.min.x,
  26447. deltaY = bounds.max.y - bounds.min.y;
  26448. bounds.min.x = position.x;
  26449. bounds.max.x = position.x + deltaX;
  26450. bounds.min.y = position.y;
  26451. bounds.max.y = position.y + deltaY;
  26452. };
  26453. })();
  26454. /***/ }),
  26455. /* 127 */
  26456. /***/ (function(module, exports, __webpack_require__) {
  26457. /**
  26458. * The `Matter.Vertices` module contains methods for creating and manipulating sets of vertices.
  26459. * A set of vertices is an array of `Matter.Vector` with additional indexing properties inserted by `Vertices.create`.
  26460. * A `Matter.Body` maintains a set of vertices to represent the shape of the object (its convex hull).
  26461. *
  26462. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  26463. *
  26464. * @class Vertices
  26465. */
  26466. var Vertices = {};
  26467. module.exports = Vertices;
  26468. var Vector = __webpack_require__(106);
  26469. var Common = __webpack_require__(42);
  26470. (function() {
  26471. /**
  26472. * Creates a new set of `Matter.Body` compatible vertices.
  26473. * The `points` argument accepts an array of `Matter.Vector` points orientated around the origin `(0, 0)`, for example:
  26474. *
  26475. * [{ x: 0, y: 0 }, { x: 25, y: 50 }, { x: 50, y: 0 }]
  26476. *
  26477. * The `Vertices.create` method returns a new array of vertices, which are similar to Matter.Vector objects,
  26478. * but with some additional references required for efficient collision detection routines.
  26479. *
  26480. * Vertices must be specified in clockwise order.
  26481. *
  26482. * Note that the `body` argument is not optional, a `Matter.Body` reference must be provided.
  26483. *
  26484. * @method create
  26485. * @param {vector[]} points
  26486. * @param {body} body
  26487. */
  26488. Vertices.create = function(points, body) {
  26489. var vertices = [];
  26490. for (var i = 0; i < points.length; i++) {
  26491. var point = points[i],
  26492. vertex = {
  26493. x: point.x,
  26494. y: point.y,
  26495. index: i,
  26496. body: body,
  26497. isInternal: false,
  26498. contact: null
  26499. };
  26500. vertex.contact = {
  26501. vertex: vertex,
  26502. normalImpulse: 0,
  26503. tangentImpulse: 0
  26504. };
  26505. vertices.push(vertex);
  26506. }
  26507. return vertices;
  26508. };
  26509. /**
  26510. * Parses a string containing ordered x y pairs separated by spaces (and optionally commas),
  26511. * into a `Matter.Vertices` object for the given `Matter.Body`.
  26512. * For parsing SVG paths, see `Svg.pathToVertices`.
  26513. * @method fromPath
  26514. * @param {string} path
  26515. * @param {body} body
  26516. * @return {vertices} vertices
  26517. */
  26518. Vertices.fromPath = function(path, body) {
  26519. var pathPattern = /L?\s*([\-\d\.e]+)[\s,]*([\-\d\.e]+)*/ig,
  26520. points = [];
  26521. path.replace(pathPattern, function(match, x, y) {
  26522. points.push({ x: parseFloat(x), y: parseFloat(y) });
  26523. });
  26524. return Vertices.create(points, body);
  26525. };
  26526. /**
  26527. * Returns the centre (centroid) of the set of vertices.
  26528. * @method centre
  26529. * @param {vertices} vertices
  26530. * @return {vector} The centre point
  26531. */
  26532. Vertices.centre = function(vertices) {
  26533. var area = Vertices.area(vertices, true),
  26534. centre = { x: 0, y: 0 },
  26535. cross,
  26536. temp,
  26537. j;
  26538. for (var i = 0; i < vertices.length; i++) {
  26539. j = (i + 1) % vertices.length;
  26540. cross = Vector.cross(vertices[i], vertices[j]);
  26541. temp = Vector.mult(Vector.add(vertices[i], vertices[j]), cross);
  26542. centre = Vector.add(centre, temp);
  26543. }
  26544. return Vector.div(centre, 6 * area);
  26545. };
  26546. /**
  26547. * Returns the average (mean) of the set of vertices.
  26548. * @method mean
  26549. * @param {vertices} vertices
  26550. * @return {vector} The average point
  26551. */
  26552. Vertices.mean = function(vertices) {
  26553. var average = { x: 0, y: 0 };
  26554. for (var i = 0; i < vertices.length; i++) {
  26555. average.x += vertices[i].x;
  26556. average.y += vertices[i].y;
  26557. }
  26558. return Vector.div(average, vertices.length);
  26559. };
  26560. /**
  26561. * Returns the area of the set of vertices.
  26562. * @method area
  26563. * @param {vertices} vertices
  26564. * @param {bool} signed
  26565. * @return {number} The area
  26566. */
  26567. Vertices.area = function(vertices, signed) {
  26568. var area = 0,
  26569. j = vertices.length - 1;
  26570. for (var i = 0; i < vertices.length; i++) {
  26571. area += (vertices[j].x - vertices[i].x) * (vertices[j].y + vertices[i].y);
  26572. j = i;
  26573. }
  26574. if (signed)
  26575. return area / 2;
  26576. return Math.abs(area) / 2;
  26577. };
  26578. /**
  26579. * Returns the moment of inertia (second moment of area) of the set of vertices given the total mass.
  26580. * @method inertia
  26581. * @param {vertices} vertices
  26582. * @param {number} mass
  26583. * @return {number} The polygon's moment of inertia
  26584. */
  26585. Vertices.inertia = function(vertices, mass) {
  26586. var numerator = 0,
  26587. denominator = 0,
  26588. v = vertices,
  26589. cross,
  26590. j;
  26591. // find the polygon's moment of inertia, using second moment of area
  26592. // from equations at http://www.physicsforums.com/showthread.php?t=25293
  26593. for (var n = 0; n < v.length; n++) {
  26594. j = (n + 1) % v.length;
  26595. cross = Math.abs(Vector.cross(v[j], v[n]));
  26596. numerator += cross * (Vector.dot(v[j], v[j]) + Vector.dot(v[j], v[n]) + Vector.dot(v[n], v[n]));
  26597. denominator += cross;
  26598. }
  26599. return (mass / 6) * (numerator / denominator);
  26600. };
  26601. /**
  26602. * Translates the set of vertices in-place.
  26603. * @method translate
  26604. * @param {vertices} vertices
  26605. * @param {vector} vector
  26606. * @param {number} scalar
  26607. */
  26608. Vertices.translate = function(vertices, vector, scalar) {
  26609. var i;
  26610. if (scalar) {
  26611. for (i = 0; i < vertices.length; i++) {
  26612. vertices[i].x += vector.x * scalar;
  26613. vertices[i].y += vector.y * scalar;
  26614. }
  26615. } else {
  26616. for (i = 0; i < vertices.length; i++) {
  26617. vertices[i].x += vector.x;
  26618. vertices[i].y += vector.y;
  26619. }
  26620. }
  26621. return vertices;
  26622. };
  26623. /**
  26624. * Rotates the set of vertices in-place.
  26625. * @method rotate
  26626. * @param {vertices} vertices
  26627. * @param {number} angle
  26628. * @param {vector} point
  26629. */
  26630. Vertices.rotate = function(vertices, angle, point) {
  26631. if (angle === 0)
  26632. return;
  26633. var cos = Math.cos(angle),
  26634. sin = Math.sin(angle);
  26635. for (var i = 0; i < vertices.length; i++) {
  26636. var vertice = vertices[i],
  26637. dx = vertice.x - point.x,
  26638. dy = vertice.y - point.y;
  26639. vertice.x = point.x + (dx * cos - dy * sin);
  26640. vertice.y = point.y + (dx * sin + dy * cos);
  26641. }
  26642. return vertices;
  26643. };
  26644. /**
  26645. * Returns `true` if the `point` is inside the set of `vertices`.
  26646. * @method contains
  26647. * @param {vertices} vertices
  26648. * @param {vector} point
  26649. * @return {boolean} True if the vertices contains point, otherwise false
  26650. */
  26651. Vertices.contains = function(vertices, point) {
  26652. for (var i = 0; i < vertices.length; i++) {
  26653. var vertice = vertices[i],
  26654. nextVertice = vertices[(i + 1) % vertices.length];
  26655. if ((point.x - vertice.x) * (nextVertice.y - vertice.y) + (point.y - vertice.y) * (vertice.x - nextVertice.x) > 0) {
  26656. return false;
  26657. }
  26658. }
  26659. return true;
  26660. };
  26661. /**
  26662. * Scales the vertices from a point (default is centre) in-place.
  26663. * @method scale
  26664. * @param {vertices} vertices
  26665. * @param {number} scaleX
  26666. * @param {number} scaleY
  26667. * @param {vector} point
  26668. */
  26669. Vertices.scale = function(vertices, scaleX, scaleY, point) {
  26670. if (scaleX === 1 && scaleY === 1)
  26671. return vertices;
  26672. point = point || Vertices.centre(vertices);
  26673. var vertex,
  26674. delta;
  26675. for (var i = 0; i < vertices.length; i++) {
  26676. vertex = vertices[i];
  26677. delta = Vector.sub(vertex, point);
  26678. vertices[i].x = point.x + delta.x * scaleX;
  26679. vertices[i].y = point.y + delta.y * scaleY;
  26680. }
  26681. return vertices;
  26682. };
  26683. /**
  26684. * Chamfers a set of vertices by giving them rounded corners, returns a new set of vertices.
  26685. * The radius parameter is a single number or an array to specify the radius for each vertex.
  26686. * @method chamfer
  26687. * @param {vertices} vertices
  26688. * @param {number[]} radius
  26689. * @param {number} quality
  26690. * @param {number} qualityMin
  26691. * @param {number} qualityMax
  26692. */
  26693. Vertices.chamfer = function(vertices, radius, quality, qualityMin, qualityMax) {
  26694. if (typeof radius === 'number') {
  26695. radius = [radius];
  26696. } else {
  26697. radius = radius || [8];
  26698. }
  26699. if (!radius.length)
  26700. radius = [radius];
  26701. // quality defaults to -1, which is auto
  26702. quality = (typeof quality !== 'undefined') ? quality : -1;
  26703. qualityMin = qualityMin || 2;
  26704. qualityMax = qualityMax || 14;
  26705. var newVertices = [];
  26706. for (var i = 0; i < vertices.length; i++) {
  26707. var prevVertex = vertices[i - 1 >= 0 ? i - 1 : vertices.length - 1],
  26708. vertex = vertices[i],
  26709. nextVertex = vertices[(i + 1) % vertices.length],
  26710. currentRadius = radius[i < radius.length ? i : radius.length - 1];
  26711. if (currentRadius === 0) {
  26712. newVertices.push(vertex);
  26713. continue;
  26714. }
  26715. var prevNormal = Vector.normalise({
  26716. x: vertex.y - prevVertex.y,
  26717. y: prevVertex.x - vertex.x
  26718. });
  26719. var nextNormal = Vector.normalise({
  26720. x: nextVertex.y - vertex.y,
  26721. y: vertex.x - nextVertex.x
  26722. });
  26723. var diagonalRadius = Math.sqrt(2 * Math.pow(currentRadius, 2)),
  26724. radiusVector = Vector.mult(Common.clone(prevNormal), currentRadius),
  26725. midNormal = Vector.normalise(Vector.mult(Vector.add(prevNormal, nextNormal), 0.5)),
  26726. scaledVertex = Vector.sub(vertex, Vector.mult(midNormal, diagonalRadius));
  26727. var precision = quality;
  26728. if (quality === -1) {
  26729. // automatically decide precision
  26730. precision = Math.pow(currentRadius, 0.32) * 1.75;
  26731. }
  26732. precision = Common.clamp(precision, qualityMin, qualityMax);
  26733. // use an even value for precision, more likely to reduce axes by using symmetry
  26734. if (precision % 2 === 1)
  26735. precision += 1;
  26736. var alpha = Math.acos(Vector.dot(prevNormal, nextNormal)),
  26737. theta = alpha / precision;
  26738. for (var j = 0; j < precision; j++) {
  26739. newVertices.push(Vector.add(Vector.rotate(radiusVector, theta * j), scaledVertex));
  26740. }
  26741. }
  26742. return newVertices;
  26743. };
  26744. /**
  26745. * Sorts the input vertices into clockwise order in place.
  26746. * @method clockwiseSort
  26747. * @param {vertices} vertices
  26748. * @return {vertices} vertices
  26749. */
  26750. Vertices.clockwiseSort = function(vertices) {
  26751. var centre = Vertices.mean(vertices);
  26752. vertices.sort(function(vertexA, vertexB) {
  26753. return Vector.angle(centre, vertexA) - Vector.angle(centre, vertexB);
  26754. });
  26755. return vertices;
  26756. };
  26757. /**
  26758. * Returns true if the vertices form a convex shape (vertices must be in clockwise order).
  26759. * @method isConvex
  26760. * @param {vertices} vertices
  26761. * @return {bool} `true` if the `vertices` are convex, `false` if not (or `null` if not computable).
  26762. */
  26763. Vertices.isConvex = function(vertices) {
  26764. // http://paulbourke.net/geometry/polygonmesh/
  26765. // Copyright (c) Paul Bourke (use permitted)
  26766. var flag = 0,
  26767. n = vertices.length,
  26768. i,
  26769. j,
  26770. k,
  26771. z;
  26772. if (n < 3)
  26773. return null;
  26774. for (i = 0; i < n; i++) {
  26775. j = (i + 1) % n;
  26776. k = (i + 2) % n;
  26777. z = (vertices[j].x - vertices[i].x) * (vertices[k].y - vertices[j].y);
  26778. z -= (vertices[j].y - vertices[i].y) * (vertices[k].x - vertices[j].x);
  26779. if (z < 0) {
  26780. flag |= 1;
  26781. } else if (z > 0) {
  26782. flag |= 2;
  26783. }
  26784. if (flag === 3) {
  26785. return false;
  26786. }
  26787. }
  26788. if (flag !== 0){
  26789. return true;
  26790. } else {
  26791. return null;
  26792. }
  26793. };
  26794. /**
  26795. * Returns the convex hull of the input vertices as a new array of points.
  26796. * @method hull
  26797. * @param {vertices} vertices
  26798. * @return [vertex] vertices
  26799. */
  26800. Vertices.hull = function(vertices) {
  26801. // http://geomalgorithms.com/a10-_hull-1.html
  26802. var upper = [],
  26803. lower = [],
  26804. vertex,
  26805. i;
  26806. // sort vertices on x-axis (y-axis for ties)
  26807. vertices = vertices.slice(0);
  26808. vertices.sort(function(vertexA, vertexB) {
  26809. var dx = vertexA.x - vertexB.x;
  26810. return dx !== 0 ? dx : vertexA.y - vertexB.y;
  26811. });
  26812. // build lower hull
  26813. for (i = 0; i < vertices.length; i += 1) {
  26814. vertex = vertices[i];
  26815. while (lower.length >= 2
  26816. && Vector.cross3(lower[lower.length - 2], lower[lower.length - 1], vertex) <= 0) {
  26817. lower.pop();
  26818. }
  26819. lower.push(vertex);
  26820. }
  26821. // build upper hull
  26822. for (i = vertices.length - 1; i >= 0; i -= 1) {
  26823. vertex = vertices[i];
  26824. while (upper.length >= 2
  26825. && Vector.cross3(upper[upper.length - 2], upper[upper.length - 1], vertex) <= 0) {
  26826. upper.pop();
  26827. }
  26828. upper.push(vertex);
  26829. }
  26830. // concatenation of the lower and upper hulls gives the convex hull
  26831. // omit last points because they are repeated at the beginning of the other list
  26832. upper.pop();
  26833. lower.pop();
  26834. return upper.concat(lower);
  26835. };
  26836. })();
  26837. /***/ }),
  26838. /* 128 */
  26839. /***/ (function(module, exports, __webpack_require__) {
  26840. /**
  26841. * @author Richard Davey <rich@photonstorm.com>
  26842. * @copyright 2018 Photon Storm Ltd.
  26843. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  26844. */
  26845. var GetAdvancedValue = __webpack_require__(10);
  26846. /**
  26847. * Adds an Animation component to a Sprite and populates it based on the given config.
  26848. *
  26849. * @function Phaser.GameObjects.BuildGameObjectAnimation
  26850. * @since 3.0.0
  26851. *
  26852. * @param {Phaser.GameObjects.Sprite} sprite - The sprite to add an Animation component to.
  26853. * @param {object} config - The animation config.
  26854. *
  26855. * @return {Phaser.GameObjects.Sprite} The updated Sprite.
  26856. */
  26857. var BuildGameObjectAnimation = function (sprite, config)
  26858. {
  26859. var animConfig = GetAdvancedValue(config, 'anims', null);
  26860. if (animConfig === null)
  26861. {
  26862. return sprite;
  26863. }
  26864. if (typeof animConfig === 'string')
  26865. {
  26866. // { anims: 'key' }
  26867. sprite.anims.play(animConfig);
  26868. }
  26869. else if (typeof animConfig === 'object')
  26870. {
  26871. // { anims: {
  26872. // key: string
  26873. // startFrame: [string|integer]
  26874. // delay: [float]
  26875. // repeat: [integer]
  26876. // repeatDelay: [float]
  26877. // yoyo: [boolean]
  26878. // play: [boolean]
  26879. // delayedPlay: [boolean]
  26880. // }
  26881. // }
  26882. var anims = sprite.anims;
  26883. var key = GetAdvancedValue(animConfig, 'key', undefined);
  26884. var startFrame = GetAdvancedValue(animConfig, 'startFrame', undefined);
  26885. var delay = GetAdvancedValue(animConfig, 'delay', 0);
  26886. var repeat = GetAdvancedValue(animConfig, 'repeat', 0);
  26887. var repeatDelay = GetAdvancedValue(animConfig, 'repeatDelay', 0);
  26888. var yoyo = GetAdvancedValue(animConfig, 'yoyo', false);
  26889. var play = GetAdvancedValue(animConfig, 'play', false);
  26890. var delayedPlay = GetAdvancedValue(animConfig, 'delayedPlay', 0);
  26891. anims.setDelay(delay);
  26892. anims.setRepeat(repeat);
  26893. anims.setRepeatDelay(repeatDelay);
  26894. anims.setYoyo(yoyo);
  26895. if (play)
  26896. {
  26897. anims.play(key, startFrame);
  26898. }
  26899. else if (delayedPlay > 0)
  26900. {
  26901. anims.delayedPlay(delayedPlay, key, startFrame);
  26902. }
  26903. else
  26904. {
  26905. anims.load(key);
  26906. }
  26907. }
  26908. return sprite;
  26909. };
  26910. module.exports = BuildGameObjectAnimation;
  26911. /***/ }),
  26912. /* 129 */
  26913. /***/ (function(module, exports, __webpack_require__) {
  26914. /**
  26915. * @author Richard Davey <rich@photonstorm.com>
  26916. * @copyright 2018 Photon Storm Ltd.
  26917. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  26918. */
  26919. var Class = __webpack_require__(0);
  26920. var Clamp = __webpack_require__(19);
  26921. var Extend = __webpack_require__(16);
  26922. /**
  26923. * @classdesc
  26924. * A Frame is a section of a Texture.
  26925. *
  26926. * @class Frame
  26927. * @memberOf Phaser.Textures
  26928. * @constructor
  26929. * @since 3.0.0
  26930. *
  26931. * @param {Phaser.Textures.Texture} texture - The Texture this Frame is a part of.
  26932. * @param {(integer|string)} name - The name of this Frame. The name is unique within the Texture.
  26933. * @param {integer} sourceIndex - The index of the TextureSource that this Frame is a part of.
  26934. * @param {number} x - The x coordinate of the top-left of this Frame.
  26935. * @param {number} y - The y coordinate of the top-left of this Frame.
  26936. * @param {number} width - The width of this Frame.
  26937. * @param {number} height - The height of this Frame.
  26938. */
  26939. var Frame = new Class({
  26940. initialize:
  26941. function Frame (texture, name, sourceIndex, x, y, width, height)
  26942. {
  26943. /**
  26944. * The Texture this Frame is a part of.
  26945. *
  26946. * @name Phaser.Textures.Frame#texture
  26947. * @type {Phaser.Textures.Texture}
  26948. * @since 3.0.0
  26949. */
  26950. this.texture = texture;
  26951. /**
  26952. * The name of this Frame.
  26953. * The name is unique within the Texture.
  26954. *
  26955. * @name Phaser.Textures.Frame#name
  26956. * @type {string}
  26957. * @since 3.0.0
  26958. */
  26959. this.name = name;
  26960. /**
  26961. * The TextureSource this Frame is part of.
  26962. *
  26963. * @name Phaser.Textures.Frame#source
  26964. * @type {Phaser.Textures.TextureSource}
  26965. * @since 3.0.0
  26966. */
  26967. this.source = texture.source[sourceIndex];
  26968. /**
  26969. * The index of the TextureSource in the Texture sources array.
  26970. *
  26971. * @name Phaser.Textures.Frame#sourceIndex
  26972. * @type {integer}
  26973. * @since 3.0.0
  26974. */
  26975. this.sourceIndex = sourceIndex;
  26976. /**
  26977. * A reference to the Texture Source WebGL Texture that this Frame is using.
  26978. *
  26979. * @name Phaser.Textures.Frame#glTexture
  26980. * @type {?WebGLTexture}
  26981. * @default null
  26982. * @since 3.11.0
  26983. */
  26984. this.glTexture = this.source.glTexture;
  26985. /**
  26986. * X position within the source image to cut from.
  26987. *
  26988. * @name Phaser.Textures.Frame#cutX
  26989. * @type {integer}
  26990. * @since 3.0.0
  26991. */
  26992. this.cutX;
  26993. /**
  26994. * Y position within the source image to cut from.
  26995. *
  26996. * @name Phaser.Textures.Frame#cutY
  26997. * @type {integer}
  26998. * @since 3.0.0
  26999. */
  27000. this.cutY;
  27001. /**
  27002. * The width of the area in the source image to cut.
  27003. *
  27004. * @name Phaser.Textures.Frame#cutWidth
  27005. * @type {integer}
  27006. * @since 3.0.0
  27007. */
  27008. this.cutWidth;
  27009. /**
  27010. * The height of the area in the source image to cut.
  27011. *
  27012. * @name Phaser.Textures.Frame#cutHeight
  27013. * @type {integer}
  27014. * @since 3.0.0
  27015. */
  27016. this.cutHeight;
  27017. /**
  27018. * The X rendering offset of this Frame, taking trim into account.
  27019. *
  27020. * @name Phaser.Textures.Frame#x
  27021. * @type {integer}
  27022. * @default 0
  27023. * @since 3.0.0
  27024. */
  27025. this.x = 0;
  27026. /**
  27027. * The Y rendering offset of this Frame, taking trim into account.
  27028. *
  27029. * @name Phaser.Textures.Frame#y
  27030. * @type {integer}
  27031. * @default 0
  27032. * @since 3.0.0
  27033. */
  27034. this.y = 0;
  27035. /**
  27036. * The rendering width of this Frame, taking trim into account.
  27037. *
  27038. * @name Phaser.Textures.Frame#width
  27039. * @type {integer}
  27040. * @since 3.0.0
  27041. */
  27042. this.width;
  27043. /**
  27044. * The rendering height of this Frame, taking trim into account.
  27045. *
  27046. * @name Phaser.Textures.Frame#height
  27047. * @type {integer}
  27048. * @since 3.0.0
  27049. */
  27050. this.height;
  27051. /**
  27052. * Half the width, floored.
  27053. * Precalculated for the renderer.
  27054. *
  27055. * @name Phaser.Textures.Frame#halfWidth
  27056. * @type {integer}
  27057. * @since 3.0.0
  27058. */
  27059. this.halfWidth;
  27060. /**
  27061. * Half the height, floored.
  27062. * Precalculated for the renderer.
  27063. *
  27064. * @name Phaser.Textures.Frame#halfHeight
  27065. * @type {integer}
  27066. * @since 3.0.0
  27067. */
  27068. this.halfHeight;
  27069. /**
  27070. * The x center of this frame, floored.
  27071. *
  27072. * @name Phaser.Textures.Frame#centerX
  27073. * @type {integer}
  27074. * @since 3.0.0
  27075. */
  27076. this.centerX;
  27077. /**
  27078. * The y center of this frame, floored.
  27079. *
  27080. * @name Phaser.Textures.Frame#centerY
  27081. * @type {integer}
  27082. * @since 3.0.0
  27083. */
  27084. this.centerY;
  27085. /**
  27086. * The horizontal pivot point of this Frame.
  27087. *
  27088. * @name Phaser.Textures.Frame#pivotX
  27089. * @type {number}
  27090. * @default 0
  27091. * @since 3.0.0
  27092. */
  27093. this.pivotX = 0;
  27094. /**
  27095. * The vertical pivot point of this Frame.
  27096. *
  27097. * @name Phaser.Textures.Frame#pivotY
  27098. * @type {number}
  27099. * @default 0
  27100. * @since 3.0.0
  27101. */
  27102. this.pivotY = 0;
  27103. /**
  27104. * Does this Frame have a custom pivot point?
  27105. *
  27106. * @name Phaser.Textures.Frame#customPivot
  27107. * @type {boolean}
  27108. * @default false
  27109. * @since 3.0.0
  27110. */
  27111. this.customPivot = false;
  27112. /**
  27113. * **CURRENTLY UNSUPPORTED**
  27114. *
  27115. * Is this frame is rotated or not in the Texture?
  27116. * Rotation allows you to use rotated frames in texture atlas packing.
  27117. * It has nothing to do with Sprite rotation.
  27118. *
  27119. * @name Phaser.Textures.Frame#rotated
  27120. * @type {boolean}
  27121. * @default false
  27122. * @since 3.0.0
  27123. */
  27124. this.rotated = false;
  27125. /**
  27126. * Over-rides the Renderer setting.
  27127. * -1 = use Renderer Setting
  27128. * 0 = No rounding
  27129. * 1 = Round
  27130. *
  27131. * @name Phaser.Textures.Frame#autoRound
  27132. * @type {integer}
  27133. * @default -1
  27134. * @since 3.0.0
  27135. */
  27136. this.autoRound = -1;
  27137. /**
  27138. * Any Frame specific custom data can be stored here.
  27139. *
  27140. * @name Phaser.Textures.Frame#customData
  27141. * @type {object}
  27142. * @since 3.0.0
  27143. */
  27144. this.customData = {};
  27145. /**
  27146. * WebGL UV u0 value.
  27147. *
  27148. * @name Phaser.Textures.Frame#u0
  27149. * @type {number}
  27150. * @default 0
  27151. * @since 3.11.0
  27152. */
  27153. this.u0 = 0;
  27154. /**
  27155. * WebGL UV v0 value.
  27156. *
  27157. * @name Phaser.Textures.Frame#v0
  27158. * @type {number}
  27159. * @default 0
  27160. * @since 3.11.0
  27161. */
  27162. this.v0 = 0;
  27163. /**
  27164. * WebGL UV u1 value.
  27165. *
  27166. * @name Phaser.Textures.Frame#u1
  27167. * @type {number}
  27168. * @default 0
  27169. * @since 3.11.0
  27170. */
  27171. this.u1 = 0;
  27172. /**
  27173. * WebGL UV v1 value.
  27174. *
  27175. * @name Phaser.Textures.Frame#v1
  27176. * @type {number}
  27177. * @default 0
  27178. * @since 3.11.0
  27179. */
  27180. this.v1 = 0;
  27181. /**
  27182. * The un-modified source frame, trim and UV data.
  27183. *
  27184. * @name Phaser.Textures.Frame#data
  27185. * @type {object}
  27186. * @private
  27187. * @since 3.0.0
  27188. */
  27189. this.data = {
  27190. cut: {
  27191. x: 0,
  27192. y: 0,
  27193. w: 0,
  27194. h: 0,
  27195. r: 0,
  27196. b: 0
  27197. },
  27198. trim: false,
  27199. sourceSize: {
  27200. w: 0,
  27201. h: 0
  27202. },
  27203. spriteSourceSize: {
  27204. x: 0,
  27205. y: 0,
  27206. w: 0,
  27207. h: 0,
  27208. r: 0,
  27209. b: 0
  27210. },
  27211. radius: 0,
  27212. drawImage: {
  27213. x: 0,
  27214. y: 0,
  27215. width: 0,
  27216. height: 0
  27217. }
  27218. };
  27219. this.setSize(width, height, x, y);
  27220. },
  27221. /**
  27222. * Sets the width, height, x and y of this Frame.
  27223. *
  27224. * This is called automatically by the constructor
  27225. * and should rarely be changed on-the-fly.
  27226. *
  27227. * @method Phaser.Textures.Frame#setSize
  27228. * @since 3.7.0
  27229. *
  27230. * @param {integer} width - The width of the frame before being trimmed.
  27231. * @param {integer} height - The height of the frame before being trimmed.
  27232. * @param {integer} [x=0] - The x coordinate of the top-left of this Frame.
  27233. * @param {integer} [y=0] - The y coordinate of the top-left of this Frame.
  27234. *
  27235. * @return {Phaser.Textures.Frame} This Frame object.
  27236. */
  27237. setSize: function (width, height, x, y)
  27238. {
  27239. if (x === undefined) { x = 0; }
  27240. if (y === undefined) { y = 0; }
  27241. this.cutX = x;
  27242. this.cutY = y;
  27243. this.cutWidth = width;
  27244. this.cutHeight = height;
  27245. this.width = width;
  27246. this.height = height;
  27247. this.halfWidth = Math.floor(width * 0.5);
  27248. this.halfHeight = Math.floor(height * 0.5);
  27249. this.centerX = Math.floor(width / 2);
  27250. this.centerY = Math.floor(height / 2);
  27251. var data = this.data;
  27252. var cut = data.cut;
  27253. cut.x = x;
  27254. cut.y = y;
  27255. cut.w = width;
  27256. cut.h = height;
  27257. cut.r = x + width;
  27258. cut.b = y + height;
  27259. data.sourceSize.w = width;
  27260. data.sourceSize.h = height;
  27261. data.spriteSourceSize.w = width;
  27262. data.spriteSourceSize.h = height;
  27263. data.radius = 0.5 * Math.sqrt(width * width + height * height);
  27264. var drawImage = data.drawImage;
  27265. drawImage.x = x;
  27266. drawImage.y = y;
  27267. drawImage.width = width;
  27268. drawImage.height = height;
  27269. return this.updateUVs();
  27270. },
  27271. /**
  27272. * If the frame was trimmed when added to the Texture Atlas, this records the trim and source data.
  27273. *
  27274. * @method Phaser.Textures.Frame#setTrim
  27275. * @since 3.0.0
  27276. *
  27277. * @param {number} actualWidth - The width of the frame before being trimmed.
  27278. * @param {number} actualHeight - The height of the frame before being trimmed.
  27279. * @param {number} destX - The destination X position of the trimmed frame for display.
  27280. * @param {number} destY - The destination Y position of the trimmed frame for display.
  27281. * @param {number} destWidth - The destination width of the trimmed frame for display.
  27282. * @param {number} destHeight - The destination height of the trimmed frame for display.
  27283. *
  27284. * @return {Phaser.Textures.Frame} This Frame object.
  27285. */
  27286. setTrim: function (actualWidth, actualHeight, destX, destY, destWidth, destHeight)
  27287. {
  27288. var data = this.data;
  27289. var ss = data.spriteSourceSize;
  27290. // Store actual values
  27291. data.trim = true;
  27292. data.sourceSize.w = actualWidth;
  27293. data.sourceSize.h = actualHeight;
  27294. ss.x = destX;
  27295. ss.y = destY;
  27296. ss.w = destWidth;
  27297. ss.h = destHeight;
  27298. ss.r = destX + destWidth;
  27299. ss.b = destY + destHeight;
  27300. // Adjust properties
  27301. this.x = destX;
  27302. this.y = destY;
  27303. this.width = destWidth;
  27304. this.height = destHeight;
  27305. this.halfWidth = destWidth * 0.5;
  27306. this.halfHeight = destHeight * 0.5;
  27307. this.centerX = Math.floor(destWidth / 2);
  27308. this.centerY = Math.floor(destHeight / 2);
  27309. return this.updateUVs();
  27310. },
  27311. /**
  27312. * Takes a crop data object and, based on the rectangular region given, calculates the
  27313. * required UV coordinates in order to crop this Frame for WebGL and Canvas rendering.
  27314. *
  27315. * This is called directly by the Game Object Texture Components `setCrop` method.
  27316. * Please use that method to crop a Game Object.
  27317. *
  27318. * @method Phaser.Textures.Frame#setCropUVs
  27319. * @since 3.11.0
  27320. *
  27321. * @param {object} crop - The crop data object. This is the `GameObject._crop` property.
  27322. * @param {number} x - The x coordinate to start the crop from. Cannot be negative or exceed the Frame width.
  27323. * @param {number} y - The y coordinate to start the crop from. Cannot be negative or exceed the Frame height.
  27324. * @param {number} width - The width of the crop rectangle. Cannot exceed the Frame width.
  27325. * @param {number} height - The height of the crop rectangle. Cannot exceed the Frame height.
  27326. * @param {boolean} flipX - Does the parent Game Object have flipX set?
  27327. * @param {boolean} flipY - Does the parent Game Object have flipY set?
  27328. *
  27329. * @return {object} The updated crop data object.
  27330. */
  27331. setCropUVs: function (crop, x, y, width, height, flipX, flipY)
  27332. {
  27333. // Clamp the input values
  27334. var cx = this.cutX;
  27335. var cy = this.cutY;
  27336. var cw = this.cutWidth;
  27337. var ch = this.cutHeight;
  27338. var rw = this.realWidth;
  27339. var rh = this.realHeight;
  27340. x = Clamp(x, 0, rw);
  27341. y = Clamp(y, 0, rh);
  27342. width = Clamp(width, 0, rw - x);
  27343. height = Clamp(height, 0, rh - y);
  27344. var ox = cx + x;
  27345. var oy = cy + y;
  27346. var ow = width;
  27347. var oh = height;
  27348. var data = this.data;
  27349. if (data.trim)
  27350. {
  27351. var ss = data.spriteSourceSize;
  27352. // Need to check for intersection between the cut area and the crop area
  27353. // If there is none, we set UV to be empty, otherwise set it to be the intersection area
  27354. var cropRight = x + width;
  27355. var cropBottom = y + height;
  27356. var intersects = !(ss.r < x || ss.b < y || ss.x > cropRight || ss.y > cropBottom);
  27357. if (intersects)
  27358. {
  27359. var ix = Math.max(ss.x, x);
  27360. var iy = Math.max(ss.y, y);
  27361. var iw = Math.min(ss.r, cropRight) - ix;
  27362. var ih = Math.min(ss.b, cropBottom) - iy;
  27363. ow = iw;
  27364. oh = ih;
  27365. if (flipX)
  27366. {
  27367. ox = cx + (cw - (ix - ss.x) - iw);
  27368. }
  27369. else
  27370. {
  27371. ox = cx + (ix - ss.x);
  27372. }
  27373. if (flipY)
  27374. {
  27375. oy = cy + (ch - (iy - ss.y) - ih);
  27376. }
  27377. else
  27378. {
  27379. oy = cy + (iy - ss.y);
  27380. }
  27381. x = ix;
  27382. y = iy;
  27383. width = iw;
  27384. height = ih;
  27385. }
  27386. else
  27387. {
  27388. ox = 0;
  27389. oy = 0;
  27390. ow = 0;
  27391. oh = 0;
  27392. }
  27393. }
  27394. else
  27395. {
  27396. if (flipX)
  27397. {
  27398. ox = cx + (cw - x - width);
  27399. }
  27400. if (flipY)
  27401. {
  27402. oy = cy + (ch - y - height);
  27403. }
  27404. }
  27405. var tw = this.source.width;
  27406. var th = this.source.height;
  27407. // Map the given coordinates into UV space, clamping to the 0-1 range.
  27408. crop.u0 = Math.max(0, ox / tw);
  27409. crop.v0 = Math.max(0, oy / th);
  27410. crop.u1 = Math.min(1, (ox + ow) / tw);
  27411. crop.v1 = Math.min(1, (oy + oh) / th);
  27412. crop.x = x;
  27413. crop.y = y;
  27414. crop.cx = ox;
  27415. crop.cy = oy;
  27416. crop.cw = ow;
  27417. crop.ch = oh;
  27418. crop.width = width;
  27419. crop.height = height;
  27420. crop.flipX = flipX;
  27421. crop.flipY = flipY;
  27422. return crop;
  27423. },
  27424. /**
  27425. * Takes a crop data object and recalculates the UVs based on the dimensions inside the crop object.
  27426. * Called automatically by `setFrame`.
  27427. *
  27428. * @method Phaser.Textures.Frame#updateCropUVs
  27429. * @since 3.11.0
  27430. *
  27431. * @param {object} crop - The crop data object. This is the `GameObject._crop` property.
  27432. * @param {boolean} flipX - Does the parent Game Object have flipX set?
  27433. * @param {boolean} flipY - Does the parent Game Object have flipY set?
  27434. *
  27435. * @return {object} The updated crop data object.
  27436. */
  27437. updateCropUVs: function (crop, flipX, flipY)
  27438. {
  27439. return this.setCropUVs(crop, crop.x, crop.y, crop.width, crop.height, flipX, flipY);
  27440. },
  27441. /**
  27442. * Updates the internal WebGL UV cache and the drawImage cache.
  27443. *
  27444. * @method Phaser.Textures.Frame#updateUVs
  27445. * @since 3.0.0
  27446. *
  27447. * @return {Phaser.Textures.Frame} This Frame object.
  27448. */
  27449. updateUVs: function ()
  27450. {
  27451. var cx = this.cutX;
  27452. var cy = this.cutY;
  27453. var cw = this.cutWidth;
  27454. var ch = this.cutHeight;
  27455. // Canvas data
  27456. var cd = this.data.drawImage;
  27457. cd.width = cw;
  27458. cd.height = ch;
  27459. // WebGL data
  27460. var tw = this.source.width;
  27461. var th = this.source.height;
  27462. this.u0 = cx / tw;
  27463. this.v0 = cy / th;
  27464. this.u1 = (cx + cw) / tw;
  27465. this.v1 = (cy + ch) / th;
  27466. return this;
  27467. },
  27468. /**
  27469. * Updates the internal WebGL UV cache.
  27470. *
  27471. * @method Phaser.Textures.Frame#updateUVsInverted
  27472. * @since 3.0.0
  27473. *
  27474. * @return {Phaser.Textures.Frame} This Frame object.
  27475. */
  27476. updateUVsInverted: function ()
  27477. {
  27478. var tw = this.source.width;
  27479. var th = this.source.height;
  27480. this.u0 = (this.cutX + this.cutHeight) / tw;
  27481. this.v0 = this.cutY / th;
  27482. this.u1 = this.cutX / tw;
  27483. this.v1 = (this.cutY + this.cutWidth) / th;
  27484. return this;
  27485. },
  27486. /**
  27487. * Clones this Frame into a new Frame object.
  27488. *
  27489. * @method Phaser.Textures.Frame#clone
  27490. * @since 3.0.0
  27491. *
  27492. * @return {Phaser.Textures.Frame} A clone of this Frame.
  27493. */
  27494. clone: function ()
  27495. {
  27496. var clone = new Frame(this.texture, this.name, this.sourceIndex);
  27497. clone.cutX = this.cutX;
  27498. clone.cutY = this.cutY;
  27499. clone.cutWidth = this.cutWidth;
  27500. clone.cutHeight = this.cutHeight;
  27501. clone.x = this.x;
  27502. clone.y = this.y;
  27503. clone.width = this.width;
  27504. clone.height = this.height;
  27505. clone.halfWidth = this.halfWidth;
  27506. clone.halfHeight = this.halfHeight;
  27507. clone.centerX = this.centerX;
  27508. clone.centerY = this.centerY;
  27509. clone.rotated = this.rotated;
  27510. clone.data = Extend(true, clone.data, this.data);
  27511. clone.updateUVs();
  27512. return clone;
  27513. },
  27514. /**
  27515. * Destroys this Frames references.
  27516. *
  27517. * @method Phaser.Textures.Frame#destroy
  27518. * @since 3.0.0
  27519. */
  27520. destroy: function ()
  27521. {
  27522. this.texture = null;
  27523. this.source = null;
  27524. },
  27525. /**
  27526. * The width of the Frame in its un-trimmed, un-padded state, as prepared in the art package,
  27527. * before being packed.
  27528. *
  27529. * @name Phaser.Textures.Frame#realWidth
  27530. * @type {number}
  27531. * @readOnly
  27532. * @since 3.0.0
  27533. */
  27534. realWidth: {
  27535. get: function ()
  27536. {
  27537. return this.data.sourceSize.w;
  27538. }
  27539. },
  27540. /**
  27541. * The height of the Frame in its un-trimmed, un-padded state, as prepared in the art package,
  27542. * before being packed.
  27543. *
  27544. * @name Phaser.Textures.Frame#realHeight
  27545. * @type {number}
  27546. * @readOnly
  27547. * @since 3.0.0
  27548. */
  27549. realHeight: {
  27550. get: function ()
  27551. {
  27552. return this.data.sourceSize.h;
  27553. }
  27554. },
  27555. /**
  27556. * The radius of the Frame (derived from sqrt(w * w + h * h) / 2)
  27557. *
  27558. * @name Phaser.Textures.Frame#radius
  27559. * @type {number}
  27560. * @readOnly
  27561. * @since 3.0.0
  27562. */
  27563. radius: {
  27564. get: function ()
  27565. {
  27566. return this.data.radius;
  27567. }
  27568. },
  27569. /**
  27570. * Is the Frame trimmed or not?
  27571. *
  27572. * @name Phaser.Textures.Frame#trimmed
  27573. * @type {boolean}
  27574. * @readOnly
  27575. * @since 3.0.0
  27576. */
  27577. trimmed: {
  27578. get: function ()
  27579. {
  27580. return this.data.trim;
  27581. }
  27582. },
  27583. /**
  27584. * The Canvas drawImage data object.
  27585. *
  27586. * @name Phaser.Textures.Frame#canvasData
  27587. * @type {object}
  27588. * @readOnly
  27589. * @since 3.0.0
  27590. */
  27591. canvasData: {
  27592. get: function ()
  27593. {
  27594. return this.data.drawImage;
  27595. }
  27596. }
  27597. });
  27598. module.exports = Frame;
  27599. /***/ }),
  27600. /* 130 */
  27601. /***/ (function(module, exports, __webpack_require__) {
  27602. /**
  27603. * @author Richard Davey <rich@photonstorm.com>
  27604. * @author Felipe Alfonso <@bitnenfer>
  27605. * @copyright 2018 Photon Storm Ltd.
  27606. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  27607. */
  27608. var Class = __webpack_require__(0);
  27609. var GetFastValue = __webpack_require__(1);
  27610. var ModelViewProjection = __webpack_require__(207);
  27611. var TransformMatrix = __webpack_require__(32);
  27612. var ShaderSourceFS = __webpack_require__(496);
  27613. var ShaderSourceVS = __webpack_require__(495);
  27614. var Utils = __webpack_require__(21);
  27615. var WebGLPipeline = __webpack_require__(84);
  27616. /**
  27617. * @classdesc
  27618. * TextureTintPipeline implements the rendering infrastructure
  27619. * for displaying textured objects
  27620. * The config properties are:
  27621. * - game: Current game instance.
  27622. * - renderer: Current WebGL renderer.
  27623. * - topology: This indicates how the primitives are rendered. The default value is GL_TRIANGLES.
  27624. * Here is the full list of rendering primitives (https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants).
  27625. * - vertShader: Source for vertex shader as a string.
  27626. * - fragShader: Source for fragment shader as a string.
  27627. * - vertexCapacity: The amount of vertices that shall be allocated
  27628. * - vertexSize: The size of a single vertex in bytes.
  27629. *
  27630. * @class TextureTintPipeline
  27631. * @extends Phaser.Renderer.WebGL.WebGLPipeline
  27632. * @memberOf Phaser.Renderer.WebGL.Pipelines
  27633. * @constructor
  27634. * @since 3.0.0
  27635. *
  27636. * @param {object} config - [description]
  27637. */
  27638. var TextureTintPipeline = new Class({
  27639. Extends: WebGLPipeline,
  27640. Mixins: [
  27641. ModelViewProjection
  27642. ],
  27643. initialize:
  27644. function TextureTintPipeline (config)
  27645. {
  27646. var rendererConfig = config.renderer.config;
  27647. // Vertex Size = attribute size added together (2 + 2 + 1 + 4)
  27648. WebGLPipeline.call(this, {
  27649. game: config.game,
  27650. renderer: config.renderer,
  27651. gl: config.renderer.gl,
  27652. topology: GetFastValue(config, 'topology', config.renderer.gl.TRIANGLES),
  27653. vertShader: GetFastValue(config, 'vertShader', ShaderSourceVS),
  27654. fragShader: GetFastValue(config, 'fragShader', ShaderSourceFS),
  27655. vertexCapacity: GetFastValue(config, 'vertexCapacity', 6 * rendererConfig.batchSize),
  27656. vertexSize: GetFastValue(config, 'vertexSize', Float32Array.BYTES_PER_ELEMENT * 5 + Uint8Array.BYTES_PER_ELEMENT * 4),
  27657. attributes: [
  27658. {
  27659. name: 'inPosition',
  27660. size: 2,
  27661. type: config.renderer.gl.FLOAT,
  27662. normalized: false,
  27663. offset: 0
  27664. },
  27665. {
  27666. name: 'inTexCoord',
  27667. size: 2,
  27668. type: config.renderer.gl.FLOAT,
  27669. normalized: false,
  27670. offset: Float32Array.BYTES_PER_ELEMENT * 2
  27671. },
  27672. {
  27673. name: 'inTintEffect',
  27674. size: 1,
  27675. type: config.renderer.gl.FLOAT,
  27676. normalized: false,
  27677. offset: Float32Array.BYTES_PER_ELEMENT * 4
  27678. },
  27679. {
  27680. name: 'inTint',
  27681. size: 4,
  27682. type: config.renderer.gl.UNSIGNED_BYTE,
  27683. normalized: true,
  27684. offset: Float32Array.BYTES_PER_ELEMENT * 5
  27685. }
  27686. ]
  27687. });
  27688. /**
  27689. * Float32 view of the array buffer containing the pipeline's vertices.
  27690. *
  27691. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#vertexViewF32
  27692. * @type {Float32Array}
  27693. * @since 3.0.0
  27694. */
  27695. this.vertexViewF32 = new Float32Array(this.vertexData);
  27696. /**
  27697. * Uint32 view of the array buffer containing the pipeline's vertices.
  27698. *
  27699. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#vertexViewU32
  27700. * @type {Uint32Array}
  27701. * @since 3.0.0
  27702. */
  27703. this.vertexViewU32 = new Uint32Array(this.vertexData);
  27704. /**
  27705. * Size of the batch.
  27706. *
  27707. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#maxQuads
  27708. * @type {integer}
  27709. * @since 3.0.0
  27710. */
  27711. this.maxQuads = rendererConfig.batchSize;
  27712. /**
  27713. * Collection of batch information
  27714. *
  27715. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batches
  27716. * @type {array}
  27717. * @since 3.1.0
  27718. */
  27719. this.batches = [];
  27720. /**
  27721. * A temporary Transform Matrix, re-used internally during batching.
  27722. *
  27723. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#_tempMatrix1
  27724. * @private
  27725. * @type {Phaser.GameObjects.Components.TransformMatrix}
  27726. * @since 3.11.0
  27727. */
  27728. this._tempMatrix1 = new TransformMatrix();
  27729. /**
  27730. * A temporary Transform Matrix, re-used internally during batching.
  27731. *
  27732. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#_tempMatrix2
  27733. * @private
  27734. * @type {Phaser.GameObjects.Components.TransformMatrix}
  27735. * @since 3.11.0
  27736. */
  27737. this._tempMatrix2 = new TransformMatrix();
  27738. /**
  27739. * A temporary Transform Matrix, re-used internally during batching.
  27740. *
  27741. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#_tempMatrix3
  27742. * @private
  27743. * @type {Phaser.GameObjects.Components.TransformMatrix}
  27744. * @since 3.11.0
  27745. */
  27746. this._tempMatrix3 = new TransformMatrix();
  27747. /**
  27748. * A temporary Transform Matrix, re-used internally during batching.
  27749. *
  27750. * @name Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#_tempMatrix4
  27751. * @private
  27752. * @type {Phaser.GameObjects.Components.TransformMatrix}
  27753. * @since 3.11.0
  27754. */
  27755. this._tempMatrix4 = new TransformMatrix();
  27756. this.mvpInit();
  27757. },
  27758. /**
  27759. * Assigns a texture to the current batch. If a texture is already set it creates
  27760. * a new batch object.
  27761. *
  27762. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#setTexture2D
  27763. * @since 3.1.0
  27764. *
  27765. * @param {WebGLTexture} texture - WebGLTexture that will be assigned to the current batch.
  27766. * @param {integer} textureUnit - Texture unit to which the texture needs to be bound.
  27767. *
  27768. * @return {Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline} This pipeline instance.
  27769. */
  27770. setTexture2D: function (texture, unit)
  27771. {
  27772. if (!texture)
  27773. {
  27774. return this;
  27775. }
  27776. var batches = this.batches;
  27777. if (batches.length === 0)
  27778. {
  27779. this.pushBatch();
  27780. }
  27781. var batch = batches[batches.length - 1];
  27782. if (unit > 0)
  27783. {
  27784. if (batch.textures[unit - 1] &&
  27785. batch.textures[unit - 1] !== texture)
  27786. {
  27787. this.pushBatch();
  27788. }
  27789. batches[batches.length - 1].textures[unit - 1] = texture;
  27790. }
  27791. else
  27792. {
  27793. if (batch.texture !== null &&
  27794. batch.texture !== texture)
  27795. {
  27796. this.pushBatch();
  27797. }
  27798. batches[batches.length - 1].texture = texture;
  27799. }
  27800. return this;
  27801. },
  27802. /**
  27803. * Creates a new batch object and pushes it to a batch array.
  27804. * The batch object contains information relevant to the current
  27805. * vertex batch like the offset in the vertex buffer, vertex count and
  27806. * the textures used by that batch.
  27807. *
  27808. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#pushBatch
  27809. * @since 3.1.0
  27810. */
  27811. pushBatch: function ()
  27812. {
  27813. var batch = {
  27814. first: this.vertexCount,
  27815. texture: null,
  27816. textures: []
  27817. };
  27818. this.batches.push(batch);
  27819. },
  27820. /**
  27821. * Binds, uploads resources and processes all batches generating draw calls.
  27822. *
  27823. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#flush
  27824. * @since 3.1.0
  27825. *
  27826. * @return {Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline} This pipeline instance.
  27827. */
  27828. flush: function ()
  27829. {
  27830. if (this.flushLocked)
  27831. {
  27832. return this;
  27833. }
  27834. this.flushLocked = true;
  27835. var gl = this.gl;
  27836. var renderer = this.renderer;
  27837. var vertexCount = this.vertexCount;
  27838. var topology = this.topology;
  27839. var vertexSize = this.vertexSize;
  27840. var batches = this.batches;
  27841. var batchCount = batches.length;
  27842. var batchVertexCount = 0;
  27843. var batch = null;
  27844. var batchNext;
  27845. var textureIndex;
  27846. var nTexture;
  27847. if (batchCount === 0 || vertexCount === 0)
  27848. {
  27849. this.flushLocked = false;
  27850. return this;
  27851. }
  27852. gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bytes.subarray(0, vertexCount * vertexSize));
  27853. for (var index = 0; index < batches.length - 1; ++index)
  27854. {
  27855. batch = batches[index];
  27856. batchNext = batches[index + 1];
  27857. if (batch.textures.length > 0)
  27858. {
  27859. for (textureIndex = 0; textureIndex < batch.textures.length; ++textureIndex)
  27860. {
  27861. nTexture = batch.textures[textureIndex];
  27862. if (nTexture)
  27863. {
  27864. renderer.setTexture2D(nTexture, 1 + textureIndex);
  27865. }
  27866. }
  27867. gl.activeTexture(gl.TEXTURE0);
  27868. }
  27869. batchVertexCount = batchNext.first - batch.first;
  27870. if (batch.texture === null || batchVertexCount <= 0) { continue; }
  27871. renderer.setTexture2D(batch.texture, 0);
  27872. gl.drawArrays(topology, batch.first, batchVertexCount);
  27873. }
  27874. // Left over data
  27875. batch = batches[batches.length - 1];
  27876. if (batch.textures.length > 0)
  27877. {
  27878. for (textureIndex = 0; textureIndex < batch.textures.length; ++textureIndex)
  27879. {
  27880. nTexture = batch.textures[textureIndex];
  27881. if (nTexture)
  27882. {
  27883. renderer.setTexture2D(nTexture, 1 + textureIndex);
  27884. }
  27885. }
  27886. gl.activeTexture(gl.TEXTURE0);
  27887. }
  27888. batchVertexCount = vertexCount - batch.first;
  27889. if (batch.texture && batchVertexCount > 0)
  27890. {
  27891. renderer.setTexture2D(batch.texture, 0);
  27892. gl.drawArrays(topology, batch.first, batchVertexCount);
  27893. }
  27894. this.vertexCount = 0;
  27895. batches.length = 0;
  27896. this.pushBatch();
  27897. this.flushLocked = false;
  27898. return this;
  27899. },
  27900. /**
  27901. * Called every time the pipeline needs to be used.
  27902. * It binds all necessary resources.
  27903. *
  27904. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#onBind
  27905. * @since 3.0.0
  27906. *
  27907. * @return {Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline} This pipeline instance.
  27908. */
  27909. onBind: function ()
  27910. {
  27911. WebGLPipeline.prototype.onBind.call(this);
  27912. this.mvpUpdate();
  27913. if (this.batches.length === 0)
  27914. {
  27915. this.pushBatch();
  27916. }
  27917. return this;
  27918. },
  27919. /**
  27920. * Resizes this pipeline and updates the projection.
  27921. *
  27922. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#resize
  27923. * @since 3.0.0
  27924. *
  27925. * @param {number} width - The new width.
  27926. * @param {number} height - The new height.
  27927. * @param {number} resolution - The resolution.
  27928. *
  27929. * @return {Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline} This pipeline instance.
  27930. */
  27931. resize: function (width, height, resolution)
  27932. {
  27933. WebGLPipeline.prototype.resize.call(this, width, height, resolution);
  27934. this.projOrtho(0, this.width, this.height, 0, -1000.0, 1000.0);
  27935. return this;
  27936. },
  27937. /**
  27938. * Takes a Sprite Game Object, or any object that extends it, and adds it to the batch.
  27939. *
  27940. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchSprite
  27941. * @since 3.0.0
  27942. *
  27943. * @param {(Phaser.GameObjects.Image|Phaser.GameObjects.Sprite)} sprite - The texture based Game Object to add to the batch.
  27944. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to use for the rendering transform.
  27945. * @param {Phaser.GameObjects.Components.TransformMatrix} [parentTransformMatrix] - The transform matrix of the parent container, if set.
  27946. */
  27947. batchSprite: function (sprite, camera, parentTransformMatrix)
  27948. {
  27949. this.renderer.setPipeline(this);
  27950. var camMatrix = this._tempMatrix1;
  27951. var spriteMatrix = this._tempMatrix2;
  27952. var calcMatrix = this._tempMatrix3;
  27953. var frame = sprite.frame;
  27954. var texture = frame.glTexture;
  27955. var u0 = frame.u0;
  27956. var v0 = frame.v0;
  27957. var u1 = frame.u1;
  27958. var v1 = frame.v1;
  27959. var frameX = frame.x;
  27960. var frameY = frame.y;
  27961. var frameWidth = frame.width;
  27962. var frameHeight = frame.height;
  27963. var x = -sprite.displayOriginX + frameX;
  27964. var y = -sprite.displayOriginY + frameY;
  27965. if (sprite.isCropped)
  27966. {
  27967. var crop = sprite._crop;
  27968. if (crop.flipX !== sprite.flipX || crop.flipY !== sprite.flipY)
  27969. {
  27970. frame.updateCropUVs(crop, sprite.flipX, sprite.flipY);
  27971. }
  27972. u0 = crop.u0;
  27973. v0 = crop.v0;
  27974. u1 = crop.u1;
  27975. v1 = crop.v1;
  27976. frameWidth = crop.width;
  27977. frameHeight = crop.height;
  27978. frameX = crop.x;
  27979. frameY = crop.y;
  27980. x = -sprite.displayOriginX + frameX;
  27981. y = -sprite.displayOriginY + frameY;
  27982. }
  27983. if (sprite.flipX)
  27984. {
  27985. x += frameWidth;
  27986. frameWidth *= -1;
  27987. }
  27988. if (sprite.flipY)
  27989. {
  27990. y += frameHeight;
  27991. frameHeight *= -1;
  27992. }
  27993. var xw = x + frameWidth;
  27994. var yh = y + frameHeight;
  27995. spriteMatrix.applyITRS(sprite.x, sprite.y, sprite.rotation, sprite.scaleX, sprite.scaleY);
  27996. camMatrix.copyFrom(camera.matrix);
  27997. if (parentTransformMatrix)
  27998. {
  27999. // Multiply the camera by the parent matrix
  28000. camMatrix.multiplyWithOffset(parentTransformMatrix, -camera.scrollX * sprite.scrollFactorX, -camera.scrollY * sprite.scrollFactorY);
  28001. // Undo the camera scroll
  28002. spriteMatrix.e = sprite.x;
  28003. spriteMatrix.f = sprite.y;
  28004. // Multiply by the Sprite matrix, store result in calcMatrix
  28005. camMatrix.multiply(spriteMatrix, calcMatrix);
  28006. }
  28007. else
  28008. {
  28009. spriteMatrix.e -= camera.scrollX * sprite.scrollFactorX;
  28010. spriteMatrix.f -= camera.scrollY * sprite.scrollFactorY;
  28011. // Multiply by the Sprite matrix, store result in calcMatrix
  28012. camMatrix.multiply(spriteMatrix, calcMatrix);
  28013. }
  28014. var tx0 = x * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  28015. var ty0 = x * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  28016. var tx1 = x * calcMatrix.a + yh * calcMatrix.c + calcMatrix.e;
  28017. var ty1 = x * calcMatrix.b + yh * calcMatrix.d + calcMatrix.f;
  28018. var tx2 = xw * calcMatrix.a + yh * calcMatrix.c + calcMatrix.e;
  28019. var ty2 = xw * calcMatrix.b + yh * calcMatrix.d + calcMatrix.f;
  28020. var tx3 = xw * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  28021. var ty3 = xw * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  28022. var tintTL = Utils.getTintAppendFloatAlpha(sprite._tintTL, camera.alpha * sprite._alphaTL);
  28023. var tintTR = Utils.getTintAppendFloatAlpha(sprite._tintTR, camera.alpha * sprite._alphaTR);
  28024. var tintBL = Utils.getTintAppendFloatAlpha(sprite._tintBL, camera.alpha * sprite._alphaBL);
  28025. var tintBR = Utils.getTintAppendFloatAlpha(sprite._tintBR, camera.alpha * sprite._alphaBR);
  28026. if (camera.roundPixels)
  28027. {
  28028. tx0 |= 0;
  28029. ty0 |= 0;
  28030. tx1 |= 0;
  28031. ty1 |= 0;
  28032. tx2 |= 0;
  28033. ty2 |= 0;
  28034. tx3 |= 0;
  28035. ty3 |= 0;
  28036. }
  28037. this.setTexture2D(texture, 0);
  28038. var tintEffect = (sprite._isTinted && sprite.tintFill);
  28039. this.batchVertices(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect);
  28040. },
  28041. /**
  28042. * Adds the vertices data into the batch and flushes if full.
  28043. *
  28044. * Assumes 6 vertices in the following arrangement:
  28045. *
  28046. * ```
  28047. * 0----3
  28048. * |\ B|
  28049. * | \ |
  28050. * | \ |
  28051. * | A \|
  28052. * | \
  28053. * 1----2
  28054. * ```
  28055. *
  28056. * Where tx0/ty0 = 0, tx1/ty1 = 1, tx2/ty2 = 2 and tx3/ty3 = 3
  28057. *
  28058. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchVertices
  28059. * @since 3.11.0
  28060. *
  28061. * @param {number} tx0 - The top-left x position.
  28062. * @param {number} ty0 - The top-left y position.
  28063. * @param {number} tx1 - The bottom-left x position.
  28064. * @param {number} ty1 - The bottom-left y position.
  28065. * @param {number} tx2 - The bottom-right x position.
  28066. * @param {number} ty2 - The bottom-right y position.
  28067. * @param {number} tx3 - The top-right x position.
  28068. * @param {number} ty3 - The top-right y position.
  28069. * @param {number} u0 - UV u0 value.
  28070. * @param {number} v0 - UV v0 value.
  28071. * @param {number} u1 - UV u1 value.
  28072. * @param {number} v1 - UV v1 value.
  28073. * @param {number} tintTL - The top-left tint color value.
  28074. * @param {number} tintTR - The top-right tint color value.
  28075. * @param {number} tintBL - The bottom-left tint color value.
  28076. * @param {number} tintBR - The bottom-right tint color value.
  28077. * @param {(number|boolean)} tintEffect - The tint effect for the shader to use.
  28078. *
  28079. * @return {boolean} `true` if this method caused the batch to flush, otherwise `false`.
  28080. */
  28081. batchVertices: function (tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect)
  28082. {
  28083. var hasFlushed = false;
  28084. if (this.vertexCount + 6 > this.vertexCapacity)
  28085. {
  28086. this.flush();
  28087. hasFlushed = true;
  28088. }
  28089. var vertexViewF32 = this.vertexViewF32;
  28090. var vertexViewU32 = this.vertexViewU32;
  28091. var vertexOffset = (this.vertexCount * this.vertexComponentCount) - 1;
  28092. vertexViewF32[++vertexOffset] = tx0;
  28093. vertexViewF32[++vertexOffset] = ty0;
  28094. vertexViewF32[++vertexOffset] = u0;
  28095. vertexViewF32[++vertexOffset] = v0;
  28096. vertexViewF32[++vertexOffset] = tintEffect;
  28097. vertexViewU32[++vertexOffset] = tintTL;
  28098. vertexViewF32[++vertexOffset] = tx1;
  28099. vertexViewF32[++vertexOffset] = ty1;
  28100. vertexViewF32[++vertexOffset] = u0;
  28101. vertexViewF32[++vertexOffset] = v1;
  28102. vertexViewF32[++vertexOffset] = tintEffect;
  28103. vertexViewU32[++vertexOffset] = tintBL;
  28104. vertexViewF32[++vertexOffset] = tx2;
  28105. vertexViewF32[++vertexOffset] = ty2;
  28106. vertexViewF32[++vertexOffset] = u1;
  28107. vertexViewF32[++vertexOffset] = v1;
  28108. vertexViewF32[++vertexOffset] = tintEffect;
  28109. vertexViewU32[++vertexOffset] = tintBR;
  28110. vertexViewF32[++vertexOffset] = tx0;
  28111. vertexViewF32[++vertexOffset] = ty0;
  28112. vertexViewF32[++vertexOffset] = u0;
  28113. vertexViewF32[++vertexOffset] = v0;
  28114. vertexViewF32[++vertexOffset] = tintEffect;
  28115. vertexViewU32[++vertexOffset] = tintTL;
  28116. vertexViewF32[++vertexOffset] = tx2;
  28117. vertexViewF32[++vertexOffset] = ty2;
  28118. vertexViewF32[++vertexOffset] = u1;
  28119. vertexViewF32[++vertexOffset] = v1;
  28120. vertexViewF32[++vertexOffset] = tintEffect;
  28121. vertexViewU32[++vertexOffset] = tintBR;
  28122. vertexViewF32[++vertexOffset] = tx3;
  28123. vertexViewF32[++vertexOffset] = ty3;
  28124. vertexViewF32[++vertexOffset] = u1;
  28125. vertexViewF32[++vertexOffset] = v0;
  28126. vertexViewF32[++vertexOffset] = tintEffect;
  28127. vertexViewU32[++vertexOffset] = tintTR;
  28128. this.vertexCount += 6;
  28129. if (this.vertexCapacity - this.vertexCount < 6)
  28130. {
  28131. // No more room at the inn
  28132. this.flush();
  28133. hasFlushed = true;
  28134. }
  28135. return hasFlushed;
  28136. },
  28137. /**
  28138. * Generic function for batching a textured quad
  28139. *
  28140. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchTexture
  28141. * @since 3.0.0
  28142. *
  28143. * @param {Phaser.GameObjects.GameObject} gameObject - Source GameObject
  28144. * @param {WebGLTexture} texture - Raw WebGLTexture associated with the quad
  28145. * @param {integer} textureWidth - Real texture width
  28146. * @param {integer} textureHeight - Real texture height
  28147. * @param {number} srcX - X coordinate of the quad
  28148. * @param {number} srcY - Y coordinate of the quad
  28149. * @param {number} srcWidth - Width of the quad
  28150. * @param {number} srcHeight - Height of the quad
  28151. * @param {number} scaleX - X component of scale
  28152. * @param {number} scaleY - Y component of scale
  28153. * @param {number} rotation - Rotation of the quad
  28154. * @param {boolean} flipX - Indicates if the quad is horizontally flipped
  28155. * @param {boolean} flipY - Indicates if the quad is vertically flipped
  28156. * @param {number} scrollFactorX - By which factor is the quad affected by the camera horizontal scroll
  28157. * @param {number} scrollFactorY - By which factor is the quad effected by the camera vertical scroll
  28158. * @param {number} displayOriginX - Horizontal origin in pixels
  28159. * @param {number} displayOriginY - Vertical origin in pixels
  28160. * @param {number} frameX - X coordinate of the texture frame
  28161. * @param {number} frameY - Y coordinate of the texture frame
  28162. * @param {number} frameWidth - Width of the texture frame
  28163. * @param {number} frameHeight - Height of the texture frame
  28164. * @param {integer} tintTL - Tint for top left
  28165. * @param {integer} tintTR - Tint for top right
  28166. * @param {integer} tintBL - Tint for bottom left
  28167. * @param {integer} tintBR - Tint for bottom right
  28168. * @param {number} tintEffect - The tint effect (0 for additive, 1 for replacement)
  28169. * @param {number} uOffset - Horizontal offset on texture coordinate
  28170. * @param {number} vOffset - Vertical offset on texture coordinate
  28171. * @param {Phaser.Cameras.Scene2D.Camera} camera - Current used camera
  28172. * @param {Phaser.GameObjects.Components.TransformMatrix} parentTransformMatrix - Parent container
  28173. */
  28174. batchTexture: function (
  28175. gameObject,
  28176. texture,
  28177. textureWidth, textureHeight,
  28178. srcX, srcY,
  28179. srcWidth, srcHeight,
  28180. scaleX, scaleY,
  28181. rotation,
  28182. flipX, flipY,
  28183. scrollFactorX, scrollFactorY,
  28184. displayOriginX, displayOriginY,
  28185. frameX, frameY, frameWidth, frameHeight,
  28186. tintTL, tintTR, tintBL, tintBR, tintEffect,
  28187. uOffset, vOffset,
  28188. camera,
  28189. parentTransformMatrix)
  28190. {
  28191. this.renderer.setPipeline(this, gameObject);
  28192. var camMatrix = this._tempMatrix1;
  28193. var spriteMatrix = this._tempMatrix2;
  28194. var calcMatrix = this._tempMatrix3;
  28195. var width = srcWidth;
  28196. var height = srcHeight;
  28197. var x = -displayOriginX;
  28198. var y = -displayOriginY;
  28199. // Invert the flipY if this is a RenderTexture
  28200. flipY = flipY ^ (texture.isRenderTexture ? 1 : 0);
  28201. if (flipX)
  28202. {
  28203. width *= -1;
  28204. x += srcWidth;
  28205. }
  28206. if (flipY)
  28207. {
  28208. height *= -1;
  28209. y += srcHeight;
  28210. }
  28211. if (camera.roundPixels)
  28212. {
  28213. x |= 0;
  28214. y |= 0;
  28215. }
  28216. var xw = x + width;
  28217. var yh = y + height;
  28218. spriteMatrix.applyITRS(srcX, srcY, rotation, scaleX, scaleY);
  28219. camMatrix.copyFrom(camera.matrix);
  28220. if (parentTransformMatrix)
  28221. {
  28222. // Multiply the camera by the parent matrix
  28223. camMatrix.multiplyWithOffset(parentTransformMatrix, -camera.scrollX * scrollFactorX, -camera.scrollY * scrollFactorY);
  28224. // Undo the camera scroll
  28225. spriteMatrix.e = srcX;
  28226. spriteMatrix.f = srcY;
  28227. // Multiply by the Sprite matrix, store result in calcMatrix
  28228. camMatrix.multiply(spriteMatrix, calcMatrix);
  28229. }
  28230. else
  28231. {
  28232. spriteMatrix.e -= camera.scrollX * scrollFactorX;
  28233. spriteMatrix.f -= camera.scrollY * scrollFactorY;
  28234. // Multiply by the Sprite matrix, store result in calcMatrix
  28235. camMatrix.multiply(spriteMatrix, calcMatrix);
  28236. }
  28237. var tx0 = x * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  28238. var ty0 = x * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  28239. var tx1 = x * calcMatrix.a + yh * calcMatrix.c + calcMatrix.e;
  28240. var ty1 = x * calcMatrix.b + yh * calcMatrix.d + calcMatrix.f;
  28241. var tx2 = xw * calcMatrix.a + yh * calcMatrix.c + calcMatrix.e;
  28242. var ty2 = xw * calcMatrix.b + yh * calcMatrix.d + calcMatrix.f;
  28243. var tx3 = xw * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  28244. var ty3 = xw * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  28245. if (camera.roundPixels)
  28246. {
  28247. tx0 |= 0;
  28248. ty0 |= 0;
  28249. tx1 |= 0;
  28250. ty1 |= 0;
  28251. tx2 |= 0;
  28252. ty2 |= 0;
  28253. tx3 |= 0;
  28254. ty3 |= 0;
  28255. }
  28256. var u0 = (frameX / textureWidth) + uOffset;
  28257. var v0 = (frameY / textureHeight) + vOffset;
  28258. var u1 = (frameX + frameWidth) / textureWidth + uOffset;
  28259. var v1 = (frameY + frameHeight) / textureHeight + vOffset;
  28260. this.setTexture2D(texture, 0);
  28261. this.batchVertices(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect);
  28262. },
  28263. /**
  28264. * Immediately draws a Texture Frame with no batching.
  28265. *
  28266. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#drawTexture
  28267. * @since 3.11.0
  28268. *
  28269. * @param {WebGLTexture} texture - The WebGL Texture to be rendered.
  28270. * @param {number} x - The horizontal position to render the texture at.
  28271. * @param {number} y - The vertical position to render the texture at.
  28272. * @param {number} tint - The tint color.
  28273. * @param {number} alpha - The alpha value.
  28274. * @param {array} transformMatrix - An array of matrix values.
  28275. * @param {Phaser.GameObjects.Components.TransformMatrix} [parentTransformMatrix] - A parent Transform Matrix.
  28276. *
  28277. * @return {Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline} This Pipeline.
  28278. */
  28279. drawTextureFrame: function (
  28280. frame,
  28281. x, y,
  28282. tint, alpha,
  28283. transformMatrix,
  28284. parentTransformMatrix
  28285. )
  28286. {
  28287. this.renderer.setPipeline(this);
  28288. if (this.vertexCount + 6 > this.vertexCapacity)
  28289. {
  28290. this.flush();
  28291. }
  28292. var spriteMatrix = this._tempMatrix1.copyFromArray(transformMatrix);
  28293. var calcMatrix = this._tempMatrix2;
  28294. var xw = x + frame.width;
  28295. var yh = y + frame.height;
  28296. if (parentTransformMatrix)
  28297. {
  28298. spriteMatrix.multiply(parentTransformMatrix, calcMatrix);
  28299. }
  28300. else
  28301. {
  28302. calcMatrix = spriteMatrix;
  28303. }
  28304. var tx0 = x * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  28305. var ty0 = x * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  28306. var tx1 = x * calcMatrix.a + yh * calcMatrix.c + calcMatrix.e;
  28307. var ty1 = x * calcMatrix.b + yh * calcMatrix.d + calcMatrix.f;
  28308. var tx2 = xw * calcMatrix.a + yh * calcMatrix.c + calcMatrix.e;
  28309. var ty2 = xw * calcMatrix.b + yh * calcMatrix.d + calcMatrix.f;
  28310. var tx3 = xw * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  28311. var ty3 = xw * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  28312. if (this.renderer.config.roundPixels)
  28313. {
  28314. tx0 |= 0;
  28315. ty0 |= 0;
  28316. tx1 |= 0;
  28317. ty1 |= 0;
  28318. tx2 |= 0;
  28319. ty2 |= 0;
  28320. tx3 |= 0;
  28321. ty3 |= 0;
  28322. }
  28323. this.setTexture2D(frame.glTexture, 0);
  28324. tint = Utils.getTintAppendFloatAlpha(tint, alpha);
  28325. if (!this.batchVertices(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, frame.u0, frame.v0, frame.u1, frame.v1, tint, tint, tint, tint, 0))
  28326. {
  28327. this.flush();
  28328. }
  28329. }
  28330. });
  28331. module.exports = TextureTintPipeline;
  28332. /***/ }),
  28333. /* 131 */
  28334. /***/ (function(module, exports) {
  28335. /**
  28336. * @author Richard Davey <rich@photonstorm.com>
  28337. * @copyright 2018 Photon Storm Ltd.
  28338. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  28339. */
  28340. /**
  28341. * 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.
  28342. * If no parent was given or falls back to using `document.body`.
  28343. *
  28344. * @function Phaser.DOM.AddToDOM
  28345. * @since 3.0.0
  28346. *
  28347. * @param {HTMLElement} element - The element to be added to the DOM. Usually a Canvas object.
  28348. * @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.
  28349. * @param {boolean} [overflowHidden=true] - Whether or not to hide overflowing content inside the parent.
  28350. *
  28351. * @return {HTMLElement} The element that was added to the DOM.
  28352. */
  28353. var AddToDOM = function (element, parent, overflowHidden)
  28354. {
  28355. if (overflowHidden === undefined) { overflowHidden = true; }
  28356. var target;
  28357. if (parent)
  28358. {
  28359. if (typeof parent === 'string')
  28360. {
  28361. // Hopefully an element ID
  28362. target = document.getElementById(parent);
  28363. }
  28364. else if (typeof parent === 'object' && parent.nodeType === 1)
  28365. {
  28366. // Quick test for a HTMLelement
  28367. target = parent;
  28368. }
  28369. }
  28370. else if (element.parentElement)
  28371. {
  28372. return element;
  28373. }
  28374. // Fallback, covers an invalid ID and a non HTMLelement object
  28375. if (!target)
  28376. {
  28377. target = document.body;
  28378. }
  28379. if (overflowHidden && target.style)
  28380. {
  28381. target.style.overflow = 'hidden';
  28382. }
  28383. target.appendChild(element);
  28384. return element;
  28385. };
  28386. module.exports = AddToDOM;
  28387. /***/ }),
  28388. /* 132 */
  28389. /***/ (function(module, exports) {
  28390. /**
  28391. * @author Richard Davey <rich@photonstorm.com>
  28392. * @copyright 2018 Photon Storm Ltd.
  28393. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  28394. */
  28395. // Browser specific prefix, so not going to change between contexts, only between browsers
  28396. var prefix = '';
  28397. /**
  28398. * @namespace Phaser.Display.Canvas.Smoothing
  28399. * @since 3.0.0
  28400. */
  28401. var Smoothing = function ()
  28402. {
  28403. /**
  28404. * Gets the Smoothing Enabled vendor prefix being used on the given context, or null if not set.
  28405. *
  28406. * @function Phaser.Display.Canvas.Smoothing.getPrefix
  28407. * @since 3.0.0
  28408. *
  28409. * @param {(CanvasRenderingContext2D|WebGLRenderingContext)} context - [description]
  28410. *
  28411. * @return {string} [description]
  28412. */
  28413. var getPrefix = function (context)
  28414. {
  28415. var vendors = [ 'i', 'webkitI', 'msI', 'mozI', 'oI' ];
  28416. for (var i = 0; i < vendors.length; i++)
  28417. {
  28418. var s = vendors[i] + 'mageSmoothingEnabled';
  28419. if (s in context)
  28420. {
  28421. return s;
  28422. }
  28423. }
  28424. return null;
  28425. };
  28426. /**
  28427. * Sets the Image Smoothing property on the given context. Set to false to disable image smoothing.
  28428. * By default browsers have image smoothing enabled, which isn't always what you visually want, especially
  28429. * when using pixel art in a game. Note that this sets the property on the context itself, so that any image
  28430. * drawn to the context will be affected. This sets the property across all current browsers but support is
  28431. * patchy on earlier browsers, especially on mobile.
  28432. *
  28433. * @function Phaser.Display.Canvas.Smoothing.enable
  28434. * @since 3.0.0
  28435. *
  28436. * @param {(CanvasRenderingContext2D|WebGLRenderingContext)} context - [description]
  28437. *
  28438. * @return {(CanvasRenderingContext2D|WebGLRenderingContext)} [description]
  28439. */
  28440. var enable = function (context)
  28441. {
  28442. if (prefix === '')
  28443. {
  28444. prefix = getPrefix(context);
  28445. }
  28446. if (prefix)
  28447. {
  28448. context[prefix] = true;
  28449. }
  28450. return context;
  28451. };
  28452. /**
  28453. * Sets the Image Smoothing property on the given context. Set to false to disable image smoothing.
  28454. * By default browsers have image smoothing enabled, which isn't always what you visually want, especially
  28455. * when using pixel art in a game. Note that this sets the property on the context itself, so that any image
  28456. * drawn to the context will be affected. This sets the property across all current browsers but support is
  28457. * patchy on earlier browsers, especially on mobile.
  28458. *
  28459. * @function Phaser.Display.Canvas.Smoothing.disable
  28460. * @since 3.0.0
  28461. *
  28462. * @param {(CanvasRenderingContext2D|WebGLRenderingContext)} context - [description]
  28463. *
  28464. * @return {(CanvasRenderingContext2D|WebGLRenderingContext)} [description]
  28465. */
  28466. var disable = function (context)
  28467. {
  28468. if (prefix === '')
  28469. {
  28470. prefix = getPrefix(context);
  28471. }
  28472. if (prefix)
  28473. {
  28474. context[prefix] = false;
  28475. }
  28476. return context;
  28477. };
  28478. /**
  28479. * Returns `true` if the given context has image smoothing enabled, otherwise returns `false`.
  28480. * Returns null if no smoothing prefix is available.
  28481. *
  28482. * @function Phaser.Display.Canvas.Smoothing.isEnabled
  28483. * @since 3.0.0
  28484. *
  28485. * @param {(CanvasRenderingContext2D|WebGLRenderingContext)} context - [description]
  28486. *
  28487. * @return {?boolean} [description]
  28488. */
  28489. var isEnabled = function (context)
  28490. {
  28491. return (prefix !== null) ? context[prefix] : null;
  28492. };
  28493. return {
  28494. disable: disable,
  28495. enable: enable,
  28496. getPrefix: getPrefix,
  28497. isEnabled: isEnabled
  28498. };
  28499. };
  28500. module.exports = Smoothing();
  28501. /***/ }),
  28502. /* 133 */
  28503. /***/ (function(module, exports, __webpack_require__) {
  28504. /**
  28505. * @author Richard Davey <rich@photonstorm.com>
  28506. * @copyright 2018 Photon Storm Ltd.
  28507. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  28508. */
  28509. var HexStringToColor = __webpack_require__(279);
  28510. var IntegerToColor = __webpack_require__(277);
  28511. var ObjectToColor = __webpack_require__(275);
  28512. var RGBStringToColor = __webpack_require__(274);
  28513. /**
  28514. * Converts the given source color value into an instance of a Color class.
  28515. * The value can be either a string, prefixed with `rgb` or a hex string, a number or an Object.
  28516. *
  28517. * @function Phaser.Display.Color.ValueToColor
  28518. * @since 3.0.0
  28519. *
  28520. * @param {(string|number|InputColorObject)} input - The source color value to convert.
  28521. *
  28522. * @return {Phaser.Display.Color} A Color object.
  28523. */
  28524. var ValueToColor = function (input)
  28525. {
  28526. var t = typeof input;
  28527. switch (t)
  28528. {
  28529. case 'string':
  28530. if (input.substr(0, 3).toLowerCase() === 'rgb')
  28531. {
  28532. return RGBStringToColor(input);
  28533. }
  28534. else
  28535. {
  28536. return HexStringToColor(input);
  28537. }
  28538. case 'number':
  28539. return IntegerToColor(input);
  28540. case 'object':
  28541. return ObjectToColor(input);
  28542. }
  28543. };
  28544. module.exports = ValueToColor;
  28545. /***/ }),
  28546. /* 134 */
  28547. /***/ (function(module, exports) {
  28548. /**
  28549. * @author Richard Davey <rich@photonstorm.com>
  28550. * @copyright 2018 Photon Storm Ltd.
  28551. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  28552. */
  28553. /**
  28554. * Takes the given string and pads it out, to the length required, using the character
  28555. * specified. For example if you need a string to be 6 characters long, you can call:
  28556. *
  28557. * `pad('bob', 6, '-', 2)`
  28558. *
  28559. * This would return: `bob---` as it has padded it out to 6 characters, using the `-` on the right.
  28560. *
  28561. * You can also use it to pad numbers (they are always returned as strings):
  28562. *
  28563. * `pad(512, 6, '0', 1)`
  28564. *
  28565. * Would return: `000512` with the string padded to the left.
  28566. *
  28567. * If you don't specify a direction it'll pad to both sides:
  28568. *
  28569. * `pad('c64', 7, '*')`
  28570. *
  28571. * Would return: `**c64**`
  28572. *
  28573. * @function Phaser.Utils.String.Pad
  28574. * @since 3.0.0
  28575. *
  28576. * @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.
  28577. * @param {integer} [len=0] - The number of characters to be added.
  28578. * @param {string} [pad=" "] - The string to pad it out with (defaults to a space).
  28579. * @param {integer} [dir=3] - The direction dir = 1 (left), 2 (right), 3 (both).
  28580. *
  28581. * @return {string} The padded string.
  28582. */
  28583. var Pad = function (str, len, pad, dir)
  28584. {
  28585. if (len === undefined) { len = 0; }
  28586. if (pad === undefined) { pad = ' '; }
  28587. if (dir === undefined) { dir = 3; }
  28588. str = str.toString();
  28589. var padlen = 0;
  28590. if (len + 1 >= str.length)
  28591. {
  28592. switch (dir)
  28593. {
  28594. case 1:
  28595. str = new Array(len + 1 - str.length).join(pad) + str;
  28596. break;
  28597. case 3:
  28598. var right = Math.ceil((padlen = len - str.length) / 2);
  28599. var left = padlen - right;
  28600. str = new Array(left + 1).join(pad) + str + new Array(right + 1).join(pad);
  28601. break;
  28602. default:
  28603. str = str + new Array(len + 1 - str.length).join(pad);
  28604. break;
  28605. }
  28606. }
  28607. return str;
  28608. };
  28609. module.exports = Pad;
  28610. /***/ }),
  28611. /* 135 */
  28612. /***/ (function(module, exports, __webpack_require__) {
  28613. /**
  28614. * @author Richard Davey <rich@photonstorm.com>
  28615. * @copyright 2018 Photon Storm Ltd.
  28616. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  28617. */
  28618. var Point = __webpack_require__(5);
  28619. /**
  28620. * Returns a uniformly distributed random point from anywhere within the given Ellipse.
  28621. *
  28622. * @function Phaser.Geom.Ellipse.Random
  28623. * @since 3.0.0
  28624. *
  28625. * @generic {Phaser.Geom.Point} O - [out,$return]
  28626. *
  28627. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get a random point from.
  28628. * @param {(Phaser.Geom.Point|object)} [out] - A Point or point-like object to set the random `x` and `y` values in.
  28629. *
  28630. * @return {(Phaser.Geom.Point|object)} A Point object with the random values set in the `x` and `y` properties.
  28631. */
  28632. var Random = function (ellipse, out)
  28633. {
  28634. if (out === undefined) { out = new Point(); }
  28635. var p = Math.random() * Math.PI * 2;
  28636. var s = Math.sqrt(Math.random());
  28637. out.x = ellipse.x + ((s * Math.cos(p)) * ellipse.width / 2);
  28638. out.y = ellipse.y + ((s * Math.sin(p)) * ellipse.height / 2);
  28639. return out;
  28640. };
  28641. module.exports = Random;
  28642. /***/ }),
  28643. /* 136 */
  28644. /***/ (function(module, exports, __webpack_require__) {
  28645. /**
  28646. * @author Richard Davey <rich@photonstorm.com>
  28647. * @copyright 2018 Photon Storm Ltd.
  28648. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  28649. */
  28650. var Perimeter = __webpack_require__(97);
  28651. var Point = __webpack_require__(5);
  28652. /**
  28653. * Position is a value between 0 and 1 where 0 = the top-left of the rectangle and 0.5 = the bottom right.
  28654. *
  28655. * @function Phaser.Geom.Rectangle.GetPoint
  28656. * @since 3.0.0
  28657. *
  28658. * @generic {Phaser.Geom.Point} O - [out,$return]
  28659. *
  28660. * @param {Phaser.Geom.Rectangle} rectangle - [description]
  28661. * @param {number} position - [description]
  28662. * @param {(Phaser.Geom.Point|object)} [out] - [description]
  28663. *
  28664. * @return {Phaser.Geom.Point} [description]
  28665. */
  28666. var GetPoint = function (rectangle, position, out)
  28667. {
  28668. if (out === undefined) { out = new Point(); }
  28669. if (position <= 0 || position >= 1)
  28670. {
  28671. out.x = rectangle.x;
  28672. out.y = rectangle.y;
  28673. return out;
  28674. }
  28675. var p = Perimeter(rectangle) * position;
  28676. if (position > 0.5)
  28677. {
  28678. p -= (rectangle.width + rectangle.height);
  28679. if (p <= rectangle.width)
  28680. {
  28681. // Face 3
  28682. out.x = rectangle.right - p;
  28683. out.y = rectangle.bottom;
  28684. }
  28685. else
  28686. {
  28687. // Face 4
  28688. out.x = rectangle.x;
  28689. out.y = rectangle.bottom - (p - rectangle.width);
  28690. }
  28691. }
  28692. else if (p <= rectangle.width)
  28693. {
  28694. // Face 1
  28695. out.x = rectangle.x + p;
  28696. out.y = rectangle.y;
  28697. }
  28698. else
  28699. {
  28700. // Face 2
  28701. out.x = rectangle.right;
  28702. out.y = rectangle.y + (p - rectangle.width);
  28703. }
  28704. return out;
  28705. };
  28706. module.exports = GetPoint;
  28707. /***/ }),
  28708. /* 137 */
  28709. /***/ (function(module, exports, __webpack_require__) {
  28710. /**
  28711. * @author Richard Davey <rich@photonstorm.com>
  28712. * @copyright 2018 Photon Storm Ltd.
  28713. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  28714. */
  28715. var Point = __webpack_require__(5);
  28716. /**
  28717. * Returns a Point object containing the coordinates of a point on the circumference of the Circle based on the given angle.
  28718. *
  28719. * @function Phaser.Geom.Circle.CircumferencePoint
  28720. * @since 3.0.0
  28721. *
  28722. * @generic {Phaser.Geom.Point} O - [out,$return]
  28723. *
  28724. * @param {Phaser.Geom.Circle} circle - The Circle to get the circumference point on.
  28725. * @param {number} angle - The angle from the center of the Circle to the circumference to return the point from. Given in radians.
  28726. * @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.
  28727. *
  28728. * @return {(Phaser.Geom.Point|object)} A Point object where the `x` and `y` properties are the point on the circumference.
  28729. */
  28730. var CircumferencePoint = function (circle, angle, out)
  28731. {
  28732. if (out === undefined) { out = new Point(); }
  28733. out.x = circle.x + (circle.radius * Math.cos(angle));
  28734. out.y = circle.y + (circle.radius * Math.sin(angle));
  28735. return out;
  28736. };
  28737. module.exports = CircumferencePoint;
  28738. /***/ }),
  28739. /* 138 */
  28740. /***/ (function(module, exports, __webpack_require__) {
  28741. /**
  28742. * @author Richard Davey <rich@photonstorm.com>
  28743. * @copyright 2018 Photon Storm Ltd.
  28744. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  28745. */
  28746. var Class = __webpack_require__(0);
  28747. /**
  28748. * @classdesc
  28749. * A Tileset is a combination of an image containing the tiles and a container for data about
  28750. * each tile.
  28751. *
  28752. * @class Tileset
  28753. * @memberOf Phaser.Tilemaps
  28754. * @constructor
  28755. * @since 3.0.0
  28756. *
  28757. * @param {string} name - The name of the tileset in the map data.
  28758. * @param {integer} firstgid - The first tile index this tileset contains.
  28759. * @param {integer} [tileWidth=32] - Width of each tile (in pixels).
  28760. * @param {integer} [tileHeight=32] - Height of each tile (in pixels).
  28761. * @param {integer} [tileMargin=0] - The margin around all tiles in the sheet (in pixels).
  28762. * @param {integer} [tileSpacing=0] - The spacing between each tile in the sheet (in pixels).
  28763. * @param {object} [tileProperties={}] - Custom properties defined per tile in the Tileset.
  28764. * These typically are custom properties created in Tiled when editing a tileset.
  28765. * @param {object} [tileData={}] - Data stored per tile. These typically are created in Tiled
  28766. * when editing a tileset, e.g. from Tiled's tile collision editor or terrain editor.
  28767. */
  28768. var Tileset = new Class({
  28769. initialize:
  28770. function Tileset (name, firstgid, tileWidth, tileHeight, tileMargin, tileSpacing, tileProperties, tileData)
  28771. {
  28772. if (tileWidth === undefined || tileWidth <= 0) { tileWidth = 32; }
  28773. if (tileHeight === undefined || tileHeight <= 0) { tileHeight = 32; }
  28774. if (tileMargin === undefined) { tileMargin = 0; }
  28775. if (tileSpacing === undefined) { tileSpacing = 0; }
  28776. if (tileProperties === undefined) { tileProperties = {}; }
  28777. if (tileData === undefined) { tileData = {}; }
  28778. /**
  28779. * The name of the Tileset.
  28780. *
  28781. * @name Phaser.Tilemaps.Tileset#name
  28782. * @type {string}
  28783. * @since 3.0.0
  28784. */
  28785. this.name = name;
  28786. /**
  28787. * The starting index of the first tile index this Tileset contains.
  28788. *
  28789. * @name Phaser.Tilemaps.Tileset#firstgid
  28790. * @type {integer}
  28791. * @since 3.0.0
  28792. */
  28793. this.firstgid = firstgid;
  28794. /**
  28795. * The width of each tile (in pixels). Use setTileSize to change.
  28796. *
  28797. * @name Phaser.Tilemaps.Tileset#tileWidth
  28798. * @type {integer}
  28799. * @readOnly
  28800. * @since 3.0.0
  28801. */
  28802. this.tileWidth = tileWidth;
  28803. /**
  28804. * The height of each tile (in pixels). Use setTileSize to change.
  28805. *
  28806. * @name Phaser.Tilemaps.Tileset#tileHeight
  28807. * @type {integer}
  28808. * @readOnly
  28809. * @since 3.0.0
  28810. */
  28811. this.tileHeight = tileHeight;
  28812. /**
  28813. * The margin around the tiles in the sheet (in pixels). Use `setSpacing` to change.
  28814. *
  28815. * @name Phaser.Tilemaps.Tileset#tileMargin
  28816. * @type {integer}
  28817. * @readOnly
  28818. * @since 3.0.0
  28819. */
  28820. this.tileMargin = tileMargin;
  28821. /**
  28822. * The spacing between each the tile in the sheet (in pixels). Use `setSpacing` to change.
  28823. *
  28824. * @name Phaser.Tilemaps.Tileset#tileSpacing
  28825. * @type {integer}
  28826. * @readOnly
  28827. * @since 3.0.0
  28828. */
  28829. this.tileSpacing = tileSpacing;
  28830. /**
  28831. * Tileset-specific properties per tile that are typically defined in the Tiled editor in the
  28832. * Tileset editor.
  28833. *
  28834. * @name Phaser.Tilemaps.Tileset#tileProperties
  28835. * @type {object}
  28836. * @since 3.0.0
  28837. */
  28838. this.tileProperties = tileProperties;
  28839. /**
  28840. * Tileset-specific data per tile that are typically defined in the Tiled editor, e.g. within
  28841. * the Tileset collision editor. This is where collision objects and terrain are stored.
  28842. *
  28843. * @name Phaser.Tilemaps.Tileset#tileData
  28844. * @type {object}
  28845. * @since 3.0.0
  28846. */
  28847. this.tileData = tileData;
  28848. /**
  28849. * The cached image that contains the individual tiles. Use setImage to set.
  28850. *
  28851. * @name Phaser.Tilemaps.Tileset#image
  28852. * @type {?Phaser.Textures.Texture}
  28853. * @readOnly
  28854. * @since 3.0.0
  28855. */
  28856. this.image = null;
  28857. /**
  28858. * The gl texture used by the WebGL renderer.
  28859. *
  28860. * @name Phaser.Tilemaps.Tileset#glTexture
  28861. * @type {?WebGLTexture}
  28862. * @readOnly
  28863. * @since 3.11.0
  28864. */
  28865. this.glTexture = null;
  28866. /**
  28867. * The number of tile rows in the the tileset.
  28868. *
  28869. * @name Phaser.Tilemaps.Tileset#rows
  28870. * @type {integer}
  28871. * @readOnly
  28872. * @since 3.0.0
  28873. */
  28874. this.rows = 0;
  28875. /**
  28876. * The number of tile columns in the tileset.
  28877. *
  28878. * @name Phaser.Tilemaps.Tileset#columns
  28879. * @type {integer}
  28880. * @readOnly
  28881. * @since 3.0.0
  28882. */
  28883. this.columns = 0;
  28884. /**
  28885. * The total number of tiles in the tileset.
  28886. *
  28887. * @name Phaser.Tilemaps.Tileset#total
  28888. * @type {integer}
  28889. * @readOnly
  28890. * @since 3.0.0
  28891. */
  28892. this.total = 0;
  28893. /**
  28894. * The look-up table to specific tile image texture coordinates (UV in pixels). Each element
  28895. * contains the coordinates for a tile in an object of the form {x, y}.
  28896. *
  28897. * @name Phaser.Tilemaps.Tileset#texCoordinates
  28898. * @type {object[]}
  28899. * @readOnly
  28900. * @since 3.0.0
  28901. */
  28902. this.texCoordinates = [];
  28903. },
  28904. /**
  28905. * Get a tiles properties that are stored in the Tileset. Returns null if tile index is not
  28906. * contained in this Tileset. This is typically defined in Tiled under the Tileset editor.
  28907. *
  28908. * @method Phaser.Tilemaps.Tileset#getTileProperties
  28909. * @since 3.0.0
  28910. *
  28911. * @param {integer} tileIndex - The unique id of the tile across all tilesets in the map.
  28912. *
  28913. * @return {?(object|undefined)}
  28914. */
  28915. getTileProperties: function (tileIndex)
  28916. {
  28917. if (!this.containsTileIndex(tileIndex)) { return null; }
  28918. return this.tileProperties[tileIndex - this.firstgid];
  28919. },
  28920. /**
  28921. * Get a tile's data that is stored in the Tileset. Returns null if tile index is not contained
  28922. * in this Tileset. This is typically defined in Tiled and will contain both Tileset collision
  28923. * info and terrain mapping.
  28924. *
  28925. * @method Phaser.Tilemaps.Tileset#getTileData
  28926. * @since 3.0.0
  28927. *
  28928. * @param {integer} tileIndex - The unique id of the tile across all tilesets in the map.
  28929. *
  28930. * @return {?object|undefined}
  28931. */
  28932. getTileData: function (tileIndex)
  28933. {
  28934. if (!this.containsTileIndex(tileIndex)) { return null; }
  28935. return this.tileData[tileIndex - this.firstgid];
  28936. },
  28937. /**
  28938. * Get a tile's collision group that is stored in the Tileset. Returns null if tile index is not
  28939. * contained in this Tileset. This is typically defined within Tiled's tileset collision editor.
  28940. *
  28941. * @method Phaser.Tilemaps.Tileset#getTileCollisionGroup
  28942. * @since 3.0.0
  28943. *
  28944. * @param {integer} tileIndex - The unique id of the tile across all tilesets in the map.
  28945. *
  28946. * @return {?object}
  28947. */
  28948. getTileCollisionGroup: function (tileIndex)
  28949. {
  28950. var data = this.getTileData(tileIndex);
  28951. return (data && data.objectgroup) ? data.objectgroup : null;
  28952. },
  28953. /**
  28954. * Returns true if and only if this Tileset contains the given tile index.
  28955. *
  28956. * @method Phaser.Tilemaps.Tileset#containsTileIndex
  28957. * @since 3.0.0
  28958. *
  28959. * @param {integer} tileIndex - The unique id of the tile across all tilesets in the map.
  28960. *
  28961. * @return {boolean}
  28962. */
  28963. containsTileIndex: function (tileIndex)
  28964. {
  28965. return (
  28966. tileIndex >= this.firstgid &&
  28967. tileIndex < (this.firstgid + this.total)
  28968. );
  28969. },
  28970. /**
  28971. * Returns the texture coordinates (UV in pixels) in the Tileset image for the given tile index.
  28972. * Returns null if tile index is not contained in this Tileset.
  28973. *
  28974. * @method Phaser.Tilemaps.Tileset#getTileTextureCoordinates
  28975. * @since 3.0.0
  28976. *
  28977. * @param {integer} tileIndex - The unique id of the tile across all tilesets in the map.
  28978. *
  28979. * @return {?object} Object in the form { x, y } representing the top-left UV coordinate
  28980. * within the Tileset image.
  28981. */
  28982. getTileTextureCoordinates: function (tileIndex)
  28983. {
  28984. if (!this.containsTileIndex(tileIndex)) { return null; }
  28985. return this.texCoordinates[tileIndex - this.firstgid];
  28986. },
  28987. /**
  28988. * Sets the image associated with this Tileset and updates the tile data (rows, columns, etc.).
  28989. *
  28990. * @method Phaser.Tilemaps.Tileset#setImage
  28991. * @since 3.0.0
  28992. *
  28993. * @param {Phaser.Textures.Texture} texture - The image that contains the tiles.
  28994. *
  28995. * @return {Phaser.Tilemaps.Tileset} This Tileset object.
  28996. */
  28997. setImage: function (texture)
  28998. {
  28999. this.image = texture;
  29000. this.glTexture = texture.get().source.glTexture;
  29001. this.updateTileData(this.image.source[0].width, this.image.source[0].height);
  29002. return this;
  29003. },
  29004. /**
  29005. * Sets the tile width & height and updates the tile data (rows, columns, etc.).
  29006. *
  29007. * @method Phaser.Tilemaps.Tileset#setTileSize
  29008. * @since 3.0.0
  29009. *
  29010. * @param {integer} [tileWidth] - The width of a tile in pixels.
  29011. * @param {integer} [tileHeight] - The height of a tile in pixels.
  29012. *
  29013. * @return {Phaser.Tilemaps.Tileset} This Tileset object.
  29014. */
  29015. setTileSize: function (tileWidth, tileHeight)
  29016. {
  29017. if (tileWidth !== undefined) { this.tileWidth = tileWidth; }
  29018. if (tileHeight !== undefined) { this.tileHeight = tileHeight; }
  29019. if (this.image)
  29020. {
  29021. this.updateTileData(this.image.source[0].width, this.image.source[0].height);
  29022. }
  29023. return this;
  29024. },
  29025. /**
  29026. * Sets the tile margin & spacing and updates the tile data (rows, columns, etc.).
  29027. *
  29028. * @method Phaser.Tilemaps.Tileset#setSpacing
  29029. * @since 3.0.0
  29030. *
  29031. * @param {integer} [margin] - The margin around the tiles in the sheet (in pixels).
  29032. * @param {integer} [spacing] - The spacing between the tiles in the sheet (in pixels).
  29033. *
  29034. * @return {Phaser.Tilemaps.Tileset} This Tileset object.
  29035. */
  29036. setSpacing: function (margin, spacing)
  29037. {
  29038. if (margin !== undefined) { this.tileMargin = margin; }
  29039. if (spacing !== undefined) { this.tileSpacing = spacing; }
  29040. if (this.image)
  29041. {
  29042. this.updateTileData(this.image.source[0].width, this.image.source[0].height);
  29043. }
  29044. return this;
  29045. },
  29046. /**
  29047. * Updates tile texture coordinates and tileset data.
  29048. *
  29049. * @method Phaser.Tilemaps.Tileset#updateTileData
  29050. * @since 3.0.0
  29051. *
  29052. * @param {integer} imageWidth - The (expected) width of the image to slice.
  29053. * @param {integer} imageHeight - The (expected) height of the image to slice.
  29054. *
  29055. * @return {Phaser.Tilemaps.Tileset} This Tileset object.
  29056. */
  29057. updateTileData: function (imageWidth, imageHeight)
  29058. {
  29059. var rowCount = (imageHeight - this.tileMargin * 2 + this.tileSpacing) / (this.tileHeight + this.tileSpacing);
  29060. var colCount = (imageWidth - this.tileMargin * 2 + this.tileSpacing) / (this.tileWidth + this.tileSpacing);
  29061. if (rowCount % 1 !== 0 || colCount % 1 !== 0)
  29062. {
  29063. console.warn('Tileset ' + this.name + ' image tile area is not an even multiple of tile size');
  29064. }
  29065. // In Tiled a tileset image that is not an even multiple of the tile dimensions is truncated
  29066. // - hence the floor when calculating the rows/columns.
  29067. rowCount = Math.floor(rowCount);
  29068. colCount = Math.floor(colCount);
  29069. this.rows = rowCount;
  29070. this.columns = colCount;
  29071. // In Tiled, "empty" spaces in a tileset count as tiles and hence count towards the gid
  29072. this.total = rowCount * colCount;
  29073. this.texCoordinates.length = 0;
  29074. var tx = this.tileMargin;
  29075. var ty = this.tileMargin;
  29076. for (var y = 0; y < this.rows; y++)
  29077. {
  29078. for (var x = 0; x < this.columns; x++)
  29079. {
  29080. this.texCoordinates.push({ x: tx, y: ty });
  29081. tx += this.tileWidth + this.tileSpacing;
  29082. }
  29083. tx = this.tileMargin;
  29084. ty += this.tileHeight + this.tileSpacing;
  29085. }
  29086. return this;
  29087. }
  29088. });
  29089. module.exports = Tileset;
  29090. /***/ }),
  29091. /* 139 */
  29092. /***/ (function(module, exports) {
  29093. /**
  29094. * @author Richard Davey <rich@photonstorm.com>
  29095. * @copyright 2018 Photon Storm Ltd.
  29096. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  29097. */
  29098. /**
  29099. * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the
  29100. * layer's position, scale and scroll.
  29101. *
  29102. * @function Phaser.Tilemaps.Components.TileToWorldY
  29103. * @private
  29104. * @since 3.0.0
  29105. *
  29106. * @param {integer} tileY - [description]
  29107. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  29108. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  29109. *
  29110. * @return {number}
  29111. */
  29112. var TileToWorldY = function (tileY, camera, layer)
  29113. {
  29114. var tileHeight = layer.baseTileHeight;
  29115. var tilemapLayer = layer.tilemapLayer;
  29116. var layerWorldY = 0;
  29117. if (tilemapLayer)
  29118. {
  29119. if (camera === undefined) { camera = tilemapLayer.scene.cameras.main; }
  29120. layerWorldY = (tilemapLayer.y + camera.scrollY * (1 - tilemapLayer.scrollFactorY));
  29121. tileHeight *= tilemapLayer.scaleY;
  29122. }
  29123. return layerWorldY + tileY * tileHeight;
  29124. };
  29125. module.exports = TileToWorldY;
  29126. /***/ }),
  29127. /* 140 */
  29128. /***/ (function(module, exports) {
  29129. /**
  29130. * @author Richard Davey <rich@photonstorm.com>
  29131. * @copyright 2018 Photon Storm Ltd.
  29132. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  29133. */
  29134. /**
  29135. * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the
  29136. * layer's position, scale and scroll.
  29137. *
  29138. * @function Phaser.Tilemaps.Components.TileToWorldX
  29139. * @private
  29140. * @since 3.0.0
  29141. *
  29142. * @param {integer} tileX - [description]
  29143. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  29144. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  29145. *
  29146. * @return {number}
  29147. */
  29148. var TileToWorldX = function (tileX, camera, layer)
  29149. {
  29150. var tileWidth = layer.baseTileWidth;
  29151. var tilemapLayer = layer.tilemapLayer;
  29152. var layerWorldX = 0;
  29153. if (tilemapLayer)
  29154. {
  29155. if (camera === undefined) { camera = tilemapLayer.scene.cameras.main; }
  29156. layerWorldX = tilemapLayer.x + camera.scrollX * (1 - tilemapLayer.scrollFactorX);
  29157. tileWidth *= tilemapLayer.scaleX;
  29158. }
  29159. return layerWorldX + tileX * tileWidth;
  29160. };
  29161. module.exports = TileToWorldX;
  29162. /***/ }),
  29163. /* 141 */
  29164. /***/ (function(module, exports, __webpack_require__) {
  29165. /**
  29166. * @author Richard Davey <rich@photonstorm.com>
  29167. * @copyright 2018 Photon Storm Ltd.
  29168. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  29169. */
  29170. var IsInLayerBounds = __webpack_require__(105);
  29171. /**
  29172. * Gets a tile at the given tile coordinates from the given layer.
  29173. *
  29174. * @function Phaser.Tilemaps.Components.GetTileAt
  29175. * @private
  29176. * @since 3.0.0
  29177. *
  29178. * @param {integer} tileX - X position to get the tile from (given in tile units, not pixels).
  29179. * @param {integer} tileY - Y position to get the tile from (given in tile units, not pixels).
  29180. * @param {boolean} [nonNull=false] - If true getTile won't return null for empty tiles, but a Tile
  29181. * object with an index of -1.
  29182. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  29183. *
  29184. * @return {Phaser.Tilemaps.Tile} The tile at the given coordinates or null if no tile was found or the coordinates
  29185. * were invalid.
  29186. */
  29187. var GetTileAt = function (tileX, tileY, nonNull, layer)
  29188. {
  29189. if (nonNull === undefined) { nonNull = false; }
  29190. if (IsInLayerBounds(tileX, tileY, layer))
  29191. {
  29192. var tile = layer.data[tileY][tileX];
  29193. if (tile === null)
  29194. {
  29195. return null;
  29196. }
  29197. else if (tile.index === -1)
  29198. {
  29199. return nonNull ? tile : null;
  29200. }
  29201. else
  29202. {
  29203. return tile;
  29204. }
  29205. }
  29206. else
  29207. {
  29208. return null;
  29209. }
  29210. };
  29211. module.exports = GetTileAt;
  29212. /***/ }),
  29213. /* 142 */
  29214. /***/ (function(module, exports, __webpack_require__) {
  29215. /**
  29216. * @author Richard Davey <rich@photonstorm.com>
  29217. * @copyright 2018 Photon Storm Ltd.
  29218. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  29219. */
  29220. /**
  29221. * @namespace Phaser.Tilemaps.Components
  29222. */
  29223. module.exports = {
  29224. CalculateFacesAt: __webpack_require__(225),
  29225. CalculateFacesWithin: __webpack_require__(41),
  29226. Copy: __webpack_require__(672),
  29227. CreateFromTiles: __webpack_require__(671),
  29228. CullTiles: __webpack_require__(670),
  29229. Fill: __webpack_require__(669),
  29230. FilterTiles: __webpack_require__(668),
  29231. FindByIndex: __webpack_require__(667),
  29232. FindTile: __webpack_require__(666),
  29233. ForEachTile: __webpack_require__(665),
  29234. GetTileAt: __webpack_require__(141),
  29235. GetTileAtWorldXY: __webpack_require__(664),
  29236. GetTilesWithin: __webpack_require__(23),
  29237. GetTilesWithinShape: __webpack_require__(663),
  29238. GetTilesWithinWorldXY: __webpack_require__(662),
  29239. HasTileAt: __webpack_require__(326),
  29240. HasTileAtWorldXY: __webpack_require__(661),
  29241. IsInLayerBounds: __webpack_require__(105),
  29242. PutTileAt: __webpack_require__(224),
  29243. PutTileAtWorldXY: __webpack_require__(660),
  29244. PutTilesAt: __webpack_require__(659),
  29245. Randomize: __webpack_require__(658),
  29246. RemoveTileAt: __webpack_require__(325),
  29247. RemoveTileAtWorldXY: __webpack_require__(657),
  29248. RenderDebug: __webpack_require__(656),
  29249. ReplaceByIndex: __webpack_require__(327),
  29250. SetCollision: __webpack_require__(655),
  29251. SetCollisionBetween: __webpack_require__(654),
  29252. SetCollisionByExclusion: __webpack_require__(653),
  29253. SetCollisionByProperty: __webpack_require__(652),
  29254. SetCollisionFromCollisionGroup: __webpack_require__(651),
  29255. SetTileIndexCallback: __webpack_require__(650),
  29256. SetTileLocationCallback: __webpack_require__(649),
  29257. Shuffle: __webpack_require__(648),
  29258. SwapByIndex: __webpack_require__(647),
  29259. TileToWorldX: __webpack_require__(140),
  29260. TileToWorldXY: __webpack_require__(646),
  29261. TileToWorldY: __webpack_require__(139),
  29262. WeightedRandomize: __webpack_require__(645),
  29263. WorldToTileX: __webpack_require__(54),
  29264. WorldToTileXY: __webpack_require__(644),
  29265. WorldToTileY: __webpack_require__(53)
  29266. };
  29267. /***/ }),
  29268. /* 143 */
  29269. /***/ (function(module, exports, __webpack_require__) {
  29270. /**
  29271. * @author Richard Davey <rich@photonstorm.com>
  29272. * @copyright 2018 Photon Storm Ltd.
  29273. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  29274. */
  29275. var Class = __webpack_require__(0);
  29276. var Components = __webpack_require__(348);
  29277. var Sprite = __webpack_require__(35);
  29278. /**
  29279. * @classdesc
  29280. * An Arcade Physics Sprite Game Object.
  29281. *
  29282. * A Sprite Game Object is used for the display of both static and animated images in your game.
  29283. * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled
  29284. * and animated.
  29285. *
  29286. * The main difference between a Sprite and an Image Game Object is that you cannot animate Images.
  29287. * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation
  29288. * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases.
  29289. *
  29290. * @class Sprite
  29291. * @extends Phaser.GameObjects.Sprite
  29292. * @memberOf Phaser.Physics.Arcade
  29293. * @constructor
  29294. * @since 3.0.0
  29295. *
  29296. * @extends Phaser.Physics.Arcade.Components.Acceleration
  29297. * @extends Phaser.Physics.Arcade.Components.Angular
  29298. * @extends Phaser.Physics.Arcade.Components.Bounce
  29299. * @extends Phaser.Physics.Arcade.Components.Debug
  29300. * @extends Phaser.Physics.Arcade.Components.Drag
  29301. * @extends Phaser.Physics.Arcade.Components.Enable
  29302. * @extends Phaser.Physics.Arcade.Components.Friction
  29303. * @extends Phaser.Physics.Arcade.Components.Gravity
  29304. * @extends Phaser.Physics.Arcade.Components.Immovable
  29305. * @extends Phaser.Physics.Arcade.Components.Mass
  29306. * @extends Phaser.Physics.Arcade.Components.Size
  29307. * @extends Phaser.Physics.Arcade.Components.Velocity
  29308. * @extends Phaser.GameObjects.Components.Alpha
  29309. * @extends Phaser.GameObjects.Components.BlendMode
  29310. * @extends Phaser.GameObjects.Components.Depth
  29311. * @extends Phaser.GameObjects.Components.Flip
  29312. * @extends Phaser.GameObjects.Components.GetBounds
  29313. * @extends Phaser.GameObjects.Components.Origin
  29314. * @extends Phaser.GameObjects.Components.Pipeline
  29315. * @extends Phaser.GameObjects.Components.ScaleMode
  29316. * @extends Phaser.GameObjects.Components.ScrollFactor
  29317. * @extends Phaser.GameObjects.Components.Size
  29318. * @extends Phaser.GameObjects.Components.Texture
  29319. * @extends Phaser.GameObjects.Components.Tint
  29320. * @extends Phaser.GameObjects.Components.Transform
  29321. * @extends Phaser.GameObjects.Components.Visible
  29322. *
  29323. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  29324. * @param {number} x - The horizontal position of this Game Object in the world.
  29325. * @param {number} y - The vertical position of this Game Object in the world.
  29326. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  29327. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  29328. */
  29329. var ArcadeSprite = new Class({
  29330. Extends: Sprite,
  29331. Mixins: [
  29332. Components.Acceleration,
  29333. Components.Angular,
  29334. Components.Bounce,
  29335. Components.Debug,
  29336. Components.Drag,
  29337. Components.Enable,
  29338. Components.Friction,
  29339. Components.Gravity,
  29340. Components.Immovable,
  29341. Components.Mass,
  29342. Components.Size,
  29343. Components.Velocity
  29344. ],
  29345. initialize:
  29346. function ArcadeSprite (scene, x, y, texture, frame)
  29347. {
  29348. Sprite.call(this, scene, x, y, texture, frame);
  29349. /**
  29350. * If this Game Object is enabled for physics then this property will contain a reference to a Physics Body.
  29351. *
  29352. * @name Phaser.Physics.Arcade.Sprite#body
  29353. * @type {?Phaser.Physics.Arcade.Body}
  29354. * @default null
  29355. * @since 3.0.0
  29356. */
  29357. this.body = null;
  29358. }
  29359. });
  29360. module.exports = ArcadeSprite;
  29361. /***/ }),
  29362. /* 144 */
  29363. /***/ (function(module, exports, __webpack_require__) {
  29364. /**
  29365. * @author Richard Davey <rich@photonstorm.com>
  29366. * @copyright 2018 Photon Storm Ltd.
  29367. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  29368. */
  29369. var Class = __webpack_require__(0);
  29370. var CONST = __webpack_require__(18);
  29371. var File = __webpack_require__(20);
  29372. var FileTypesManager = __webpack_require__(7);
  29373. var GetFastValue = __webpack_require__(1);
  29374. var IsPlainObject = __webpack_require__(8);
  29375. var ParseXML = __webpack_require__(264);
  29376. /**
  29377. * @typedef {object} Phaser.Loader.FileTypes.XMLFileConfig
  29378. *
  29379. * @property {string} key - The key of the file. Must be unique within both the Loader and the Text Cache.
  29380. * @property {string} [url] - The absolute or relative URL to load the file from.
  29381. * @property {string} [extension='xml'] - The default file extension to use if no url is provided.
  29382. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  29383. */
  29384. /**
  29385. * @classdesc
  29386. * A single XML File suitable for loading by the Loader.
  29387. *
  29388. * These are created when you use the Phaser.Loader.LoaderPlugin#xml method and are not typically created directly.
  29389. *
  29390. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#xml.
  29391. *
  29392. * @class XMLFile
  29393. * @extends Phaser.Loader.File
  29394. * @memberOf Phaser.Loader.FileTypes
  29395. * @constructor
  29396. * @since 3.0.0
  29397. *
  29398. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  29399. * @param {(string|Phaser.Loader.FileTypes.XMLFileConfig)} key - The key to use for this file, or a file configuration object.
  29400. * @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".
  29401. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  29402. */
  29403. var XMLFile = new Class({
  29404. Extends: File,
  29405. initialize:
  29406. function XMLFile (loader, key, url, xhrSettings)
  29407. {
  29408. var extension = 'xml';
  29409. if (IsPlainObject(key))
  29410. {
  29411. var config = key;
  29412. key = GetFastValue(config, 'key');
  29413. url = GetFastValue(config, 'url');
  29414. xhrSettings = GetFastValue(config, 'xhrSettings');
  29415. extension = GetFastValue(config, 'extension', extension);
  29416. }
  29417. var fileConfig = {
  29418. type: 'xml',
  29419. cache: loader.cacheManager.xml,
  29420. extension: extension,
  29421. responseType: 'text',
  29422. key: key,
  29423. url: url,
  29424. xhrSettings: xhrSettings
  29425. };
  29426. File.call(this, loader, fileConfig);
  29427. },
  29428. /**
  29429. * Called automatically by Loader.nextFile.
  29430. * This method controls what extra work this File does with its loaded data.
  29431. *
  29432. * @method Phaser.Loader.FileTypes.XMLFile#onProcess
  29433. * @since 3.7.0
  29434. */
  29435. onProcess: function ()
  29436. {
  29437. this.state = CONST.FILE_PROCESSING;
  29438. this.data = ParseXML(this.xhrLoader.responseText);
  29439. if (this.data)
  29440. {
  29441. this.onProcessComplete();
  29442. }
  29443. else
  29444. {
  29445. console.warn('Invalid XMLFile: ' + this.key);
  29446. this.onProcessError();
  29447. }
  29448. }
  29449. });
  29450. /**
  29451. * Adds an XML file, or array of XML files, to the current load queue.
  29452. *
  29453. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  29454. *
  29455. * ```javascript
  29456. * function preload ()
  29457. * {
  29458. * this.load.xml('wavedata', 'files/AlienWaveData.xml');
  29459. * }
  29460. * ```
  29461. *
  29462. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  29463. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  29464. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  29465. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  29466. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  29467. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  29468. * loaded.
  29469. *
  29470. * The key must be a unique String. It is used to add the file to the global XML Cache upon a successful load.
  29471. * The key should be unique both in terms of files being loaded and files already present in the XML Cache.
  29472. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  29473. * then remove it from the XML Cache first, before loading a new one.
  29474. *
  29475. * Instead of passing arguments you can pass a configuration object, such as:
  29476. *
  29477. * ```javascript
  29478. * this.load.xml({
  29479. * key: 'wavedata',
  29480. * url: 'files/AlienWaveData.xml'
  29481. * });
  29482. * ```
  29483. *
  29484. * See the documentation for `Phaser.Loader.FileTypes.XMLFileConfig` for more details.
  29485. *
  29486. * Once the file has finished loading you can access it from its Cache using its key:
  29487. *
  29488. * ```javascript
  29489. * this.load.xml('wavedata', 'files/AlienWaveData.xml');
  29490. * // and later in your game ...
  29491. * var data = this.cache.xml.get('wavedata');
  29492. * ```
  29493. *
  29494. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  29495. * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and
  29496. * this is what you would use to retrieve the text from the XML Cache.
  29497. *
  29498. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  29499. *
  29500. * 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"
  29501. * 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
  29502. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  29503. *
  29504. * Note: The ability to load this type of file will only be available if the XML File type has been built into Phaser.
  29505. * It is available in the default build but can be excluded from custom builds.
  29506. *
  29507. * @method Phaser.Loader.LoaderPlugin#xml
  29508. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  29509. * @since 3.0.0
  29510. *
  29511. * @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.
  29512. * @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".
  29513. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  29514. *
  29515. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  29516. */
  29517. FileTypesManager.register('xml', function (key, url, xhrSettings)
  29518. {
  29519. if (Array.isArray(key))
  29520. {
  29521. for (var i = 0; i < key.length; i++)
  29522. {
  29523. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  29524. this.addFile(new XMLFile(this, key[i]));
  29525. }
  29526. }
  29527. else
  29528. {
  29529. this.addFile(new XMLFile(this, key, url, xhrSettings));
  29530. }
  29531. return this;
  29532. });
  29533. module.exports = XMLFile;
  29534. /***/ }),
  29535. /* 145 */
  29536. /***/ (function(module, exports) {
  29537. /**
  29538. * @author Richard Davey <rich@photonstorm.com>
  29539. * @copyright 2018 Photon Storm Ltd.
  29540. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  29541. */
  29542. /**
  29543. * Snap a value to nearest grid slice, using floor.
  29544. *
  29545. * Example: if you have an interval gap of `5` and a position of `12`... you will snap to `10`.
  29546. * As will `14` snap to `10`... but `16` will snap to `15`.
  29547. *
  29548. * @function Phaser.Math.Snap.Floor
  29549. * @since 3.0.0
  29550. *
  29551. * @param {number} value - The value to snap.
  29552. * @param {number} gap - The interval gap of the grid.
  29553. * @param {number} [start=0] - Optional starting offset for gap.
  29554. *
  29555. * @return {number} The snapped value.
  29556. */
  29557. var SnapFloor = function (value, gap, start)
  29558. {
  29559. if (start === undefined) { start = 0; }
  29560. if (gap === 0)
  29561. {
  29562. return value;
  29563. }
  29564. value -= start;
  29565. value = gap * Math.floor(value / gap);
  29566. return start + value;
  29567. };
  29568. module.exports = SnapFloor;
  29569. /***/ }),
  29570. /* 146 */
  29571. /***/ (function(module, exports, __webpack_require__) {
  29572. /**
  29573. * @author Richard Davey <rich@photonstorm.com>
  29574. * @copyright 2018 Photon Storm Ltd.
  29575. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  29576. */
  29577. var Point = __webpack_require__(5);
  29578. // This is based off an explanation and expanded math presented by Paul Bourke:
  29579. // See http:'local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/
  29580. /**
  29581. * [description]
  29582. *
  29583. * @function Phaser.Geom.Intersects.LineToLine
  29584. * @since 3.0.0
  29585. *
  29586. * @param {Phaser.Geom.Line} line1 - [description]
  29587. * @param {Phaser.Geom.Line} line2 - [description]
  29588. * @param {Phaser.Geom.Point} [out] - [description]
  29589. *
  29590. * @return {boolean} [description]
  29591. */
  29592. var LineToLine = function (line1, line2, out)
  29593. {
  29594. if (out === undefined) { out = new Point(); }
  29595. var x1 = line1.x1;
  29596. var y1 = line1.y1;
  29597. var x2 = line1.x2;
  29598. var y2 = line1.y2;
  29599. var x3 = line2.x1;
  29600. var y3 = line2.y1;
  29601. var x4 = line2.x2;
  29602. var y4 = line2.y2;
  29603. var numA = (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3);
  29604. var numB = (x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3);
  29605. var deNom = (y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1);
  29606. // Make sure there is not a division by zero - this also indicates that the lines are parallel.
  29607. // If numA and numB were both equal to zero the lines would be on top of each other (coincidental).
  29608. // This check is not done because it is not necessary for this implementation (the parallel check accounts for this).
  29609. if (deNom === 0)
  29610. {
  29611. return false;
  29612. }
  29613. // Calculate the intermediate fractional point that the lines potentially intersect.
  29614. var uA = numA / deNom;
  29615. var uB = numB / deNom;
  29616. // The fractional point will be between 0 and 1 inclusive if the lines intersect.
  29617. // If the fractional calculation is larger than 1 or smaller than 0 the lines would need to be longer to intersect.
  29618. if (uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1)
  29619. {
  29620. out.x = x1 + (uA * (x2 - x1));
  29621. out.y = y1 + (uA * (y2 - y1));
  29622. return true;
  29623. }
  29624. return false;
  29625. };
  29626. module.exports = LineToLine;
  29627. /***/ }),
  29628. /* 147 */
  29629. /***/ (function(module, exports, __webpack_require__) {
  29630. /**
  29631. * @author Richard Davey <rich@photonstorm.com>
  29632. * @copyright 2018 Photon Storm Ltd.
  29633. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  29634. */
  29635. var Class = __webpack_require__(0);
  29636. var Components = __webpack_require__(17);
  29637. var GameObject = __webpack_require__(2);
  29638. var MeshRender = __webpack_require__(865);
  29639. /**
  29640. * @classdesc
  29641. * A Mesh Game Object.
  29642. *
  29643. * @class Mesh
  29644. * @extends Phaser.GameObjects.GameObject
  29645. * @memberOf Phaser.GameObjects
  29646. * @constructor
  29647. * @webglOnly
  29648. * @since 3.0.0
  29649. *
  29650. * @extends Phaser.GameObjects.Components.Alpha
  29651. * @extends Phaser.GameObjects.Components.BlendMode
  29652. * @extends Phaser.GameObjects.Components.Depth
  29653. * @extends Phaser.GameObjects.Components.Flip
  29654. * @extends Phaser.GameObjects.Components.GetBounds
  29655. * @extends Phaser.GameObjects.Components.Mask
  29656. * @extends Phaser.GameObjects.Components.Origin
  29657. * @extends Phaser.GameObjects.Components.Pipeline
  29658. * @extends Phaser.GameObjects.Components.ScaleMode
  29659. * @extends Phaser.GameObjects.Components.Size
  29660. * @extends Phaser.GameObjects.Components.Texture
  29661. * @extends Phaser.GameObjects.Components.Transform
  29662. * @extends Phaser.GameObjects.Components.Visible
  29663. * @extends Phaser.GameObjects.Components.ScrollFactor
  29664. *
  29665. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  29666. * @param {number} x - The horizontal position of this Game Object in the world.
  29667. * @param {number} y - The vertical position of this Game Object in the world.
  29668. * @param {number[]} vertices - An array containing the vertices data for this Mesh.
  29669. * @param {number[]} uv - An array containing the uv data for this Mesh.
  29670. * @param {number[]} colors - An array containing the color data for this Mesh.
  29671. * @param {number[]} alphas - An array containing the alpha data for this Mesh.
  29672. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  29673. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  29674. */
  29675. var Mesh = new Class({
  29676. Extends: GameObject,
  29677. Mixins: [
  29678. Components.Alpha,
  29679. Components.BlendMode,
  29680. Components.Depth,
  29681. Components.Flip,
  29682. Components.GetBounds,
  29683. Components.Mask,
  29684. Components.Origin,
  29685. Components.Pipeline,
  29686. Components.ScaleMode,
  29687. Components.Size,
  29688. Components.Texture,
  29689. Components.Transform,
  29690. Components.Visible,
  29691. Components.ScrollFactor,
  29692. MeshRender
  29693. ],
  29694. initialize:
  29695. function Mesh (scene, x, y, vertices, uv, colors, alphas, texture, frame)
  29696. {
  29697. GameObject.call(this, scene, 'Mesh');
  29698. if (vertices.length !== uv.length)
  29699. {
  29700. throw new Error('Mesh Vertex count must match UV count');
  29701. }
  29702. var verticesUB = (vertices.length / 2) | 0;
  29703. if (colors.length > 0 && colors.length < verticesUB)
  29704. {
  29705. throw new Error('Mesh Color count must match Vertex count');
  29706. }
  29707. if (alphas.length > 0 && alphas.length < verticesUB)
  29708. {
  29709. throw new Error('Mesh Alpha count must match Vertex count');
  29710. }
  29711. var i;
  29712. if (colors.length === 0)
  29713. {
  29714. for (i = 0; i < verticesUB; ++i)
  29715. {
  29716. colors[i] = 0xFFFFFF;
  29717. }
  29718. }
  29719. if (alphas.length === 0)
  29720. {
  29721. for (i = 0; i < verticesUB; ++i)
  29722. {
  29723. alphas[i] = 1.0;
  29724. }
  29725. }
  29726. /**
  29727. * An array containing the vertices data for this Mesh.
  29728. *
  29729. * @name Phaser.GameObjects.Mesh#vertices
  29730. * @type {Float32Array}
  29731. * @since 3.0.0
  29732. */
  29733. this.vertices = new Float32Array(vertices);
  29734. /**
  29735. * An array containing the uv data for this Mesh.
  29736. *
  29737. * @name Phaser.GameObjects.Mesh#uv
  29738. * @type {Float32Array}
  29739. * @since 3.0.0
  29740. */
  29741. this.uv = new Float32Array(uv);
  29742. /**
  29743. * An array containing the color data for this Mesh.
  29744. *
  29745. * @name Phaser.GameObjects.Mesh#colors
  29746. * @type {Uint32Array}
  29747. * @since 3.0.0
  29748. */
  29749. this.colors = new Uint32Array(colors);
  29750. /**
  29751. * An array containing the alpha data for this Mesh.
  29752. *
  29753. * @name Phaser.GameObjects.Mesh#alphas
  29754. * @type {Float32Array}
  29755. * @since 3.0.0
  29756. */
  29757. this.alphas = new Float32Array(alphas);
  29758. /**
  29759. * Fill or additive mode used when blending the color values?
  29760. *
  29761. * @name Phaser.GameObjects.Mesh#tintFill
  29762. * @type {boolean}
  29763. * @default false
  29764. * @since 3.11.0
  29765. */
  29766. this.tintFill = false;
  29767. this.setTexture(texture, frame);
  29768. this.setPosition(x, y);
  29769. this.setSizeToFrame();
  29770. this.setOrigin();
  29771. this.initPipeline('TextureTintPipeline');
  29772. }
  29773. });
  29774. module.exports = Mesh;
  29775. /***/ }),
  29776. /* 148 */
  29777. /***/ (function(module, exports, __webpack_require__) {
  29778. /**
  29779. * @author Richard Davey <rich@photonstorm.com>
  29780. * @copyright 2018 Photon Storm Ltd.
  29781. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  29782. */
  29783. var Class = __webpack_require__(0);
  29784. var Components = __webpack_require__(17);
  29785. var GameObject = __webpack_require__(2);
  29786. var GetBitmapTextSize = __webpack_require__(918);
  29787. var ParseFromAtlas = __webpack_require__(917);
  29788. var Render = __webpack_require__(916);
  29789. /**
  29790. * The font data for an individual character of a Bitmap Font.
  29791. *
  29792. * Describes the character's position, size, offset and kerning.
  29793. *
  29794. * @typedef {object} BitmapFontCharacterData
  29795. *
  29796. * @property {number} x - The x position of the character.
  29797. * @property {number} y - The y position of the character.
  29798. * @property {number} width - The width of the character.
  29799. * @property {number} height - The height of the character.
  29800. * @property {number} centerX - The center x position of the character.
  29801. * @property {number} centerY - The center y position of the character.
  29802. * @property {number} xOffset - The x offset of the character.
  29803. * @property {number} yOffset - The y offset of the character.
  29804. * @property {object} data - Extra data for the character.
  29805. * @property {Object.<number>} kerning - Kerning values, keyed by character code.
  29806. */
  29807. /**
  29808. * Bitmap Font data that can be used by a BitmapText Game Object.
  29809. *
  29810. * @typedef {object} BitmapFontData
  29811. *
  29812. * @property {string} font - The name of the font.
  29813. * @property {number} size - The size of the font.
  29814. * @property {number} lineHeight - The line height of the font.
  29815. * @property {boolean} retroFont - Whether this font is a retro font (monospace).
  29816. * @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.
  29817. */
  29818. /**
  29819. * @typedef {object} JSONBitmapText
  29820. * @extends {JSONGameObject}
  29821. *
  29822. * @property {string} font - The name of the font.
  29823. * @property {string} text - The text that this Bitmap Text displays.
  29824. * @property {number} fontSize - The size of the font.
  29825. * @property {number} letterSpacing - Adds / Removes spacing between characters.
  29826. * @property {integer} align - The alignment of the text in a multi-line BitmapText object.
  29827. */
  29828. /**
  29829. * @classdesc
  29830. * [description]
  29831. *
  29832. * @class BitmapText
  29833. * @extends Phaser.GameObjects.GameObject
  29834. * @memberOf Phaser.GameObjects
  29835. * @constructor
  29836. * @since 3.0.0
  29837. *
  29838. * @extends Phaser.GameObjects.Components.Alpha
  29839. * @extends Phaser.GameObjects.Components.BlendMode
  29840. * @extends Phaser.GameObjects.Components.Depth
  29841. * @extends Phaser.GameObjects.Components.Mask
  29842. * @extends Phaser.GameObjects.Components.Origin
  29843. * @extends Phaser.GameObjects.Components.Pipeline
  29844. * @extends Phaser.GameObjects.Components.ScaleMode
  29845. * @extends Phaser.GameObjects.Components.ScrollFactor
  29846. * @extends Phaser.GameObjects.Components.Texture
  29847. * @extends Phaser.GameObjects.Components.Tint
  29848. * @extends Phaser.GameObjects.Components.Transform
  29849. * @extends Phaser.GameObjects.Components.Visible
  29850. *
  29851. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. It can only belong to one Scene at any given time.
  29852. * @param {number} x - The x coordinate of this Game Object in world space.
  29853. * @param {number} y - The y coordinate of this Game Object in world space.
  29854. * @param {string} font - The key of the font to use from the Bitmap Font cache.
  29855. * @param {(string|string[])} [text] - The string, or array of strings, to be set as the content of this Bitmap Text.
  29856. * @param {number} [size] - The font size of this Bitmap Text.
  29857. * @param {integer} [align=0] - The alignment of the text in a multi-line BitmapText object.
  29858. */
  29859. var BitmapText = new Class({
  29860. Extends: GameObject,
  29861. Mixins: [
  29862. Components.Alpha,
  29863. Components.BlendMode,
  29864. Components.Depth,
  29865. Components.Mask,
  29866. Components.Origin,
  29867. Components.Pipeline,
  29868. Components.ScaleMode,
  29869. Components.ScrollFactor,
  29870. Components.Texture,
  29871. Components.Tint,
  29872. Components.Transform,
  29873. Components.Visible,
  29874. Render
  29875. ],
  29876. initialize:
  29877. function BitmapText (scene, x, y, font, text, size, align)
  29878. {
  29879. if (text === undefined) { text = ''; }
  29880. if (align === undefined) { align = 0; }
  29881. GameObject.call(this, scene, 'BitmapText');
  29882. /**
  29883. * The key of the Bitmap Font used by this Bitmap Text.
  29884. * To change the font after creation please use `setFont`.
  29885. *
  29886. * @name Phaser.GameObjects.BitmapText#font
  29887. * @type {string}
  29888. * @readOnly
  29889. * @since 3.0.0
  29890. */
  29891. this.font = font;
  29892. var entry = this.scene.sys.cache.bitmapFont.get(font);
  29893. /**
  29894. * The data of the Bitmap Font used by this Bitmap Text.
  29895. *
  29896. * @name Phaser.GameObjects.BitmapText#fontData
  29897. * @type {BitmapFontData}
  29898. * @readOnly
  29899. * @since 3.0.0
  29900. */
  29901. this.fontData = entry.data;
  29902. /**
  29903. * The text that this Bitmap Text object displays.
  29904. *
  29905. * @name Phaser.GameObjects.BitmapText#_text
  29906. * @type {string}
  29907. * @private
  29908. * @since 3.0.0
  29909. */
  29910. this._text = '';
  29911. /**
  29912. * The font size of this Bitmap Text.
  29913. *
  29914. * @name Phaser.GameObjects.BitmapText#_fontSize
  29915. * @type {number}
  29916. * @private
  29917. * @since 3.0.0
  29918. */
  29919. this._fontSize = size || this.fontData.size;
  29920. /**
  29921. * Adds / Removes spacing between characters.
  29922. *
  29923. * Can be a negative or positive number.
  29924. *
  29925. * @name Phaser.GameObjects.BitmapText#_letterSpacing
  29926. * @type {number}
  29927. * @private
  29928. * @since 3.4.0
  29929. */
  29930. this._letterSpacing = 0;
  29931. /**
  29932. * Controls the alignment of each line of text in this BitmapText object.
  29933. * Only has any effect when this BitmapText contains multiple lines of text, split with carriage-returns.
  29934. * Has no effect with single-lines of text.
  29935. *
  29936. * See the methods `setLeftAlign`, `setCenterAlign` and `setRightAlign`.
  29937. *
  29938. * 0 = Left aligned (default)
  29939. * 1 = Middle aligned
  29940. * 2 = Right aligned
  29941. *
  29942. * The alignment position is based on the longest line of text.
  29943. *
  29944. * @name Phaser.GameObjects.BitmapText#_align
  29945. * @type {integer}
  29946. * @private
  29947. * @since 3.11.0
  29948. */
  29949. this._align = align;
  29950. /**
  29951. * An object that describes the size of this Bitmap Text.
  29952. *
  29953. * @name Phaser.GameObjects.BitmapText#_bounds
  29954. * @type {BitmapTextSize}
  29955. * @private
  29956. * @since 3.0.0
  29957. */
  29958. this._bounds = GetBitmapTextSize(this, false, this._bounds);
  29959. /**
  29960. * An internal dirty flag for bounds calculation.
  29961. *
  29962. * @name Phaser.GameObjects.BitmapText#_dirty
  29963. * @type {boolean}
  29964. * @private
  29965. * @since 3.11.0
  29966. */
  29967. this._dirty = false;
  29968. this.setTexture(entry.texture, entry.frame);
  29969. this.setPosition(x, y);
  29970. this.setOrigin(0, 0);
  29971. this.initPipeline('TextureTintPipeline');
  29972. this.setText(text);
  29973. },
  29974. /**
  29975. * Set the lines of text in this BitmapText to be left-aligned.
  29976. * This only has any effect if this BitmapText contains more than one line of text.
  29977. *
  29978. * @method Phaser.GameObjects.BitmapText#setLeftAlign
  29979. * @since 3.11.0
  29980. *
  29981. * @return {this} This BitmapText Object.
  29982. */
  29983. setLeftAlign: function ()
  29984. {
  29985. this._align = BitmapText.ALIGN_LEFT;
  29986. this._dirty = true;
  29987. return this;
  29988. },
  29989. /**
  29990. * Set the lines of text in this BitmapText to be center-aligned.
  29991. * This only has any effect if this BitmapText contains more than one line of text.
  29992. *
  29993. * @method Phaser.GameObjects.BitmapText#setCenterAlign
  29994. * @since 3.11.0
  29995. *
  29996. * @return {this} This BitmapText Object.
  29997. */
  29998. setCenterAlign: function ()
  29999. {
  30000. this._align = BitmapText.ALIGN_CENTER;
  30001. this._dirty = true;
  30002. return this;
  30003. },
  30004. /**
  30005. * Set the lines of text in this BitmapText to be right-aligned.
  30006. * This only has any effect if this BitmapText contains more than one line of text.
  30007. *
  30008. * @method Phaser.GameObjects.BitmapText#setRightAlign
  30009. * @since 3.11.0
  30010. *
  30011. * @return {this} This BitmapText Object.
  30012. */
  30013. setRightAlign: function ()
  30014. {
  30015. this._align = BitmapText.ALIGN_RIGHT;
  30016. this._dirty = true;
  30017. return this;
  30018. },
  30019. /**
  30020. * Set the font size of this Bitmap Text.
  30021. *
  30022. * @method Phaser.GameObjects.BitmapText#setFontSize
  30023. * @since 3.0.0
  30024. *
  30025. * @param {number} size - The font size to set.
  30026. *
  30027. * @return {this} This BitmapText Object.
  30028. */
  30029. setFontSize: function (size)
  30030. {
  30031. this._fontSize = size;
  30032. this._dirty = true;
  30033. return this;
  30034. },
  30035. /**
  30036. * Sets the letter spacing between each character of this Bitmap Text.
  30037. * Can be a positive value to increase the space, or negative to reduce it.
  30038. * Spacing is applied after the kerning values have been set.
  30039. *
  30040. * @method Phaser.GameObjects.BitmapText#setLetterSpacing
  30041. * @since 3.4.0
  30042. *
  30043. * @param {number} [spacing=0] - The amount of horizontal space to add between each character.
  30044. *
  30045. * @return {this} This BitmapText Object.
  30046. */
  30047. setLetterSpacing: function (spacing)
  30048. {
  30049. if (spacing === undefined) { spacing = 0; }
  30050. this._letterSpacing = spacing;
  30051. this._dirty = true;
  30052. return this;
  30053. },
  30054. /**
  30055. * Set the textual content of this BitmapText.
  30056. *
  30057. * An array of strings will be converted into multi-line text. Use the align methods to change multi-line alignment.
  30058. *
  30059. * @method Phaser.GameObjects.BitmapText#setText
  30060. * @since 3.0.0
  30061. *
  30062. * @param {(string|string[])} value - The string, or array of strings, to be set as the content of this BitmapText.
  30063. *
  30064. * @return {this} This BitmapText Object.
  30065. */
  30066. setText: function (value)
  30067. {
  30068. if (!value && value !== 0)
  30069. {
  30070. value = '';
  30071. }
  30072. if (Array.isArray(value))
  30073. {
  30074. value = value.join('\n');
  30075. }
  30076. if (value !== this.text)
  30077. {
  30078. this._text = value.toString();
  30079. this.updateDisplayOrigin();
  30080. this._dirty = true;
  30081. }
  30082. return this;
  30083. },
  30084. /**
  30085. * Calculate the bounds of this Bitmap Text.
  30086. *
  30087. * An object is returned that contains the position, width and height of the Bitmap Text in local and global
  30088. * contexts.
  30089. *
  30090. * Local size is based on just the font size and a [0, 0] position.
  30091. *
  30092. * Global size takes into account the Game Object's scale, world position and display origin.
  30093. *
  30094. * Also in the object is data regarding the length of each line, should this be a multi-line BitmapText.
  30095. *
  30096. * @method Phaser.GameObjects.BitmapText#getTextBounds
  30097. * @since 3.0.0
  30098. *
  30099. * @param {boolean} [round] - Whether to round the results to the nearest integer.
  30100. *
  30101. * @return {BitmapTextSize} An object that describes the size of this Bitmap Text.
  30102. */
  30103. getTextBounds: function (round)
  30104. {
  30105. // local = The BitmapText based on fontSize and 0x0 coords
  30106. // global = The BitmapText, taking into account scale and world position
  30107. // lines = The BitmapText line data
  30108. if (this._dirty)
  30109. {
  30110. GetBitmapTextSize(this, round, this._bounds);
  30111. }
  30112. return this._bounds;
  30113. },
  30114. /**
  30115. * Changes the font this BitmapText is using to render.
  30116. *
  30117. * The new texture is loaded and applied to the BitmapText. The existing test, size and alignment are preserved,
  30118. * unless overridden via the arguments.
  30119. *
  30120. * @method Phaser.GameObjects.BitmapText#setFont
  30121. * @since 3.11.0
  30122. *
  30123. * @param {string} font - The key of the font to use from the Bitmap Font cache.
  30124. * @param {number} [size] - The font size of this Bitmap Text. If not specified the current size will be used.
  30125. * @param {integer} [align=0] - The alignment of the text in a multi-line BitmapText object. If not specified the current alignment will be used.
  30126. *
  30127. * @return {this} This BitmapText Object.
  30128. */
  30129. setFont: function (key, size, align)
  30130. {
  30131. if (size === undefined) { size = this._fontSize; }
  30132. if (align === undefined) { align = this._align; }
  30133. if (key !== this.font)
  30134. {
  30135. var entry = this.scene.sys.cache.bitmapFont.get(key);
  30136. if (entry)
  30137. {
  30138. this.font = key;
  30139. this.fontData = entry.data;
  30140. this._fontSize = size;
  30141. this._align = align;
  30142. this.setTexture(entry.texture, entry.frame);
  30143. GetBitmapTextSize(this, false, this._bounds);
  30144. }
  30145. }
  30146. return this;
  30147. },
  30148. /**
  30149. * Controls the alignment of each line of text in this BitmapText object.
  30150. *
  30151. * Only has any effect when this BitmapText contains multiple lines of text, split with carriage-returns.
  30152. * Has no effect with single-lines of text.
  30153. *
  30154. * See the methods `setLeftAlign`, `setCenterAlign` and `setRightAlign`.
  30155. *
  30156. * 0 = Left aligned (default)
  30157. * 1 = Middle aligned
  30158. * 2 = Right aligned
  30159. *
  30160. * The alignment position is based on the longest line of text.
  30161. *
  30162. * @name Phaser.GameObjects.BitmapText#align
  30163. * @type {integer}
  30164. * @since 3.11.0
  30165. */
  30166. align: {
  30167. set: function (value)
  30168. {
  30169. this._align = value;
  30170. this._dirty = true;
  30171. },
  30172. get: function ()
  30173. {
  30174. return this._align;
  30175. }
  30176. },
  30177. /**
  30178. * The text that this Bitmap Text object displays.
  30179. *
  30180. * You can also use the method `setText` if you want a chainable way to change the text content.
  30181. *
  30182. * @name Phaser.GameObjects.BitmapText#text
  30183. * @type {string}
  30184. * @since 3.0.0
  30185. */
  30186. text: {
  30187. set: function (value)
  30188. {
  30189. this.setText(value);
  30190. },
  30191. get: function ()
  30192. {
  30193. return this._text;
  30194. }
  30195. },
  30196. /**
  30197. * The font size of this Bitmap Text.
  30198. *
  30199. * You can also use the method `setFontSize` if you want a chainable way to change the font size.
  30200. *
  30201. * @name Phaser.GameObjects.BitmapText#fontSize
  30202. * @type {number}
  30203. * @since 3.0.0
  30204. */
  30205. fontSize: {
  30206. set: function (value)
  30207. {
  30208. this._fontSize = value;
  30209. this._dirty = true;
  30210. },
  30211. get: function ()
  30212. {
  30213. return this._fontSize;
  30214. }
  30215. },
  30216. /**
  30217. * Adds / Removes spacing between characters.
  30218. *
  30219. * Can be a negative or positive number.
  30220. *
  30221. * You can also use the method `setLetterSpacing` if you want a chainable way to change the letter spacing.
  30222. *
  30223. * @name Phaser.GameObjects.BitmapText#letterSpacing
  30224. * @type {number}
  30225. * @since 3.0.0
  30226. */
  30227. letterSpacing: {
  30228. set: function (value)
  30229. {
  30230. this._letterSpacing = value;
  30231. this._dirty = true;
  30232. },
  30233. get: function ()
  30234. {
  30235. return this._letterSpacing;
  30236. }
  30237. },
  30238. /**
  30239. * The width of this Bitmap Text.
  30240. *
  30241. * @name Phaser.GameObjects.BitmapText#width
  30242. * @type {number}
  30243. * @readOnly
  30244. * @since 3.0.0
  30245. */
  30246. width: {
  30247. get: function ()
  30248. {
  30249. this.getTextBounds(false);
  30250. return this._bounds.global.width;
  30251. }
  30252. },
  30253. /**
  30254. * The height of this bitmap text.
  30255. *
  30256. * @name Phaser.GameObjects.BitmapText#height
  30257. * @type {number}
  30258. * @readOnly
  30259. * @since 3.0.0
  30260. */
  30261. height: {
  30262. get: function ()
  30263. {
  30264. this.getTextBounds(false);
  30265. return this._bounds.global.height;
  30266. }
  30267. },
  30268. /**
  30269. * Build a JSON representation of this Bitmap Text.
  30270. *
  30271. * @method Phaser.GameObjects.BitmapText#toJSON
  30272. * @since 3.0.0
  30273. *
  30274. * @return {JSONBitmapText} A JSON representation of this Bitmap Text.
  30275. */
  30276. toJSON: function ()
  30277. {
  30278. var out = Components.ToJSON(this);
  30279. // Extra data is added here
  30280. var data = {
  30281. font: this.font,
  30282. text: this.text,
  30283. fontSize: this.fontSize,
  30284. letterSpacing: this.letterSpacing,
  30285. align: this.align
  30286. };
  30287. out.data = data;
  30288. return out;
  30289. }
  30290. });
  30291. /**
  30292. * Left align the text characters in a multi-line BitmapText object.
  30293. *
  30294. * @name Phaser.GameObjects.BitmapText.ALIGN_LEFT
  30295. * @type {integer}
  30296. * @since 3.11.0
  30297. */
  30298. BitmapText.ALIGN_LEFT = 0;
  30299. /**
  30300. * Center align the text characters in a multi-line BitmapText object.
  30301. *
  30302. * @name Phaser.GameObjects.BitmapText.ALIGN_CENTER
  30303. * @type {integer}
  30304. * @since 3.11.0
  30305. */
  30306. BitmapText.ALIGN_CENTER = 1;
  30307. /**
  30308. * Right align the text characters in a multi-line BitmapText object.
  30309. *
  30310. * @name Phaser.GameObjects.BitmapText.ALIGN_RIGHT
  30311. * @type {integer}
  30312. * @since 3.11.0
  30313. */
  30314. BitmapText.ALIGN_RIGHT = 2;
  30315. BitmapText.ParseFromAtlas = ParseFromAtlas;
  30316. module.exports = BitmapText;
  30317. /***/ }),
  30318. /* 149 */
  30319. /***/ (function(module, exports) {
  30320. /**
  30321. * @author Richard Davey <rich@photonstorm.com>
  30322. * @copyright 2018 Photon Storm Ltd.
  30323. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  30324. */
  30325. /**
  30326. * Returns a Random element from the array.
  30327. *
  30328. * @function Phaser.Utils.Array.GetRandom
  30329. * @since 3.0.0
  30330. *
  30331. * @param {array} array - The array to select the random entry from.
  30332. * @param {integer} [startIndex=0] - An optional start index.
  30333. * @param {integer} [length=array.length] - An optional length, the total number of elements (from the startIndex) to choose from.
  30334. *
  30335. * @return {*} A random element from the array, or `null` if no element could be found in the range given.
  30336. */
  30337. var GetRandom = function (array, startIndex, length)
  30338. {
  30339. if (startIndex === undefined) { startIndex = 0; }
  30340. if (length === undefined) { length = array.length; }
  30341. var randomIndex = startIndex + Math.floor(Math.random() * length);
  30342. return (array[randomIndex] === undefined) ? null : array[randomIndex];
  30343. };
  30344. module.exports = GetRandom;
  30345. /***/ }),
  30346. /* 150 */
  30347. /***/ (function(module, exports, __webpack_require__) {
  30348. /**
  30349. * @author Richard Davey <rich@photonstorm.com>
  30350. * @copyright 2018 Photon Storm Ltd.
  30351. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  30352. */
  30353. /**
  30354. * @namespace Phaser.Utils.Array
  30355. */
  30356. module.exports = {
  30357. Matrix: __webpack_require__(473),
  30358. Add: __webpack_require__(466),
  30359. AddAt: __webpack_require__(465),
  30360. BringToTop: __webpack_require__(464),
  30361. CountAllMatching: __webpack_require__(463),
  30362. Each: __webpack_require__(462),
  30363. EachInRange: __webpack_require__(461),
  30364. FindClosestInSorted: __webpack_require__(214),
  30365. GetAll: __webpack_require__(460),
  30366. GetFirst: __webpack_require__(459),
  30367. GetRandom: __webpack_require__(149),
  30368. MoveDown: __webpack_require__(458),
  30369. MoveTo: __webpack_require__(457),
  30370. MoveUp: __webpack_require__(456),
  30371. NumberArray: __webpack_require__(455),
  30372. NumberArrayStep: __webpack_require__(454),
  30373. QuickSelect: __webpack_require__(185),
  30374. Range: __webpack_require__(247),
  30375. Remove: __webpack_require__(200),
  30376. RemoveAt: __webpack_require__(453),
  30377. RemoveBetween: __webpack_require__(452),
  30378. RemoveRandomElement: __webpack_require__(451),
  30379. Replace: __webpack_require__(450),
  30380. RotateLeft: __webpack_require__(295),
  30381. RotateRight: __webpack_require__(294),
  30382. SafeRange: __webpack_require__(29),
  30383. SendToBack: __webpack_require__(449),
  30384. SetAll: __webpack_require__(448),
  30385. Shuffle: __webpack_require__(95),
  30386. SpliceOne: __webpack_require__(56),
  30387. StableSort: __webpack_require__(83),
  30388. Swap: __webpack_require__(447)
  30389. };
  30390. /***/ }),
  30391. /* 151 */
  30392. /***/ (function(module, exports, __webpack_require__) {
  30393. /**
  30394. * @author Richard Davey <rich@photonstorm.com>
  30395. * @author Felipe Alfonso <@bitnenfer>
  30396. * @copyright 2018 Photon Storm Ltd.
  30397. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  30398. */
  30399. var Class = __webpack_require__(0);
  30400. var ShaderSourceFS = __webpack_require__(497);
  30401. var TextureTintPipeline = __webpack_require__(130);
  30402. var LIGHT_COUNT = 10;
  30403. /**
  30404. * @classdesc
  30405. * ForwardDiffuseLightPipeline implements a forward rendering approach for 2D lights.
  30406. * This pipeline extends TextureTintPipeline so it implements all it's rendering functions
  30407. * and batching system.
  30408. *
  30409. * @class ForwardDiffuseLightPipeline
  30410. * @extends Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline
  30411. * @memberOf Phaser.Renderer.WebGL.Pipelines
  30412. * @constructor
  30413. * @since 3.0.0
  30414. *
  30415. * @param {object} config - [description]
  30416. */
  30417. var ForwardDiffuseLightPipeline = new Class({
  30418. Extends: TextureTintPipeline,
  30419. initialize:
  30420. function ForwardDiffuseLightPipeline (config)
  30421. {
  30422. config.fragShader = ShaderSourceFS.replace('%LIGHT_COUNT%', LIGHT_COUNT.toString());
  30423. TextureTintPipeline.call(this, config);
  30424. /**
  30425. * Default normal map texture to use.
  30426. *
  30427. * @name Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#defaultNormalMap
  30428. * @type {Phaser.Texture.Frame}
  30429. * @private
  30430. * @since 3.11.0
  30431. */
  30432. this.defaultNormalMap;
  30433. },
  30434. /**
  30435. * Called when the Game has fully booted and the Renderer has finished setting up.
  30436. *
  30437. * By this stage all Game level systems are now in place and you can perform any final
  30438. * tasks that the pipeline may need that relied on game systems such as the Texture Manager.
  30439. *
  30440. * @method Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#boot
  30441. * @override
  30442. * @since 3.11.0
  30443. */
  30444. boot: function ()
  30445. {
  30446. this.defaultNormalMap = this.game.textures.getFrame('__DEFAULT');
  30447. },
  30448. /**
  30449. * This function binds its base class resources and this lights 2D resources.
  30450. *
  30451. * @method Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#onBind
  30452. * @override
  30453. * @since 3.0.0
  30454. *
  30455. * @param {Phaser.GameObjects.GameObject} [gameObject] - The Game Object that invoked this pipeline, if any.
  30456. *
  30457. * @return {Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline} [description]
  30458. */
  30459. onBind: function (gameObject)
  30460. {
  30461. TextureTintPipeline.prototype.onBind.call(this);
  30462. var renderer = this.renderer;
  30463. var program = this.program;
  30464. this.mvpUpdate();
  30465. renderer.setInt1(program, 'uNormSampler', 1);
  30466. renderer.setFloat2(program, 'uResolution', this.width, this.height);
  30467. if (gameObject)
  30468. {
  30469. this.setNormalMap(gameObject);
  30470. }
  30471. return this;
  30472. },
  30473. /**
  30474. * This function sets all the needed resources for each camera pass.
  30475. *
  30476. * @method Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#onRender
  30477. * @since 3.0.0
  30478. *
  30479. * @param {Phaser.Scene} scene - [description]
  30480. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  30481. *
  30482. * @return {Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline} [description]
  30483. */
  30484. onRender: function (scene, camera)
  30485. {
  30486. this.active = false;
  30487. var lightManager = scene.sys.lights;
  30488. if (!lightManager || lightManager.lights.length <= 0 || !lightManager.active)
  30489. {
  30490. // Passthru
  30491. return this;
  30492. }
  30493. var lights = lightManager.cull(camera);
  30494. var lightCount = Math.min(lights.length, LIGHT_COUNT);
  30495. if (lightCount === 0)
  30496. {
  30497. return this;
  30498. }
  30499. this.active = true;
  30500. var renderer = this.renderer;
  30501. var program = this.program;
  30502. var cameraMatrix = camera.matrix;
  30503. var point = {x: 0, y: 0};
  30504. var height = renderer.height;
  30505. var index;
  30506. for (index = 0; index < LIGHT_COUNT; ++index)
  30507. {
  30508. // Reset lights
  30509. renderer.setFloat1(program, 'uLights[' + index + '].radius', 0);
  30510. }
  30511. renderer.setFloat4(program, 'uCamera', camera.x, camera.y, camera.rotation, camera.zoom);
  30512. renderer.setFloat3(program, 'uAmbientLightColor', lightManager.ambientColor.r, lightManager.ambientColor.g, lightManager.ambientColor.b);
  30513. for (index = 0; index < lightCount; ++index)
  30514. {
  30515. var light = lights[index];
  30516. var lightName = 'uLights[' + index + '].';
  30517. cameraMatrix.transformPoint(light.x, light.y, point);
  30518. renderer.setFloat2(program, lightName + 'position', point.x - (camera.scrollX * light.scrollFactorX * camera.zoom), height - (point.y - (camera.scrollY * light.scrollFactorY) * camera.zoom));
  30519. renderer.setFloat3(program, lightName + 'color', light.r, light.g, light.b);
  30520. renderer.setFloat1(program, lightName + 'intensity', light.intensity);
  30521. renderer.setFloat1(program, lightName + 'radius', light.radius);
  30522. }
  30523. return this;
  30524. },
  30525. /**
  30526. * Generic function for batching a textured quad
  30527. *
  30528. * @method Phaser.Renderer.WebGL.Pipelines.TextureTintPipeline#batchTexture
  30529. * @since 3.0.0
  30530. *
  30531. * @param {Phaser.GameObjects.GameObject} gameObject - Source GameObject
  30532. * @param {WebGLTexture} texture - Raw WebGLTexture associated with the quad
  30533. * @param {integer} textureWidth - Real texture width
  30534. * @param {integer} textureHeight - Real texture height
  30535. * @param {number} srcX - X coordinate of the quad
  30536. * @param {number} srcY - Y coordinate of the quad
  30537. * @param {number} srcWidth - Width of the quad
  30538. * @param {number} srcHeight - Height of the quad
  30539. * @param {number} scaleX - X component of scale
  30540. * @param {number} scaleY - Y component of scale
  30541. * @param {number} rotation - Rotation of the quad
  30542. * @param {boolean} flipX - Indicates if the quad is horizontally flipped
  30543. * @param {boolean} flipY - Indicates if the quad is vertically flipped
  30544. * @param {number} scrollFactorX - By which factor is the quad affected by the camera horizontal scroll
  30545. * @param {number} scrollFactorY - By which factor is the quad effected by the camera vertical scroll
  30546. * @param {number} displayOriginX - Horizontal origin in pixels
  30547. * @param {number} displayOriginY - Vertical origin in pixels
  30548. * @param {number} frameX - X coordinate of the texture frame
  30549. * @param {number} frameY - Y coordinate of the texture frame
  30550. * @param {number} frameWidth - Width of the texture frame
  30551. * @param {number} frameHeight - Height of the texture frame
  30552. * @param {integer} tintTL - Tint for top left
  30553. * @param {integer} tintTR - Tint for top right
  30554. * @param {integer} tintBL - Tint for bottom left
  30555. * @param {integer} tintBR - Tint for bottom right
  30556. * @param {number} tintEffect - The tint effect (0 for additive, 1 for replacement)
  30557. * @param {number} uOffset - Horizontal offset on texture coordinate
  30558. * @param {number} vOffset - Vertical offset on texture coordinate
  30559. * @param {Phaser.Cameras.Scene2D.Camera} camera - Current used camera
  30560. * @param {Phaser.GameObjects.Components.TransformMatrix} parentTransformMatrix - Parent container
  30561. */
  30562. batchTexture: function (
  30563. gameObject,
  30564. texture,
  30565. textureWidth, textureHeight,
  30566. srcX, srcY,
  30567. srcWidth, srcHeight,
  30568. scaleX, scaleY,
  30569. rotation,
  30570. flipX, flipY,
  30571. scrollFactorX, scrollFactorY,
  30572. displayOriginX, displayOriginY,
  30573. frameX, frameY, frameWidth, frameHeight,
  30574. tintTL, tintTR, tintBL, tintBR, tintEffect,
  30575. uOffset, vOffset,
  30576. camera,
  30577. parentTransformMatrix)
  30578. {
  30579. if (!this.active)
  30580. {
  30581. return;
  30582. }
  30583. this.renderer.setPipeline(this);
  30584. var normalTexture;
  30585. if (gameObject.texture)
  30586. {
  30587. normalTexture = gameObject.texture.dataSource[gameObject.frame.sourceIndex];
  30588. }
  30589. else if (gameObject.tileset)
  30590. {
  30591. normalTexture = gameObject.tileset.image.dataSource[0];
  30592. }
  30593. if (!normalTexture)
  30594. {
  30595. normalTexture = this.defaultNormalMap;
  30596. }
  30597. this.setTexture2D(normalTexture.glTexture, 1);
  30598. var camMatrix = this._tempMatrix1;
  30599. var spriteMatrix = this._tempMatrix2;
  30600. var calcMatrix = this._tempMatrix3;
  30601. var width = srcWidth;
  30602. var height = srcHeight;
  30603. var x = -displayOriginX;
  30604. var y = -displayOriginY;
  30605. // Invert the flipY if this is a RenderTexture
  30606. flipY = flipY ^ (texture.isRenderTexture ? 1 : 0);
  30607. if (flipX)
  30608. {
  30609. width *= -1;
  30610. x += srcWidth;
  30611. }
  30612. if (flipY)
  30613. {
  30614. height *= -1;
  30615. y += srcHeight;
  30616. }
  30617. if (camera.roundPixels)
  30618. {
  30619. x |= 0;
  30620. y |= 0;
  30621. }
  30622. var xw = x + width;
  30623. var yh = y + height;
  30624. spriteMatrix.applyITRS(srcX, srcY, rotation, scaleX, scaleY);
  30625. camMatrix.copyFrom(camera.matrix);
  30626. if (parentTransformMatrix)
  30627. {
  30628. // Multiply the camera by the parent matrix
  30629. camMatrix.multiplyWithOffset(parentTransformMatrix, -camera.scrollX * scrollFactorX, -camera.scrollY * scrollFactorY);
  30630. // Undo the camera scroll
  30631. spriteMatrix.e = srcX;
  30632. spriteMatrix.f = srcY;
  30633. // Multiply by the Sprite matrix, store result in calcMatrix
  30634. camMatrix.multiply(spriteMatrix, calcMatrix);
  30635. }
  30636. else
  30637. {
  30638. spriteMatrix.e -= camera.scrollX * scrollFactorX;
  30639. spriteMatrix.f -= camera.scrollY * scrollFactorY;
  30640. // Multiply by the Sprite matrix, store result in calcMatrix
  30641. camMatrix.multiply(spriteMatrix, calcMatrix);
  30642. }
  30643. var tx0 = x * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  30644. var ty0 = x * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  30645. var tx1 = x * calcMatrix.a + yh * calcMatrix.c + calcMatrix.e;
  30646. var ty1 = x * calcMatrix.b + yh * calcMatrix.d + calcMatrix.f;
  30647. var tx2 = xw * calcMatrix.a + yh * calcMatrix.c + calcMatrix.e;
  30648. var ty2 = xw * calcMatrix.b + yh * calcMatrix.d + calcMatrix.f;
  30649. var tx3 = xw * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  30650. var ty3 = xw * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  30651. if (camera.roundPixels)
  30652. {
  30653. tx0 |= 0;
  30654. ty0 |= 0;
  30655. tx1 |= 0;
  30656. ty1 |= 0;
  30657. tx2 |= 0;
  30658. ty2 |= 0;
  30659. tx3 |= 0;
  30660. ty3 |= 0;
  30661. }
  30662. var u0 = (frameX / textureWidth) + uOffset;
  30663. var v0 = (frameY / textureHeight) + vOffset;
  30664. var u1 = (frameX + frameWidth) / textureWidth + uOffset;
  30665. var v1 = (frameY + frameHeight) / textureHeight + vOffset;
  30666. this.setTexture2D(texture, 0);
  30667. this.batchVertices(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect);
  30668. },
  30669. /**
  30670. * Sets the Game Objects normal map as the active texture.
  30671. *
  30672. * @method Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#setNormalMap
  30673. * @since 3.11.0
  30674. *
  30675. * @param {Phaser.GameObjects.GameObject} gameObject - [description]
  30676. */
  30677. setNormalMap: function (gameObject)
  30678. {
  30679. if (!this.active || !gameObject)
  30680. {
  30681. return;
  30682. }
  30683. var normalTexture;
  30684. if (gameObject.texture)
  30685. {
  30686. normalTexture = gameObject.texture.dataSource[gameObject.frame.sourceIndex];
  30687. }
  30688. if (!normalTexture)
  30689. {
  30690. normalTexture = this.defaultNormalMap;
  30691. }
  30692. this.setTexture2D(normalTexture.glTexture, 1);
  30693. this.renderer.setPipeline(gameObject.defaultPipeline);
  30694. },
  30695. /**
  30696. * [description]
  30697. *
  30698. * @method Phaser.Renderer.WebGL.Pipelines.ForwardDiffuseLightPipeline#batchSprite
  30699. * @since 3.0.0
  30700. *
  30701. * @param {Phaser.GameObjects.Sprite} sprite - [description]
  30702. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  30703. * @param {Phaser.GameObjects.Components.TransformMatrix} parentTransformMatrix - [description]
  30704. *
  30705. */
  30706. batchSprite: function (sprite, camera, parentTransformMatrix)
  30707. {
  30708. if (!this.active)
  30709. {
  30710. return;
  30711. }
  30712. var normalTexture = sprite.texture.dataSource[sprite.frame.sourceIndex];
  30713. if (normalTexture)
  30714. {
  30715. this.renderer.setPipeline(this);
  30716. this.setTexture2D(normalTexture.glTexture, 1);
  30717. TextureTintPipeline.prototype.batchSprite.call(this, sprite, camera, parentTransformMatrix);
  30718. }
  30719. }
  30720. });
  30721. ForwardDiffuseLightPipeline.LIGHT_COUNT = LIGHT_COUNT;
  30722. module.exports = ForwardDiffuseLightPipeline;
  30723. /***/ }),
  30724. /* 152 */
  30725. /***/ (function(module, exports) {
  30726. /**
  30727. * @author Richard Davey <rich@photonstorm.com>
  30728. * @copyright 2018 Photon Storm Ltd.
  30729. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  30730. */
  30731. /**
  30732. * Compute a random integer between the `min` and `max` values, inclusive.
  30733. *
  30734. * @function Phaser.Math.Between
  30735. * @since 3.0.0
  30736. *
  30737. * @param {integer} min - The minimum value.
  30738. * @param {integer} max - The maximum value.
  30739. *
  30740. * @return {integer} The random integer.
  30741. */
  30742. var Between = function (min, max)
  30743. {
  30744. return Math.floor(Math.random() * (max - min + 1) + min);
  30745. };
  30746. module.exports = Between;
  30747. /***/ }),
  30748. /* 153 */
  30749. /***/ (function(module, exports, __webpack_require__) {
  30750. /**
  30751. * @author Richard Davey <rich@photonstorm.com>
  30752. * @copyright 2018 Photon Storm Ltd.
  30753. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  30754. */
  30755. var CONST = __webpack_require__(15);
  30756. /**
  30757. * Convert the given angle in radians, to the equivalent angle in degrees.
  30758. *
  30759. * @function Phaser.Math.RadToDeg
  30760. * @since 3.0.0
  30761. *
  30762. * @param {number} radians - The angle in radians to convert ot degrees.
  30763. *
  30764. * @return {integer} The given angle converted to degrees.
  30765. */
  30766. var RadToDeg = function (radians)
  30767. {
  30768. return radians * CONST.RAD_TO_DEG;
  30769. };
  30770. module.exports = RadToDeg;
  30771. /***/ }),
  30772. /* 154 */
  30773. /***/ (function(module, exports, __webpack_require__) {
  30774. /**
  30775. * @author Richard Davey <rich@photonstorm.com>
  30776. * @copyright 2018 Photon Storm Ltd.
  30777. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  30778. */
  30779. var Class = __webpack_require__(0);
  30780. var GameObject = __webpack_require__(2);
  30781. var Sprite = __webpack_require__(35);
  30782. var Vector2 = __webpack_require__(6);
  30783. var Vector4 = __webpack_require__(271);
  30784. /**
  30785. * @classdesc
  30786. * A Sprite 3D Game Object.
  30787. *
  30788. * The Sprite 3D object is an encapsulation of a standard Sprite object, with additional methods to allow
  30789. * it to be rendered by a 3D Camera. The Sprite can be positioned anywhere within 3D space.
  30790. *
  30791. * @class Sprite3D
  30792. * @extends Phaser.GameObjects.GameObject
  30793. * @memberOf Phaser.GameObjects
  30794. * @constructor
  30795. * @since 3.0.0
  30796. *
  30797. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  30798. * @param {number} x - The x position of this Game Object.
  30799. * @param {number} y - The y position of this Game Object.
  30800. * @param {number} z - The z position of this Game Object.
  30801. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  30802. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  30803. */
  30804. var Sprite3D = new Class({
  30805. Extends: GameObject,
  30806. initialize:
  30807. function Sprite3D (scene, x, y, z, texture, frame)
  30808. {
  30809. GameObject.call(this, scene, 'Sprite3D');
  30810. /**
  30811. * The encapsulated Sprite.
  30812. *
  30813. * @name Phaser.GameObjects.Sprite3D#gameObject
  30814. * @type {Phaser.GameObjects.GameObject}
  30815. * @since 3.0.0
  30816. */
  30817. this.gameObject = new Sprite(scene, 0, 0, texture, frame);
  30818. /**
  30819. * The position of the Sprite.
  30820. *
  30821. * @name Phaser.GameObjects.Sprite3D#position
  30822. * @type {Phaser.Math.Vector4}
  30823. * @since 3.0.0
  30824. */
  30825. this.position = new Vector4(x, y, z);
  30826. /**
  30827. * The 2D size of the Sprite.
  30828. *
  30829. * @name Phaser.GameObjects.Sprite3D#size
  30830. * @type {Phaser.Math.Vector2}
  30831. * @since 3.0.0
  30832. */
  30833. this.size = new Vector2(this.gameObject.width, this.gameObject.height);
  30834. /**
  30835. * The 2D scale of the Sprite.
  30836. *
  30837. * @name Phaser.GameObjects.Sprite3D#scale
  30838. * @type {Phaser.Math.Vector2}
  30839. * @since 3.0.0
  30840. */
  30841. this.scale = new Vector2(1, 1);
  30842. /**
  30843. * Whether to automatically set the horizontal scale of the encapsulated Sprite.
  30844. *
  30845. * @name Phaser.GameObjects.Sprite3D#adjustScaleX
  30846. * @type {boolean}
  30847. * @default true
  30848. * @since 3.0.0
  30849. */
  30850. this.adjustScaleX = true;
  30851. /**
  30852. * Whether to automatically set the vertical scale of the encapsulated Sprite.
  30853. *
  30854. * @name Phaser.GameObjects.Sprite3D#adjustScaleY
  30855. * @type {boolean}
  30856. * @default true
  30857. * @since 3.0.0
  30858. */
  30859. this.adjustScaleY = true;
  30860. /**
  30861. * The visible state of the Game Object.
  30862. *
  30863. * @name Phaser.GameObjects.Sprite3D#_visible
  30864. * @type {boolean}
  30865. * @default true
  30866. * @private
  30867. * @since 3.0.0
  30868. */
  30869. this._visible = true;
  30870. },
  30871. /**
  30872. * Project this Sprite onto the given 3D Camera.
  30873. *
  30874. * @method Phaser.GameObjects.Sprite3D#project
  30875. * @since 3.0.0
  30876. *
  30877. * @param {Phaser.Cameras.Sprite3D.Camera} camera - The 3D Camera onto which to project this Sprite.
  30878. */
  30879. project: function (camera)
  30880. {
  30881. var pos = this.position;
  30882. var gameObject = this.gameObject;
  30883. camera.project(pos, gameObject);
  30884. camera.getPointSize(pos, this.size, this.scale);
  30885. if (this.scale.x <= 0 || this.scale.y <= 0)
  30886. {
  30887. gameObject.setVisible(false);
  30888. }
  30889. else
  30890. {
  30891. if (!gameObject.visible)
  30892. {
  30893. gameObject.setVisible(true);
  30894. }
  30895. if (this.adjustScaleX)
  30896. {
  30897. gameObject.scaleX = this.scale.x;
  30898. }
  30899. if (this.adjustScaleY)
  30900. {
  30901. gameObject.scaleY = this.scale.y;
  30902. }
  30903. gameObject.setDepth(gameObject.z * -1);
  30904. }
  30905. },
  30906. /**
  30907. * Set the visible state of the Game Object.
  30908. *
  30909. * @method Phaser.GameObjects.Sprite3D#setVisible
  30910. * @since 3.0.0
  30911. *
  30912. * @param {boolean} value - The visible state of the Game Object.
  30913. *
  30914. * @return {Phaser.GameObjects.Sprite3D} This Sprite3D Object.
  30915. */
  30916. setVisible: function (value)
  30917. {
  30918. this.visible = value;
  30919. return this;
  30920. },
  30921. /**
  30922. * The visible state of the Game Object.
  30923. *
  30924. * An invisible Game Object will skip rendering, but will still process update logic.
  30925. *
  30926. * @name Phaser.GameObjects.Sprite3D#visible
  30927. * @type {boolean}
  30928. * @since 3.0.0
  30929. */
  30930. visible: {
  30931. get: function ()
  30932. {
  30933. return this._visible;
  30934. },
  30935. set: function (value)
  30936. {
  30937. this._visible = value;
  30938. this.gameObject.visible = value;
  30939. }
  30940. },
  30941. /**
  30942. * The x position of this Game Object.
  30943. *
  30944. * @name Phaser.GameObjects.Sprite3D#x
  30945. * @type {number}
  30946. * @since 3.0.0
  30947. */
  30948. x: {
  30949. get: function ()
  30950. {
  30951. return this.position.x;
  30952. },
  30953. set: function (value)
  30954. {
  30955. this.position.x = value;
  30956. }
  30957. },
  30958. /**
  30959. * The y position of this Game Object.
  30960. *
  30961. * @name Phaser.GameObjects.Sprite3D#y
  30962. * @type {number}
  30963. * @since 3.0.0
  30964. */
  30965. y: {
  30966. get: function ()
  30967. {
  30968. return this.position.y;
  30969. },
  30970. set: function (value)
  30971. {
  30972. this.position.y = value;
  30973. }
  30974. },
  30975. /**
  30976. * The z position of this Game Object.
  30977. *
  30978. * @name Phaser.GameObjects.Sprite3D#z
  30979. * @type {number}
  30980. * @since 3.0.0
  30981. */
  30982. z: {
  30983. get: function ()
  30984. {
  30985. return this.position.z;
  30986. },
  30987. set: function (value)
  30988. {
  30989. this.position.z = value;
  30990. }
  30991. }
  30992. });
  30993. module.exports = Sprite3D;
  30994. /***/ }),
  30995. /* 155 */
  30996. /***/ (function(module, exports) {
  30997. /**
  30998. * @author Richard Davey <rich@photonstorm.com>
  30999. * @copyright 2018 Photon Storm Ltd.
  31000. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31001. */
  31002. /**
  31003. * Given 3 separate color values this will return an integer representation of it.
  31004. *
  31005. * @function Phaser.Display.Color.GetColor
  31006. * @since 3.0.0
  31007. *
  31008. * @param {integer} red - The red color value. A number between 0 and 255.
  31009. * @param {integer} green - The green color value. A number between 0 and 255.
  31010. * @param {integer} blue - The blue color value. A number between 0 and 255.
  31011. *
  31012. * @return {number} The combined color value.
  31013. */
  31014. var GetColor = function (red, green, blue)
  31015. {
  31016. return red << 16 | green << 8 | blue;
  31017. };
  31018. module.exports = GetColor;
  31019. /***/ }),
  31020. /* 156 */
  31021. /***/ (function(module, exports) {
  31022. /**
  31023. * @author Richard Davey <rich@photonstorm.com>
  31024. * @copyright 2018 Photon Storm Ltd.
  31025. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31026. */
  31027. // Centers this Rectangle so that the center coordinates match the given x and y values.
  31028. /**
  31029. * [description]
  31030. *
  31031. * @function Phaser.Geom.Rectangle.CenterOn
  31032. * @since 3.0.0
  31033. *
  31034. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  31035. *
  31036. * @param {Phaser.Geom.Rectangle} rect - [description]
  31037. * @param {number} x - [description]
  31038. * @param {number} y - [description]
  31039. *
  31040. * @return {Phaser.Geom.Rectangle} [description]
  31041. */
  31042. var CenterOn = function (rect, x, y)
  31043. {
  31044. rect.x = x - (rect.width / 2);
  31045. rect.y = y - (rect.height / 2);
  31046. return rect;
  31047. };
  31048. module.exports = CenterOn;
  31049. /***/ }),
  31050. /* 157 */
  31051. /***/ (function(module, exports) {
  31052. /**
  31053. * @author Richard Davey <rich@photonstorm.com>
  31054. * @copyright 2018 Photon Storm Ltd.
  31055. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31056. */
  31057. /**
  31058. * Calculate a smooth interpolation percentage of `x` between `min` and `max`.
  31059. *
  31060. * The function receives the number `x` as an argument and returns 0 if `x` is less than or equal to the left edge,
  31061. * 1 if `x` is greater than or equal to the right edge, and smoothly interpolates, using a Hermite polynomial,
  31062. * between 0 and 1 otherwise.
  31063. *
  31064. * @function Phaser.Math.SmoothStep
  31065. * @since 3.0.0
  31066. * @see {@link https://en.wikipedia.org/wiki/Smoothstep}
  31067. *
  31068. * @param {number} x - The input value.
  31069. * @param {number} min - The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'.
  31070. * @param {number} max - The maximum value, also known as the 'right edge', assumed greater than the 'left edge'.
  31071. *
  31072. * @return {number} The percentage of interpolation, between 0 and 1.
  31073. */
  31074. var SmoothStep = function (x, min, max)
  31075. {
  31076. if (x <= min)
  31077. {
  31078. return 0;
  31079. }
  31080. if (x >= max)
  31081. {
  31082. return 1;
  31083. }
  31084. x = (x - min) / (max - min);
  31085. return x * x * (3 - 2 * x);
  31086. };
  31087. module.exports = SmoothStep;
  31088. /***/ }),
  31089. /* 158 */
  31090. /***/ (function(module, exports, __webpack_require__) {
  31091. /**
  31092. * @author Richard Davey <rich@photonstorm.com>
  31093. * @copyright 2018 Photon Storm Ltd.
  31094. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31095. */
  31096. var Point = __webpack_require__(5);
  31097. /**
  31098. * [description]
  31099. *
  31100. * @function Phaser.Geom.Triangle.Random
  31101. * @since 3.0.0
  31102. *
  31103. * @generic {Phaser.Geom.Point} O - [out,$return]
  31104. *
  31105. * @param {Phaser.Geom.Triangle} triangle - [description]
  31106. * @param {Phaser.Geom.Point} [out] - [description]
  31107. *
  31108. * @return {Phaser.Geom.Point} [description]
  31109. */
  31110. var Random = function (triangle, out)
  31111. {
  31112. if (out === undefined) { out = new Point(); }
  31113. // Basis vectors
  31114. var ux = triangle.x2 - triangle.x1;
  31115. var uy = triangle.y2 - triangle.y1;
  31116. var vx = triangle.x3 - triangle.x1;
  31117. var vy = triangle.y3 - triangle.y1;
  31118. // Random point within the unit square
  31119. var r = Math.random();
  31120. var s = Math.random();
  31121. // Point outside the triangle? Remap it.
  31122. if (r + s >= 1)
  31123. {
  31124. r = 1 - r;
  31125. s = 1 - s;
  31126. }
  31127. out.x = triangle.x1 + ((ux * r) + (vx * s));
  31128. out.y = triangle.y1 + ((uy * r) + (vy * s));
  31129. return out;
  31130. };
  31131. module.exports = Random;
  31132. /***/ }),
  31133. /* 159 */
  31134. /***/ (function(module, exports, __webpack_require__) {
  31135. /**
  31136. * @author Richard Davey <rich@photonstorm.com>
  31137. * @copyright 2018 Photon Storm Ltd.
  31138. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31139. */
  31140. var Point = __webpack_require__(5);
  31141. /**
  31142. * [description]
  31143. *
  31144. * @function Phaser.Geom.Rectangle.Random
  31145. * @since 3.0.0
  31146. *
  31147. * @generic {Phaser.Geom.Point} O - [out,$return]
  31148. *
  31149. * @param {Phaser.Geom.Rectangle} rect - [description]
  31150. * @param {Phaser.Geom.Point} out - [description]
  31151. *
  31152. * @return {Phaser.Geom.Point} [description]
  31153. */
  31154. var Random = function (rect, out)
  31155. {
  31156. if (out === undefined) { out = new Point(); }
  31157. out.x = rect.x + (Math.random() * rect.width);
  31158. out.y = rect.y + (Math.random() * rect.height);
  31159. return out;
  31160. };
  31161. module.exports = Random;
  31162. /***/ }),
  31163. /* 160 */
  31164. /***/ (function(module, exports, __webpack_require__) {
  31165. /**
  31166. * @author Richard Davey <rich@photonstorm.com>
  31167. * @copyright 2018 Photon Storm Ltd.
  31168. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31169. */
  31170. var Point = __webpack_require__(5);
  31171. /**
  31172. * Returns a random point on a given Line.
  31173. *
  31174. * @function Phaser.Geom.Line.Random
  31175. * @since 3.0.0
  31176. *
  31177. * @generic {Phaser.Geom.Point} O - [out,$return]
  31178. *
  31179. * @param {Phaser.Geom.Line} line - The Line to calculate the random Point on.
  31180. * @param {(Phaser.Geom.Point|object)} [out] - An instance of a Point to be modified.
  31181. *
  31182. * @return {(Phaser.Geom.Point|object)} A random Point on the Line.
  31183. */
  31184. var Random = function (line, out)
  31185. {
  31186. if (out === undefined) { out = new Point(); }
  31187. var t = Math.random();
  31188. out.x = line.x1 + t * (line.x2 - line.x1);
  31189. out.y = line.y1 + t * (line.y2 - line.y1);
  31190. return out;
  31191. };
  31192. module.exports = Random;
  31193. /***/ }),
  31194. /* 161 */
  31195. /***/ (function(module, exports, __webpack_require__) {
  31196. /**
  31197. * @author Richard Davey <rich@photonstorm.com>
  31198. * @copyright 2018 Photon Storm Ltd.
  31199. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31200. */
  31201. var Length = __webpack_require__(70);
  31202. var Point = __webpack_require__(5);
  31203. /**
  31204. * Get a number of points along a line's length.
  31205. *
  31206. * Provide a `quantity` to get an exact number of points along the line.
  31207. *
  31208. * Provide a `stepRate` to ensure a specific distance between each point on the line. Set `quantity` to `0` when
  31209. * providing a `stepRate`.
  31210. *
  31211. * @function Phaser.Geom.Line.GetPoints
  31212. * @since 3.0.0
  31213. *
  31214. * @generic {Phaser.Geom.Point[]} O - [out,$return]
  31215. *
  31216. * @param {Phaser.Geom.Line} line - The line.
  31217. * @param {integer} quantity - The number of points to place on the line. Set to `0` to use `stepRate` instead.
  31218. * @param {number} [stepRate] - The distance between each point on the line. When set, `quantity` is implied and should be set to `0`.
  31219. * @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.
  31220. *
  31221. * @return {(array|Phaser.Geom.Point[])} An array of Points, or point-like objects, containing the coordinates of the points on the line.
  31222. */
  31223. var GetPoints = function (line, quantity, stepRate, out)
  31224. {
  31225. if (out === undefined) { out = []; }
  31226. // If quantity is a falsey value (false, null, 0, undefined, etc) then we calculate it based on the stepRate instead.
  31227. if (!quantity)
  31228. {
  31229. quantity = Length(line) / stepRate;
  31230. }
  31231. var x1 = line.x1;
  31232. var y1 = line.y1;
  31233. var x2 = line.x2;
  31234. var y2 = line.y2;
  31235. for (var i = 0; i < quantity; i++)
  31236. {
  31237. var position = i / quantity;
  31238. var x = x1 + (x2 - x1) * position;
  31239. var y = y1 + (y2 - y1) * position;
  31240. out.push(new Point(x, y));
  31241. }
  31242. return out;
  31243. };
  31244. module.exports = GetPoints;
  31245. /***/ }),
  31246. /* 162 */
  31247. /***/ (function(module, exports, __webpack_require__) {
  31248. /**
  31249. * @author Richard Davey <rich@photonstorm.com>
  31250. * @copyright 2018 Photon Storm Ltd.
  31251. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31252. */
  31253. var Point = __webpack_require__(5);
  31254. /**
  31255. * Returns a uniformly distributed random point from anywhere within the given Circle.
  31256. *
  31257. * @function Phaser.Geom.Circle.Random
  31258. * @since 3.0.0
  31259. *
  31260. * @generic {Phaser.Geom.Point} O - [out,$return]
  31261. *
  31262. * @param {Phaser.Geom.Circle} circle - The Circle to get a random point from.
  31263. * @param {(Phaser.Geom.Point|object)} [out] - A Point or point-like object to set the random `x` and `y` values in.
  31264. *
  31265. * @return {(Phaser.Geom.Point|object)} A Point object with the random values set in the `x` and `y` properties.
  31266. */
  31267. var Random = function (circle, out)
  31268. {
  31269. if (out === undefined) { out = new Point(); }
  31270. var t = 2 * Math.PI * Math.random();
  31271. var u = Math.random() + Math.random();
  31272. var r = (u > 1) ? 2 - u : u;
  31273. var x = r * Math.cos(t);
  31274. var y = r * Math.sin(t);
  31275. out.x = circle.x + (x * circle.radius);
  31276. out.y = circle.y + (y * circle.radius);
  31277. return out;
  31278. };
  31279. module.exports = Random;
  31280. /***/ }),
  31281. /* 163 */
  31282. /***/ (function(module, exports, __webpack_require__) {
  31283. /**
  31284. * @author Richard Davey <rich@photonstorm.com>
  31285. * @copyright 2018 Photon Storm Ltd.
  31286. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31287. */
  31288. var BlendModes = __webpack_require__(52);
  31289. var Circle = __webpack_require__(88);
  31290. var CircleContains = __webpack_require__(33);
  31291. var Class = __webpack_require__(0);
  31292. var Components = __webpack_require__(17);
  31293. var GameObject = __webpack_require__(2);
  31294. var Rectangle = __webpack_require__(13);
  31295. var RectangleContains = __webpack_require__(31);
  31296. /**
  31297. * @classdesc
  31298. * A Zone Game Object.
  31299. *
  31300. * A Zone is a non-rendering rectangular Game Object that has a position and size.
  31301. * It has no texture and never displays, but does live on the display list and
  31302. * can be moved, scaled and rotated like any other Game Object.
  31303. *
  31304. * Its primary use is for creating Drop Zones and Input Hit Areas and it has a couple of helper methods
  31305. * specifically for this. It is also useful for object overlap checks, or as a base for your own
  31306. * non-displaying Game Objects.
  31307. * The default origin is 0.5, the center of the Zone, the same as with Game Objects.
  31308. *
  31309. * @class Zone
  31310. * @extends Phaser.GameObjects.GameObject
  31311. * @memberOf Phaser.GameObjects
  31312. * @constructor
  31313. * @since 3.0.0
  31314. *
  31315. * @extends Phaser.GameObjects.Components.Depth
  31316. * @extends Phaser.GameObjects.Components.GetBounds
  31317. * @extends Phaser.GameObjects.Components.Origin
  31318. * @extends Phaser.GameObjects.Components.ScaleMode
  31319. * @extends Phaser.GameObjects.Components.Transform
  31320. * @extends Phaser.GameObjects.Components.ScrollFactor
  31321. * @extends Phaser.GameObjects.Components.Visible
  31322. *
  31323. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs.
  31324. * @param {number} x - The horizontal position of this Game Object in the world.
  31325. * @param {number} y - The vertical position of this Game Object in the world.
  31326. * @param {number} [width=1] - The width of the Game Object.
  31327. * @param {number} [height=1] - The height of the Game Object.
  31328. */
  31329. var Zone = new Class({
  31330. Extends: GameObject,
  31331. Mixins: [
  31332. Components.Depth,
  31333. Components.GetBounds,
  31334. Components.Origin,
  31335. Components.ScaleMode,
  31336. Components.Transform,
  31337. Components.ScrollFactor,
  31338. Components.Visible
  31339. ],
  31340. initialize:
  31341. function Zone (scene, x, y, width, height)
  31342. {
  31343. if (width === undefined) { width = 1; }
  31344. if (height === undefined) { height = width; }
  31345. GameObject.call(this, scene, 'Zone');
  31346. this.setPosition(x, y);
  31347. /**
  31348. * The native (un-scaled) width of this Game Object.
  31349. *
  31350. * @name Phaser.GameObjects.Zone#width
  31351. * @type {number}
  31352. * @since 3.0.0
  31353. */
  31354. this.width = width;
  31355. /**
  31356. * The native (un-scaled) height of this Game Object.
  31357. *
  31358. * @name Phaser.GameObjects.Zone#height
  31359. * @type {number}
  31360. * @since 3.0.0
  31361. */
  31362. this.height = height;
  31363. /**
  31364. * The Blend Mode of the Game Object.
  31365. * Although a Zone never renders, it still has a blend mode to allow it to fit seamlessly into
  31366. * display lists without causing a batch flush.
  31367. *
  31368. * @name Phaser.GameObjects.Zone#blendMode
  31369. * @type {integer}
  31370. * @since 3.0.0
  31371. */
  31372. this.blendMode = BlendModes.NORMAL;
  31373. },
  31374. /**
  31375. * The displayed width of this Game Object.
  31376. * This value takes into account the scale factor.
  31377. *
  31378. * @name Phaser.GameObjects.Zone#displayWidth
  31379. * @type {number}
  31380. * @since 3.0.0
  31381. */
  31382. displayWidth: {
  31383. get: function ()
  31384. {
  31385. return this.scaleX * this.width;
  31386. },
  31387. set: function (value)
  31388. {
  31389. this.scaleX = value / this.width;
  31390. }
  31391. },
  31392. /**
  31393. * The displayed height of this Game Object.
  31394. * This value takes into account the scale factor.
  31395. *
  31396. * @name Phaser.GameObjects.Zone#displayHeight
  31397. * @type {number}
  31398. * @since 3.0.0
  31399. */
  31400. displayHeight: {
  31401. get: function ()
  31402. {
  31403. return this.scaleY * this.height;
  31404. },
  31405. set: function (value)
  31406. {
  31407. this.scaleY = value / this.height;
  31408. }
  31409. },
  31410. /**
  31411. * Sets the size of this Game Object.
  31412. *
  31413. * @method Phaser.GameObjects.Zone#setSize
  31414. * @since 3.0.0
  31415. *
  31416. * @param {number} width - The width of this Game Object.
  31417. * @param {number} height - The height of this Game Object.
  31418. * @param {boolean} [resizeInput=true] - If this Zone has a Rectangle for a hit area this argument will resize the hit area as well.
  31419. *
  31420. * @return {Phaser.GameObjects.Zone} This Game Object.
  31421. */
  31422. setSize: function (width, height, resizeInput)
  31423. {
  31424. if (resizeInput === undefined) { resizeInput = true; }
  31425. this.width = width;
  31426. this.height = height;
  31427. if (resizeInput && this.input && this.input.hitArea instanceof Rectangle)
  31428. {
  31429. this.input.hitArea.width = width;
  31430. this.input.hitArea.height = height;
  31431. }
  31432. return this;
  31433. },
  31434. /**
  31435. * Sets the display size of this Game Object.
  31436. * Calling this will adjust the scale.
  31437. *
  31438. * @method Phaser.GameObjects.Zone#setDisplaySize
  31439. * @since 3.0.0
  31440. *
  31441. * @param {number} width - The width of this Game Object.
  31442. * @param {number} height - The height of this Game Object.
  31443. *
  31444. * @return {Phaser.GameObjects.Zone} This Game Object.
  31445. */
  31446. setDisplaySize: function (width, height)
  31447. {
  31448. this.displayWidth = width;
  31449. this.displayHeight = height;
  31450. return this;
  31451. },
  31452. /**
  31453. * Sets this Zone to be a Circular Drop Zone.
  31454. * The circle is centered on this Zones `x` and `y` coordinates.
  31455. *
  31456. * @method Phaser.GameObjects.Zone#setCircleDropZone
  31457. * @since 3.0.0
  31458. *
  31459. * @param {number} radius - The radius of the Circle that will form the Drop Zone.
  31460. *
  31461. * @return {Phaser.GameObjects.Zone} This Game Object.
  31462. */
  31463. setCircleDropZone: function (radius)
  31464. {
  31465. return this.setDropZone(new Circle(0, 0, radius), CircleContains);
  31466. },
  31467. /**
  31468. * Sets this Zone to be a Rectangle Drop Zone.
  31469. * The rectangle is centered on this Zones `x` and `y` coordinates.
  31470. *
  31471. * @method Phaser.GameObjects.Zone#setRectangleDropZone
  31472. * @since 3.0.0
  31473. *
  31474. * @param {number} width - The width of the rectangle drop zone.
  31475. * @param {number} height - The height of the rectangle drop zone.
  31476. *
  31477. * @return {Phaser.GameObjects.Zone} This Game Object.
  31478. */
  31479. setRectangleDropZone: function (width, height)
  31480. {
  31481. var x = -(width / 2);
  31482. var y = -(height / 2);
  31483. return this.setDropZone(new Rectangle(x, y, width, height), RectangleContains);
  31484. },
  31485. /**
  31486. * Allows you to define your own Geometry shape to be used as a Drop Zone.
  31487. *
  31488. * @method Phaser.GameObjects.Zone#setDropZone
  31489. * @since 3.0.0
  31490. *
  31491. * @param {object} shape - A Geometry shape instance, such as Phaser.Geom.Ellipse, or your own custom shape.
  31492. * @param {HitAreaCallback} callback - A function that will return `true` if the given x/y coords it is sent are within the shape.
  31493. *
  31494. * @return {Phaser.GameObjects.Zone} This Game Object.
  31495. */
  31496. setDropZone: function (shape, callback)
  31497. {
  31498. if (shape === undefined)
  31499. {
  31500. this.setRectangleDropZone(this.width, this.height);
  31501. }
  31502. else
  31503. if (!this.input)
  31504. {
  31505. this.setInteractive(shape, callback, true);
  31506. }
  31507. return this;
  31508. },
  31509. /**
  31510. * A NOOP method so you can pass a Zone to a Container.
  31511. * Calling this method will do nothing. It is intentionally empty.
  31512. *
  31513. * @method Phaser.GameObjects.Zone#setAlpha
  31514. * @private
  31515. * @since 3.11.0
  31516. */
  31517. setAlpha: function ()
  31518. {
  31519. },
  31520. /**
  31521. * A Zone does not render.
  31522. *
  31523. * @method Phaser.GameObjects.Zone#renderCanvas
  31524. * @private
  31525. * @since 3.0.0
  31526. */
  31527. renderCanvas: function ()
  31528. {
  31529. },
  31530. /**
  31531. * A Zone does not render.
  31532. *
  31533. * @method Phaser.GameObjects.Zone#renderWebGL
  31534. * @private
  31535. * @since 3.0.0
  31536. */
  31537. renderWebGL: function ()
  31538. {
  31539. }
  31540. });
  31541. module.exports = Zone;
  31542. /***/ }),
  31543. /* 164 */
  31544. /***/ (function(module, exports, __webpack_require__) {
  31545. /**
  31546. * @author Richard Davey <rich@photonstorm.com>
  31547. * @copyright 2018 Photon Storm Ltd.
  31548. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  31549. */
  31550. var Class = __webpack_require__(0);
  31551. var EventEmitter = __webpack_require__(9);
  31552. var TweenBuilder = __webpack_require__(71);
  31553. var TWEEN_CONST = __webpack_require__(61);
  31554. /**
  31555. * @classdesc
  31556. * [description]
  31557. *
  31558. * @class Timeline
  31559. * @memberOf Phaser.Tweens
  31560. * @extends Phaser.Events.EventEmitter
  31561. * @constructor
  31562. * @since 3.0.0
  31563. *
  31564. * @param {Phaser.Tweens.TweenManager} manager - [description]
  31565. */
  31566. var Timeline = new Class({
  31567. Extends: EventEmitter,
  31568. initialize:
  31569. function Timeline (manager)
  31570. {
  31571. EventEmitter.call(this);
  31572. /**
  31573. * [description]
  31574. *
  31575. * @name Phaser.Tweens.Timeline#manager
  31576. * @type {Phaser.Tweens.TweenManager}
  31577. * @since 3.0.0
  31578. */
  31579. this.manager = manager;
  31580. /**
  31581. * [description]
  31582. *
  31583. * @name Phaser.Tweens.Timeline#isTimeline
  31584. * @type {boolean}
  31585. * @default true
  31586. * @since 3.0.0
  31587. */
  31588. this.isTimeline = true;
  31589. /**
  31590. * An array of Tween objects, each containing a unique property and target being tweened.
  31591. *
  31592. * @name Phaser.Tweens.Timeline#data
  31593. * @type {array}
  31594. * @default []
  31595. * @since 3.0.0
  31596. */
  31597. this.data = [];
  31598. /**
  31599. * data array doesn't usually change, so we can cache the length
  31600. *
  31601. * @name Phaser.Tweens.Timeline#totalData
  31602. * @type {number}
  31603. * @default 0
  31604. * @since 3.0.0
  31605. */
  31606. this.totalData = 0;
  31607. /**
  31608. * If true then duration, delay, etc values are all frame totals.
  31609. *
  31610. * @name Phaser.Tweens.Timeline#useFrames
  31611. * @type {boolean}
  31612. * @default false
  31613. * @since 3.0.0
  31614. */
  31615. this.useFrames = false;
  31616. /**
  31617. * 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.
  31618. * Value isn't used when calculating total duration of the tween, it's a run-time delta adjustment only.
  31619. *
  31620. * @name Phaser.Tweens.Timeline#timeScale
  31621. * @type {number}
  31622. * @default 1
  31623. * @since 3.0.0
  31624. */
  31625. this.timeScale = 1;
  31626. /**
  31627. * Loop this tween? Can be -1 for an infinite loop, or an integer.
  31628. * When enabled it will play through ALL TweenDatas again (use TweenData.repeat to loop a single TD)
  31629. *
  31630. * @name Phaser.Tweens.Timeline#loop
  31631. * @type {number}
  31632. * @default 0
  31633. * @since 3.0.0
  31634. */
  31635. this.loop = 0;
  31636. /**
  31637. * Time in ms/frames before the tween loops.
  31638. *
  31639. * @name Phaser.Tweens.Timeline#loopDelay
  31640. * @type {number}
  31641. * @default 0
  31642. * @since 3.0.0
  31643. */
  31644. this.loopDelay = 0;
  31645. /**
  31646. * How many loops are left to run?
  31647. *
  31648. * @name Phaser.Tweens.Timeline#loopCounter
  31649. * @type {number}
  31650. * @default 0
  31651. * @since 3.0.0
  31652. */
  31653. this.loopCounter = 0;
  31654. /**
  31655. * Time in ms/frames before the 'onComplete' event fires. This never fires if loop = true (as it never completes)
  31656. *
  31657. * @name Phaser.Tweens.Timeline#completeDelay
  31658. * @type {number}
  31659. * @default 0
  31660. * @since 3.0.0
  31661. */
  31662. this.completeDelay = 0;
  31663. /**
  31664. * Countdown timer (used by loopDelay and completeDelay)
  31665. *
  31666. * @name Phaser.Tweens.Timeline#countdown
  31667. * @type {number}
  31668. * @default 0
  31669. * @since 3.0.0
  31670. */
  31671. this.countdown = 0;
  31672. /**
  31673. * The current state of the tween
  31674. *
  31675. * @name Phaser.Tweens.Timeline#state
  31676. * @type {integer}
  31677. * @since 3.0.0
  31678. */
  31679. this.state = TWEEN_CONST.PENDING_ADD;
  31680. /**
  31681. * The state of the tween when it was paused (used by Resume)
  31682. *
  31683. * @name Phaser.Tweens.Timeline#_pausedState
  31684. * @type {integer}
  31685. * @private
  31686. * @since 3.0.0
  31687. */
  31688. this._pausedState = TWEEN_CONST.PENDING_ADD;
  31689. /**
  31690. * Does the Tween start off paused? (if so it needs to be started with Tween.play)
  31691. *
  31692. * @name Phaser.Tweens.Timeline#paused
  31693. * @type {boolean}
  31694. * @default false
  31695. * @since 3.0.0
  31696. */
  31697. this.paused = false;
  31698. /**
  31699. * Elapsed time in ms/frames of this run through the Tween.
  31700. *
  31701. * @name Phaser.Tweens.Timeline#elapsed
  31702. * @type {number}
  31703. * @default 0
  31704. * @since 3.0.0
  31705. */
  31706. this.elapsed = 0;
  31707. /**
  31708. * Total elapsed time in ms/frames of the entire Tween, including looping.
  31709. *
  31710. * @name Phaser.Tweens.Timeline#totalElapsed
  31711. * @type {number}
  31712. * @default 0
  31713. * @since 3.0.0
  31714. */
  31715. this.totalElapsed = 0;
  31716. /**
  31717. * Time in ms/frames for the whole Tween to play through once, excluding loop amounts and loop delays.
  31718. *
  31719. * @name Phaser.Tweens.Timeline#duration
  31720. * @type {number}
  31721. * @default 0
  31722. * @since 3.0.0
  31723. */
  31724. this.duration = 0;
  31725. /**
  31726. * Value between 0 and 1. The amount through the Tween, excluding loops.
  31727. *
  31728. * @name Phaser.Tweens.Timeline#progress
  31729. * @type {number}
  31730. * @default 0
  31731. * @since 3.0.0
  31732. */
  31733. this.progress = 0;
  31734. /**
  31735. * Time in ms/frames for all Tweens to complete (including looping)
  31736. *
  31737. * @name Phaser.Tweens.Timeline#totalDuration
  31738. * @type {number}
  31739. * @default 0
  31740. * @since 3.0.0
  31741. */
  31742. this.totalDuration = 0;
  31743. /**
  31744. * Value between 0 and 1. The amount through the entire Tween, including looping.
  31745. *
  31746. * @name Phaser.Tweens.Timeline#totalProgress
  31747. * @type {number}
  31748. * @default 0
  31749. * @since 3.0.0
  31750. */
  31751. this.totalProgress = 0;
  31752. this.callbacks = {
  31753. onComplete: null,
  31754. onLoop: null,
  31755. onStart: null,
  31756. onUpdate: null,
  31757. onYoyo: null
  31758. };
  31759. this.callbackScope;
  31760. },
  31761. /**
  31762. * [description]
  31763. *
  31764. * @method Phaser.Tweens.Timeline#setTimeScale
  31765. * @since 3.0.0
  31766. *
  31767. * @param {number} value - [description]
  31768. *
  31769. * @return {Phaser.Tweens.Timeline} This Timeline object.
  31770. */
  31771. setTimeScale: function (value)
  31772. {
  31773. this.timeScale = value;
  31774. return this;
  31775. },
  31776. /**
  31777. * [description]
  31778. *
  31779. * @method Phaser.Tweens.Timeline#getTimeScale
  31780. * @since 3.0.0
  31781. *
  31782. * @return {number} [description]
  31783. */
  31784. getTimeScale: function ()
  31785. {
  31786. return this.timeScale;
  31787. },
  31788. /**
  31789. * [description]
  31790. *
  31791. * @method Phaser.Tweens.Timeline#isPlaying
  31792. * @since 3.0.0
  31793. *
  31794. * @return {boolean} [description]
  31795. */
  31796. isPlaying: function ()
  31797. {
  31798. return (this.state === TWEEN_CONST.ACTIVE);
  31799. },
  31800. /**
  31801. * [description]
  31802. *
  31803. * @method Phaser.Tweens.Timeline#add
  31804. * @since 3.0.0
  31805. *
  31806. * @param {object} config - [description]
  31807. *
  31808. * @return {Phaser.Tweens.Timeline} This Timeline object.
  31809. */
  31810. add: function (config)
  31811. {
  31812. return this.queue(TweenBuilder(this, config));
  31813. },
  31814. /**
  31815. * [description]
  31816. *
  31817. * @method Phaser.Tweens.Timeline#queue
  31818. * @since 3.0.0
  31819. *
  31820. * @param {Phaser.Tweens.Tween} tween - [description]
  31821. *
  31822. * @return {Phaser.Tweens.Timeline} This Timeline object.
  31823. */
  31824. queue: function (tween)
  31825. {
  31826. if (!this.isPlaying())
  31827. {
  31828. tween.parent = this;
  31829. tween.parentIsTimeline = true;
  31830. this.data.push(tween);
  31831. this.totalData = this.data.length;
  31832. }
  31833. return this;
  31834. },
  31835. /**
  31836. * [description]
  31837. *
  31838. * @method Phaser.Tweens.Timeline#hasOffset
  31839. * @since 3.0.0
  31840. *
  31841. * @param {Phaser.Tweens.Tween} tween - [description]
  31842. *
  31843. * @return {boolean} [description]
  31844. */
  31845. hasOffset: function (tween)
  31846. {
  31847. return (tween.offset !== null);
  31848. },
  31849. /**
  31850. * [description]
  31851. *
  31852. * @method Phaser.Tweens.Timeline#isOffsetAbsolute
  31853. * @since 3.0.0
  31854. *
  31855. * @param {number} value - [description]
  31856. *
  31857. * @return {boolean} [description]
  31858. */
  31859. isOffsetAbsolute: function (value)
  31860. {
  31861. return (typeof(value) === 'number');
  31862. },
  31863. /**
  31864. * [description]
  31865. *
  31866. * @method Phaser.Tweens.Timeline#isOffsetRelative
  31867. * @since 3.0.0
  31868. *
  31869. * @param {string} value - [description]
  31870. *
  31871. * @return {boolean} [description]
  31872. */
  31873. isOffsetRelative: function (value)
  31874. {
  31875. var t = typeof(value);
  31876. if (t === 'string')
  31877. {
  31878. var op = value[0];
  31879. if (op === '-' || op === '+')
  31880. {
  31881. return true;
  31882. }
  31883. }
  31884. return false;
  31885. },
  31886. /**
  31887. * [description]
  31888. *
  31889. * @method Phaser.Tweens.Timeline#getRelativeOffset
  31890. * @since 3.0.0
  31891. *
  31892. * @param {string} value - [description]
  31893. * @param {number} base - [description]
  31894. *
  31895. * @return {number} [description]
  31896. */
  31897. getRelativeOffset: function (value, base)
  31898. {
  31899. var op = value[0];
  31900. var num = parseFloat(value.substr(2));
  31901. var result = base;
  31902. switch (op)
  31903. {
  31904. case '+':
  31905. result += num;
  31906. break;
  31907. case '-':
  31908. result -= num;
  31909. break;
  31910. }
  31911. // Cannot ever be < 0
  31912. return Math.max(0, result);
  31913. },
  31914. /**
  31915. * [description]
  31916. *
  31917. * @method Phaser.Tweens.Timeline#calcDuration
  31918. * @since 3.0.0
  31919. */
  31920. calcDuration: function ()
  31921. {
  31922. var prevEnd = 0;
  31923. var totalDuration = 0;
  31924. var offsetDuration = 0;
  31925. for (var i = 0; i < this.totalData; i++)
  31926. {
  31927. var tween = this.data[i];
  31928. tween.init();
  31929. if (this.hasOffset(tween))
  31930. {
  31931. if (this.isOffsetAbsolute(tween.offset))
  31932. {
  31933. // An actual number, so it defines the start point from the beginning of the timeline
  31934. tween.calculatedOffset = tween.offset;
  31935. if (tween.offset === 0)
  31936. {
  31937. offsetDuration = 0;
  31938. }
  31939. }
  31940. else if (this.isOffsetRelative(tween.offset))
  31941. {
  31942. // A relative offset (i.e. '-=1000', so starts at 'offset' ms relative to the PREVIOUS Tweens ending time)
  31943. tween.calculatedOffset = this.getRelativeOffset(tween.offset, prevEnd);
  31944. }
  31945. }
  31946. else
  31947. {
  31948. // Sequential
  31949. tween.calculatedOffset = offsetDuration;
  31950. }
  31951. prevEnd = tween.totalDuration + tween.calculatedOffset;
  31952. totalDuration += tween.totalDuration;
  31953. offsetDuration += tween.totalDuration;
  31954. }
  31955. // Excludes loop values
  31956. this.duration = totalDuration;
  31957. this.loopCounter = (this.loop === -1) ? 999999999999 : this.loop;
  31958. if (this.loopCounter > 0)
  31959. {
  31960. this.totalDuration = this.duration + this.completeDelay + ((this.duration + this.loopDelay) * this.loopCounter);
  31961. }
  31962. else
  31963. {
  31964. this.totalDuration = this.duration + this.completeDelay;
  31965. }
  31966. },
  31967. /**
  31968. * [description]
  31969. *
  31970. * @method Phaser.Tweens.Timeline#init
  31971. * @since 3.0.0
  31972. *
  31973. * @return {boolean} [description]
  31974. */
  31975. init: function ()
  31976. {
  31977. this.calcDuration();
  31978. this.progress = 0;
  31979. this.totalProgress = 0;
  31980. if (this.paused)
  31981. {
  31982. this.state = TWEEN_CONST.PAUSED;
  31983. return false;
  31984. }
  31985. else
  31986. {
  31987. return true;
  31988. }
  31989. },
  31990. /**
  31991. * [description]
  31992. *
  31993. * @method Phaser.Tweens.Timeline#resetTweens
  31994. * @since 3.0.0
  31995. *
  31996. * @param {boolean} resetFromLoop - [description]
  31997. */
  31998. resetTweens: function (resetFromLoop)
  31999. {
  32000. for (var i = 0; i < this.totalData; i++)
  32001. {
  32002. var tween = this.data[i];
  32003. tween.play(resetFromLoop);
  32004. }
  32005. },
  32006. /**
  32007. * [description]
  32008. *
  32009. * @method Phaser.Tweens.Timeline#setCallback
  32010. * @since 3.0.0
  32011. *
  32012. * @param {string} type - [description]
  32013. * @param {function} callback - [description]
  32014. * @param {array} [params] - [description]
  32015. * @param {object} [scope] - [description]
  32016. *
  32017. * @return {Phaser.Tweens.Timeline} This Timeline object.
  32018. */
  32019. setCallback: function (type, callback, params, scope)
  32020. {
  32021. if (Timeline.TYPES.indexOf(type) !== -1)
  32022. {
  32023. this.callbacks[type] = { func: callback, scope: scope, params: params };
  32024. }
  32025. return this;
  32026. },
  32027. /**
  32028. * Delegates #makeActive to the Tween manager.
  32029. *
  32030. * @method Phaser.Tweens.Timeline#makeActive
  32031. * @since 3.3.0
  32032. *
  32033. * @param {Phaser.Tweens.Tween} tween - The tween object to make active.
  32034. *
  32035. * @return {Phaser.Tweens.TweenManager} The Timeline's Tween Manager object.
  32036. */
  32037. makeActive: function (tween)
  32038. {
  32039. return this.manager.makeActive(tween);
  32040. },
  32041. /**
  32042. * [description]
  32043. *
  32044. * @method Phaser.Tweens.Timeline#play
  32045. * @since 3.0.0
  32046. */
  32047. play: function ()
  32048. {
  32049. if (this.state === TWEEN_CONST.ACTIVE)
  32050. {
  32051. return;
  32052. }
  32053. if (this.paused)
  32054. {
  32055. this.paused = false;
  32056. this.manager.makeActive(this);
  32057. return;
  32058. }
  32059. else
  32060. {
  32061. this.resetTweens(false);
  32062. this.state = TWEEN_CONST.ACTIVE;
  32063. }
  32064. var onStart = this.callbacks.onStart;
  32065. if (onStart)
  32066. {
  32067. onStart.func.apply(onStart.scope, onStart.params);
  32068. }
  32069. this.emit('start', this);
  32070. },
  32071. /**
  32072. * [description]
  32073. *
  32074. * @method Phaser.Tweens.Timeline#nextState
  32075. * @since 3.0.0
  32076. */
  32077. nextState: function ()
  32078. {
  32079. if (this.loopCounter > 0)
  32080. {
  32081. // Reset the elapsed time
  32082. // TODO: Probably ought to be set to the remainder from elapsed - duration
  32083. // as the tweens nearly always over-run by a few ms due to rAf
  32084. this.elapsed = 0;
  32085. this.progress = 0;
  32086. this.loopCounter--;
  32087. var onLoop = this.callbacks.onLoop;
  32088. if (onLoop)
  32089. {
  32090. onLoop.func.apply(onLoop.scope, onLoop.params);
  32091. }
  32092. this.emit('loop', this, this.loopCounter);
  32093. this.resetTweens(true);
  32094. if (this.loopDelay > 0)
  32095. {
  32096. this.countdown = this.loopDelay;
  32097. this.state = TWEEN_CONST.LOOP_DELAY;
  32098. }
  32099. else
  32100. {
  32101. this.state = TWEEN_CONST.ACTIVE;
  32102. }
  32103. }
  32104. else if (this.completeDelay > 0)
  32105. {
  32106. this.countdown = this.completeDelay;
  32107. this.state = TWEEN_CONST.COMPLETE_DELAY;
  32108. }
  32109. else
  32110. {
  32111. var onComplete = this.callbacks.onComplete;
  32112. if (onComplete)
  32113. {
  32114. onComplete.func.apply(onComplete.scope, onComplete.params);
  32115. }
  32116. this.emit('complete', this);
  32117. this.state = TWEEN_CONST.PENDING_REMOVE;
  32118. }
  32119. },
  32120. /**
  32121. * Returns 'true' if this Timeline has finished and should be removed from the Tween Manager.
  32122. * Otherwise, returns false.
  32123. *
  32124. * @method Phaser.Tweens.Timeline#update
  32125. * @since 3.0.0
  32126. *
  32127. * @param {number} timestamp - [description]
  32128. * @param {number} delta - [description]
  32129. *
  32130. * @return {boolean} Returns `true` if this Timeline has finished and should be removed from the Tween Manager.
  32131. */
  32132. update: function (timestamp, delta)
  32133. {
  32134. if (this.state === TWEEN_CONST.PAUSED)
  32135. {
  32136. return;
  32137. }
  32138. var rawDelta = delta;
  32139. if (this.useFrames)
  32140. {
  32141. delta = 1 * this.manager.timeScale;
  32142. }
  32143. delta *= this.timeScale;
  32144. this.elapsed += delta;
  32145. this.progress = Math.min(this.elapsed / this.duration, 1);
  32146. this.totalElapsed += delta;
  32147. this.totalProgress = Math.min(this.totalElapsed / this.totalDuration, 1);
  32148. switch (this.state)
  32149. {
  32150. case TWEEN_CONST.ACTIVE:
  32151. var stillRunning = this.totalData;
  32152. for (var i = 0; i < this.totalData; i++)
  32153. {
  32154. var tween = this.data[i];
  32155. if (tween.update(timestamp, rawDelta))
  32156. {
  32157. stillRunning--;
  32158. }
  32159. }
  32160. var onUpdate = this.callbacks.onUpdate;
  32161. if (onUpdate)
  32162. {
  32163. onUpdate.func.apply(onUpdate.scope, onUpdate.params);
  32164. }
  32165. this.emit('update', this);
  32166. // Anything still running? If not, we're done
  32167. if (stillRunning === 0)
  32168. {
  32169. this.nextState();
  32170. }
  32171. break;
  32172. case TWEEN_CONST.LOOP_DELAY:
  32173. this.countdown -= delta;
  32174. if (this.countdown <= 0)
  32175. {
  32176. this.state = TWEEN_CONST.ACTIVE;
  32177. }
  32178. break;
  32179. case TWEEN_CONST.COMPLETE_DELAY:
  32180. this.countdown -= delta;
  32181. if (this.countdown <= 0)
  32182. {
  32183. var onComplete = this.callbacks.onComplete;
  32184. if (onComplete)
  32185. {
  32186. onComplete.func.apply(onComplete.scope, onComplete.params);
  32187. }
  32188. this.emit('complete', this);
  32189. this.state = TWEEN_CONST.PENDING_REMOVE;
  32190. }
  32191. break;
  32192. }
  32193. return (this.state === TWEEN_CONST.PENDING_REMOVE);
  32194. },
  32195. /**
  32196. * Stops the Tween immediately, whatever stage of progress it is at and flags it for removal by the TweenManager.
  32197. *
  32198. * @method Phaser.Tweens.Timeline#stop
  32199. * @since 3.0.0
  32200. */
  32201. stop: function ()
  32202. {
  32203. this.state = TWEEN_CONST.PENDING_REMOVE;
  32204. },
  32205. /**
  32206. * [description]
  32207. *
  32208. * @method Phaser.Tweens.Timeline#pause
  32209. * @since 3.0.0
  32210. *
  32211. * @return {Phaser.Tweens.Timeline} This Timeline object.
  32212. */
  32213. pause: function ()
  32214. {
  32215. if (this.state === TWEEN_CONST.PAUSED)
  32216. {
  32217. return;
  32218. }
  32219. this.paused = true;
  32220. this._pausedState = this.state;
  32221. this.state = TWEEN_CONST.PAUSED;
  32222. this.emit('pause', this);
  32223. return this;
  32224. },
  32225. /**
  32226. * [description]
  32227. *
  32228. * @method Phaser.Tweens.Timeline#resume
  32229. * @since 3.0.0
  32230. *
  32231. * @return {Phaser.Tweens.Timeline} This Timeline object.
  32232. */
  32233. resume: function ()
  32234. {
  32235. if (this.state === TWEEN_CONST.PAUSED)
  32236. {
  32237. this.paused = false;
  32238. this.state = this._pausedState;
  32239. }
  32240. this.emit('resume', this);
  32241. return this;
  32242. },
  32243. /**
  32244. * [description]
  32245. *
  32246. * @method Phaser.Tweens.Timeline#hasTarget
  32247. * @since 3.0.0
  32248. *
  32249. * @param {object} target - [description]
  32250. *
  32251. * @return {boolean} [description]
  32252. */
  32253. hasTarget: function (target)
  32254. {
  32255. for (var i = 0; i < this.data.length; i++)
  32256. {
  32257. if (this.data[i].hasTarget(target))
  32258. {
  32259. return true;
  32260. }
  32261. }
  32262. return false;
  32263. },
  32264. /**
  32265. * [description]
  32266. *
  32267. * @method Phaser.Tweens.Timeline#destroy
  32268. * @since 3.0.0
  32269. */
  32270. destroy: function ()
  32271. {
  32272. for (var i = 0; i < this.data.length; i++)
  32273. {
  32274. this.data[i].stop();
  32275. }
  32276. }
  32277. });
  32278. Timeline.TYPES = [ 'onStart', 'onUpdate', 'onLoop', 'onComplete', 'onYoyo' ];
  32279. module.exports = Timeline;
  32280. /***/ }),
  32281. /* 165 */
  32282. /***/ (function(module, exports, __webpack_require__) {
  32283. /**
  32284. * @author Richard Davey <rich@photonstorm.com>
  32285. * @copyright 2018 Photon Storm Ltd.
  32286. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  32287. */
  32288. var Clone = __webpack_require__(34);
  32289. var Defaults = __webpack_require__(100);
  32290. var GetAdvancedValue = __webpack_require__(10);
  32291. var GetBoolean = __webpack_require__(62);
  32292. var GetEaseFunction = __webpack_require__(63);
  32293. var GetNewValue = __webpack_require__(72);
  32294. var GetTargets = __webpack_require__(102);
  32295. var GetTweens = __webpack_require__(167);
  32296. var GetValue = __webpack_require__(4);
  32297. var Timeline = __webpack_require__(164);
  32298. var TweenBuilder = __webpack_require__(71);
  32299. /**
  32300. * [description]
  32301. *
  32302. * @function Phaser.Tweens.Builders.TimelineBuilder
  32303. * @since 3.0.0
  32304. *
  32305. * @param {Phaser.Tweens.TweenManager} manager - [description]
  32306. * @param {object} config - [description]
  32307. *
  32308. * @return {Phaser.Tweens.Timeline} [description]
  32309. */
  32310. var TimelineBuilder = function (manager, config)
  32311. {
  32312. var timeline = new Timeline(manager);
  32313. var tweens = GetTweens(config);
  32314. if (tweens.length === 0)
  32315. {
  32316. timeline.paused = true;
  32317. return timeline;
  32318. }
  32319. var defaults = Clone(Defaults);
  32320. defaults.targets = GetTargets(config);
  32321. // totalDuration: If specified each tween in the Timeline is given an equal portion of the totalDuration
  32322. var totalDuration = GetAdvancedValue(config, 'totalDuration', 0);
  32323. if (totalDuration > 0)
  32324. {
  32325. defaults.duration = Math.floor(totalDuration / tweens.length);
  32326. }
  32327. else
  32328. {
  32329. defaults.duration = GetNewValue(config, 'duration', defaults.duration);
  32330. }
  32331. defaults.delay = GetNewValue(config, 'delay', defaults.delay);
  32332. defaults.easeParams = GetValue(config, 'easeParams', defaults.easeParams);
  32333. defaults.ease = GetEaseFunction(GetValue(config, 'ease', defaults.ease), defaults.easeParams);
  32334. defaults.hold = GetNewValue(config, 'hold', defaults.hold);
  32335. defaults.repeat = GetNewValue(config, 'repeat', defaults.repeat);
  32336. defaults.repeatDelay = GetNewValue(config, 'repeatDelay', defaults.repeatDelay);
  32337. defaults.yoyo = GetBoolean(config, 'yoyo', defaults.yoyo);
  32338. defaults.flipX = GetBoolean(config, 'flipX', defaults.flipX);
  32339. defaults.flipY = GetBoolean(config, 'flipY', defaults.flipY);
  32340. // Create the Tweens
  32341. for (var i = 0; i < tweens.length; i++)
  32342. {
  32343. timeline.queue(TweenBuilder(timeline, tweens[i], defaults));
  32344. }
  32345. timeline.completeDelay = GetAdvancedValue(config, 'completeDelay', 0);
  32346. timeline.loop = Math.round(GetAdvancedValue(config, 'loop', 0));
  32347. timeline.loopDelay = Math.round(GetAdvancedValue(config, 'loopDelay', 0));
  32348. timeline.paused = GetBoolean(config, 'paused', false);
  32349. timeline.useFrames = GetBoolean(config, 'useFrames', false);
  32350. // Callbacks
  32351. var scope = GetValue(config, 'callbackScope', timeline);
  32352. var timelineArray = [ timeline ];
  32353. var onStart = GetValue(config, 'onStart', false);
  32354. // The Start of the Timeline
  32355. if (onStart)
  32356. {
  32357. var onStartScope = GetValue(config, 'onStartScope', scope);
  32358. var onStartParams = GetValue(config, 'onStartParams', []);
  32359. timeline.setCallback('onStart', onStart, timelineArray.concat(onStartParams), onStartScope);
  32360. }
  32361. var onUpdate = GetValue(config, 'onUpdate', false);
  32362. // Every time the Timeline updates (regardless which Tweens are running)
  32363. if (onUpdate)
  32364. {
  32365. var onUpdateScope = GetValue(config, 'onUpdateScope', scope);
  32366. var onUpdateParams = GetValue(config, 'onUpdateParams', []);
  32367. timeline.setCallback('onUpdate', onUpdate, timelineArray.concat(onUpdateParams), onUpdateScope);
  32368. }
  32369. var onLoop = GetValue(config, 'onLoop', false);
  32370. // Called when the whole Timeline loops
  32371. if (onLoop)
  32372. {
  32373. var onLoopScope = GetValue(config, 'onLoopScope', scope);
  32374. var onLoopParams = GetValue(config, 'onLoopParams', []);
  32375. timeline.setCallback('onLoop', onLoop, timelineArray.concat(onLoopParams), onLoopScope);
  32376. }
  32377. var onYoyo = GetValue(config, 'onYoyo', false);
  32378. // Called when a Timeline yoyos
  32379. if (onYoyo)
  32380. {
  32381. var onYoyoScope = GetValue(config, 'onYoyoScope', scope);
  32382. var onYoyoParams = GetValue(config, 'onYoyoParams', []);
  32383. timeline.setCallback('onYoyo', onYoyo, timelineArray.concat(null, onYoyoParams), onYoyoScope);
  32384. }
  32385. var onComplete = GetValue(config, 'onComplete', false);
  32386. // Called when the Timeline completes, after the completeDelay, etc.
  32387. if (onComplete)
  32388. {
  32389. var onCompleteScope = GetValue(config, 'onCompleteScope', scope);
  32390. var onCompleteParams = GetValue(config, 'onCompleteParams', []);
  32391. timeline.setCallback('onComplete', onComplete, timelineArray.concat(onCompleteParams), onCompleteScope);
  32392. }
  32393. return timeline;
  32394. };
  32395. module.exports = TimelineBuilder;
  32396. /***/ }),
  32397. /* 166 */
  32398. /***/ (function(module, exports, __webpack_require__) {
  32399. /**
  32400. * @author Richard Davey <rich@photonstorm.com>
  32401. * @copyright 2018 Photon Storm Ltd.
  32402. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  32403. */
  32404. var Defaults = __webpack_require__(100);
  32405. var GetAdvancedValue = __webpack_require__(10);
  32406. var GetBoolean = __webpack_require__(62);
  32407. var GetEaseFunction = __webpack_require__(63);
  32408. var GetNewValue = __webpack_require__(72);
  32409. var GetValue = __webpack_require__(4);
  32410. var GetValueOp = __webpack_require__(101);
  32411. var Tween = __webpack_require__(99);
  32412. var TweenData = __webpack_require__(98);
  32413. /**
  32414. * [description]
  32415. *
  32416. * @function Phaser.Tweens.Builders.NumberTweenBuilder
  32417. * @since 3.0.0
  32418. *
  32419. * @param {(Phaser.Tweens.TweenManager|Phaser.Tweens.Timeline)} parent - [description]
  32420. * @param {object} config - [description]
  32421. * @param {Phaser.Tweens.TweenConfigDefaults} defaults - [description]
  32422. *
  32423. * @return {Phaser.Tweens.Tween} [description]
  32424. */
  32425. var NumberTweenBuilder = function (parent, config, defaults)
  32426. {
  32427. if (defaults === undefined)
  32428. {
  32429. defaults = Defaults;
  32430. }
  32431. // var tween = this.tweens.addCounter({
  32432. // from: 100,
  32433. // to: 200,
  32434. // ... (normal tween properties)
  32435. // })
  32436. //
  32437. // Then use it in your game via:
  32438. //
  32439. // tween.getValue()
  32440. var from = GetValue(config, 'from', 0);
  32441. var to = GetValue(config, 'to', 1);
  32442. var targets = [ { value: from } ];
  32443. var delay = GetNewValue(config, 'delay', defaults.delay);
  32444. var duration = GetNewValue(config, 'duration', defaults.duration);
  32445. var easeParams = GetValue(config, 'easeParams', defaults.easeParams);
  32446. var ease = GetEaseFunction(GetValue(config, 'ease', defaults.ease), easeParams);
  32447. var hold = GetNewValue(config, 'hold', defaults.hold);
  32448. var repeat = GetNewValue(config, 'repeat', defaults.repeat);
  32449. var repeatDelay = GetNewValue(config, 'repeatDelay', defaults.repeatDelay);
  32450. var yoyo = GetBoolean(config, 'yoyo', defaults.yoyo);
  32451. var data = [];
  32452. var ops = GetValueOp('value', to);
  32453. var tweenData = TweenData(
  32454. targets[0],
  32455. 'value',
  32456. ops.getEnd,
  32457. ops.getStart,
  32458. ease,
  32459. delay,
  32460. duration,
  32461. yoyo,
  32462. hold,
  32463. repeat,
  32464. repeatDelay,
  32465. false,
  32466. false
  32467. );
  32468. tweenData.start = from;
  32469. tweenData.current = from;
  32470. tweenData.to = to;
  32471. data.push(tweenData);
  32472. var tween = new Tween(parent, data, targets);
  32473. tween.offset = GetAdvancedValue(config, 'offset', null);
  32474. tween.completeDelay = GetAdvancedValue(config, 'completeDelay', 0);
  32475. tween.loop = Math.round(GetAdvancedValue(config, 'loop', 0));
  32476. tween.loopDelay = Math.round(GetAdvancedValue(config, 'loopDelay', 0));
  32477. tween.paused = GetBoolean(config, 'paused', false);
  32478. tween.useFrames = GetBoolean(config, 'useFrames', false);
  32479. // Set the Callbacks
  32480. var scope = GetValue(config, 'callbackScope', tween);
  32481. // Callback parameters: 0 = a reference to the Tween itself, 1 = the target/s of the Tween, ... your own params
  32482. var tweenArray = [ tween, null ];
  32483. var callbacks = Tween.TYPES;
  32484. for (var i = 0; i < callbacks.length; i++)
  32485. {
  32486. var type = callbacks[i];
  32487. var callback = GetValue(config, type, false);
  32488. if (callback)
  32489. {
  32490. var callbackScope = GetValue(config, type + 'Scope', scope);
  32491. var callbackParams = GetValue(config, type + 'Params', []);
  32492. // The null is reset to be the Tween target
  32493. tween.setCallback(type, callback, tweenArray.concat(callbackParams), callbackScope);
  32494. }
  32495. }
  32496. return tween;
  32497. };
  32498. module.exports = NumberTweenBuilder;
  32499. /***/ }),
  32500. /* 167 */
  32501. /***/ (function(module, exports, __webpack_require__) {
  32502. /**
  32503. * @author Richard Davey <rich@photonstorm.com>
  32504. * @copyright 2018 Photon Storm Ltd.
  32505. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  32506. */
  32507. var GetValue = __webpack_require__(4);
  32508. /**
  32509. * [description]
  32510. *
  32511. * @function Phaser.Tweens.Builders.GetTweens
  32512. * @since 3.0.0
  32513. *
  32514. * @param {object} config - [description]
  32515. *
  32516. * @return {array} [description]
  32517. */
  32518. var GetTweens = function (config)
  32519. {
  32520. var tweens = GetValue(config, 'tweens', null);
  32521. if (tweens === null)
  32522. {
  32523. return [];
  32524. }
  32525. else if (typeof tweens === 'function')
  32526. {
  32527. tweens = tweens.call();
  32528. }
  32529. if (!Array.isArray(tweens))
  32530. {
  32531. tweens = [ tweens ];
  32532. }
  32533. return tweens;
  32534. };
  32535. module.exports = GetTweens;
  32536. /***/ }),
  32537. /* 168 */
  32538. /***/ (function(module, exports, __webpack_require__) {
  32539. /**
  32540. * @author Richard Davey <rich@photonstorm.com>
  32541. * @copyright 2018 Photon Storm Ltd.
  32542. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  32543. */
  32544. var RESERVED = __webpack_require__(309);
  32545. /**
  32546. * [description]
  32547. *
  32548. * @function Phaser.Tweens.Builders.GetProps
  32549. * @since 3.0.0
  32550. *
  32551. * @param {object} config - [description]
  32552. *
  32553. * @return {array} [description]
  32554. */
  32555. var GetProps = function (config)
  32556. {
  32557. var key;
  32558. var keys = [];
  32559. // First see if we have a props object
  32560. if (config.hasOwnProperty('props'))
  32561. {
  32562. for (key in config.props)
  32563. {
  32564. // Skip any property that starts with an underscore
  32565. if (key.substr(0, 1) !== '_')
  32566. {
  32567. keys.push({ key: key, value: config.props[key] });
  32568. }
  32569. }
  32570. }
  32571. else
  32572. {
  32573. for (key in config)
  32574. {
  32575. // Skip any property that is in the ReservedProps list or that starts with an underscore
  32576. if (RESERVED.indexOf(key) === -1 && key.substr(0, 1) !== '_')
  32577. {
  32578. keys.push({ key: key, value: config[key] });
  32579. }
  32580. }
  32581. }
  32582. return keys;
  32583. };
  32584. module.exports = GetProps;
  32585. /***/ }),
  32586. /* 169 */
  32587. /***/ (function(module, exports, __webpack_require__) {
  32588. /**
  32589. * @author Richard Davey <rich@photonstorm.com>
  32590. * @copyright 2018 Photon Storm Ltd.
  32591. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  32592. */
  32593. var Class = __webpack_require__(0);
  32594. var GetFastValue = __webpack_require__(1);
  32595. /**
  32596. * @typedef {object} TimerEventConfig
  32597. *
  32598. * @property {number} [delay=0] - [description]
  32599. * @property {number} [repeat=0] - [description]
  32600. * @property {boolean} [loop=false] - [description]
  32601. * @property {function} [callback] - [description]
  32602. * @property {*} [callbackScope] - [description]
  32603. * @property {Array.<*>} [args] - [description]
  32604. * @property {number} [timeScale=1] - [description]
  32605. * @property {number} [startAt=1] - [description]
  32606. * @property {boolean} [paused=false] - [description]
  32607. */
  32608. /**
  32609. * @classdesc
  32610. * [description]
  32611. *
  32612. * @class TimerEvent
  32613. * @memberOf Phaser.Time
  32614. * @constructor
  32615. * @since 3.0.0
  32616. *
  32617. * @param {TimerEventConfig} config - [description]
  32618. */
  32619. var TimerEvent = new Class({
  32620. initialize:
  32621. function TimerEvent (config)
  32622. {
  32623. /**
  32624. * The delay in ms at which this TimerEvent fires.
  32625. *
  32626. * @name Phaser.Time.TimerEvent#delay
  32627. * @type {number}
  32628. * @default 0
  32629. * @readOnly
  32630. * @since 3.0.0
  32631. */
  32632. this.delay = 0;
  32633. /**
  32634. * The total number of times this TimerEvent will repeat before finishing.
  32635. *
  32636. * @name Phaser.Time.TimerEvent#repeat
  32637. * @type {number}
  32638. * @default 0
  32639. * @readOnly
  32640. * @since 3.0.0
  32641. */
  32642. this.repeat = 0;
  32643. /**
  32644. * If repeating this contains the current repeat count.
  32645. *
  32646. * @name Phaser.Time.TimerEvent#repeatCount
  32647. * @type {number}
  32648. * @default 0
  32649. * @since 3.0.0
  32650. */
  32651. this.repeatCount = 0;
  32652. /**
  32653. * True if this TimerEvent loops, otherwise false.
  32654. *
  32655. * @name Phaser.Time.TimerEvent#loop
  32656. * @type {boolean}
  32657. * @default false
  32658. * @readOnly
  32659. * @since 3.0.0
  32660. */
  32661. this.loop = false;
  32662. /**
  32663. * The callback that will be called when the TimerEvent occurs.
  32664. *
  32665. * @name Phaser.Time.TimerEvent#callback
  32666. * @type {function}
  32667. * @since 3.0.0
  32668. */
  32669. this.callback;
  32670. /**
  32671. * The scope in which the callback will be called.
  32672. *
  32673. * @name Phaser.Time.TimerEvent#callbackScope
  32674. * @type {object}
  32675. * @since 3.0.0
  32676. */
  32677. this.callbackScope;
  32678. /**
  32679. * Additional arguments to be passed to the callback.
  32680. *
  32681. * @name Phaser.Time.TimerEvent#args
  32682. * @type {array}
  32683. * @since 3.0.0
  32684. */
  32685. this.args;
  32686. /**
  32687. * Scale the time causing this TimerEvent to update.
  32688. *
  32689. * @name Phaser.Time.TimerEvent#timeScale
  32690. * @type {number}
  32691. * @default 1
  32692. * @since 3.0.0
  32693. */
  32694. this.timeScale = 1;
  32695. /**
  32696. * Start this many MS into the elapsed (useful if you want a long duration with repeat, but for the first loop to fire quickly)
  32697. *
  32698. * @name Phaser.Time.TimerEvent#startAt
  32699. * @type {number}
  32700. * @default 0
  32701. * @since 3.0.0
  32702. */
  32703. this.startAt = 0;
  32704. /**
  32705. * [description]
  32706. *
  32707. * @name Phaser.Time.TimerEvent#elapsed
  32708. * @type {number}
  32709. * @default 0
  32710. * @since 3.0.0
  32711. */
  32712. this.elapsed = 0;
  32713. /**
  32714. * [description]
  32715. *
  32716. * @name Phaser.Time.TimerEvent#paused
  32717. * @type {boolean}
  32718. * @default false
  32719. * @since 3.0.0
  32720. */
  32721. this.paused = false;
  32722. /**
  32723. * [description]
  32724. *
  32725. * @name Phaser.Time.TimerEvent#hasDispatched
  32726. * @type {boolean}
  32727. * @default false
  32728. * @since 3.0.0
  32729. */
  32730. this.hasDispatched = false;
  32731. this.reset(config);
  32732. },
  32733. /**
  32734. * [description]
  32735. *
  32736. * @method Phaser.Time.TimerEvent#reset
  32737. * @since 3.0.0
  32738. *
  32739. * @param {TimerEventConfig} config - [description]
  32740. *
  32741. * @return {Phaser.Time.TimerEvent} This TimerEvent object.
  32742. */
  32743. reset: function (config)
  32744. {
  32745. this.delay = GetFastValue(config, 'delay', 0);
  32746. // Can also be set to -1 for an infinite loop (same as setting loop: true)
  32747. this.repeat = GetFastValue(config, 'repeat', 0);
  32748. this.loop = GetFastValue(config, 'loop', false);
  32749. this.callback = GetFastValue(config, 'callback', undefined);
  32750. this.callbackScope = GetFastValue(config, 'callbackScope', this.callback);
  32751. this.args = GetFastValue(config, 'args', []);
  32752. this.timeScale = GetFastValue(config, 'timeScale', 1);
  32753. this.startAt = GetFastValue(config, 'startAt', 0);
  32754. this.paused = GetFastValue(config, 'paused', false);
  32755. this.elapsed = this.startAt;
  32756. this.hasDispatched = false;
  32757. this.repeatCount = (this.repeat === -1 || this.loop) ? 999999999999 : this.repeat;
  32758. return this;
  32759. },
  32760. /**
  32761. * Gets the progress of the current iteration, not factoring in repeats.
  32762. *
  32763. * @method Phaser.Time.TimerEvent#getProgress
  32764. * @since 3.0.0
  32765. *
  32766. * @return {number} [description]
  32767. */
  32768. getProgress: function ()
  32769. {
  32770. return (this.elapsed / this.delay);
  32771. },
  32772. /**
  32773. * Gets the progress of the timer overall, factoring in repeats.
  32774. *
  32775. * @method Phaser.Time.TimerEvent#getOverallProgress
  32776. * @since 3.0.0
  32777. *
  32778. * @return {number} [description]
  32779. */
  32780. getOverallProgress: function ()
  32781. {
  32782. if (this.repeat > 0)
  32783. {
  32784. var totalDuration = this.delay + (this.delay * this.repeat);
  32785. var totalElapsed = this.elapsed + (this.delay * (this.repeat - this.repeatCount));
  32786. return (totalElapsed / totalDuration);
  32787. }
  32788. else
  32789. {
  32790. return this.getProgress();
  32791. }
  32792. },
  32793. /**
  32794. * [description]
  32795. *
  32796. * @method Phaser.Time.TimerEvent#getRepeatCount
  32797. * @since 3.0.0
  32798. *
  32799. * @return {number} [description]
  32800. */
  32801. getRepeatCount: function ()
  32802. {
  32803. return this.repeatCount;
  32804. },
  32805. /**
  32806. * [description]
  32807. *
  32808. * @method Phaser.Time.TimerEvent#getElapsed
  32809. * @since 3.0.0
  32810. *
  32811. * @return {number} [description]
  32812. */
  32813. getElapsed: function ()
  32814. {
  32815. return this.elapsed;
  32816. },
  32817. /**
  32818. * [description]
  32819. *
  32820. * @method Phaser.Time.TimerEvent#getElapsedSeconds
  32821. * @since 3.0.0
  32822. *
  32823. * @return {number} [description]
  32824. */
  32825. getElapsedSeconds: function ()
  32826. {
  32827. return this.elapsed * 0.001;
  32828. },
  32829. /**
  32830. * [description]
  32831. *
  32832. * @method Phaser.Time.TimerEvent#remove
  32833. * @since 3.0.0
  32834. *
  32835. * @param {function} dispatchCallback - [description]
  32836. */
  32837. remove: function (dispatchCallback)
  32838. {
  32839. if (dispatchCallback === undefined) { dispatchCallback = false; }
  32840. this.elapsed = this.delay;
  32841. this.hasDispatched = !dispatchCallback;
  32842. this.repeatCount = 0;
  32843. },
  32844. /**
  32845. * [description]
  32846. *
  32847. * @method Phaser.Time.TimerEvent#destroy
  32848. * @since 3.0.0
  32849. */
  32850. destroy: function ()
  32851. {
  32852. this.callback = undefined;
  32853. this.callbackScope = undefined;
  32854. this.args = [];
  32855. }
  32856. });
  32857. module.exports = TimerEvent;
  32858. /***/ }),
  32859. /* 170 */
  32860. /***/ (function(module, exports, __webpack_require__) {
  32861. /**
  32862. * @author Richard Davey <rich@photonstorm.com>
  32863. * @copyright 2018 Photon Storm Ltd.
  32864. * @license {@link https://github.com/photonstorm/phaser3-plugin-template/blob/master/LICENSE|MIT License}
  32865. */
  32866. var Class = __webpack_require__(0);
  32867. /**
  32868. * @classdesc
  32869. * A Global Plugin is installed just once into the Game owned Plugin Manager.
  32870. * It can listen for Game events and respond to them.
  32871. *
  32872. * @class BasePlugin
  32873. * @memberOf Phaser.Plugins
  32874. * @constructor
  32875. * @since 3.8.0
  32876. *
  32877. * @param {Phaser.Plugins.PluginManager} pluginManager - A reference to the Plugin Manager.
  32878. */
  32879. var BasePlugin = new Class({
  32880. initialize:
  32881. function BasePlugin (pluginManager)
  32882. {
  32883. /**
  32884. * A handy reference to the Plugin Manager that is responsible for this plugin.
  32885. * Can be used as a route to gain access to game systems and events.
  32886. *
  32887. * @name Phaser.Plugins.BasePlugin#pluginManager
  32888. * @type {Phaser.Plugins.PluginManager}
  32889. * @protected
  32890. * @since 3.8.0
  32891. */
  32892. this.pluginManager = pluginManager;
  32893. /**
  32894. * A reference to the Game instance this plugin is running under.
  32895. *
  32896. * @name Phaser.Plugins.BasePlugin#game
  32897. * @type {Phaser.Game}
  32898. * @protected
  32899. * @since 3.8.0
  32900. */
  32901. this.game = pluginManager.game;
  32902. /**
  32903. * A reference to the Scene that has installed this plugin.
  32904. * Only set if it's a Scene Plugin, otherwise `null`.
  32905. * This property is only set when the plugin is instantiated and added to the Scene, not before.
  32906. * You cannot use it during the `init` method, but you can during the `boot` method.
  32907. *
  32908. * @name Phaser.Plugins.BasePlugin#scene
  32909. * @type {?Phaser.Scene}
  32910. * @protected
  32911. * @since 3.8.0
  32912. */
  32913. this.scene;
  32914. /**
  32915. * A reference to the Scene Systems of the Scene that has installed this plugin.
  32916. * Only set if it's a Scene Plugin, otherwise `null`.
  32917. * This property is only set when the plugin is instantiated and added to the Scene, not before.
  32918. * You cannot use it during the `init` method, but you can during the `boot` method.
  32919. *
  32920. * @name Phaser.Plugins.BasePlugin#systems
  32921. * @type {?Phaser.Scenes.Systems}
  32922. * @protected
  32923. * @since 3.8.0
  32924. */
  32925. this.systems;
  32926. },
  32927. /**
  32928. * Called by the PluginManager when this plugin is first instantiated.
  32929. * It will never be called again on this instance.
  32930. * In here you can set-up whatever you need for this plugin to run.
  32931. * If a plugin is set to automatically start then `BasePlugin.start` will be called immediately after this.
  32932. *
  32933. * @method Phaser.Plugins.BasePlugin#init
  32934. * @since 3.8.0
  32935. */
  32936. init: function ()
  32937. {
  32938. },
  32939. /**
  32940. * Called by the PluginManager when this plugin is started.
  32941. * If a plugin is stopped, and then started again, this will get called again.
  32942. * Typically called immediately after `BasePlugin.init`.
  32943. *
  32944. * @method Phaser.Plugins.BasePlugin#start
  32945. * @since 3.8.0
  32946. */
  32947. start: function ()
  32948. {
  32949. // Here are the game-level events you can listen to.
  32950. // At the very least you should offer a destroy handler for when the game closes down.
  32951. // var eventEmitter = this.game.events;
  32952. // eventEmitter.once('destroy', this.gameDestroy, this);
  32953. // eventEmitter.on('pause', this.gamePause, this);
  32954. // eventEmitter.on('resume', this.gameResume, this);
  32955. // eventEmitter.on('resize', this.gameResize, this);
  32956. // eventEmitter.on('prestep', this.gamePreStep, this);
  32957. // eventEmitter.on('step', this.gameStep, this);
  32958. // eventEmitter.on('poststep', this.gamePostStep, this);
  32959. // eventEmitter.on('prerender', this.gamePreRender, this);
  32960. // eventEmitter.on('postrender', this.gamePostRender, this);
  32961. },
  32962. /**
  32963. * Called by the PluginManager when this plugin is stopped.
  32964. * The game code has requested that your plugin stop doing whatever it does.
  32965. * It is now considered as 'inactive' by the PluginManager.
  32966. * Handle that process here (i.e. stop listening for events, etc)
  32967. * If the plugin is started again then `BasePlugin.start` will be called again.
  32968. *
  32969. * @method Phaser.Plugins.BasePlugin#stop
  32970. * @since 3.8.0
  32971. */
  32972. stop: function ()
  32973. {
  32974. },
  32975. /**
  32976. * If this is a Scene Plugin (i.e. installed into a Scene) then this method is called when the Scene boots.
  32977. * By this point the plugin properties `scene` and `systems` will have already been set.
  32978. * In here you can listen for Scene events and set-up whatever you need for this plugin to run.
  32979. *
  32980. * @method Phaser.Plugins.BasePlugin#boot
  32981. * @since 3.8.0
  32982. */
  32983. boot: function ()
  32984. {
  32985. // Here are the Scene events you can listen to.
  32986. // At the very least you should offer a destroy handler for when the Scene closes down.
  32987. // var eventEmitter = this.systems.events;
  32988. // eventEmitter.once('destroy', this.sceneDestroy, this);
  32989. // eventEmitter.on('start', this.sceneStart, this);
  32990. // eventEmitter.on('preupdate', this.scenePreUpdate, this);
  32991. // eventEmitter.on('update', this.sceneUpdate, this);
  32992. // eventEmitter.on('postupdate', this.scenePostUpdate, this);
  32993. // eventEmitter.on('pause', this.scenePause, this);
  32994. // eventEmitter.on('resume', this.sceneResume, this);
  32995. // eventEmitter.on('sleep', this.sceneSleep, this);
  32996. // eventEmitter.on('wake', this.sceneWake, this);
  32997. // eventEmitter.on('shutdown', this.sceneShutdown, this);
  32998. // eventEmitter.on('destroy', this.sceneDestroy, this);
  32999. },
  33000. /**
  33001. * Game instance has been destroyed.
  33002. * You must release everything in here, all references, all objects, free it all up.
  33003. *
  33004. * @method Phaser.Plugins.BasePlugin#destroy
  33005. * @since 3.8.0
  33006. */
  33007. destroy: function ()
  33008. {
  33009. this.pluginManager = null;
  33010. this.game = null;
  33011. this.scene = null;
  33012. this.systems = null;
  33013. }
  33014. });
  33015. module.exports = BasePlugin;
  33016. /***/ }),
  33017. /* 171 */
  33018. /***/ (function(module, exports, __webpack_require__) {
  33019. /**
  33020. * The `Matter.Bodies` module contains factory methods for creating rigid body models
  33021. * with commonly used body configurations (such as rectangles, circles and other polygons).
  33022. *
  33023. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  33024. *
  33025. * @class Bodies
  33026. */
  33027. // TODO: true circle bodies
  33028. var Bodies = {};
  33029. module.exports = Bodies;
  33030. var Vertices = __webpack_require__(127);
  33031. var Common = __webpack_require__(42);
  33032. var Body = __webpack_require__(73);
  33033. var Bounds = __webpack_require__(126);
  33034. var Vector = __webpack_require__(106);
  33035. var decomp = __webpack_require__(1021);
  33036. (function() {
  33037. /**
  33038. * Creates a new rigid body model with a rectangle hull.
  33039. * The options parameter is an object that specifies any properties you wish to override the defaults.
  33040. * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.
  33041. * @method rectangle
  33042. * @param {number} x
  33043. * @param {number} y
  33044. * @param {number} width
  33045. * @param {number} height
  33046. * @param {object} [options]
  33047. * @return {body} A new rectangle body
  33048. */
  33049. Bodies.rectangle = function(x, y, width, height, options) {
  33050. options = options || {};
  33051. var rectangle = {
  33052. label: 'Rectangle Body',
  33053. position: { x: x, y: y },
  33054. vertices: Vertices.fromPath('L 0 0 L ' + width + ' 0 L ' + width + ' ' + height + ' L 0 ' + height)
  33055. };
  33056. if (options.chamfer) {
  33057. var chamfer = options.chamfer;
  33058. rectangle.vertices = Vertices.chamfer(rectangle.vertices, chamfer.radius,
  33059. chamfer.quality, chamfer.qualityMin, chamfer.qualityMax);
  33060. delete options.chamfer;
  33061. }
  33062. return Body.create(Common.extend({}, rectangle, options));
  33063. };
  33064. /**
  33065. * Creates a new rigid body model with a trapezoid hull.
  33066. * The options parameter is an object that specifies any properties you wish to override the defaults.
  33067. * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.
  33068. * @method trapezoid
  33069. * @param {number} x
  33070. * @param {number} y
  33071. * @param {number} width
  33072. * @param {number} height
  33073. * @param {number} slope
  33074. * @param {object} [options]
  33075. * @return {body} A new trapezoid body
  33076. */
  33077. Bodies.trapezoid = function(x, y, width, height, slope, options) {
  33078. options = options || {};
  33079. slope *= 0.5;
  33080. var roof = (1 - (slope * 2)) * width;
  33081. var x1 = width * slope,
  33082. x2 = x1 + roof,
  33083. x3 = x2 + x1,
  33084. verticesPath;
  33085. if (slope < 0.5) {
  33086. verticesPath = 'L 0 0 L ' + x1 + ' ' + (-height) + ' L ' + x2 + ' ' + (-height) + ' L ' + x3 + ' 0';
  33087. } else {
  33088. verticesPath = 'L 0 0 L ' + x2 + ' ' + (-height) + ' L ' + x3 + ' 0';
  33089. }
  33090. var trapezoid = {
  33091. label: 'Trapezoid Body',
  33092. position: { x: x, y: y },
  33093. vertices: Vertices.fromPath(verticesPath)
  33094. };
  33095. if (options.chamfer) {
  33096. var chamfer = options.chamfer;
  33097. trapezoid.vertices = Vertices.chamfer(trapezoid.vertices, chamfer.radius,
  33098. chamfer.quality, chamfer.qualityMin, chamfer.qualityMax);
  33099. delete options.chamfer;
  33100. }
  33101. return Body.create(Common.extend({}, trapezoid, options));
  33102. };
  33103. /**
  33104. * Creates a new rigid body model with a circle hull.
  33105. * The options parameter is an object that specifies any properties you wish to override the defaults.
  33106. * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.
  33107. * @method circle
  33108. * @param {number} x
  33109. * @param {number} y
  33110. * @param {number} radius
  33111. * @param {object} [options]
  33112. * @param {number} [maxSides]
  33113. * @return {body} A new circle body
  33114. */
  33115. Bodies.circle = function(x, y, radius, options, maxSides) {
  33116. options = options || {};
  33117. var circle = {
  33118. label: 'Circle Body',
  33119. circleRadius: radius
  33120. };
  33121. // approximate circles with polygons until true circles implemented in SAT
  33122. maxSides = maxSides || 25;
  33123. var sides = Math.ceil(Math.max(10, Math.min(maxSides, radius)));
  33124. // optimisation: always use even number of sides (half the number of unique axes)
  33125. if (sides % 2 === 1)
  33126. sides += 1;
  33127. return Bodies.polygon(x, y, sides, radius, Common.extend({}, circle, options));
  33128. };
  33129. /**
  33130. * Creates a new rigid body model with a regular polygon hull with the given number of sides.
  33131. * The options parameter is an object that specifies any properties you wish to override the defaults.
  33132. * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.
  33133. * @method polygon
  33134. * @param {number} x
  33135. * @param {number} y
  33136. * @param {number} sides
  33137. * @param {number} radius
  33138. * @param {object} [options]
  33139. * @return {body} A new regular polygon body
  33140. */
  33141. Bodies.polygon = function(x, y, sides, radius, options) {
  33142. options = options || {};
  33143. if (sides < 3)
  33144. return Bodies.circle(x, y, radius, options);
  33145. var theta = 2 * Math.PI / sides,
  33146. path = '',
  33147. offset = theta * 0.5;
  33148. for (var i = 0; i < sides; i += 1) {
  33149. var angle = offset + (i * theta),
  33150. xx = Math.cos(angle) * radius,
  33151. yy = Math.sin(angle) * radius;
  33152. path += 'L ' + xx.toFixed(3) + ' ' + yy.toFixed(3) + ' ';
  33153. }
  33154. var polygon = {
  33155. label: 'Polygon Body',
  33156. position: { x: x, y: y },
  33157. vertices: Vertices.fromPath(path)
  33158. };
  33159. if (options.chamfer) {
  33160. var chamfer = options.chamfer;
  33161. polygon.vertices = Vertices.chamfer(polygon.vertices, chamfer.radius,
  33162. chamfer.quality, chamfer.qualityMin, chamfer.qualityMax);
  33163. delete options.chamfer;
  33164. }
  33165. return Body.create(Common.extend({}, polygon, options));
  33166. };
  33167. /**
  33168. * Creates a body using the supplied vertices (or an array containing multiple sets of vertices).
  33169. * If the vertices are convex, they will pass through as supplied.
  33170. * Otherwise if the vertices are concave, they will be decomposed if [poly-decomp.js](https://github.com/schteppe/poly-decomp.js) is available.
  33171. * Note that this process is not guaranteed to support complex sets of vertices (e.g. those with holes may fail).
  33172. * By default the decomposition will discard collinear edges (to improve performance).
  33173. * It can also optionally discard any parts that have an area less than `minimumArea`.
  33174. * If the vertices can not be decomposed, the result will fall back to using the convex hull.
  33175. * The options parameter is an object that specifies any `Matter.Body` properties you wish to override the defaults.
  33176. * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.
  33177. * @method fromVertices
  33178. * @param {number} x
  33179. * @param {number} y
  33180. * @param [[vector]] vertexSets
  33181. * @param {object} [options]
  33182. * @param {bool} [flagInternal=false]
  33183. * @param {number} [removeCollinear=0.01]
  33184. * @param {number} [minimumArea=10]
  33185. * @return {body}
  33186. */
  33187. Bodies.fromVertices = function(x, y, vertexSets, options, flagInternal, removeCollinear, minimumArea) {
  33188. var body,
  33189. parts,
  33190. isConvex,
  33191. vertices,
  33192. i,
  33193. j,
  33194. k,
  33195. v,
  33196. z;
  33197. options = options || {};
  33198. parts = [];
  33199. flagInternal = typeof flagInternal !== 'undefined' ? flagInternal : false;
  33200. removeCollinear = typeof removeCollinear !== 'undefined' ? removeCollinear : 0.01;
  33201. minimumArea = typeof minimumArea !== 'undefined' ? minimumArea : 10;
  33202. if (!decomp) {
  33203. Common.warn('Bodies.fromVertices: poly-decomp.js required. Could not decompose vertices. Fallback to convex hull.');
  33204. }
  33205. // ensure vertexSets is an array of arrays
  33206. if (!Common.isArray(vertexSets[0])) {
  33207. vertexSets = [vertexSets];
  33208. }
  33209. for (v = 0; v < vertexSets.length; v += 1) {
  33210. vertices = vertexSets[v];
  33211. isConvex = Vertices.isConvex(vertices);
  33212. if (isConvex || !decomp) {
  33213. if (isConvex) {
  33214. vertices = Vertices.clockwiseSort(vertices);
  33215. } else {
  33216. // fallback to convex hull when decomposition is not possible
  33217. vertices = Vertices.hull(vertices);
  33218. }
  33219. parts.push({
  33220. position: { x: x, y: y },
  33221. vertices: vertices
  33222. });
  33223. } else {
  33224. // initialise a decomposition
  33225. var concave = vertices.map(function(vertex) {
  33226. return [vertex.x, vertex.y];
  33227. });
  33228. // vertices are concave and simple, we can decompose into parts
  33229. decomp.makeCCW(concave);
  33230. if (removeCollinear !== false)
  33231. decomp.removeCollinearPoints(concave, removeCollinear);
  33232. // use the quick decomposition algorithm (Bayazit)
  33233. var decomposed = decomp.quickDecomp(concave);
  33234. // for each decomposed chunk
  33235. for (i = 0; i < decomposed.length; i++) {
  33236. var chunk = decomposed[i];
  33237. // convert vertices into the correct structure
  33238. var chunkVertices = chunk.map(function(vertices) {
  33239. return {
  33240. x: vertices[0],
  33241. y: vertices[1]
  33242. };
  33243. });
  33244. // skip small chunks
  33245. if (minimumArea > 0 && Vertices.area(chunkVertices) < minimumArea)
  33246. continue;
  33247. // create a compound part
  33248. parts.push({
  33249. position: Vertices.centre(chunkVertices),
  33250. vertices: chunkVertices
  33251. });
  33252. }
  33253. }
  33254. }
  33255. // create body parts
  33256. for (i = 0; i < parts.length; i++) {
  33257. parts[i] = Body.create(Common.extend(parts[i], options));
  33258. }
  33259. // flag internal edges (coincident part edges)
  33260. if (flagInternal) {
  33261. var coincident_max_dist = 5;
  33262. for (i = 0; i < parts.length; i++) {
  33263. var partA = parts[i];
  33264. for (j = i + 1; j < parts.length; j++) {
  33265. var partB = parts[j];
  33266. if (Bounds.overlaps(partA.bounds, partB.bounds)) {
  33267. var pav = partA.vertices,
  33268. pbv = partB.vertices;
  33269. // iterate vertices of both parts
  33270. for (k = 0; k < partA.vertices.length; k++) {
  33271. for (z = 0; z < partB.vertices.length; z++) {
  33272. // find distances between the vertices
  33273. var da = Vector.magnitudeSquared(Vector.sub(pav[(k + 1) % pav.length], pbv[z])),
  33274. db = Vector.magnitudeSquared(Vector.sub(pav[k], pbv[(z + 1) % pbv.length]));
  33275. // if both vertices are very close, consider the edge concident (internal)
  33276. if (da < coincident_max_dist && db < coincident_max_dist) {
  33277. pav[k].isInternal = true;
  33278. pbv[z].isInternal = true;
  33279. }
  33280. }
  33281. }
  33282. }
  33283. }
  33284. }
  33285. }
  33286. if (parts.length > 1) {
  33287. // create the parent body to be returned, that contains generated compound parts
  33288. body = Body.create(Common.extend({ parts: parts.slice(0) }, options));
  33289. Body.setPosition(body, { x: x, y: y });
  33290. return body;
  33291. } else {
  33292. return parts[0];
  33293. }
  33294. };
  33295. })();
  33296. /***/ }),
  33297. /* 172 */
  33298. /***/ (function(module, exports, __webpack_require__) {
  33299. /**
  33300. * @author Richard Davey <rich@photonstorm.com>
  33301. * @copyright 2018 Photon Storm Ltd.
  33302. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  33303. */
  33304. var Class = __webpack_require__(0);
  33305. var File = __webpack_require__(20);
  33306. var GetFastValue = __webpack_require__(1);
  33307. var GetURL = __webpack_require__(108);
  33308. var IsPlainObject = __webpack_require__(8);
  33309. /**
  33310. * @classdesc
  33311. * A single Audio File suitable for loading by the Loader.
  33312. *
  33313. * These are created when you use the Phaser.Loader.LoaderPlugin#audio method and are not typically created directly.
  33314. *
  33315. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#audio.
  33316. *
  33317. * @class HTML5AudioFile
  33318. * @extends Phaser.Loader.File
  33319. * @memberOf Phaser.Loader.FileTypes
  33320. * @constructor
  33321. * @since 3.0.0
  33322. *
  33323. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  33324. * @param {(string|Phaser.Loader.FileTypes.AudioFileConfig)} key - The key to use for this file, or a file configuration object.
  33325. * @param {string} [urlConfig] - The absolute or relative URL to load this file from.
  33326. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  33327. */
  33328. var HTML5AudioFile = new Class({
  33329. Extends: File,
  33330. initialize:
  33331. function HTML5AudioFile (loader, key, urlConfig, audioConfig)
  33332. {
  33333. if (IsPlainObject(key))
  33334. {
  33335. var config = key;
  33336. key = GetFastValue(config, 'key');
  33337. audioConfig = GetFastValue(config, 'config', audioConfig);
  33338. }
  33339. var fileConfig = {
  33340. type: 'audio',
  33341. cache: loader.cacheManager.audio,
  33342. extension: urlConfig.type,
  33343. key: key,
  33344. url: urlConfig.url,
  33345. config: audioConfig
  33346. };
  33347. File.call(this, loader, fileConfig);
  33348. // New properties specific to this class
  33349. this.locked = 'ontouchstart' in window;
  33350. this.loaded = false;
  33351. this.filesLoaded = 0;
  33352. this.filesTotal = 0;
  33353. },
  33354. /**
  33355. * Called when the file finishes loading.
  33356. *
  33357. * @method Phaser.Loader.FileTypes.HTML5AudioFile#onLoad
  33358. * @since 3.0.0
  33359. */
  33360. onLoad: function ()
  33361. {
  33362. if (this.loaded)
  33363. {
  33364. return;
  33365. }
  33366. this.loaded = true;
  33367. this.loader.nextFile(this, true);
  33368. },
  33369. /**
  33370. * Called if the file errors while loading.
  33371. *
  33372. * @method Phaser.Loader.FileTypes.HTML5AudioFile#onError
  33373. * @since 3.0.0
  33374. */
  33375. onError: function ()
  33376. {
  33377. for (var i = 0; i < this.data.length; i++)
  33378. {
  33379. var audio = this.data[i];
  33380. audio.oncanplaythrough = null;
  33381. audio.onerror = null;
  33382. }
  33383. this.loader.nextFile(this, false);
  33384. },
  33385. /**
  33386. * Called during the file load progress. Is sent a DOM ProgressEvent.
  33387. *
  33388. * @method Phaser.Loader.FileTypes.HTML5AudioFile#onProgress
  33389. * @since 3.0.0
  33390. */
  33391. onProgress: function (event)
  33392. {
  33393. var audio = event.target;
  33394. audio.oncanplaythrough = null;
  33395. audio.onerror = null;
  33396. this.filesLoaded++;
  33397. this.percentComplete = Math.min((this.filesLoaded / this.filesTotal), 1);
  33398. this.loader.emit('fileprogress', this, this.percentComplete);
  33399. if (this.filesLoaded === this.filesTotal)
  33400. {
  33401. this.onLoad();
  33402. }
  33403. },
  33404. /**
  33405. * Called by the Loader, starts the actual file downloading.
  33406. * During the load the methods onLoad, onError and onProgress are called, based on the XHR events.
  33407. * You shouldn't normally call this method directly, it's meant to be invoked by the Loader.
  33408. *
  33409. * @method Phaser.Loader.FileTypes.HTML5AudioFile#load
  33410. * @since 3.0.0
  33411. */
  33412. load: function ()
  33413. {
  33414. this.data = [];
  33415. var instances = (this.config && this.config.instances) || 1;
  33416. this.filesTotal = instances;
  33417. this.filesLoaded = 0;
  33418. this.percentComplete = 0;
  33419. for (var i = 0; i < instances; i++)
  33420. {
  33421. var audio = new Audio();
  33422. audio.dataset.name = this.key + ('0' + i).slice(-2);
  33423. audio.dataset.used = 'false';
  33424. if (this.locked)
  33425. {
  33426. audio.dataset.locked = 'true';
  33427. }
  33428. else
  33429. {
  33430. audio.dataset.locked = 'false';
  33431. audio.preload = 'auto';
  33432. audio.oncanplaythrough = this.onProgress.bind(this);
  33433. audio.onerror = this.onError.bind(this);
  33434. }
  33435. this.data.push(audio);
  33436. }
  33437. for (i = 0; i < this.data.length; i++)
  33438. {
  33439. audio = this.data[i];
  33440. audio.src = GetURL(this, this.loader.baseURL);
  33441. if (!this.locked)
  33442. {
  33443. audio.load();
  33444. }
  33445. }
  33446. if (this.locked)
  33447. {
  33448. // This is super-dangerous but works. Race condition potential high.
  33449. // Is there another way?
  33450. setTimeout(this.onLoad.bind(this));
  33451. }
  33452. }
  33453. });
  33454. module.exports = HTML5AudioFile;
  33455. /***/ }),
  33456. /* 173 */
  33457. /***/ (function(module, exports, __webpack_require__) {
  33458. /**
  33459. * @author Richard Davey <rich@photonstorm.com>
  33460. * @copyright 2018 Photon Storm Ltd.
  33461. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  33462. */
  33463. var Class = __webpack_require__(0);
  33464. var CONST = __webpack_require__(22);
  33465. var File = __webpack_require__(20);
  33466. var FileTypesManager = __webpack_require__(7);
  33467. var GetFastValue = __webpack_require__(1);
  33468. var HTML5AudioFile = __webpack_require__(172);
  33469. var IsPlainObject = __webpack_require__(8);
  33470. /**
  33471. * @typedef {object} Phaser.Loader.FileTypes.AudioFileConfig
  33472. *
  33473. * @property {string} key - The key of the file. Must be unique within the Loader and Audio Cache.
  33474. * @property {string} [urlConfig] - The absolute or relative URL to load the file from.
  33475. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  33476. * @property {AudioContext} [audioContext] - The AudioContext this file will use to process itself.
  33477. */
  33478. /**
  33479. * @classdesc
  33480. * A single Audio File suitable for loading by the Loader.
  33481. *
  33482. * These are created when you use the Phaser.Loader.LoaderPlugin#audio method and are not typically created directly.
  33483. *
  33484. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#audio.
  33485. *
  33486. * @class AudioFile
  33487. * @extends Phaser.Loader.File
  33488. * @memberOf Phaser.Loader.FileTypes
  33489. * @constructor
  33490. * @since 3.0.0
  33491. *
  33492. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  33493. * @param {(string|Phaser.Loader.FileTypes.AudioFileConfig)} key - The key to use for this file, or a file configuration object.
  33494. * @param {any} [urlConfig] - The absolute or relative URL to load this file from in a config object.
  33495. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  33496. * @param {AudioContext} [audioContext] - The AudioContext this file will use to process itself.
  33497. */
  33498. var AudioFile = new Class({
  33499. Extends: File,
  33500. initialize:
  33501. // URL is an object created by AudioFile.findAudioURL
  33502. function AudioFile (loader, key, urlConfig, xhrSettings, audioContext)
  33503. {
  33504. if (IsPlainObject(key))
  33505. {
  33506. var config = key;
  33507. key = GetFastValue(config, 'key');
  33508. xhrSettings = GetFastValue(config, 'xhrSettings');
  33509. audioContext = GetFastValue(config, 'context', audioContext);
  33510. }
  33511. var fileConfig = {
  33512. type: 'audio',
  33513. cache: loader.cacheManager.audio,
  33514. extension: urlConfig.type,
  33515. responseType: 'arraybuffer',
  33516. key: key,
  33517. url: urlConfig.url,
  33518. xhrSettings: xhrSettings,
  33519. config: { context: audioContext }
  33520. };
  33521. File.call(this, loader, fileConfig);
  33522. },
  33523. /**
  33524. * Called automatically by Loader.nextFile.
  33525. * This method controls what extra work this File does with its loaded data.
  33526. *
  33527. * @method Phaser.Loader.FileTypes.AudioFile#onProcess
  33528. * @since 3.0.0
  33529. */
  33530. onProcess: function ()
  33531. {
  33532. this.state = CONST.FILE_PROCESSING;
  33533. var _this = this;
  33534. // interesting read https://github.com/WebAudio/web-audio-api/issues/1305
  33535. this.config.context.decodeAudioData(this.xhrLoader.response,
  33536. function (audioBuffer)
  33537. {
  33538. _this.data = audioBuffer;
  33539. _this.onProcessComplete();
  33540. },
  33541. function (e)
  33542. {
  33543. // eslint-disable-next-line no-console
  33544. console.error('Error decoding audio: ' + this.key + ' - ', e.message);
  33545. _this.onProcessError();
  33546. }
  33547. );
  33548. this.config.context = null;
  33549. }
  33550. });
  33551. AudioFile.create = function (loader, key, urls, config, xhrSettings)
  33552. {
  33553. var game = loader.systems.game;
  33554. var audioConfig = game.config.audio;
  33555. var deviceAudio = game.device.audio;
  33556. // url may be inside key, which may be an object
  33557. if (IsPlainObject(key))
  33558. {
  33559. urls = GetFastValue(key, 'url', []);
  33560. config = GetFastValue(key, 'config', {});
  33561. }
  33562. var urlConfig = AudioFile.getAudioURL(game, urls);
  33563. if (!urlConfig)
  33564. {
  33565. return null;
  33566. }
  33567. // https://developers.google.com/web/updates/2012/02/HTML5-audio-and-the-Web-Audio-API-are-BFFs
  33568. // var stream = GetFastValue(config, 'stream', false);
  33569. if (deviceAudio.webAudio && !(audioConfig && audioConfig.disableWebAudio))
  33570. {
  33571. return new AudioFile(loader, key, urlConfig, xhrSettings, game.sound.context);
  33572. }
  33573. else
  33574. {
  33575. return new HTML5AudioFile(loader, key, urlConfig, config);
  33576. }
  33577. };
  33578. AudioFile.getAudioURL = function (game, urls)
  33579. {
  33580. if (!Array.isArray(urls))
  33581. {
  33582. urls = [ urls ];
  33583. }
  33584. for (var i = 0; i < urls.length; i++)
  33585. {
  33586. var url = GetFastValue(urls[i], 'url', urls[i]);
  33587. if (url.indexOf('blob:') === 0 || url.indexOf('data:') === 0)
  33588. {
  33589. return url;
  33590. }
  33591. var audioType = url.match(/\.([a-zA-Z0-9]+)($|\?)/);
  33592. audioType = GetFastValue(urls[i], 'type', (audioType) ? audioType[1] : '').toLowerCase();
  33593. if (game.device.audio[audioType])
  33594. {
  33595. return {
  33596. url: url,
  33597. type: audioType
  33598. };
  33599. }
  33600. }
  33601. return null;
  33602. };
  33603. /**
  33604. * Adds an Audio or HTML5Audio file, or array of audio files, to the current load queue.
  33605. *
  33606. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  33607. *
  33608. * ```javascript
  33609. * function preload ()
  33610. * {
  33611. * this.load.audio('title', [ 'music/Title.ogg', 'music/Title.mp3', 'music/Title.m4a' ]);
  33612. * }
  33613. * ```
  33614. *
  33615. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  33616. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  33617. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  33618. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  33619. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  33620. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  33621. * loaded.
  33622. *
  33623. * The key must be a unique String. It is used to add the file to the global Audio Cache upon a successful load.
  33624. * The key should be unique both in terms of files being loaded and files already present in the Audio Cache.
  33625. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  33626. * then remove it from the Audio Cache first, before loading a new one.
  33627. *
  33628. * Instead of passing arguments you can pass a configuration object, such as:
  33629. *
  33630. * ```javascript
  33631. * this.load.audio({
  33632. * key: 'title',
  33633. * url: [ 'music/Title.ogg', 'music/Title.mp3', 'music/Title.m4a' ]
  33634. * });
  33635. * ```
  33636. *
  33637. * See the documentation for `Phaser.Loader.FileTypes.AudioFileConfig` for more details.
  33638. *
  33639. * The URLs can be relative or absolute. If the URLs are relative the `Loader.baseURL` and `Loader.path` values will be prepended to them.
  33640. *
  33641. * Due to different browsers supporting different audio file types you should usually provide your audio files in a variety of formats.
  33642. * 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
  33643. * browser support.
  33644. *
  33645. * 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.
  33646. *
  33647. * Note: The ability to load this type of file will only be available if the Audio File type has been built into Phaser.
  33648. * It is available in the default build but can be excluded from custom builds.
  33649. *
  33650. * @method Phaser.Loader.LoaderPlugin#audio
  33651. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  33652. * @since 3.0.0
  33653. *
  33654. * @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.
  33655. * @param {(string|string[])} [urls] - The absolute or relative URL to load the audio files from.
  33656. * @param {any} [config] - An object containing an `instances` property for HTML5Audio. Defaults to 1.
  33657. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  33658. *
  33659. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  33660. */
  33661. FileTypesManager.register('audio', function (key, urls, config, xhrSettings)
  33662. {
  33663. var game = this.systems.game;
  33664. var audioConfig = game.config.audio;
  33665. var deviceAudio = game.device.audio;
  33666. if ((audioConfig && audioConfig.noAudio) || (!deviceAudio.webAudio && !deviceAudio.audioData))
  33667. {
  33668. // Sounds are disabled, so skip loading audio
  33669. return this;
  33670. }
  33671. var audioFile;
  33672. if (Array.isArray(key))
  33673. {
  33674. for (var i = 0; i < key.length; i++)
  33675. {
  33676. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  33677. audioFile = AudioFile.create(this, key[i]);
  33678. if (audioFile)
  33679. {
  33680. this.addFile(audioFile);
  33681. }
  33682. }
  33683. }
  33684. else
  33685. {
  33686. audioFile = AudioFile.create(this, key, urls, config, xhrSettings);
  33687. if (audioFile)
  33688. {
  33689. this.addFile(audioFile);
  33690. }
  33691. }
  33692. return this;
  33693. });
  33694. module.exports = AudioFile;
  33695. /***/ }),
  33696. /* 174 */
  33697. /***/ (function(module, exports, __webpack_require__) {
  33698. /**
  33699. * @author Richard Davey <rich@photonstorm.com>
  33700. * @copyright 2018 Photon Storm Ltd.
  33701. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  33702. */
  33703. var MergeXHRSettings = __webpack_require__(107);
  33704. /**
  33705. * Creates a new XMLHttpRequest (xhr) object based on the given File and XHRSettings
  33706. * and starts the download of it. It uses the Files own XHRSettings and merges them
  33707. * with the global XHRSettings object to set the xhr values before download.
  33708. *
  33709. * @function Phaser.Loader.XHRLoader
  33710. * @since 3.0.0
  33711. *
  33712. * @param {Phaser.Loader.File} file - The File to download.
  33713. * @param {XHRSettingsObject} globalXHRSettings - The global XHRSettings object.
  33714. *
  33715. * @return {XMLHttpRequest} The XHR object.
  33716. */
  33717. var XHRLoader = function (file, globalXHRSettings)
  33718. {
  33719. var config = MergeXHRSettings(globalXHRSettings, file.xhrSettings);
  33720. var xhr = new XMLHttpRequest();
  33721. xhr.open('GET', file.src, config.async, config.user, config.password);
  33722. xhr.responseType = file.xhrSettings.responseType;
  33723. xhr.timeout = config.timeout;
  33724. if (config.header && config.headerValue)
  33725. {
  33726. xhr.setRequestHeader(config.header, config.headerValue);
  33727. }
  33728. if (config.requestedWith)
  33729. {
  33730. xhr.setRequestHeader('X-Requested-With', config.requestedWith);
  33731. }
  33732. if (config.overrideMimeType)
  33733. {
  33734. xhr.overrideMimeType(config.overrideMimeType);
  33735. }
  33736. // 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.)
  33737. xhr.onload = file.onLoad.bind(file, xhr);
  33738. xhr.onerror = file.onError.bind(file);
  33739. xhr.onprogress = file.onProgress.bind(file);
  33740. // This is the only standard method, the ones above are browser additions (maybe not universal?)
  33741. // xhr.onreadystatechange
  33742. xhr.send();
  33743. return xhr;
  33744. };
  33745. module.exports = XHRLoader;
  33746. /***/ }),
  33747. /* 175 */
  33748. /***/ (function(module, exports, __webpack_require__) {
  33749. /**
  33750. * @author Richard Davey <rich@photonstorm.com>
  33751. * @copyright 2018 Photon Storm Ltd.
  33752. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  33753. */
  33754. var Class = __webpack_require__(0);
  33755. var GetFastValue = __webpack_require__(1);
  33756. var ProcessKeyCombo = __webpack_require__(378);
  33757. var ResetKeyCombo = __webpack_require__(376);
  33758. /**
  33759. * @callback KeyboardKeydownCallback
  33760. *
  33761. * @param {KeyboardEvent} event - The Keyboard Event.
  33762. */
  33763. /**
  33764. * @typedef {object} KeyComboConfig
  33765. *
  33766. * @property {boolean} [resetOnWrongKey=true] - If they press the wrong key do we reset the combo?
  33767. * @property {number} [maxKeyDelay=0] - The max delay in ms between each key press. Above this the combo is reset. 0 means disabled.
  33768. * @property {boolean} [resetOnMatch=false] - If previously matched and they press the first key of the combo again, will it reset?
  33769. * @property {boolean} [deleteOnMatch=false] - If the combo matches, will it delete itself?
  33770. */
  33771. /**
  33772. * @classdesc
  33773. * A KeyCombo will listen for a specific string of keys from the Keyboard, and when it receives them
  33774. * it will emit a `keycombomatch` event from the Keyboard Manager.
  33775. *
  33776. * The keys to be listened for can be defined as:
  33777. *
  33778. * A string (i.e. 'ATARI')
  33779. * An array of either integers (key codes) or strings, or a mixture of both
  33780. * An array of objects (such as Key objects) with a public 'keyCode' property
  33781. *
  33782. * For example, to listen for the Konami code (up, up, up, down, down, down, left, left, left, right, right, right)
  33783. * you could pass the following array of key codes:
  33784. *
  33785. * ```javascript
  33786. * this.input.keyboard.createCombo([ 38, 38, 38, 40, 40, 40, 37, 37, 37, 39, 39, 39 ], { resetOnMatch: true });
  33787. *
  33788. * this.input.keyboard.on('keycombomatch', function (event) {
  33789. * console.log('Konami Code entered!');
  33790. * });
  33791. * ```
  33792. *
  33793. * Or, to listen for the user entering the word PHASER:
  33794. *
  33795. * ```javascript
  33796. * this.input.keyboard.createCombo('PHASER');
  33797. * ```
  33798. *
  33799. * @class KeyCombo
  33800. * @memberOf Phaser.Input.Keyboard
  33801. * @constructor
  33802. * @since 3.0.0
  33803. *
  33804. * @param {Phaser.Input.Keyboard.KeyboardPlugin} keyboardPlugin - A reference to the Keyboard Plugin.
  33805. * @param {(string|integer[]|object[])} keys - The keys that comprise this combo.
  33806. * @param {KeyComboConfig} [config] - A Key Combo configuration object.
  33807. */
  33808. var KeyCombo = new Class({
  33809. initialize:
  33810. function KeyCombo (keyboardPlugin, keys, config)
  33811. {
  33812. if (config === undefined) { config = {}; }
  33813. // Can't have a zero or single length combo (string or array based)
  33814. if (keys.length < 2)
  33815. {
  33816. return false;
  33817. }
  33818. /**
  33819. * A reference to the Keyboard Manager
  33820. *
  33821. * @name Phaser.Input.Keyboard.KeyCombo#manager
  33822. * @type {Phaser.Input.Keyboard.KeyboardPlugin}
  33823. * @since 3.0.0
  33824. */
  33825. this.manager = keyboardPlugin;
  33826. /**
  33827. * A flag that controls if this Key Combo is actively processing keys or not.
  33828. *
  33829. * @name Phaser.Input.Keyboard.KeyCombo#enabled
  33830. * @type {boolean}
  33831. * @default true
  33832. * @since 3.0.0
  33833. */
  33834. this.enabled = true;
  33835. /**
  33836. * An array of the keycodes that comprise this combo.
  33837. *
  33838. * @name Phaser.Input.Keyboard.KeyCombo#keyCodes
  33839. * @type {array}
  33840. * @default []
  33841. * @since 3.0.0
  33842. */
  33843. this.keyCodes = [];
  33844. // if 'keys' is a string we need to get the keycode of each character in it
  33845. for (var i = 0; i < keys.length; i++)
  33846. {
  33847. var char = keys[i];
  33848. if (typeof char === 'string')
  33849. {
  33850. this.keyCodes.push(char.toUpperCase().charCodeAt(0));
  33851. }
  33852. else if (typeof char === 'number')
  33853. {
  33854. this.keyCodes.push(char);
  33855. }
  33856. else if (char.hasOwnProperty('keyCode'))
  33857. {
  33858. this.keyCodes.push(char.keyCode);
  33859. }
  33860. }
  33861. /**
  33862. * The current keyCode the combo is waiting for.
  33863. *
  33864. * @name Phaser.Input.Keyboard.KeyCombo#current
  33865. * @type {integer}
  33866. * @since 3.0.0
  33867. */
  33868. this.current = this.keyCodes[0];
  33869. /**
  33870. * The current index of the key being waited for in the 'keys' string.
  33871. *
  33872. * @name Phaser.Input.Keyboard.KeyCombo#index
  33873. * @type {integer}
  33874. * @default 0
  33875. * @since 3.0.0
  33876. */
  33877. this.index = 0;
  33878. /**
  33879. * The length of this combo (in keycodes)
  33880. *
  33881. * @name Phaser.Input.Keyboard.KeyCombo#size
  33882. * @type {number}
  33883. * @since 3.0.0
  33884. */
  33885. this.size = this.keyCodes.length;
  33886. /**
  33887. * The time the previous key in the combo was matched.
  33888. *
  33889. * @name Phaser.Input.Keyboard.KeyCombo#timeLastMatched
  33890. * @type {number}
  33891. * @default 0
  33892. * @since 3.0.0
  33893. */
  33894. this.timeLastMatched = 0;
  33895. /**
  33896. * Has this Key Combo been matched yet?
  33897. *
  33898. * @name Phaser.Input.Keyboard.KeyCombo#matched
  33899. * @type {boolean}
  33900. * @default false
  33901. * @since 3.0.0
  33902. */
  33903. this.matched = false;
  33904. /**
  33905. * The time the entire combo was matched.
  33906. *
  33907. * @name Phaser.Input.Keyboard.KeyCombo#timeMatched
  33908. * @type {number}
  33909. * @default 0
  33910. * @since 3.0.0
  33911. */
  33912. this.timeMatched = 0;
  33913. /**
  33914. * If they press the wrong key do we reset the combo?
  33915. *
  33916. * @name Phaser.Input.Keyboard.KeyCombo#resetOnWrongKey
  33917. * @type {boolean}
  33918. * @default 0
  33919. * @since 3.0.0
  33920. */
  33921. this.resetOnWrongKey = GetFastValue(config, 'resetOnWrongKey', true);
  33922. /**
  33923. * The max delay in ms between each key press. Above this the combo is reset. 0 means disabled.
  33924. *
  33925. * @name Phaser.Input.Keyboard.KeyCombo#maxKeyDelay
  33926. * @type {integer}
  33927. * @default 0
  33928. * @since 3.0.0
  33929. */
  33930. this.maxKeyDelay = GetFastValue(config, 'maxKeyDelay', 0);
  33931. /**
  33932. * If previously matched and they press the first key of the combo again, will it reset?
  33933. *
  33934. * @name Phaser.Input.Keyboard.KeyCombo#resetOnMatch
  33935. * @type {boolean}
  33936. * @default false
  33937. * @since 3.0.0
  33938. */
  33939. this.resetOnMatch = GetFastValue(config, 'resetOnMatch', false);
  33940. /**
  33941. * If the combo matches, will it delete itself?
  33942. *
  33943. * @name Phaser.Input.Keyboard.KeyCombo#deleteOnMatch
  33944. * @type {boolean}
  33945. * @default false
  33946. * @since 3.0.0
  33947. */
  33948. this.deleteOnMatch = GetFastValue(config, 'deleteOnMatch', false);
  33949. var _this = this;
  33950. var onKeyDownHandler = function (event)
  33951. {
  33952. if (_this.matched || !_this.enabled)
  33953. {
  33954. return;
  33955. }
  33956. var matched = ProcessKeyCombo(event, _this);
  33957. if (matched)
  33958. {
  33959. _this.manager.emit('keycombomatch', _this, event);
  33960. if (_this.resetOnMatch)
  33961. {
  33962. ResetKeyCombo(_this);
  33963. }
  33964. else if (_this.deleteOnMatch)
  33965. {
  33966. _this.destroy();
  33967. }
  33968. }
  33969. };
  33970. /**
  33971. * The internal Key Down handler.
  33972. *
  33973. * @name Phaser.Input.Keyboard.KeyCombo#onKeyDown
  33974. * @private
  33975. * @type {KeyboardKeydownCallback}
  33976. * @since 3.0.0
  33977. */
  33978. this.onKeyDown = onKeyDownHandler;
  33979. this.manager.on('keydown', onKeyDownHandler);
  33980. },
  33981. /**
  33982. * How far complete is this combo? A value between 0 and 1.
  33983. *
  33984. * @name Phaser.Input.Keyboard.KeyCombo#progress
  33985. * @type {number}
  33986. * @readOnly
  33987. * @since 3.0.0
  33988. */
  33989. progress: {
  33990. get: function ()
  33991. {
  33992. return this.index / this.size;
  33993. }
  33994. },
  33995. /**
  33996. * Destroys this Key Combo and all of its references.
  33997. *
  33998. * @method Phaser.Input.Keyboard.KeyCombo#destroy
  33999. * @since 3.0.0
  34000. */
  34001. destroy: function ()
  34002. {
  34003. this.enabled = false;
  34004. this.keyCodes = [];
  34005. this.manager.off('keydown', this.onKeyDown);
  34006. this.manager = null;
  34007. }
  34008. });
  34009. module.exports = KeyCombo;
  34010. /***/ }),
  34011. /* 176 */
  34012. /***/ (function(module, exports, __webpack_require__) {
  34013. /**
  34014. * @author Richard Davey <rich@photonstorm.com>
  34015. * @copyright 2018 Photon Storm Ltd.
  34016. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  34017. */
  34018. var Class = __webpack_require__(0);
  34019. /**
  34020. * @classdesc
  34021. * A generic Key object which can be passed to the Process functions (and so on)
  34022. * keycode must be an integer
  34023. *
  34024. * @class Key
  34025. * @memberOf Phaser.Input.Keyboard
  34026. * @constructor
  34027. * @since 3.0.0
  34028. *
  34029. * @param {integer} keyCode - The keycode of this key.
  34030. */
  34031. var Key = new Class({
  34032. initialize:
  34033. function Key (keyCode)
  34034. {
  34035. /**
  34036. * The keycode of this key.
  34037. *
  34038. * @name Phaser.Input.Keyboard.Key#keyCode
  34039. * @type {integer}
  34040. * @since 3.0.0
  34041. */
  34042. this.keyCode = keyCode;
  34043. /**
  34044. * The original DOM event.
  34045. *
  34046. * @name Phaser.Input.Keyboard.Key#originalEvent
  34047. * @type {KeyboardEvent}
  34048. * @since 3.0.0
  34049. */
  34050. this.originalEvent = undefined;
  34051. /**
  34052. * Should this Key prevent event propagation?
  34053. *
  34054. * @name Phaser.Input.Keyboard.Key#preventDefault
  34055. * @type {boolean}
  34056. * @default true
  34057. * @since 3.0.0
  34058. */
  34059. this.preventDefault = true;
  34060. /**
  34061. * Can this Key be processed?
  34062. *
  34063. * @name Phaser.Input.Keyboard.Key#enabled
  34064. * @type {boolean}
  34065. * @default true
  34066. * @since 3.0.0
  34067. */
  34068. this.enabled = true;
  34069. /**
  34070. * The "down" state of the key. This will remain `true` for as long as the keyboard thinks this key is held down.
  34071. *
  34072. * @name Phaser.Input.Keyboard.Key#isDown
  34073. * @type {boolean}
  34074. * @default false
  34075. * @since 3.0.0
  34076. */
  34077. this.isDown = false;
  34078. /**
  34079. * The "up" state of the key. This will remain `true` for as long as the keyboard thinks this key is up.
  34080. *
  34081. * @name Phaser.Input.Keyboard.Key#isUp
  34082. * @type {boolean}
  34083. * @default true
  34084. * @since 3.0.0
  34085. */
  34086. this.isUp = true;
  34087. /**
  34088. * The down state of the ALT key, if pressed at the same time as this key.
  34089. *
  34090. * @name Phaser.Input.Keyboard.Key#altKey
  34091. * @type {boolean}
  34092. * @default false
  34093. * @since 3.0.0
  34094. */
  34095. this.altKey = false;
  34096. /**
  34097. * The down state of the CTRL key, if pressed at the same time as this key.
  34098. *
  34099. * @name Phaser.Input.Keyboard.Key#ctrlKey
  34100. * @type {boolean}
  34101. * @default false
  34102. * @since 3.0.0
  34103. */
  34104. this.ctrlKey = false;
  34105. /**
  34106. * The down state of the SHIFT key, if pressed at the same time as this key.
  34107. *
  34108. * @name Phaser.Input.Keyboard.Key#shiftKey
  34109. * @type {boolean}
  34110. * @default false
  34111. * @since 3.0.0
  34112. */
  34113. this.shiftKey = false;
  34114. /**
  34115. * The location of the modifier key. 0 for standard (or unknown), 1 for left, 2 for right, 3 for numpad.
  34116. *
  34117. * @name Phaser.Input.Keyboard.Key#location
  34118. * @type {number}
  34119. * @default 0
  34120. * @since 3.0.0
  34121. */
  34122. this.location = 0;
  34123. /**
  34124. * The timestamp when the key was last pressed down.
  34125. *
  34126. * @name Phaser.Input.Keyboard.Key#timeDown
  34127. * @type {number}
  34128. * @default 0
  34129. * @since 3.0.0
  34130. */
  34131. this.timeDown = 0;
  34132. /**
  34133. * The number of milliseconds this key was held down for in the previous down - up sequence.
  34134. *
  34135. * @name Phaser.Input.Keyboard.Key#duration
  34136. * @type {number}
  34137. * @default 0
  34138. * @since 3.0.0
  34139. */
  34140. this.duration = 0;
  34141. /**
  34142. * The timestamp when the key was last released.
  34143. *
  34144. * @name Phaser.Input.Keyboard.Key#timeUp
  34145. * @type {number}
  34146. * @default 0
  34147. * @since 3.0.0
  34148. */
  34149. this.timeUp = 0;
  34150. /**
  34151. * If a key is held down this holds down the number of times the key has 'repeated'.
  34152. *
  34153. * @name Phaser.Input.Keyboard.Key#repeats
  34154. * @type {number}
  34155. * @default 0
  34156. * @since 3.0.0
  34157. */
  34158. this.repeats = 0;
  34159. /**
  34160. * True if the key has just been pressed (NOTE: requires to be reset, see justDown getter)
  34161. *
  34162. * @name Phaser.Input.Keyboard.Key#_justDown
  34163. * @type {boolean}
  34164. * @private
  34165. * @default false
  34166. * @since 3.0.0
  34167. */
  34168. this._justDown = false;
  34169. /**
  34170. * True if the key has just been pressed (NOTE: requires to be reset, see justDown getter)
  34171. *
  34172. * @name Phaser.Input.Keyboard.Key#_justUp
  34173. * @type {boolean}
  34174. * @private
  34175. * @default false
  34176. * @since 3.0.0
  34177. */
  34178. this._justUp = false;
  34179. /**
  34180. * Internal tick counter.
  34181. *
  34182. * @name Phaser.Input.Keyboard.Key#_tick
  34183. * @type {number}
  34184. * @private
  34185. * @since 3.11.0
  34186. */
  34187. this._tick = -1;
  34188. },
  34189. /**
  34190. * Resets this Key object back to its default un-pressed state.
  34191. *
  34192. * @method Phaser.Input.Keyboard.Key.reset
  34193. * @since 3.6.0
  34194. *
  34195. * @return {Phaser.Input.Keyboard.Key} This Key instance.
  34196. */
  34197. reset: function ()
  34198. {
  34199. this.preventDefault = true;
  34200. this.enabled = true;
  34201. this.isDown = false;
  34202. this.isUp = true;
  34203. this.altKey = false;
  34204. this.ctrlKey = false;
  34205. this.shiftKey = false;
  34206. this.timeDown = 0;
  34207. this.duration = 0;
  34208. this.timeUp = 0;
  34209. this.repeats = 0;
  34210. this._justDown = false;
  34211. this._justUp = false;
  34212. this._tick = -1;
  34213. return this;
  34214. }
  34215. });
  34216. module.exports = Key;
  34217. /***/ }),
  34218. /* 177 */
  34219. /***/ (function(module, exports, __webpack_require__) {
  34220. /**
  34221. * @author Richard Davey <rich@photonstorm.com>
  34222. * @copyright 2018 Photon Storm Ltd.
  34223. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  34224. */
  34225. var Axis = __webpack_require__(179);
  34226. var Button = __webpack_require__(178);
  34227. var Class = __webpack_require__(0);
  34228. var EventEmitter = __webpack_require__(9);
  34229. var Vector2 = __webpack_require__(6);
  34230. /**
  34231. * @classdesc
  34232. * A single Gamepad.
  34233. *
  34234. * These are created, updated and managed by the Gamepad Plugin.
  34235. *
  34236. * @class Gamepad
  34237. * @extends Phaser.Events.EventEmitter
  34238. * @memberOf Phaser.Input.Gamepad
  34239. * @constructor
  34240. * @since 3.0.0
  34241. *
  34242. * @param {Phaser.Input.Gamepad.GamepadPlugin} manager - A reference to the Gamepad Plugin.
  34243. * @param {Pad} pad - The Gamepad object, as extracted from GamepadEvent.
  34244. */
  34245. var Gamepad = new Class({
  34246. Extends: EventEmitter,
  34247. initialize:
  34248. function Gamepad (manager, pad)
  34249. {
  34250. EventEmitter.call(this);
  34251. /**
  34252. * A reference to the Gamepad Plugin.
  34253. *
  34254. * @name Phaser.Input.Gamepad.Gamepad#manager
  34255. * @type {Phaser.Input.Gamepad.GamepadPlugin}
  34256. * @since 3.0.0
  34257. */
  34258. this.manager = manager;
  34259. /**
  34260. * A reference to the native Gamepad object that is connected to the browser.
  34261. *
  34262. * @name Phaser.Input.Gamepad.Gamepad#pad
  34263. * @type {any}
  34264. * @since 3.10.0
  34265. */
  34266. this.pad = pad;
  34267. /**
  34268. * A string containing some information about the controller.
  34269. *
  34270. * This is not strictly specified, but in Firefox it will contain three pieces of information
  34271. * separated by dashes (-): two 4-digit hexadecimal strings containing the USB vendor and
  34272. * product id of the controller, and the name of the controller as provided by the driver.
  34273. * In Chrome it will contain the name of the controller as provided by the driver,
  34274. * followed by vendor and product 4-digit hexadecimal strings.
  34275. *
  34276. * @name Phaser.Input.Gamepad.Gamepad#id
  34277. * @type {string}
  34278. * @since 3.0.0
  34279. */
  34280. this.id = pad.id;
  34281. /**
  34282. * An integer that is unique for each Gamepad currently connected to the system.
  34283. * This can be used to distinguish multiple controllers.
  34284. * Note that disconnecting a device and then connecting a new device may reuse the previous index.
  34285. *
  34286. * @name Phaser.Input.Gamepad.Gamepad#index
  34287. * @type {number}
  34288. * @since 3.0.0
  34289. */
  34290. this.index = pad.index;
  34291. var buttons = [];
  34292. for (var i = 0; i < pad.buttons.length; i++)
  34293. {
  34294. buttons.push(new Button(this, i));
  34295. }
  34296. /**
  34297. * An array of Gamepad Button objects, corresponding to the different buttons available on the Gamepad.
  34298. *
  34299. * @name Phaser.Input.Gamepad.Gamepad#buttons
  34300. * @type {Phaser.Input.Gamepad.Button[]}
  34301. * @since 3.0.0
  34302. */
  34303. this.buttons = buttons;
  34304. var axes = [];
  34305. for (i = 0; i < pad.axes.length; i++)
  34306. {
  34307. axes.push(new Axis(this, i));
  34308. }
  34309. /**
  34310. * An array of Gamepad Axis objects, corresponding to the different axes available on the Gamepad, if any.
  34311. *
  34312. * @name Phaser.Input.Gamepad.Gamepad#axes
  34313. * @type {Phaser.Input.Gamepad.Axis[]}
  34314. * @since 3.0.0
  34315. */
  34316. this.axes = axes;
  34317. /**
  34318. * The Gamepad's Haptic Actuator (Vibration / Rumble support).
  34319. * This is highly experimental and only set if both present on the device,
  34320. * and exposed by both the hardware and browser.
  34321. *
  34322. * @name Phaser.Input.Gamepad.Gamepad#vibration
  34323. * @type {GamepadHapticActuator}
  34324. * @since 3.10.0
  34325. */
  34326. this.vibration = pad.vibrationActuator;
  34327. // https://w3c.github.io/gamepad/#remapping
  34328. var _noButton = { value: 0, pressed: false };
  34329. /**
  34330. * A reference to the Left Button in the Left Cluster.
  34331. *
  34332. * @name Phaser.Input.Gamepad.Gamepad#_LCLeft
  34333. * @type {Phaser.Input.Gamepad.Button}
  34334. * @private
  34335. * @since 3.10.0
  34336. */
  34337. this._LCLeft = (buttons[14]) ? buttons[14] : _noButton;
  34338. /**
  34339. * A reference to the Right Button in the Left Cluster.
  34340. *
  34341. * @name Phaser.Input.Gamepad.Gamepad#_LCRight
  34342. * @type {Phaser.Input.Gamepad.Button}
  34343. * @private
  34344. * @since 3.10.0
  34345. */
  34346. this._LCRight = (buttons[15]) ? buttons[15] : _noButton;
  34347. /**
  34348. * A reference to the Top Button in the Left Cluster.
  34349. *
  34350. * @name Phaser.Input.Gamepad.Gamepad#_LCTop
  34351. * @type {Phaser.Input.Gamepad.Button}
  34352. * @private
  34353. * @since 3.10.0
  34354. */
  34355. this._LCTop = (buttons[12]) ? buttons[12] : _noButton;
  34356. /**
  34357. * A reference to the Bottom Button in the Left Cluster.
  34358. *
  34359. * @name Phaser.Input.Gamepad.Gamepad#_LCBottom
  34360. * @type {Phaser.Input.Gamepad.Button}
  34361. * @private
  34362. * @since 3.10.0
  34363. */
  34364. this._LCBottom = (buttons[13]) ? buttons[13] : _noButton;
  34365. /**
  34366. * A reference to the Left Button in the Right Cluster.
  34367. *
  34368. * @name Phaser.Input.Gamepad.Gamepad#_RCLeft
  34369. * @type {Phaser.Input.Gamepad.Button}
  34370. * @private
  34371. * @since 3.10.0
  34372. */
  34373. this._RCLeft = (buttons[2]) ? buttons[2] : _noButton;
  34374. /**
  34375. * A reference to the Right Button in the Right Cluster.
  34376. *
  34377. * @name Phaser.Input.Gamepad.Gamepad#_RCRight
  34378. * @type {Phaser.Input.Gamepad.Button}
  34379. * @private
  34380. * @since 3.10.0
  34381. */
  34382. this._RCRight = (buttons[1]) ? buttons[1] : _noButton;
  34383. /**
  34384. * A reference to the Top Button in the Right Cluster.
  34385. *
  34386. * @name Phaser.Input.Gamepad.Gamepad#_RCTop
  34387. * @type {Phaser.Input.Gamepad.Button}
  34388. * @private
  34389. * @since 3.10.0
  34390. */
  34391. this._RCTop = (buttons[3]) ? buttons[3] : _noButton;
  34392. /**
  34393. * A reference to the Bottom Button in the Right Cluster.
  34394. *
  34395. * @name Phaser.Input.Gamepad.Gamepad#_RCBottom
  34396. * @type {Phaser.Input.Gamepad.Button}
  34397. * @private
  34398. * @since 3.10.0
  34399. */
  34400. this._RCBottom = (buttons[0]) ? buttons[0] : _noButton;
  34401. /**
  34402. * A reference to the Top Left Front Button (L1 Shoulder Button)
  34403. *
  34404. * @name Phaser.Input.Gamepad.Gamepad#_FBLeftTop
  34405. * @type {Phaser.Input.Gamepad.Button}
  34406. * @private
  34407. * @since 3.10.0
  34408. */
  34409. this._FBLeftTop = (buttons[4]) ? buttons[4] : _noButton;
  34410. /**
  34411. * A reference to the Bottom Left Front Button (L2 Shoulder Button)
  34412. *
  34413. * @name Phaser.Input.Gamepad.Gamepad#_FBLeftBottom
  34414. * @type {Phaser.Input.Gamepad.Button}
  34415. * @private
  34416. * @since 3.10.0
  34417. */
  34418. this._FBLeftBottom = (buttons[6]) ? buttons[6] : _noButton;
  34419. /**
  34420. * A reference to the Top Right Front Button (R1 Shoulder Button)
  34421. *
  34422. * @name Phaser.Input.Gamepad.Gamepad#_FBRightTop
  34423. * @type {Phaser.Input.Gamepad.Button}
  34424. * @private
  34425. * @since 3.10.0
  34426. */
  34427. this._FBRightTop = (buttons[5]) ? buttons[5] : _noButton;
  34428. /**
  34429. * A reference to the Bottom Right Front Button (R2 Shoulder Button)
  34430. *
  34431. * @name Phaser.Input.Gamepad.Gamepad#_FBRightBottom
  34432. * @type {Phaser.Input.Gamepad.Button}
  34433. * @private
  34434. * @since 3.10.0
  34435. */
  34436. this._FBRightBottom = (buttons[7]) ? buttons[7] : _noButton;
  34437. var _noAxis = { value: 0 };
  34438. /**
  34439. * A reference to the Horizontal Axis for the Left Stick.
  34440. *
  34441. * @name Phaser.Input.Gamepad.Gamepad#_HAxisLeft
  34442. * @type {Phaser.Input.Gamepad.Button}
  34443. * @private
  34444. * @since 3.10.0
  34445. */
  34446. this._HAxisLeft = (axes[0]) ? axes[0] : _noAxis;
  34447. /**
  34448. * A reference to the Vertical Axis for the Left Stick.
  34449. *
  34450. * @name Phaser.Input.Gamepad.Gamepad#_VAxisLeft
  34451. * @type {Phaser.Input.Gamepad.Button}
  34452. * @private
  34453. * @since 3.10.0
  34454. */
  34455. this._VAxisLeft = (axes[1]) ? axes[1] : _noAxis;
  34456. /**
  34457. * A reference to the Horizontal Axis for the Right Stick.
  34458. *
  34459. * @name Phaser.Input.Gamepad.Gamepad#_HAxisRight
  34460. * @type {Phaser.Input.Gamepad.Button}
  34461. * @private
  34462. * @since 3.10.0
  34463. */
  34464. this._HAxisRight = (axes[2]) ? axes[2] : _noAxis;
  34465. /**
  34466. * A reference to the Vertical Axis for the Right Stick.
  34467. *
  34468. * @name Phaser.Input.Gamepad.Gamepad#_VAxisRight
  34469. * @type {Phaser.Input.Gamepad.Button}
  34470. * @private
  34471. * @since 3.10.0
  34472. */
  34473. this._VAxisRight = (axes[3]) ? axes[3] : _noAxis;
  34474. /**
  34475. * A Vector2 containing the most recent values from the Gamepad's left axis stick.
  34476. * This is updated automatically as part of the Gamepad.update cycle.
  34477. * The H Axis is mapped to the `Vector2.x` property, and the V Axis to the `Vector2.y` property.
  34478. * The values are based on the Axis thresholds.
  34479. * If the Gamepad does not have a left axis stick, the values will always be zero.
  34480. *
  34481. * @name Phaser.Input.Gamepad.Gamepad#leftStick
  34482. * @type {Phaser.Math.Vector2}
  34483. * @since 3.10.0
  34484. */
  34485. this.leftStick = new Vector2();
  34486. /**
  34487. * A Vector2 containing the most recent values from the Gamepad's right axis stick.
  34488. * This is updated automatically as part of the Gamepad.update cycle.
  34489. * The H Axis is mapped to the `Vector2.x` property, and the V Axis to the `Vector2.y` property.
  34490. * The values are based on the Axis thresholds.
  34491. * If the Gamepad does not have a right axis stick, the values will always be zero.
  34492. *
  34493. * @name Phaser.Input.Gamepad.Gamepad#rightStick
  34494. * @type {Phaser.Math.Vector2}
  34495. * @since 3.10.0
  34496. */
  34497. this.rightStick = new Vector2();
  34498. },
  34499. /**
  34500. * Gets the total number of axis this Gamepad claims to support.
  34501. *
  34502. * @method Phaser.Input.Gamepad.Gamepad#getAxisTotal
  34503. * @since 3.10.0
  34504. *
  34505. * @return {integer} The total number of axes this Gamepad claims to support.
  34506. */
  34507. getAxisTotal: function ()
  34508. {
  34509. return this.axes.length;
  34510. },
  34511. /**
  34512. * Gets the value of an axis based on the given index.
  34513. * The index must be valid within the range of axes supported by this Gamepad.
  34514. * The return value will be a float between 0 and 1.
  34515. *
  34516. * @method Phaser.Input.Gamepad.Gamepad#getAxisValue
  34517. * @since 3.10.0
  34518. *
  34519. * @param {integer} index - The index of the axes to get the value for.
  34520. *
  34521. * @return {number} The value of the axis, between 0 and 1.
  34522. */
  34523. getAxisValue: function (index)
  34524. {
  34525. return this.axes[index].getValue();
  34526. },
  34527. /**
  34528. * Sets the threshold value of all axis on this Gamepad.
  34529. * The value is a float between 0 and 1 and is the amount below which the axis is considered as not having been moved.
  34530. *
  34531. * @method Phaser.Input.Gamepad.Gamepad#setAxisThreshold
  34532. * @since 3.10.0
  34533. *
  34534. * @param {number} value - A value between 0 and 1.
  34535. */
  34536. setAxisThreshold: function (value)
  34537. {
  34538. for (var i = 0; i < this.axes.length; i++)
  34539. {
  34540. this.axes[i].threshold = value;
  34541. }
  34542. },
  34543. /**
  34544. * Gets the total number of buttons this Gamepad claims to have.
  34545. *
  34546. * @method Phaser.Input.Gamepad.Gamepad#getButtonTotal
  34547. * @since 3.10.0
  34548. *
  34549. * @return {integer} The total number of buttons this Gamepad claims to have.
  34550. */
  34551. getButtonTotal: function ()
  34552. {
  34553. return this.buttons.length;
  34554. },
  34555. /**
  34556. * Gets the value of a button based on the given index.
  34557. * The index must be valid within the range of buttons supported by this Gamepad.
  34558. *
  34559. * The return value will be either 0 or 1 for an analogue button, or a float between 0 and 1
  34560. * for a pressure-sensitive digital button, such as the shoulder buttons on a Dual Shock.
  34561. *
  34562. * @method Phaser.Input.Gamepad.Gamepad#getButtonValue
  34563. * @since 3.10.0
  34564. *
  34565. * @param {integer} index - The index of the button to get the value for.
  34566. *
  34567. * @return {number} The value of the button, between 0 and 1.
  34568. */
  34569. getButtonValue: function (index)
  34570. {
  34571. return this.buttons[index].value;
  34572. },
  34573. /**
  34574. * Returns if the button is pressed down or not.
  34575. * The index must be valid within the range of buttons supported by this Gamepad.
  34576. *
  34577. * @method Phaser.Input.Gamepad.Gamepad#isButtonDown
  34578. * @since 3.10.0
  34579. *
  34580. * @param {integer} index - The index of the button to get the value for.
  34581. *
  34582. * @return {boolean} `true` if the button is considered as being pressed down, otherwise `false`.
  34583. */
  34584. isButtonDown: function (index)
  34585. {
  34586. return this.buttons[index].pressed;
  34587. },
  34588. /**
  34589. * Internal update handler for this Gamepad.
  34590. * Called automatically by the Gamepad Manager as part of its update.
  34591. *
  34592. * @method Phaser.Input.Gamepad.Gamepad#update
  34593. * @private
  34594. * @since 3.0.0
  34595. */
  34596. update: function (pad)
  34597. {
  34598. var i;
  34599. // Sync the button values
  34600. var localButtons = this.buttons;
  34601. var gamepadButtons = pad.buttons;
  34602. var len = localButtons.length;
  34603. for (i = 0; i < len; i++)
  34604. {
  34605. localButtons[i].update(gamepadButtons[i].value);
  34606. }
  34607. // Sync the axis values
  34608. var localAxes = this.axes;
  34609. var gamepadAxes = pad.axes;
  34610. len = localAxes.length;
  34611. for (i = 0; i < len; i++)
  34612. {
  34613. localAxes[i].update(gamepadAxes[i]);
  34614. }
  34615. if (len >= 2)
  34616. {
  34617. this.leftStick.set(localAxes[0].getValue(), localAxes[1].getValue());
  34618. if (len >= 4)
  34619. {
  34620. this.rightStick.set(localAxes[2].getValue(), localAxes[3].getValue());
  34621. }
  34622. }
  34623. },
  34624. /**
  34625. * Destroys this Gamepad instance, its buttons and axes, and releases external references it holds.
  34626. *
  34627. * @method Phaser.Input.Gamepad.Gamepad#destroy
  34628. * @since 3.10.0
  34629. */
  34630. destroy: function ()
  34631. {
  34632. this.removeAllListeners();
  34633. this.manager = null;
  34634. this.pad = null;
  34635. var i;
  34636. for (i = 0; i < this.buttons.length; i++)
  34637. {
  34638. this.buttons[i].destroy();
  34639. }
  34640. for (i = 0; i < this.axes.length; i++)
  34641. {
  34642. this.axes[i].destroy();
  34643. }
  34644. this.buttons = [];
  34645. this.axes = [];
  34646. },
  34647. /**
  34648. * Is this Gamepad currently connected or not?
  34649. *
  34650. * @name Phaser.Input.Gamepad.Gamepad#connected
  34651. * @type {boolean}
  34652. * @default true
  34653. * @since 3.0.0
  34654. */
  34655. connected: {
  34656. get: function ()
  34657. {
  34658. return this.pad.connected;
  34659. }
  34660. },
  34661. /**
  34662. * A timestamp containing the most recent time this Gamepad was updated.
  34663. *
  34664. * @name Phaser.Input.Gamepad.Gamepad#timestamp
  34665. * @type {number}
  34666. * @since 3.0.0
  34667. */
  34668. timestamp: {
  34669. get: function ()
  34670. {
  34671. return this.pad.timestamp;
  34672. }
  34673. },
  34674. /**
  34675. * Is the Gamepad's Left button being pressed?
  34676. * If the Gamepad doesn't have this button it will always return false.
  34677. * This is the d-pad left button under standard Gamepad mapping.
  34678. *
  34679. * @name Phaser.Input.Gamepad.Gamepad#left
  34680. * @type {boolean}
  34681. * @since 3.10.0
  34682. */
  34683. left: {
  34684. get: function ()
  34685. {
  34686. return this._LCLeft.pressed;
  34687. }
  34688. },
  34689. /**
  34690. * Is the Gamepad's Right button being pressed?
  34691. * If the Gamepad doesn't have this button it will always return false.
  34692. * This is the d-pad right button under standard Gamepad mapping.
  34693. *
  34694. * @name Phaser.Input.Gamepad.Gamepad#right
  34695. * @type {boolean}
  34696. * @since 3.10.0
  34697. */
  34698. right: {
  34699. get: function ()
  34700. {
  34701. return this._LCRight.pressed;
  34702. }
  34703. },
  34704. /**
  34705. * Is the Gamepad's Up button being pressed?
  34706. * If the Gamepad doesn't have this button it will always return false.
  34707. * This is the d-pad up button under standard Gamepad mapping.
  34708. *
  34709. * @name Phaser.Input.Gamepad.Gamepad#up
  34710. * @type {boolean}
  34711. * @since 3.10.0
  34712. */
  34713. up: {
  34714. get: function ()
  34715. {
  34716. return this._LCTop.pressed;
  34717. }
  34718. },
  34719. /**
  34720. * Is the Gamepad's Down button being pressed?
  34721. * If the Gamepad doesn't have this button it will always return false.
  34722. * This is the d-pad down button under standard Gamepad mapping.
  34723. *
  34724. * @name Phaser.Input.Gamepad.Gamepad#down
  34725. * @type {boolean}
  34726. * @since 3.10.0
  34727. */
  34728. down: {
  34729. get: function ()
  34730. {
  34731. return this._LCBottom.pressed;
  34732. }
  34733. },
  34734. /**
  34735. * Is the Gamepad's bottom button in the right button cluster being pressed?
  34736. * If the Gamepad doesn't have this button it will always return false.
  34737. * On a Dual Shock controller it's the X button.
  34738. * On an XBox controller it's the A button.
  34739. *
  34740. * @name Phaser.Input.Gamepad.Gamepad#A
  34741. * @type {boolean}
  34742. * @since 3.10.0
  34743. */
  34744. A: {
  34745. get: function ()
  34746. {
  34747. return this._RCBottom.pressed;
  34748. }
  34749. },
  34750. /**
  34751. * Is the Gamepad's top button in the right button cluster being pressed?
  34752. * If the Gamepad doesn't have this button it will always return false.
  34753. * On a Dual Shock controller it's the Triangle button.
  34754. * On an XBox controller it's the Y button.
  34755. *
  34756. * @name Phaser.Input.Gamepad.Gamepad#Y
  34757. * @type {boolean}
  34758. * @since 3.10.0
  34759. */
  34760. Y: {
  34761. get: function ()
  34762. {
  34763. return this._RCTop.pressed;
  34764. }
  34765. },
  34766. /**
  34767. * Is the Gamepad's left button in the right button cluster being pressed?
  34768. * If the Gamepad doesn't have this button it will always return false.
  34769. * On a Dual Shock controller it's the Square button.
  34770. * On an XBox controller it's the X button.
  34771. *
  34772. * @name Phaser.Input.Gamepad.Gamepad#X
  34773. * @type {boolean}
  34774. * @since 3.10.0
  34775. */
  34776. X: {
  34777. get: function ()
  34778. {
  34779. return this._RCLeft.pressed;
  34780. }
  34781. },
  34782. /**
  34783. * Is the Gamepad's right button in the right button cluster being pressed?
  34784. * If the Gamepad doesn't have this button it will always return false.
  34785. * On a Dual Shock controller it's the Circle button.
  34786. * On an XBox controller it's the B button.
  34787. *
  34788. * @name Phaser.Input.Gamepad.Gamepad#B
  34789. * @type {boolean}
  34790. * @since 3.10.0
  34791. */
  34792. B: {
  34793. get: function ()
  34794. {
  34795. return this._RCRight.pressed;
  34796. }
  34797. },
  34798. /**
  34799. * Returns the value of the Gamepad's top left shoulder button.
  34800. * If the Gamepad doesn't have this button it will always return zero.
  34801. * The value is a float between 0 and 1, corresponding to how depressed the button is.
  34802. * On a Dual Shock controller it's the L1 button.
  34803. * On an XBox controller it's the LB button.
  34804. *
  34805. * @name Phaser.Input.Gamepad.Gamepad#L1
  34806. * @type {number}
  34807. * @since 3.10.0
  34808. */
  34809. L1: {
  34810. get: function ()
  34811. {
  34812. return this._FBLeftTop.value;
  34813. }
  34814. },
  34815. /**
  34816. * Returns the value of the Gamepad's bottom left shoulder button.
  34817. * If the Gamepad doesn't have this button it will always return zero.
  34818. * The value is a float between 0 and 1, corresponding to how depressed the button is.
  34819. * On a Dual Shock controller it's the L2 button.
  34820. * On an XBox controller it's the LT button.
  34821. *
  34822. * @name Phaser.Input.Gamepad.Gamepad#L2
  34823. * @type {number}
  34824. * @since 3.10.0
  34825. */
  34826. L2: {
  34827. get: function ()
  34828. {
  34829. return this._FBLeftBottom.value;
  34830. }
  34831. },
  34832. /**
  34833. * Returns the value of the Gamepad's top right shoulder button.
  34834. * If the Gamepad doesn't have this button it will always return zero.
  34835. * The value is a float between 0 and 1, corresponding to how depressed the button is.
  34836. * On a Dual Shock controller it's the R1 button.
  34837. * On an XBox controller it's the RB button.
  34838. *
  34839. * @name Phaser.Input.Gamepad.Gamepad#R1
  34840. * @type {number}
  34841. * @since 3.10.0
  34842. */
  34843. R1: {
  34844. get: function ()
  34845. {
  34846. return this._FBRightTop.value;
  34847. }
  34848. },
  34849. /**
  34850. * Returns the value of the Gamepad's bottom right shoulder button.
  34851. * If the Gamepad doesn't have this button it will always return zero.
  34852. * The value is a float between 0 and 1, corresponding to how depressed the button is.
  34853. * On a Dual Shock controller it's the R2 button.
  34854. * On an XBox controller it's the RT button.
  34855. *
  34856. * @name Phaser.Input.Gamepad.Gamepad#R2
  34857. * @type {number}
  34858. * @since 3.10.0
  34859. */
  34860. R2: {
  34861. get: function ()
  34862. {
  34863. return this._FBRightBottom.value;
  34864. }
  34865. }
  34866. });
  34867. module.exports = Gamepad;
  34868. /***/ }),
  34869. /* 178 */
  34870. /***/ (function(module, exports, __webpack_require__) {
  34871. /**
  34872. * @author Richard Davey <rich@photonstorm.com>
  34873. * @copyright 2018 Photon Storm Ltd.
  34874. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  34875. */
  34876. var Class = __webpack_require__(0);
  34877. /**
  34878. * @classdesc
  34879. * Contains information about a specific button on a Gamepad.
  34880. * Button objects are created automatically by the Gamepad as they are needed.
  34881. *
  34882. * @class Button
  34883. * @memberOf Phaser.Input.Gamepad
  34884. * @constructor
  34885. * @since 3.0.0
  34886. *
  34887. * @param {Phaser.Input.Gamepad.Gamepad} pad - A reference to the Gamepad that this Button belongs to.
  34888. * @param {integer} index - The index of this Button.
  34889. */
  34890. var Button = new Class({
  34891. initialize:
  34892. function Button (pad, index)
  34893. {
  34894. /**
  34895. * A reference to the Gamepad that this Button belongs to.
  34896. *
  34897. * @name Phaser.Input.Gamepad.Button#pad
  34898. * @type {Phaser.Input.Gamepad.Gamepad}
  34899. * @since 3.0.0
  34900. */
  34901. this.pad = pad;
  34902. /**
  34903. * An event emitter to use to emit the button events.
  34904. *
  34905. * @name Phaser.Input.Gamepad.Button#events
  34906. * @type {Phaser.Events.EventEmitter}
  34907. * @since 3.0.0
  34908. */
  34909. this.events = pad.manager;
  34910. /**
  34911. * The index of this Button.
  34912. *
  34913. * @name Phaser.Input.Gamepad.Button#index
  34914. * @type {integer}
  34915. * @since 3.0.0
  34916. */
  34917. this.index = index;
  34918. /**
  34919. * Between 0 and 1.
  34920. *
  34921. * @name Phaser.Input.Gamepad.Button#value
  34922. * @type {number}
  34923. * @default 0
  34924. * @since 3.0.0
  34925. */
  34926. this.value = 0;
  34927. /**
  34928. * Can be set for analogue buttons to enable a 'pressure' threshold,
  34929. * before a button is considered as being 'pressed'.
  34930. *
  34931. * @name Phaser.Input.Gamepad.Button#threshold
  34932. * @type {number}
  34933. * @default 1
  34934. * @since 3.0.0
  34935. */
  34936. this.threshold = 1;
  34937. /**
  34938. * Is the Button being pressed down or not?
  34939. *
  34940. * @name Phaser.Input.Gamepad.Button#pressed
  34941. * @type {boolean}
  34942. * @default false
  34943. * @since 3.0.0
  34944. */
  34945. this.pressed = false;
  34946. },
  34947. /**
  34948. * Internal update handler for this Button.
  34949. * Called automatically by the Gamepad as part of its update.
  34950. *
  34951. * @method Phaser.Input.Gamepad.Button#update
  34952. * @private
  34953. * @since 3.0.0
  34954. *
  34955. * @param {number} value - The GamepadButton value.
  34956. */
  34957. update: function (value)
  34958. {
  34959. this.value = value;
  34960. var pad = this.pad;
  34961. var index = this.index;
  34962. if (value >= this.threshold)
  34963. {
  34964. if (!this.pressed)
  34965. {
  34966. this.pressed = true;
  34967. this.events.emit('down', pad, this, value);
  34968. this.pad.emit('down', index, value, this);
  34969. }
  34970. }
  34971. else if (this.pressed)
  34972. {
  34973. this.pressed = false;
  34974. this.events.emit('up', pad, this, value);
  34975. this.pad.emit('up', index, value, this);
  34976. }
  34977. },
  34978. /**
  34979. * Destroys this Button instance and releases external references it holds.
  34980. *
  34981. * @method Phaser.Input.Gamepad.Button#destroy
  34982. * @since 3.10.0
  34983. */
  34984. destroy: function ()
  34985. {
  34986. this.pad = null;
  34987. this.events = null;
  34988. }
  34989. });
  34990. module.exports = Button;
  34991. /***/ }),
  34992. /* 179 */
  34993. /***/ (function(module, exports, __webpack_require__) {
  34994. /**
  34995. * @author Richard Davey <rich@photonstorm.com>
  34996. * @copyright 2018 Photon Storm Ltd.
  34997. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  34998. */
  34999. var Class = __webpack_require__(0);
  35000. /**
  35001. * @classdesc
  35002. * Contains information about a specific Gamepad Axis.
  35003. * Axis objects are created automatically by the Gamepad as they are needed.
  35004. *
  35005. * @class Axis
  35006. * @memberOf Phaser.Input.Gamepad
  35007. * @constructor
  35008. * @since 3.0.0
  35009. *
  35010. * @param {Phaser.Input.Gamepad.Gamepad} pad - A reference to the Gamepad that this Axis belongs to.
  35011. * @param {integer} index - The index of this Axis.
  35012. */
  35013. var Axis = new Class({
  35014. initialize:
  35015. function Axis (pad, index)
  35016. {
  35017. /**
  35018. * A reference to the Gamepad that this Axis belongs to.
  35019. *
  35020. * @name Phaser.Input.Gamepad.Axis#pad
  35021. * @type {Phaser.Input.Gamepad.Gamepad}
  35022. * @since 3.0.0
  35023. */
  35024. this.pad = pad;
  35025. /**
  35026. * An event emitter to use to emit the axis events.
  35027. *
  35028. * @name Phaser.Input.Gamepad.Axis#events
  35029. * @type {Phaser.Events.EventEmitter}
  35030. * @since 3.0.0
  35031. */
  35032. this.events = pad.events;
  35033. /**
  35034. * The index of this Axis.
  35035. *
  35036. * @name Phaser.Input.Gamepad.Axis#index
  35037. * @type {integer}
  35038. * @since 3.0.0
  35039. */
  35040. this.index = index;
  35041. /**
  35042. * The raw axis value, between -1 and 1 with 0 being dead center.
  35043. * Use the method `getValue` to get a normalized value with the threshold applied.
  35044. *
  35045. * @name Phaser.Input.Gamepad.Axis#value
  35046. * @type {number}
  35047. * @default 0
  35048. * @since 3.0.0
  35049. */
  35050. this.value = 0;
  35051. /**
  35052. * Movement tolerance threshold below which axis values are ignored in `getValue`.
  35053. *
  35054. * @name Phaser.Input.Gamepad.Axis#threshold
  35055. * @type {number}
  35056. * @default 0.1
  35057. * @since 3.0.0
  35058. */
  35059. this.threshold = 0.1;
  35060. },
  35061. /**
  35062. * Internal update handler for this Axis.
  35063. * Called automatically by the Gamepad as part of its update.
  35064. *
  35065. * @method Phaser.Input.Gamepad.Axis#update
  35066. * @private
  35067. * @since 3.0.0
  35068. *
  35069. * @param {number} value - The value of the axis movement.
  35070. */
  35071. update: function (value)
  35072. {
  35073. this.value = value;
  35074. },
  35075. /**
  35076. * Applies the `threshold` value to the axis and returns it.
  35077. *
  35078. * @method Phaser.Input.Gamepad.Axis#getValue
  35079. * @since 3.0.0
  35080. *
  35081. * @return {number} The axis value, adjusted for the movement threshold.
  35082. */
  35083. getValue: function ()
  35084. {
  35085. return (Math.abs(this.value) < this.threshold) ? 0 : this.value;
  35086. },
  35087. /**
  35088. * Destroys this Axis instance and releases external references it holds.
  35089. *
  35090. * @method Phaser.Input.Gamepad.Axis#destroy
  35091. * @since 3.10.0
  35092. */
  35093. destroy: function ()
  35094. {
  35095. this.pad = null;
  35096. this.events = null;
  35097. }
  35098. });
  35099. module.exports = Axis;
  35100. /***/ }),
  35101. /* 180 */
  35102. /***/ (function(module, exports) {
  35103. /**
  35104. * @author Richard Davey <rich@photonstorm.com>
  35105. * @copyright 2018 Photon Storm Ltd.
  35106. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35107. */
  35108. /**
  35109. * @callback HitAreaCallback
  35110. *
  35111. * @param {any} hitArea - The hit area object.
  35112. * @param {number} x - The translated x coordinate of the hit test event.
  35113. * @param {number} y - The translated y coordinate of the hit test event.
  35114. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that invoked the hit test.
  35115. *
  35116. * @return {boolean} `true` if the coordinates fall within the space of the hitArea, otherwise `false`.
  35117. */
  35118. /**
  35119. * @typedef {object} Phaser.Input.InteractiveObject
  35120. *
  35121. * @property {Phaser.GameObjects.GameObject} gameObject - The Game Object to which this Interactive Object is bound.
  35122. * @property {boolean} enabled - Is this Interactive Object currently enabled for input events?
  35123. * @property {boolean} draggable - Is this Interactive Object draggable? Enable with `InputPlugin.setDraggable`.
  35124. * @property {boolean} dropZone - Is this Interactive Object a drag-targets drop zone? Set when the object is created.
  35125. * @property {(boolean|string)} cursor - Should this Interactive Object change the cursor (via css) when over? (desktop only)
  35126. * @property {?Phaser.GameObjects.GameObject} target - An optional drop target for a draggable Interactive Object.
  35127. * @property {Phaser.Cameras.Scene2D.Camera} camera - The most recent Camera to be tested against this Interactive Object.
  35128. * @property {any} hitArea - The hit area for this Interactive Object. Typically a geometry shape, like a Rectangle or Circle.
  35129. * @property {HitAreaCallback} hitAreaCallback - The 'contains' check callback that the hit area shape will use for all hit tests.
  35130. * @property {number} localX - The x coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position.
  35131. * @property {number} localY - The y coordinate that the Pointer interacted with this object on, relative to the Game Object's top-left position.
  35132. * @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.
  35133. * @property {number} dragStartX - The x coordinate that the Pointer started dragging this Interactive Object from.
  35134. * @property {number} dragStartY - The y coordinate that the Pointer started dragging this Interactive Object from.
  35135. * @property {number} dragX - The x coordinate that this Interactive Object is currently being dragged to.
  35136. * @property {number} dragY - The y coordinate that this Interactive Object is currently being dragged to.
  35137. */
  35138. /**
  35139. * Creates a new Interactive Object.
  35140. *
  35141. * This is called automatically by the Input Manager when you enable a Game Object for input.
  35142. *
  35143. * The resulting Interactive Object is mapped to the Game Object's `input` property.
  35144. *
  35145. * @function Phaser.Input.CreateInteractiveObject
  35146. * @since 3.0.0
  35147. *
  35148. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to which this Interactive Object is bound.
  35149. * @param {any} hitArea - The hit area for this Interactive Object. Typically a geometry shape, like a Rectangle or Circle.
  35150. * @param {HitAreaCallback} hitAreaCallback - The 'contains' check callback that the hit area shape will use for all hit tests.
  35151. *
  35152. * @return {Phaser.Input.InteractiveObject} The new Interactive Object.
  35153. */
  35154. var CreateInteractiveObject = function (gameObject, hitArea, hitAreaCallback)
  35155. {
  35156. return {
  35157. gameObject: gameObject,
  35158. enabled: true,
  35159. draggable: false,
  35160. dropZone: false,
  35161. cursor: false,
  35162. target: null,
  35163. camera: null,
  35164. hitArea: hitArea,
  35165. hitAreaCallback: hitAreaCallback,
  35166. localX: 0,
  35167. localY: 0,
  35168. // 0 = Not being dragged
  35169. // 1 = Being checked for dragging
  35170. // 2 = Being dragged
  35171. dragState: 0,
  35172. dragStartX: 0,
  35173. dragStartY: 0,
  35174. dragX: 0,
  35175. dragY: 0
  35176. };
  35177. };
  35178. module.exports = CreateInteractiveObject;
  35179. /***/ }),
  35180. /* 181 */
  35181. /***/ (function(module, exports, __webpack_require__) {
  35182. /**
  35183. * @author Richard Davey <rich@photonstorm.com>
  35184. * @copyright 2018 Photon Storm Ltd.
  35185. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35186. */
  35187. var Commands = __webpack_require__(119);
  35188. var GameObject = __webpack_require__(2);
  35189. /**
  35190. * Renders this Game Object with the Canvas Renderer to the given Camera.
  35191. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  35192. * This method should not be called directly. It is a utility function of the Render module.
  35193. *
  35194. * @method Phaser.GameObjects.Graphics#renderCanvas
  35195. * @since 3.0.0
  35196. * @private
  35197. *
  35198. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  35199. * @param {Phaser.GameObjects.Graphics} src - The Game Object being rendered in this call.
  35200. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  35201. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  35202. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  35203. * @param {CanvasRenderingContext2D} [renderTargetCtx] - The target rendering context.
  35204. * @param {boolean} allowClip - [description]
  35205. */
  35206. var GraphicsCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix, renderTargetCtx, allowClip)
  35207. {
  35208. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  35209. {
  35210. return;
  35211. }
  35212. var cameraScrollX = camera.scrollX * src.scrollFactorX;
  35213. var cameraScrollY = camera.scrollY * src.scrollFactorY;
  35214. var srcX = src.x;
  35215. var srcY = src.y;
  35216. var srcScaleX = src.scaleX;
  35217. var srcScaleY = src.scaleY;
  35218. var srcRotation = src.rotation;
  35219. var commandBuffer = src.commandBuffer;
  35220. var ctx = renderTargetCtx || renderer.currentContext;
  35221. var lineAlpha = 1.0;
  35222. var fillAlpha = 1.0;
  35223. var lineColor = 0;
  35224. var fillColor = 0;
  35225. var lineWidth = 1.0;
  35226. var red = 0;
  35227. var green = 0;
  35228. var blue = 0;
  35229. // Alpha
  35230. var alpha = camera.alpha * src.alpha;
  35231. if (alpha === 0)
  35232. {
  35233. // Nothing to see, so abort early
  35234. return;
  35235. }
  35236. else if (renderer.currentAlpha !== alpha)
  35237. {
  35238. renderer.currentAlpha = alpha;
  35239. ctx.globalAlpha = alpha;
  35240. }
  35241. // Blend Mode
  35242. if (renderer.currentBlendMode !== src.blendMode)
  35243. {
  35244. renderer.currentBlendMode = src.blendMode;
  35245. ctx.globalCompositeOperation = renderer.blendModes[src.blendMode];
  35246. }
  35247. // Smoothing
  35248. if (renderer.currentScaleMode !== src.scaleMode)
  35249. {
  35250. renderer.currentScaleMode = src.scaleMode;
  35251. }
  35252. ctx.save();
  35253. if (parentMatrix)
  35254. {
  35255. var matrix = parentMatrix.matrix;
  35256. ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  35257. }
  35258. ctx.translate(srcX - cameraScrollX, srcY - cameraScrollY);
  35259. ctx.rotate(srcRotation);
  35260. ctx.scale(srcScaleX, srcScaleY);
  35261. ctx.fillStyle = '#fff';
  35262. ctx.globalAlpha = src.alpha;
  35263. for (var index = 0, length = commandBuffer.length; index < length; ++index)
  35264. {
  35265. var commandID = commandBuffer[index];
  35266. switch (commandID)
  35267. {
  35268. case Commands.ARC:
  35269. ctx.arc(
  35270. commandBuffer[index + 1],
  35271. commandBuffer[index + 2],
  35272. commandBuffer[index + 3],
  35273. commandBuffer[index + 4],
  35274. commandBuffer[index + 5],
  35275. commandBuffer[index + 6]
  35276. );
  35277. index += 6;
  35278. break;
  35279. case Commands.LINE_STYLE:
  35280. lineWidth = commandBuffer[index + 1];
  35281. lineColor = commandBuffer[index + 2];
  35282. lineAlpha = commandBuffer[index + 3];
  35283. red = ((lineColor & 0xFF0000) >>> 16);
  35284. green = ((lineColor & 0xFF00) >>> 8);
  35285. blue = (lineColor & 0xFF);
  35286. ctx.strokeStyle = 'rgba(' + red + ',' + green + ',' + blue + ',' + lineAlpha + ')';
  35287. ctx.lineWidth = lineWidth;
  35288. index += 3;
  35289. break;
  35290. case Commands.FILL_STYLE:
  35291. fillColor = commandBuffer[index + 1];
  35292. fillAlpha = commandBuffer[index + 2];
  35293. red = ((fillColor & 0xFF0000) >>> 16);
  35294. green = ((fillColor & 0xFF00) >>> 8);
  35295. blue = (fillColor & 0xFF);
  35296. ctx.fillStyle = 'rgba(' + red + ',' + green + ',' + blue + ',' + fillAlpha + ')';
  35297. index += 2;
  35298. break;
  35299. case Commands.BEGIN_PATH:
  35300. ctx.beginPath();
  35301. break;
  35302. case Commands.CLOSE_PATH:
  35303. ctx.closePath();
  35304. break;
  35305. case Commands.FILL_PATH:
  35306. if (!allowClip)
  35307. {
  35308. ctx.fill();
  35309. }
  35310. break;
  35311. case Commands.STROKE_PATH:
  35312. if (!allowClip)
  35313. {
  35314. ctx.stroke();
  35315. }
  35316. break;
  35317. case Commands.FILL_RECT:
  35318. if (!allowClip)
  35319. {
  35320. ctx.fillRect(
  35321. commandBuffer[index + 1],
  35322. commandBuffer[index + 2],
  35323. commandBuffer[index + 3],
  35324. commandBuffer[index + 4]
  35325. );
  35326. }
  35327. else
  35328. {
  35329. ctx.rect(
  35330. commandBuffer[index + 1],
  35331. commandBuffer[index + 2],
  35332. commandBuffer[index + 3],
  35333. commandBuffer[index + 4]
  35334. );
  35335. }
  35336. index += 4;
  35337. break;
  35338. case Commands.FILL_TRIANGLE:
  35339. ctx.beginPath();
  35340. ctx.moveTo(commandBuffer[index + 1], commandBuffer[index + 2]);
  35341. ctx.lineTo(commandBuffer[index + 3], commandBuffer[index + 4]);
  35342. ctx.lineTo(commandBuffer[index + 5], commandBuffer[index + 6]);
  35343. ctx.closePath();
  35344. if (!allowClip)
  35345. {
  35346. ctx.fill();
  35347. }
  35348. index += 6;
  35349. break;
  35350. case Commands.STROKE_TRIANGLE:
  35351. ctx.beginPath();
  35352. ctx.moveTo(commandBuffer[index + 1], commandBuffer[index + 2]);
  35353. ctx.lineTo(commandBuffer[index + 3], commandBuffer[index + 4]);
  35354. ctx.lineTo(commandBuffer[index + 5], commandBuffer[index + 6]);
  35355. ctx.closePath();
  35356. if (!allowClip)
  35357. {
  35358. ctx.stroke();
  35359. }
  35360. index += 6;
  35361. break;
  35362. case Commands.LINE_TO:
  35363. ctx.lineTo(
  35364. commandBuffer[index + 1],
  35365. commandBuffer[index + 2]
  35366. );
  35367. index += 2;
  35368. break;
  35369. case Commands.MOVE_TO:
  35370. ctx.moveTo(
  35371. commandBuffer[index + 1],
  35372. commandBuffer[index + 2]
  35373. );
  35374. index += 2;
  35375. break;
  35376. case Commands.LINE_FX_TO:
  35377. ctx.lineTo(
  35378. commandBuffer[index + 1],
  35379. commandBuffer[index + 2]
  35380. );
  35381. index += 5;
  35382. break;
  35383. case Commands.MOVE_FX_TO:
  35384. ctx.moveTo(
  35385. commandBuffer[index + 1],
  35386. commandBuffer[index + 2]
  35387. );
  35388. index += 5;
  35389. break;
  35390. case Commands.SAVE:
  35391. ctx.save();
  35392. break;
  35393. case Commands.RESTORE:
  35394. ctx.restore();
  35395. break;
  35396. case Commands.TRANSLATE:
  35397. ctx.translate(
  35398. commandBuffer[index + 1],
  35399. commandBuffer[index + 2]
  35400. );
  35401. index += 2;
  35402. break;
  35403. case Commands.SCALE:
  35404. ctx.scale(
  35405. commandBuffer[index + 1],
  35406. commandBuffer[index + 2]
  35407. );
  35408. index += 2;
  35409. break;
  35410. case Commands.ROTATE:
  35411. ctx.rotate(
  35412. commandBuffer[index + 1]
  35413. );
  35414. index += 1;
  35415. break;
  35416. }
  35417. }
  35418. ctx.restore();
  35419. };
  35420. module.exports = GraphicsCanvasRenderer;
  35421. /***/ }),
  35422. /* 182 */
  35423. /***/ (function(module, exports) {
  35424. /**
  35425. * @author Richard Davey <rich@photonstorm.com>
  35426. * @copyright 2018 Photon Storm Ltd.
  35427. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35428. */
  35429. /**
  35430. * Returns the circumference of the given Ellipse.
  35431. *
  35432. * @function Phaser.Geom.Ellipse.Circumference
  35433. * @since 3.0.0
  35434. *
  35435. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get the circumference of.
  35436. *
  35437. * @return {number} The circumference of th Ellipse.
  35438. */
  35439. var Circumference = function (ellipse)
  35440. {
  35441. var rx = ellipse.width / 2;
  35442. var ry = ellipse.height / 2;
  35443. var h = Math.pow((rx - ry), 2) / Math.pow((rx + ry), 2);
  35444. return (Math.PI * (rx + ry)) * (1 + ((3 * h) / (10 + Math.sqrt(4 - (3 * h)))));
  35445. };
  35446. module.exports = Circumference;
  35447. /***/ }),
  35448. /* 183 */
  35449. /***/ (function(module, exports, __webpack_require__) {
  35450. /**
  35451. * @author Richard Davey <rich@photonstorm.com>
  35452. * @copyright 2018 Photon Storm Ltd.
  35453. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35454. */
  35455. var Circumference = __webpack_require__(182);
  35456. var CircumferencePoint = __webpack_require__(113);
  35457. var FromPercent = __webpack_require__(64);
  35458. var MATH_CONST = __webpack_require__(15);
  35459. /**
  35460. * Returns an array of Point objects containing the coordinates of the points around the circumference of the Ellipse,
  35461. * based on the given quantity or stepRate values.
  35462. *
  35463. * @function Phaser.Geom.Ellipse.GetPoints
  35464. * @since 3.0.0
  35465. *
  35466. * @generic {Phaser.Geom.Point[]} O - [out,$return]
  35467. *
  35468. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get the points from.
  35469. * @param {integer} quantity - The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead.
  35470. * @param {number} [stepRate] - Sets the quantity by getting the circumference of the ellipse and dividing it by the stepRate.
  35471. * @param {(array|Phaser.Geom.Point[])} [out] - An array to insert the points in to. If not provided a new array will be created.
  35472. *
  35473. * @return {(array|Phaser.Geom.Point[])} An array of Point objects pertaining to the points around the circumference of the ellipse.
  35474. */
  35475. var GetPoints = function (ellipse, quantity, stepRate, out)
  35476. {
  35477. if (out === undefined) { out = []; }
  35478. // If quantity is a falsey value (false, null, 0, undefined, etc) then we calculate it based on the stepRate instead.
  35479. if (!quantity)
  35480. {
  35481. quantity = Circumference(ellipse) / stepRate;
  35482. }
  35483. for (var i = 0; i < quantity; i++)
  35484. {
  35485. var angle = FromPercent(i / quantity, 0, MATH_CONST.PI2);
  35486. out.push(CircumferencePoint(ellipse, angle));
  35487. }
  35488. return out;
  35489. };
  35490. module.exports = GetPoints;
  35491. /***/ }),
  35492. /* 184 */
  35493. /***/ (function(module, exports, __webpack_require__) {
  35494. /**
  35495. * @author Richard Davey <rich@photonstorm.com>
  35496. * @copyright 2018 Photon Storm Ltd.
  35497. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35498. */
  35499. var CircumferencePoint = __webpack_require__(113);
  35500. var FromPercent = __webpack_require__(64);
  35501. var MATH_CONST = __webpack_require__(15);
  35502. var Point = __webpack_require__(5);
  35503. /**
  35504. * Returns a Point object containing the coordinates of a point on the circumference of the Ellipse
  35505. * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point
  35506. * at 180 degrees around the circle.
  35507. *
  35508. * @function Phaser.Geom.Ellipse.GetPoint
  35509. * @since 3.0.0
  35510. *
  35511. * @generic {Phaser.Geom.Point} O - [out,$return]
  35512. *
  35513. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get the circumference point on.
  35514. * @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.
  35515. * @param {(Phaser.Geom.Point|object)} [out] - An object to store the return values in. If not given a Point object will be created.
  35516. *
  35517. * @return {(Phaser.Geom.Point|object)} A Point, or point-like object, containing the coordinates of the point around the ellipse.
  35518. */
  35519. var GetPoint = function (ellipse, position, out)
  35520. {
  35521. if (out === undefined) { out = new Point(); }
  35522. var angle = FromPercent(position, 0, MATH_CONST.PI2);
  35523. return CircumferencePoint(ellipse, angle, out);
  35524. };
  35525. module.exports = GetPoint;
  35526. /***/ }),
  35527. /* 185 */
  35528. /***/ (function(module, exports) {
  35529. /**
  35530. * @author Richard Davey <rich@photonstorm.com>
  35531. * @copyright 2018 Photon Storm Ltd.
  35532. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35533. */
  35534. // This is from the quickselect npm package: https://www.npmjs.com/package/quickselect
  35535. // Coded by https://www.npmjs.com/~mourner (Vladimir Agafonkin)
  35536. // https://en.wikipedia.org/wiki/Floyd%E2%80%93Rivest_algorithm
  35537. // Floyd-Rivest selection algorithm:
  35538. // Rearrange items so that all items in the [left, k] range are smaller than all items in (k, right];
  35539. // The k-th element will have the (k - left + 1)th smallest value in [left, right]
  35540. /**
  35541. * [description]
  35542. *
  35543. * @function Phaser.Utils.Array.QuickSelect
  35544. * @since 3.0.0
  35545. *
  35546. * @param {array} arr - [description]
  35547. * @param {number} k - [description]
  35548. * @param {number} left - [description]
  35549. * @param {number} right - [description]
  35550. * @param {function} compare - [description]
  35551. */
  35552. var QuickSelect = function (arr, k, left, right, compare)
  35553. {
  35554. left = left || 0;
  35555. right = right || (arr.length - 1);
  35556. compare = compare || defaultCompare;
  35557. while (right > left)
  35558. {
  35559. if (right - left > 600)
  35560. {
  35561. var n = right - left + 1;
  35562. var m = k - left + 1;
  35563. var z = Math.log(n);
  35564. var s = 0.5 * Math.exp(2 * z / 3);
  35565. var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
  35566. var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
  35567. var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
  35568. QuickSelect(arr, k, newLeft, newRight, compare);
  35569. }
  35570. var t = arr[k];
  35571. var i = left;
  35572. var j = right;
  35573. swap(arr, left, k);
  35574. if (compare(arr[right], t) > 0)
  35575. {
  35576. swap(arr, left, right);
  35577. }
  35578. while (i < j)
  35579. {
  35580. swap(arr, i, j);
  35581. i++;
  35582. j--;
  35583. while (compare(arr[i], t) < 0)
  35584. {
  35585. i++;
  35586. }
  35587. while (compare(arr[j], t) > 0)
  35588. {
  35589. j--;
  35590. }
  35591. }
  35592. if (compare(arr[left], t) === 0)
  35593. {
  35594. swap(arr, left, j);
  35595. }
  35596. else
  35597. {
  35598. j++;
  35599. swap(arr, j, right);
  35600. }
  35601. if (j <= k)
  35602. {
  35603. left = j + 1;
  35604. }
  35605. if (k <= j)
  35606. {
  35607. right = j - 1;
  35608. }
  35609. }
  35610. };
  35611. function swap (arr, i, j)
  35612. {
  35613. var tmp = arr[i];
  35614. arr[i] = arr[j];
  35615. arr[j] = tmp;
  35616. }
  35617. function defaultCompare (a, b)
  35618. {
  35619. return a < b ? -1 : a > b ? 1 : 0;
  35620. }
  35621. module.exports = QuickSelect;
  35622. /***/ }),
  35623. /* 186 */
  35624. /***/ (function(module, exports) {
  35625. /**
  35626. * @author Richard Davey <rich@photonstorm.com>
  35627. * @copyright 2018 Photon Storm Ltd.
  35628. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35629. */
  35630. // Transposes the elements of the given matrix (array of arrays).
  35631. // The transpose of a matrix is a new matrix whose rows are the columns of the original.
  35632. /**
  35633. * [description]
  35634. *
  35635. * @function Phaser.Utils.Array.Matrix.TransposeMatrix
  35636. * @since 3.0.0
  35637. *
  35638. * @param {array} array - The array matrix to transpose.
  35639. *
  35640. * @return {array} A new array matrix which is a transposed version of the given array.
  35641. */
  35642. var TransposeMatrix = function (array)
  35643. {
  35644. var sourceRowCount = array.length;
  35645. var sourceColCount = array[0].length;
  35646. var result = new Array(sourceColCount);
  35647. for (var i = 0; i < sourceColCount; i++)
  35648. {
  35649. result[i] = new Array(sourceRowCount);
  35650. for (var j = sourceRowCount - 1; j > -1; j--)
  35651. {
  35652. result[i][j] = array[j][i];
  35653. }
  35654. }
  35655. return result;
  35656. };
  35657. module.exports = TransposeMatrix;
  35658. /***/ }),
  35659. /* 187 */
  35660. /***/ (function(module, exports, __webpack_require__) {
  35661. /**
  35662. * @author Richard Davey <rich@photonstorm.com>
  35663. * @copyright 2018 Photon Storm Ltd.
  35664. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35665. */
  35666. /**
  35667. * @namespace Phaser.Textures.Parsers
  35668. */
  35669. module.exports = {
  35670. AtlasXML: __webpack_require__(484),
  35671. Canvas: __webpack_require__(483),
  35672. Image: __webpack_require__(482),
  35673. JSONArray: __webpack_require__(481),
  35674. JSONHash: __webpack_require__(480),
  35675. SpriteSheet: __webpack_require__(479),
  35676. SpriteSheetFromAtlas: __webpack_require__(478),
  35677. UnityYAML: __webpack_require__(477)
  35678. };
  35679. /***/ }),
  35680. /* 188 */
  35681. /***/ (function(module, exports, __webpack_require__) {
  35682. /**
  35683. * @author Richard Davey <rich@photonstorm.com>
  35684. * @copyright 2018 Photon Storm Ltd.
  35685. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35686. */
  35687. var CanvasPool = __webpack_require__(24);
  35688. var Class = __webpack_require__(0);
  35689. var IsSizePowerOfTwo = __webpack_require__(85);
  35690. var ScaleModes = __webpack_require__(59);
  35691. /**
  35692. * @classdesc
  35693. * A Texture Source is the encapsulation of the actual source data for a Texture.
  35694. * This is typically an Image Element, loaded from the file system or network, or a Canvas Element.
  35695. *
  35696. * A Texture can contain multiple Texture Sources, which only happens when a multi-atlas is loaded.
  35697. *
  35698. * @class TextureSource
  35699. * @memberOf Phaser.Textures
  35700. * @constructor
  35701. * @since 3.0.0
  35702. *
  35703. * @param {Phaser.Textures.Texture} texture - The Texture this TextureSource belongs to.
  35704. * @param {(HTMLImageElement|HTMLCanvasElement)} source - The source image data.
  35705. * @param {integer} [width] - Optional width of the source image. If not given it's derived from the source itself.
  35706. * @param {integer} [height] - Optional height of the source image. If not given it's derived from the source itself.
  35707. */
  35708. var TextureSource = new Class({
  35709. initialize:
  35710. function TextureSource (texture, source, width, height)
  35711. {
  35712. var game = texture.manager.game;
  35713. /**
  35714. * The Texture this TextureSource belongs to.
  35715. *
  35716. * @name Phaser.Textures.TextureSource#renderer
  35717. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  35718. * @since 3.7.0
  35719. */
  35720. this.renderer = game.renderer;
  35721. /**
  35722. * The Texture this TextureSource belongs to.
  35723. *
  35724. * @name Phaser.Textures.TextureSource#texture
  35725. * @type {string}
  35726. * @since 3.0.0
  35727. */
  35728. this.texture = texture;
  35729. /**
  35730. * The source image data. This is either an Image Element, or a Canvas Element.
  35731. *
  35732. * @name Phaser.Textures.TextureSource#image
  35733. * @type {(HTMLImageElement|HTMLCanvasElement)}
  35734. * @since 3.0.0
  35735. */
  35736. this.image = source;
  35737. /**
  35738. * Currently un-used.
  35739. *
  35740. * @name Phaser.Textures.TextureSource#compressionAlgorithm
  35741. * @type {integer}
  35742. * @default null
  35743. * @since 3.0.0
  35744. */
  35745. this.compressionAlgorithm = null;
  35746. /**
  35747. * The resolution of the source image.
  35748. *
  35749. * @name Phaser.Textures.TextureSource#resolution
  35750. * @type {number}
  35751. * @default 1
  35752. * @since 3.0.0
  35753. */
  35754. this.resolution = 1;
  35755. /**
  35756. * The width of the source image. If not specified in the constructor it will check
  35757. * the `naturalWidth` and then `width` properties of the source image.
  35758. *
  35759. * @name Phaser.Textures.TextureSource#width
  35760. * @type {integer}
  35761. * @since 3.0.0
  35762. */
  35763. this.width = width || source.naturalWidth || source.width || 0;
  35764. /**
  35765. * The height of the source image. If not specified in the constructor it will check
  35766. * the `naturalHeight` and then `height` properties of the source image.
  35767. *
  35768. * @name Phaser.Textures.TextureSource#height
  35769. * @type {integer}
  35770. * @since 3.0.0
  35771. */
  35772. this.height = height || source.naturalHeight || source.height || 0;
  35773. /**
  35774. * The Scale Mode the image will use when rendering.
  35775. * Either Linear or Nearest.
  35776. *
  35777. * @name Phaser.Textures.TextureSource#scaleMode
  35778. * @type {number}
  35779. * @since 3.0.0
  35780. */
  35781. this.scaleMode = ScaleModes.DEFAULT;
  35782. /**
  35783. * Is the source image a Canvas Element?
  35784. *
  35785. * @name Phaser.Textures.TextureSource#isCanvas
  35786. * @type {boolean}
  35787. * @since 3.0.0
  35788. */
  35789. this.isCanvas = (source instanceof HTMLCanvasElement);
  35790. /**
  35791. * Are the source image dimensions a power of two?
  35792. *
  35793. * @name Phaser.Textures.TextureSource#isPowerOf2
  35794. * @type {boolean}
  35795. * @since 3.0.0
  35796. */
  35797. this.isPowerOf2 = IsSizePowerOfTwo(this.width, this.height);
  35798. /**
  35799. * The WebGL Texture of the source image.
  35800. *
  35801. * @name Phaser.Textures.TextureSource#glTexture
  35802. * @type {?WebGLTexture}
  35803. * @default null
  35804. * @since 3.0.0
  35805. */
  35806. this.glTexture = null;
  35807. this.init(game);
  35808. },
  35809. /**
  35810. * Creates a WebGL Texture, if required, and sets the Texture filter mode.
  35811. *
  35812. * @method Phaser.Textures.TextureSource#init
  35813. * @since 3.0.0
  35814. *
  35815. * @param {Phaser.Game} game - A reference to the Phaser Game instance.
  35816. */
  35817. init: function (game)
  35818. {
  35819. if (this.renderer && this.renderer.gl)
  35820. {
  35821. if (this.isCanvas)
  35822. {
  35823. this.glTexture = this.renderer.canvasToTexture(this.image);
  35824. }
  35825. else
  35826. {
  35827. this.glTexture = this.renderer.createTextureFromSource(this.image, this.width, this.height, this.scaleMode);
  35828. }
  35829. }
  35830. if (!game.config.antialias)
  35831. {
  35832. this.setFilter(1);
  35833. }
  35834. },
  35835. /**
  35836. * Sets the Filter Mode for this Texture.
  35837. *
  35838. * The mode can be either Linear, the default, or Nearest.
  35839. *
  35840. * For pixel-art you should use Nearest.
  35841. *
  35842. * @method Phaser.Textures.TextureSource#setFilter
  35843. * @since 3.0.0
  35844. *
  35845. * @param {Phaser.Textures.FilterMode} filterMode - The Filter Mode.
  35846. */
  35847. setFilter: function (filterMode)
  35848. {
  35849. if (this.renderer.gl)
  35850. {
  35851. this.renderer.setTextureFilter(this.glTexture, filterMode);
  35852. }
  35853. },
  35854. /**
  35855. * If this TextureSource is backed by a Canvas and is running under WebGL,
  35856. * it updates the WebGLTexture using the canvas data.
  35857. *
  35858. * @method Phaser.Textures.TextureSource#update
  35859. * @since 3.7.0
  35860. */
  35861. update: function ()
  35862. {
  35863. if (this.renderer.gl && this.isCanvas)
  35864. {
  35865. this.renderer.canvasToTexture(this.image, this.glTexture);
  35866. }
  35867. },
  35868. /**
  35869. * Destroys this Texture Source and nulls the references.
  35870. *
  35871. * @method Phaser.Textures.TextureSource#destroy
  35872. * @since 3.0.0
  35873. */
  35874. destroy: function ()
  35875. {
  35876. if (this.glTexture)
  35877. {
  35878. this.renderer.deleteTexture(this.glTexture);
  35879. }
  35880. if (this.isCanvas)
  35881. {
  35882. CanvasPool.remove(this.image);
  35883. }
  35884. this.renderer = null;
  35885. this.texture = null;
  35886. this.image = null;
  35887. }
  35888. });
  35889. module.exports = TextureSource;
  35890. /***/ }),
  35891. /* 189 */
  35892. /***/ (function(module, exports, __webpack_require__) {
  35893. /**
  35894. * @author Richard Davey <rich@photonstorm.com>
  35895. * @copyright 2018 Photon Storm Ltd.
  35896. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  35897. */
  35898. var CanvasPool = __webpack_require__(24);
  35899. var CanvasTexture = __webpack_require__(485);
  35900. var Class = __webpack_require__(0);
  35901. var Color = __webpack_require__(30);
  35902. var CONST = __webpack_require__(22);
  35903. var EventEmitter = __webpack_require__(9);
  35904. var GenerateTexture = __webpack_require__(270);
  35905. var GetValue = __webpack_require__(4);
  35906. var Parser = __webpack_require__(187);
  35907. var Texture = __webpack_require__(117);
  35908. /**
  35909. * @callback EachTextureCallback
  35910. *
  35911. * @param {Phaser.Textures.Texture} texture - [description]
  35912. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  35913. */
  35914. /**
  35915. * @classdesc
  35916. * Textures are managed by the global TextureManager. This is a singleton class that is
  35917. * responsible for creating and delivering Textures and their corresponding Frames to Game Objects.
  35918. *
  35919. * Sprites and other Game Objects get the texture data they need from the TextureManager.
  35920. *
  35921. * Access it via `scene.textures`.
  35922. *
  35923. * @class TextureManager
  35924. * @extends Phaser.Events.EventEmitter
  35925. * @memberOf Phaser.Textures
  35926. * @constructor
  35927. * @since 3.0.0
  35928. *
  35929. * @param {Phaser.Game} game - [description]
  35930. */
  35931. var TextureManager = new Class({
  35932. Extends: EventEmitter,
  35933. initialize:
  35934. function TextureManager (game)
  35935. {
  35936. EventEmitter.call(this);
  35937. /**
  35938. * [description]
  35939. *
  35940. * @name Phaser.Textures.TextureManager#game
  35941. * @type {Phaser.Game}
  35942. * @since 3.0.0
  35943. */
  35944. this.game = game;
  35945. /**
  35946. * [description]
  35947. *
  35948. * @name Phaser.Textures.TextureManager#name
  35949. * @type {string}
  35950. * @since 3.0.0
  35951. */
  35952. this.name = 'TextureManager';
  35953. /**
  35954. * [description]
  35955. *
  35956. * @name Phaser.Textures.TextureManager#list
  35957. * @type {object}
  35958. * @default {}
  35959. * @since 3.0.0
  35960. */
  35961. this.list = {};
  35962. /**
  35963. * [description]
  35964. *
  35965. * @name Phaser.Textures.TextureManager#_tempCanvas
  35966. * @type {HTMLCanvasElement}
  35967. * @private
  35968. * @since 3.0.0
  35969. */
  35970. this._tempCanvas = CanvasPool.create2D(this, 1, 1);
  35971. /**
  35972. * [description]
  35973. *
  35974. * @name Phaser.Textures.TextureManager#_tempContext
  35975. * @type {CanvasRenderingContext2D}
  35976. * @private
  35977. * @since 3.0.0
  35978. */
  35979. this._tempContext = this._tempCanvas.getContext('2d');
  35980. /**
  35981. * [description]
  35982. *
  35983. * @name Phaser.Textures.TextureManager#_pending
  35984. * @type {integer}
  35985. * @private
  35986. * @default 0
  35987. * @since 3.0.0
  35988. */
  35989. this._pending = 0;
  35990. game.events.once('boot', this.boot, this);
  35991. },
  35992. /**
  35993. * [description]
  35994. *
  35995. * @method Phaser.Textures.TextureManager#boot
  35996. * @since 3.0.0
  35997. */
  35998. boot: function ()
  35999. {
  36000. this._pending = 2;
  36001. this.on('onload', this.updatePending, this);
  36002. this.on('onerror', this.updatePending, this);
  36003. this.addBase64('__DEFAULT', this.game.config.defaultImage);
  36004. this.addBase64('__MISSING', this.game.config.missingImage);
  36005. this.game.events.once('destroy', this.destroy, this);
  36006. },
  36007. /**
  36008. * [description]
  36009. *
  36010. * @method Phaser.Textures.TextureManager#updatePending
  36011. * @since 3.0.0
  36012. */
  36013. updatePending: function ()
  36014. {
  36015. this._pending--;
  36016. if (this._pending === 0)
  36017. {
  36018. this.off('onload');
  36019. this.off('onerror');
  36020. this.game.events.emit('ready');
  36021. }
  36022. },
  36023. /**
  36024. * Checks the given texture key and throws a console.warn if the key is already in use, then returns false.
  36025. * If you wish to avoid the console.warn then use `TextureManager.exists` instead.
  36026. *
  36027. * @method Phaser.Textures.TextureManager#checkKey
  36028. * @since 3.7.0
  36029. *
  36030. * @param {string} key - The texture key to check.
  36031. *
  36032. * @return {boolean} `true` if it's safe to use the texture key, otherwise `false`.
  36033. */
  36034. checkKey: function (key)
  36035. {
  36036. if (this.exists(key))
  36037. {
  36038. // eslint-disable-next-line no-console
  36039. console.error('Texture key already in use: ' + key);
  36040. return false;
  36041. }
  36042. return true;
  36043. },
  36044. /**
  36045. * Removes a Texture from the Texture Manager and destroys it. This will immediately
  36046. * clear all references to it from the Texture Manager, and if it has one, destroy its
  36047. * WebGLTexture. This will emit a `removetexture` event.
  36048. *
  36049. * Note: If you have any Game Objects still using this texture they will start throwing
  36050. * errors the next time they try to render. Make sure that removing the texture is the final
  36051. * step when clearing down to avoid this.
  36052. *
  36053. * @method Phaser.Textures.TextureManager#remove
  36054. * @since 3.7.0
  36055. *
  36056. * @param {(string|Phaser.Textures.Texture)} key - The key of the Texture to remove, or a reference to it.
  36057. *
  36058. * @return {Phaser.Textures.TextureManager} The Texture Manager.
  36059. */
  36060. remove: function (key)
  36061. {
  36062. if (typeof key === 'string')
  36063. {
  36064. if (this.exists(key))
  36065. {
  36066. key = this.get(key);
  36067. }
  36068. else
  36069. {
  36070. console.warn('No texture found matching key: ' + key);
  36071. return this;
  36072. }
  36073. }
  36074. // By this point key should be a Texture, if not, the following fails anyway
  36075. if (this.list.hasOwnProperty(key.key))
  36076. {
  36077. delete this.list[key.key];
  36078. key.destroy();
  36079. this.emit('removetexture', key.key);
  36080. }
  36081. return this;
  36082. },
  36083. /**
  36084. * Adds a new Texture to the Texture Manager created from the given Base64 encoded data.
  36085. *
  36086. * @method Phaser.Textures.TextureManager#addBase64
  36087. * @since 3.0.0
  36088. *
  36089. * @param {string} key - The unique string-based key of the Texture.
  36090. * @param {*} data - The Base64 encoded data.
  36091. */
  36092. addBase64: function (key, data)
  36093. {
  36094. if (this.checkKey(key))
  36095. {
  36096. var _this = this;
  36097. var image = new Image();
  36098. image.onerror = function ()
  36099. {
  36100. _this.emit('onerror', key);
  36101. };
  36102. image.onload = function ()
  36103. {
  36104. var texture = _this.create(key, image);
  36105. Parser.Image(texture, 0);
  36106. _this.emit('addtexture', key, texture);
  36107. _this.emit('onload', key, texture);
  36108. };
  36109. image.src = data;
  36110. }
  36111. },
  36112. /**
  36113. * Adds a new Texture to the Texture Manager created from the given Image element.
  36114. *
  36115. * @method Phaser.Textures.TextureManager#addImage
  36116. * @since 3.0.0
  36117. *
  36118. * @param {string} key - The unique string-based key of the Texture.
  36119. * @param {HTMLImageElement} source - The source Image element.
  36120. * @param {HTMLImageElement} [dataSource] - An optional data Image element.
  36121. *
  36122. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  36123. */
  36124. addImage: function (key, source, dataSource)
  36125. {
  36126. var texture = null;
  36127. if (this.checkKey(key))
  36128. {
  36129. texture = this.create(key, source);
  36130. Parser.Image(texture, 0);
  36131. if (dataSource)
  36132. {
  36133. texture.setDataSource(dataSource);
  36134. }
  36135. this.emit('addtexture', key, texture);
  36136. }
  36137. return texture;
  36138. },
  36139. /**
  36140. * Creates a new Texture using the given config values.
  36141. * Generated textures consist of a Canvas element to which the texture data is drawn.
  36142. * See the Phaser.Create function for the more direct way to create textures.
  36143. *
  36144. * @method Phaser.Textures.TextureManager#generate
  36145. * @since 3.0.0
  36146. *
  36147. * @param {string} key - The unique string-based key of the Texture.
  36148. * @param {object} config - [description]
  36149. *
  36150. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  36151. */
  36152. generate: function (key, config)
  36153. {
  36154. if (this.checkKey(key))
  36155. {
  36156. var canvas = CanvasPool.create(this, 1, 1);
  36157. config.canvas = canvas;
  36158. GenerateTexture(config);
  36159. return this.addCanvas(key, canvas);
  36160. }
  36161. else
  36162. {
  36163. return null;
  36164. }
  36165. },
  36166. /**
  36167. * Creates a new Texture using a blank Canvas element of the size given.
  36168. *
  36169. * Canvas elements are automatically pooled and calling this method will
  36170. * extract a free canvas from the CanvasPool, or create one if none are available.
  36171. *
  36172. * @method Phaser.Textures.TextureManager#createCanvas
  36173. * @since 3.0.0
  36174. *
  36175. * @param {string} key - The unique string-based key of the Texture.
  36176. * @param {integer} [width=256]- The width of the Canvas element.
  36177. * @param {integer} [height=256] - The height of the Canvas element.
  36178. *
  36179. * @return {?Phaser.Textures.CanvasTexture} The Canvas Texture that was created, or `null` if the key is already in use.
  36180. */
  36181. createCanvas: function (key, width, height)
  36182. {
  36183. if (width === undefined) { width = 256; }
  36184. if (height === undefined) { height = 256; }
  36185. if (this.checkKey(key))
  36186. {
  36187. var canvas = CanvasPool.create(this, width, height, CONST.CANVAS, true);
  36188. return this.addCanvas(key, canvas);
  36189. }
  36190. return null;
  36191. },
  36192. /**
  36193. * Creates a new Canvas Texture object from an existing Canvas element and adds
  36194. * it to this Texture Manager.
  36195. *
  36196. * @method Phaser.Textures.TextureManager#addCanvas
  36197. * @since 3.0.0
  36198. *
  36199. * @param {string} key - The unique string-based key of the Texture.
  36200. * @param {HTMLCanvasElement} source - The Canvas element to form the base of the new Texture.
  36201. *
  36202. * @return {?Phaser.Textures.CanvasTexture} The Canvas Texture that was created, or `null` if the key is already in use.
  36203. */
  36204. addCanvas: function (key, source)
  36205. {
  36206. var texture = null;
  36207. if (this.checkKey(key))
  36208. {
  36209. texture = new CanvasTexture(this, key, source, source.width, source.height);
  36210. this.list[key] = texture;
  36211. this.emit('addtexture', key, texture);
  36212. }
  36213. return texture;
  36214. },
  36215. /**
  36216. * Adds a new Texture Atlas to this Texture Manager.
  36217. * It can accept either JSON Array or JSON Hash formats, as exported by Texture Packer and similar software.
  36218. *
  36219. * @method Phaser.Textures.TextureManager#addAtlas
  36220. * @since 3.0.0
  36221. *
  36222. * @param {string} key - The unique string-based key of the Texture.
  36223. * @param {HTMLImageElement} source - The source Image element.
  36224. * @param {object} data - The Texture Atlas data.
  36225. * @param {HTMLImageElement} [dataSource] - An optional data Image element.
  36226. *
  36227. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  36228. */
  36229. addAtlas: function (key, source, data, dataSource)
  36230. {
  36231. // New Texture Packer format?
  36232. if (Array.isArray(data.textures) || Array.isArray(data.frames))
  36233. {
  36234. return this.addAtlasJSONArray(key, source, data, dataSource);
  36235. }
  36236. else
  36237. {
  36238. return this.addAtlasJSONHash(key, source, data, dataSource);
  36239. }
  36240. },
  36241. /**
  36242. * Adds a Texture Atlas to this Texture Manager.
  36243. * The frame data of the atlas must be stored in an Array within the JSON.
  36244. * This is known as a JSON Array in software such as Texture Packer.
  36245. *
  36246. * @method Phaser.Textures.TextureManager#addAtlasJSONArray
  36247. * @since 3.0.0
  36248. *
  36249. * @param {string} key - The unique string-based key of the Texture.
  36250. * @param {(HTMLImageElement|HTMLImageElement[])} source - The source Image element/s.
  36251. * @param {(object|object[])} data - The Texture Atlas data/s.
  36252. * @param {HTMLImageElement} [dataSource] - An optional data Image element.
  36253. *
  36254. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  36255. */
  36256. addAtlasJSONArray: function (key, source, data, dataSource)
  36257. {
  36258. var texture = null;
  36259. if (this.checkKey(key))
  36260. {
  36261. texture = this.create(key, source);
  36262. // Multi-Atlas?
  36263. if (Array.isArray(data))
  36264. {
  36265. var singleAtlasFile = (data.length === 1); // multi-pack with one atlas file for all images
  36266. // !! Assumes the textures are in the same order in the source array as in the json data !!
  36267. for (var i = 0; i < texture.source.length; i++)
  36268. {
  36269. var atlasData = singleAtlasFile ? data[0] : data[i];
  36270. Parser.JSONArray(texture, i, atlasData);
  36271. }
  36272. }
  36273. else
  36274. {
  36275. Parser.JSONArray(texture, 0, data);
  36276. }
  36277. if (dataSource)
  36278. {
  36279. texture.setDataSource(dataSource);
  36280. }
  36281. this.emit('addtexture', key, texture);
  36282. }
  36283. return texture;
  36284. },
  36285. /**
  36286. * Adds a Texture Atlas to this Texture Manager.
  36287. * The frame data of the atlas must be stored in an Object within the JSON.
  36288. * This is known as a JSON Hash in software such as Texture Packer.
  36289. *
  36290. * @method Phaser.Textures.TextureManager#addAtlasJSONHash
  36291. * @since 3.0.0
  36292. *
  36293. * @param {string} key - The unique string-based key of the Texture.
  36294. * @param {HTMLImageElement} source - The source Image element.
  36295. * @param {object} data - The Texture Atlas data.
  36296. * @param {HTMLImageElement} [dataSource] - An optional data Image element.
  36297. *
  36298. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  36299. */
  36300. addAtlasJSONHash: function (key, source, data, dataSource)
  36301. {
  36302. var texture = null;
  36303. if (this.checkKey(key))
  36304. {
  36305. texture = this.create(key, source);
  36306. if (Array.isArray(data))
  36307. {
  36308. for (var i = 0; i < data.length; i++)
  36309. {
  36310. Parser.JSONHash(texture, i, data[i]);
  36311. }
  36312. }
  36313. else
  36314. {
  36315. Parser.JSONHash(texture, 0, data);
  36316. }
  36317. if (dataSource)
  36318. {
  36319. texture.setDataSource(dataSource);
  36320. }
  36321. this.emit('addtexture', key, texture);
  36322. }
  36323. return texture;
  36324. },
  36325. /**
  36326. * Adds a Texture Atlas to this Texture Manager, where the atlas data is given
  36327. * in the XML format.
  36328. *
  36329. * @method Phaser.Textures.TextureManager#addAtlasXML
  36330. * @since 3.7.0
  36331. *
  36332. * @param {string} key - The unique string-based key of the Texture.
  36333. * @param {HTMLImageElement} source - The source Image element.
  36334. * @param {object} data - The Texture Atlas XML data.
  36335. * @param {HTMLImageElement} [dataSource] - An optional data Image element.
  36336. *
  36337. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  36338. */
  36339. addAtlasXML: function (key, source, data, dataSource)
  36340. {
  36341. var texture = null;
  36342. if (this.checkKey(key))
  36343. {
  36344. texture = this.create(key, source);
  36345. Parser.AtlasXML(texture, 0, data);
  36346. if (dataSource)
  36347. {
  36348. texture.setDataSource(dataSource);
  36349. }
  36350. this.emit('addtexture', key, texture);
  36351. }
  36352. return texture;
  36353. },
  36354. /**
  36355. * Adds a Unity Texture Atlas to this Texture Manager.
  36356. * The data must be in the form of a Unity YAML file.
  36357. *
  36358. * @method Phaser.Textures.TextureManager#addUnityAtlas
  36359. * @since 3.0.0
  36360. *
  36361. * @param {string} key - The unique string-based key of the Texture.
  36362. * @param {HTMLImageElement} source - The source Image element.
  36363. * @param {object} data - The Texture Atlas data.
  36364. * @param {HTMLImageElement} [dataSource] - An optional data Image element.
  36365. *
  36366. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  36367. */
  36368. addUnityAtlas: function (key, source, data, dataSource)
  36369. {
  36370. var texture = null;
  36371. if (this.checkKey(key))
  36372. {
  36373. texture = this.create(key, source);
  36374. Parser.UnityYAML(texture, 0, data);
  36375. if (dataSource)
  36376. {
  36377. texture.setDataSource(dataSource);
  36378. }
  36379. this.emit('addtexture', key, texture);
  36380. }
  36381. return texture;
  36382. },
  36383. /**
  36384. * @typedef {object} SpriteSheetConfig
  36385. *
  36386. * @property {integer} frameWidth - The fixed width of each frame.
  36387. * @property {integer} [frameHeight] - The fixed height of each frame. If not set it will use the frameWidth as the height.
  36388. * @property {integer} [startFrame=0] - Skip a number of frames. Useful when there are multiple sprite sheets in one Texture.
  36389. * @property {integer} [endFrame=-1] - The total number of frames to extract from the Sprite Sheet. The default value of -1 means "extract all frames".
  36390. * @property {integer} [margin=0] - If the frames have been drawn with a margin, specify the amount here.
  36391. * @property {integer} [spacing=0] - If the frames have been drawn with spacing between them, specify the amount here.
  36392. */
  36393. /**
  36394. * Adds a Sprite Sheet to this Texture Manager.
  36395. *
  36396. * In Phaser terminology a Sprite Sheet is a texture containing different frames, but each frame is the exact
  36397. * same size and cannot be trimmed or rotated.
  36398. *
  36399. * @method Phaser.Textures.TextureManager#addSpriteSheet
  36400. * @since 3.0.0
  36401. *
  36402. * @param {string} key - The unique string-based key of the Texture.
  36403. * @param {HTMLImageElement} source - The source Image element.
  36404. * @param {SpriteSheetConfig} config - The configuration object for this Sprite Sheet.
  36405. *
  36406. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  36407. */
  36408. addSpriteSheet: function (key, source, config)
  36409. {
  36410. var texture = null;
  36411. if (this.checkKey(key))
  36412. {
  36413. texture = this.create(key, source);
  36414. var width = texture.source[0].width;
  36415. var height = texture.source[0].height;
  36416. Parser.SpriteSheet(texture, 0, 0, 0, width, height, config);
  36417. this.emit('addtexture', key, texture);
  36418. }
  36419. return texture;
  36420. },
  36421. /**
  36422. * @typedef {object} SpriteSheetFromAtlasConfig
  36423. *
  36424. * @property {string} atlas - The key of the Texture Atlas in which this Sprite Sheet can be found.
  36425. * @property {string} frame - The key of the Texture Atlas Frame in which this Sprite Sheet can be found.
  36426. * @property {integer} frameWidth - The fixed width of each frame.
  36427. * @property {integer} [frameHeight] - The fixed height of each frame. If not set it will use the frameWidth as the height.
  36428. * @property {integer} [startFrame=0] - Skip a number of frames. Useful when there are multiple sprite sheets in one Texture.
  36429. * @property {integer} [endFrame=-1] - The total number of frames to extract from the Sprite Sheet. The default value of -1 means "extract all frames".
  36430. * @property {integer} [margin=0] - If the frames have been drawn with a margin, specify the amount here.
  36431. * @property {integer} [spacing=0] - If the frames have been drawn with spacing between them, specify the amount here.
  36432. */
  36433. /**
  36434. * Adds a Sprite Sheet to this Texture Manager, where the Sprite Sheet exists as a Frame within a Texture Atlas.
  36435. *
  36436. * In Phaser terminology a Sprite Sheet is a texture containing different frames, but each frame is the exact
  36437. * same size and cannot be trimmed or rotated.
  36438. *
  36439. * @method Phaser.Textures.TextureManager#addSpriteSheetFromAtlas
  36440. * @since 3.0.0
  36441. *
  36442. * @param {string} key - The unique string-based key of the Texture.
  36443. * @param {SpriteSheetFromAtlasConfig} config - The configuration object for this Sprite Sheet.
  36444. *
  36445. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  36446. */
  36447. addSpriteSheetFromAtlas: function (key, config)
  36448. {
  36449. if (!this.checkKey(key))
  36450. {
  36451. return null;
  36452. }
  36453. var atlasKey = GetValue(config, 'atlas', null);
  36454. var atlasFrame = GetValue(config, 'frame', null);
  36455. if (!atlasKey || !atlasFrame)
  36456. {
  36457. return;
  36458. }
  36459. var atlas = this.get(atlasKey);
  36460. var sheet = atlas.get(atlasFrame);
  36461. if (sheet)
  36462. {
  36463. var texture = this.create(key, sheet.source.image);
  36464. if (sheet.trimmed)
  36465. {
  36466. // If trimmed we need to help the parser adjust
  36467. Parser.SpriteSheetFromAtlas(texture, sheet, config);
  36468. }
  36469. else
  36470. {
  36471. Parser.SpriteSheet(texture, 0, sheet.cutX, sheet.cutY, sheet.cutWidth, sheet.cutHeight, config);
  36472. }
  36473. this.emit('addtexture', key, texture);
  36474. return texture;
  36475. }
  36476. },
  36477. /**
  36478. * Creates a new Texture using the given source and dimensions.
  36479. *
  36480. * @method Phaser.Textures.TextureManager#create
  36481. * @since 3.0.0
  36482. *
  36483. * @param {string} key - The unique string-based key of the Texture.
  36484. * @param {HTMLImageElement} source - The source Image element.
  36485. * @param {integer} width - The width of the Texture.
  36486. * @param {integer} height - The height of the Texture.
  36487. *
  36488. * @return {?Phaser.Textures.Texture} The Texture that was created, or `null` if the key is already in use.
  36489. */
  36490. create: function (key, source, width, height)
  36491. {
  36492. var texture = null;
  36493. if (this.checkKey(key))
  36494. {
  36495. texture = new Texture(this, key, source, width, height);
  36496. this.list[key] = texture;
  36497. }
  36498. return texture;
  36499. },
  36500. /**
  36501. * Checks the given key to see if a Texture using it exists within this Texture Manager.
  36502. *
  36503. * @method Phaser.Textures.TextureManager#exists
  36504. * @since 3.0.0
  36505. *
  36506. * @param {string} key - The unique string-based key of the Texture.
  36507. *
  36508. * @return {boolean} Returns `true` if a Texture matching the given key exists in this Texture Manager.
  36509. */
  36510. exists: function (key)
  36511. {
  36512. return (this.list.hasOwnProperty(key));
  36513. },
  36514. /**
  36515. * Returns a Texture from the Texture Manager that matches the given key.
  36516. * If the key is undefined it will return the `__DEFAULT` Texture.
  36517. * If the key is given, but not found, it will return the `__MISSING` Texture.
  36518. *
  36519. * @method Phaser.Textures.TextureManager#get
  36520. * @since 3.0.0
  36521. *
  36522. * @param {string} key - The unique string-based key of the Texture.
  36523. *
  36524. * @return {Phaser.Textures.Texture} The Texture that was created.
  36525. */
  36526. get: function (key)
  36527. {
  36528. if (key === undefined) { key = '__DEFAULT'; }
  36529. if (this.list[key])
  36530. {
  36531. return this.list[key];
  36532. }
  36533. else
  36534. {
  36535. return this.list['__MISSING'];
  36536. }
  36537. },
  36538. /**
  36539. * Takes a Texture key and Frame name and returns a clone of that Frame if found.
  36540. *
  36541. * @method Phaser.Textures.TextureManager#cloneFrame
  36542. * @since 3.0.0
  36543. *
  36544. * @param {string} key - The unique string-based key of the Texture.
  36545. * @param {(string|integer)} frame - The string or index of the Frame to be cloned.
  36546. *
  36547. * @return {Phaser.Textures.Frame} A Clone of the given Frame.
  36548. */
  36549. cloneFrame: function (key, frame)
  36550. {
  36551. if (this.list[key])
  36552. {
  36553. return this.list[key].get(frame).clone();
  36554. }
  36555. },
  36556. /**
  36557. * Takes a Texture key and Frame name and returns a reference to that Frame, if found.
  36558. *
  36559. * @method Phaser.Textures.TextureManager#getFrame
  36560. * @since 3.0.0
  36561. *
  36562. * @param {string} key - The unique string-based key of the Texture.
  36563. * @param {(string|integer)} [frame] - The string-based name, or integer based index, of the Frame to get from the Texture.
  36564. *
  36565. * @return {Phaser.Textures.Frame} A Texture Frame object.
  36566. */
  36567. getFrame: function (key, frame)
  36568. {
  36569. if (this.list[key])
  36570. {
  36571. return this.list[key].get(frame);
  36572. }
  36573. },
  36574. /**
  36575. * Returns an array with all of the keys of all Textures in this Texture Manager.
  36576. * The output array will exclude the `__DEFAULT` and `__MISSING` keys.
  36577. *
  36578. * @method Phaser.Textures.TextureManager#getTextureKeys
  36579. * @since 3.0.0
  36580. *
  36581. * @return {string[]} An array containing all of the Texture keys stored in this Texture Manager.
  36582. */
  36583. getTextureKeys: function ()
  36584. {
  36585. var output = [];
  36586. for (var key in this.list)
  36587. {
  36588. if (key !== '__DEFAULT' && key !== '__MISSING')
  36589. {
  36590. output.push(key);
  36591. }
  36592. }
  36593. return output;
  36594. },
  36595. /**
  36596. * Given a Texture and an `x` and `y` coordinate this method will return a new
  36597. * Color object that has been populated with the color and alpha values of the pixel
  36598. * at that location in the Texture.
  36599. *
  36600. * @method Phaser.Textures.TextureManager#getPixel
  36601. * @since 3.0.0
  36602. *
  36603. * @param {integer} x - The x coordinate of the pixel within the Texture.
  36604. * @param {integer} y - The y coordinate of the pixel within the Texture.
  36605. * @param {string} key - The unique string-based key of the Texture.
  36606. * @param {(string|integer)} frame - The string or index of the Frame.
  36607. *
  36608. * @return {?Phaser.Display.Color} A Color object populated with the color values of the requested pixel,
  36609. * or `null` if the coordinates were out of bounds.
  36610. */
  36611. getPixel: function (x, y, key, frame)
  36612. {
  36613. var textureFrame = this.getFrame(key, frame);
  36614. if (textureFrame)
  36615. {
  36616. var source = textureFrame.source.image;
  36617. if (x >= 0 && x <= source.width && y >= 0 && y <= source.height)
  36618. {
  36619. x += textureFrame.cutX;
  36620. y += textureFrame.cutY;
  36621. // if (textureFrame.trimmed)
  36622. // {
  36623. // x -= this.sprite.texture.trim.x;
  36624. // y -= this.sprite.texture.trim.y;
  36625. // }
  36626. var context = this._tempContext;
  36627. context.clearRect(0, 0, 1, 1);
  36628. context.drawImage(source, x, y, 1, 1, 0, 0, 1, 1);
  36629. var rgb = context.getImageData(0, 0, 1, 1);
  36630. return new Color(rgb.data[0], rgb.data[1], rgb.data[2], rgb.data[3]);
  36631. }
  36632. }
  36633. return null;
  36634. },
  36635. /**
  36636. * Given a Texture and an `x` and `y` coordinate this method will return a value between 0 and 255
  36637. * corresponding to the alpha value of the pixel at that location in the Texture. If the coordinate
  36638. * is out of bounds it will return null.
  36639. *
  36640. * @method Phaser.Textures.TextureManager#getPixelAlpha
  36641. * @since 3.10.0
  36642. *
  36643. * @param {integer} x - The x coordinate of the pixel within the Texture.
  36644. * @param {integer} y - The y coordinate of the pixel within the Texture.
  36645. * @param {string} key - The unique string-based key of the Texture.
  36646. * @param {(string|integer)} frame - The string or index of the Frame.
  36647. *
  36648. * @return {integer} A value between 0 and 255, or `null` if the coordinates were out of bounds.
  36649. */
  36650. getPixelAlpha: function (x, y, key, frame)
  36651. {
  36652. var textureFrame = this.getFrame(key, frame);
  36653. if (textureFrame)
  36654. {
  36655. var source = textureFrame.source.image;
  36656. if (x >= 0 && x <= source.width && y >= 0 && y <= source.height)
  36657. {
  36658. x += textureFrame.cutX;
  36659. y += textureFrame.cutY;
  36660. var context = this._tempContext;
  36661. context.clearRect(0, 0, 1, 1);
  36662. context.drawImage(source, x, y, 1, 1, 0, 0, 1, 1);
  36663. var rgb = context.getImageData(0, 0, 1, 1);
  36664. return rgb.data[3];
  36665. }
  36666. }
  36667. return null;
  36668. },
  36669. /**
  36670. * Sets the given Game Objects `texture` and `frame` properties so that it uses
  36671. * the Texture and Frame specified in the `key` and `frame` arguments to this method.
  36672. *
  36673. * @method Phaser.Textures.TextureManager#setTexture
  36674. * @since 3.0.0
  36675. *
  36676. * @param {Phaser.GameObjects.GameObject} gameObject - [description]
  36677. * @param {string} key - The unique string-based key of the Texture.
  36678. * @param {(string|integer)} frame - The string or index of the Frame.
  36679. *
  36680. * @return {Phaser.GameObjects.GameObject} The Game Object the texture was set on.
  36681. */
  36682. setTexture: function (gameObject, key, frame)
  36683. {
  36684. if (this.list[key])
  36685. {
  36686. gameObject.texture = this.list[key];
  36687. gameObject.frame = gameObject.texture.get(frame);
  36688. }
  36689. return gameObject;
  36690. },
  36691. /**
  36692. * Passes all Textures to the given callback.
  36693. *
  36694. * @method Phaser.Textures.TextureManager#each
  36695. * @since 3.0.0
  36696. *
  36697. * @param {EachTextureCallback} callback - The callback function to be sent the Textures.
  36698. * @param {object} scope - The value to use as `this` when executing the callback.
  36699. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  36700. */
  36701. each: function (callback, scope)
  36702. {
  36703. var args = [ null ];
  36704. for (var i = 1; i < arguments.length; i++)
  36705. {
  36706. args.push(arguments[i]);
  36707. }
  36708. for (var texture in this.list)
  36709. {
  36710. args[0] = this.list[texture];
  36711. callback.apply(scope, args);
  36712. }
  36713. },
  36714. /**
  36715. * Destroys the Texture Manager and all Textures stored within it.
  36716. *
  36717. * @method Phaser.Textures.TextureManager#destroy
  36718. * @since 3.0.0
  36719. */
  36720. destroy: function ()
  36721. {
  36722. for (var texture in this.list)
  36723. {
  36724. this.list[texture].destroy();
  36725. }
  36726. this.list = {};
  36727. this.game = null;
  36728. CanvasPool.remove(this._tempCanvas);
  36729. }
  36730. });
  36731. module.exports = TextureManager;
  36732. /***/ }),
  36733. /* 190 */
  36734. /***/ (function(module, exports, __webpack_require__) {
  36735. /**
  36736. * @author Richard Davey <rich@photonstorm.com>
  36737. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  36738. * @copyright 2018 Photon Storm Ltd.
  36739. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  36740. */
  36741. var BaseSound = __webpack_require__(77);
  36742. var Class = __webpack_require__(0);
  36743. /**
  36744. * @classdesc
  36745. * Web Audio API implementation of the sound.
  36746. *
  36747. * @class WebAudioSound
  36748. * @extends Phaser.Sound.BaseSound
  36749. * @memberOf Phaser.Sound
  36750. * @constructor
  36751. * @since 3.0.0
  36752. *
  36753. * @param {Phaser.Sound.WebAudioSoundManager} manager - Reference to the current sound manager instance.
  36754. * @param {string} key - Asset key for the sound.
  36755. * @param {SoundConfig} [config={}] - An optional config object containing default sound settings.
  36756. */
  36757. var WebAudioSound = new Class({
  36758. Extends: BaseSound,
  36759. initialize:
  36760. function WebAudioSound (manager, key, config)
  36761. {
  36762. if (config === undefined) { config = {}; }
  36763. /**
  36764. * Audio buffer containing decoded data of the audio asset to be played.
  36765. *
  36766. * @name Phaser.Sound.WebAudioSound#audioBuffer
  36767. * @type {AudioBuffer}
  36768. * @private
  36769. * @since 3.0.0
  36770. */
  36771. this.audioBuffer = manager.game.cache.audio.get(key);
  36772. if (!this.audioBuffer)
  36773. {
  36774. // eslint-disable-next-line no-console
  36775. console.warn('Audio cache entry missing: ' + key);
  36776. return;
  36777. }
  36778. /**
  36779. * A reference to an audio source node used for playing back audio from
  36780. * audio data stored in Phaser.Sound.WebAudioSound#audioBuffer.
  36781. *
  36782. * @name Phaser.Sound.WebAudioSound#source
  36783. * @type {AudioBufferSourceNode}
  36784. * @private
  36785. * @default null
  36786. * @since 3.0.0
  36787. */
  36788. this.source = null;
  36789. /**
  36790. * A reference to a second audio source used for gapless looped playback.
  36791. *
  36792. * @name Phaser.Sound.WebAudioSound#loopSource
  36793. * @type {AudioBufferSourceNode}
  36794. * @private
  36795. * @default null
  36796. * @since 3.0.0
  36797. */
  36798. this.loopSource = null;
  36799. /**
  36800. * Gain node responsible for controlling this sound's muting.
  36801. *
  36802. * @name Phaser.Sound.WebAudioSound#muteNode
  36803. * @type {GainNode}
  36804. * @private
  36805. * @since 3.0.0
  36806. */
  36807. this.muteNode = manager.context.createGain();
  36808. /**
  36809. * Gain node responsible for controlling this sound's volume.
  36810. *
  36811. * @name Phaser.Sound.WebAudioSound#volumeNode
  36812. * @type {GainNode}
  36813. * @private
  36814. * @since 3.0.0
  36815. */
  36816. this.volumeNode = manager.context.createGain();
  36817. /**
  36818. * The time at which the sound should have started playback from the beginning.
  36819. * Based on BaseAudioContext.currentTime value.
  36820. *
  36821. * @name Phaser.Sound.WebAudioSound#playTime
  36822. * @type {number}
  36823. * @private
  36824. * @default 0
  36825. * @since 3.0.0
  36826. */
  36827. this.playTime = 0;
  36828. /**
  36829. * The time at which the sound source should have actually started playback.
  36830. * Based on BaseAudioContext.currentTime value.
  36831. *
  36832. * @name Phaser.Sound.WebAudioSound#startTime
  36833. * @type {number}
  36834. * @private
  36835. * @default 0
  36836. * @since 3.0.0
  36837. */
  36838. this.startTime = 0;
  36839. /**
  36840. * The time at which the sound loop source should actually start playback.
  36841. * Based on BaseAudioContext.currentTime value.
  36842. *
  36843. * @name Phaser.Sound.WebAudioSound#loopTime
  36844. * @type {number}
  36845. * @private
  36846. * @default 0
  36847. * @since 3.0.0
  36848. */
  36849. this.loopTime = 0;
  36850. /**
  36851. * An array where we keep track of all rate updates during playback.
  36852. * Array of object types: { time: number, rate: number }
  36853. *
  36854. * @name Phaser.Sound.WebAudioSound#rateUpdates
  36855. * @type {array}
  36856. * @private
  36857. * @default []
  36858. * @since 3.0.0
  36859. */
  36860. this.rateUpdates = [];
  36861. /**
  36862. * Used for keeping track when sound source playback has ended
  36863. * so its state can be updated accordingly.
  36864. *
  36865. * @name Phaser.Sound.WebAudioSound#hasEnded
  36866. * @type {boolean}
  36867. * @private
  36868. * @default false
  36869. * @since 3.0.0
  36870. */
  36871. this.hasEnded = false;
  36872. /**
  36873. * Used for keeping track when sound source has looped
  36874. * so its state can be updated accordingly.
  36875. *
  36876. * @name Phaser.Sound.WebAudioSound#hasLooped
  36877. * @type {boolean}
  36878. * @private
  36879. * @default false
  36880. * @since 3.0.0
  36881. */
  36882. this.hasLooped = false;
  36883. this.muteNode.connect(this.volumeNode);
  36884. this.volumeNode.connect(manager.destination);
  36885. this.duration = this.audioBuffer.duration;
  36886. this.totalDuration = this.audioBuffer.duration;
  36887. BaseSound.call(this, manager, key, config);
  36888. },
  36889. /**
  36890. * @event Phaser.Sound.WebAudioSound#playEvent
  36891. * @param {Phaser.Sound.WebAudioSound} sound - Reference to the Sound that emitted event.
  36892. */
  36893. /**
  36894. * Play this sound, or a marked section of it.
  36895. *
  36896. * It always plays the sound from the start. If you want to start playback from a specific time
  36897. * you can set 'seek' setting of the config object, provided to this call, to that value.
  36898. *
  36899. * @method Phaser.Sound.WebAudioSound#play
  36900. * @fires Phaser.Sound.WebAudioSound#playEvent
  36901. * @since 3.0.0
  36902. *
  36903. * @param {string} [markerName=''] - If you want to play a marker then provide the marker name here, otherwise omit it to play the full sound.
  36904. * @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.
  36905. *
  36906. * @return {boolean} Whether the sound started playing successfully.
  36907. */
  36908. play: function (markerName, config)
  36909. {
  36910. if (!BaseSound.prototype.play.call(this, markerName, config))
  36911. {
  36912. return false;
  36913. }
  36914. // \/\/\/ isPlaying = true, isPaused = false \/\/\/
  36915. this.stopAndRemoveBufferSource();
  36916. this.createAndStartBufferSource();
  36917. this.emit('play', this);
  36918. return true;
  36919. },
  36920. /**
  36921. * @event Phaser.Sound.WebAudioSound#pauseEvent
  36922. * @param {Phaser.Sound.WebAudioSound} sound - Reference to the Sound that emitted event.
  36923. */
  36924. /**
  36925. * Pauses the sound.
  36926. *
  36927. * @method Phaser.Sound.WebAudioSound#pause
  36928. * @fires Phaser.Sound.WebAudioSound#pauseEvent
  36929. * @since 3.0.0
  36930. *
  36931. * @return {boolean} Whether the sound was paused successfully.
  36932. */
  36933. pause: function ()
  36934. {
  36935. if (this.manager.context.currentTime < this.startTime)
  36936. {
  36937. return false;
  36938. }
  36939. if (!BaseSound.prototype.pause.call(this))
  36940. {
  36941. return false;
  36942. }
  36943. // \/\/\/ isPlaying = false, isPaused = true \/\/\/
  36944. this.currentConfig.seek = this.getCurrentTime(); // Equivalent to setting paused time
  36945. this.stopAndRemoveBufferSource();
  36946. this.emit('pause', this);
  36947. return true;
  36948. },
  36949. /**
  36950. * @event Phaser.Sound.WebAudioSound#resumeEvent
  36951. * @param {Phaser.Sound.WebAudioSound} sound - Reference to the Sound that emitted event.
  36952. */
  36953. /**
  36954. * Resumes the sound.
  36955. *
  36956. * @method Phaser.Sound.WebAudioSound#resume
  36957. * @fires Phaser.Sound.WebAudioSound#resumeEvent
  36958. * @since 3.0.0
  36959. *
  36960. * @return {boolean} Whether the sound was resumed successfully.
  36961. */
  36962. resume: function ()
  36963. {
  36964. if (this.manager.context.currentTime < this.startTime)
  36965. {
  36966. return false;
  36967. }
  36968. if (!BaseSound.prototype.resume.call(this))
  36969. {
  36970. return false;
  36971. }
  36972. // \/\/\/ isPlaying = true, isPaused = false \/\/\/
  36973. this.createAndStartBufferSource();
  36974. this.emit('resume', this);
  36975. return true;
  36976. },
  36977. /**
  36978. * @event Phaser.Sound.WebAudioSound#stopEvent
  36979. * @param {Phaser.Sound.WebAudioSound} sound - Reference to the Sound that emitted event.
  36980. */
  36981. /**
  36982. * Stop playing this sound.
  36983. *
  36984. * @method Phaser.Sound.WebAudioSound#stop
  36985. * @fires Phaser.Sound.WebAudioSound#stopEvent
  36986. * @since 3.0.0
  36987. *
  36988. * @return {boolean} Whether the sound was stopped successfully.
  36989. */
  36990. stop: function ()
  36991. {
  36992. if (!BaseSound.prototype.stop.call(this))
  36993. {
  36994. return false;
  36995. }
  36996. // \/\/\/ isPlaying = false, isPaused = false \/\/\/
  36997. this.stopAndRemoveBufferSource();
  36998. this.emit('stop', this);
  36999. return true;
  37000. },
  37001. /**
  37002. * Used internally.
  37003. *
  37004. * @method Phaser.Sound.WebAudioSound#createAndStartBufferSource
  37005. * @private
  37006. * @since 3.0.0
  37007. */
  37008. createAndStartBufferSource: function ()
  37009. {
  37010. var seek = this.currentConfig.seek;
  37011. var delay = this.currentConfig.delay;
  37012. var when = this.manager.context.currentTime + delay;
  37013. var offset = (this.currentMarker ? this.currentMarker.start : 0) + seek;
  37014. var duration = this.duration - seek;
  37015. this.playTime = when - seek;
  37016. this.startTime = when;
  37017. this.source = this.createBufferSource();
  37018. this.applyConfig();
  37019. this.source.start(Math.max(0, when), Math.max(0, offset), Math.max(0, duration));
  37020. this.resetConfig();
  37021. },
  37022. /**
  37023. * Used internally.
  37024. *
  37025. * @method Phaser.Sound.WebAudioSound#createAndStartLoopBufferSource
  37026. * @private
  37027. * @since 3.0.0
  37028. */
  37029. createAndStartLoopBufferSource: function ()
  37030. {
  37031. var when = this.getLoopTime();
  37032. var offset = this.currentMarker ? this.currentMarker.start : 0;
  37033. var duration = this.duration;
  37034. this.loopTime = when;
  37035. this.loopSource = this.createBufferSource();
  37036. this.loopSource.playbackRate.setValueAtTime(this.totalRate, 0);
  37037. this.loopSource.start(Math.max(0, when), Math.max(0, offset), Math.max(0, duration));
  37038. },
  37039. /**
  37040. * Used internally.
  37041. *
  37042. * @method Phaser.Sound.WebAudioSound#createBufferSource
  37043. * @private
  37044. * @since 3.0.0
  37045. *
  37046. * @return {AudioBufferSourceNode}
  37047. */
  37048. createBufferSource: function ()
  37049. {
  37050. var _this = this;
  37051. var source = this.manager.context.createBufferSource();
  37052. source.buffer = this.audioBuffer;
  37053. source.connect(this.muteNode);
  37054. source.onended = function (ev)
  37055. {
  37056. if (ev.target === _this.source)
  37057. {
  37058. // sound ended
  37059. if (_this.currentConfig.loop)
  37060. {
  37061. _this.hasLooped = true;
  37062. }
  37063. else
  37064. {
  37065. _this.hasEnded = true;
  37066. }
  37067. }
  37068. // else was stopped
  37069. };
  37070. return source;
  37071. },
  37072. /**
  37073. * Used internally.
  37074. *
  37075. * @method Phaser.Sound.WebAudioSound#stopAndRemoveBufferSource
  37076. * @private
  37077. * @since 3.0.0
  37078. */
  37079. stopAndRemoveBufferSource: function ()
  37080. {
  37081. if (this.source)
  37082. {
  37083. this.source.stop();
  37084. this.source.disconnect();
  37085. this.source = null;
  37086. }
  37087. this.playTime = 0;
  37088. this.startTime = 0;
  37089. this.stopAndRemoveLoopBufferSource();
  37090. },
  37091. /**
  37092. * Used internally.
  37093. *
  37094. * @method Phaser.Sound.WebAudioSound#stopAndRemoveLoopBufferSource
  37095. * @private
  37096. * @since 3.0.0
  37097. */
  37098. stopAndRemoveLoopBufferSource: function ()
  37099. {
  37100. if (this.loopSource)
  37101. {
  37102. this.loopSource.stop();
  37103. this.loopSource.disconnect();
  37104. this.loopSource = null;
  37105. }
  37106. this.loopTime = 0;
  37107. },
  37108. /**
  37109. * Method used internally for applying config values to some of the sound properties.
  37110. *
  37111. * @method Phaser.Sound.WebAudioSound#applyConfig
  37112. * @protected
  37113. * @since 3.0.0
  37114. */
  37115. applyConfig: function ()
  37116. {
  37117. this.rateUpdates.length = 0;
  37118. this.rateUpdates.push({
  37119. time: 0,
  37120. rate: 1
  37121. });
  37122. BaseSound.prototype.applyConfig.call(this);
  37123. },
  37124. /**
  37125. * @event Phaser.Sound.WebAudioSound#endedEvent
  37126. * @param {Phaser.Sound.WebAudioSound} sound - Reference to the sound that emitted event.
  37127. */
  37128. /**
  37129. * @event Phaser.Sound.WebAudioSound#loopedEvent
  37130. * @param {Phaser.Sound.WebAudioSound} sound - Reference to the sound that emitted event.
  37131. */
  37132. /**
  37133. * Update method called automatically by sound manager on every game step.
  37134. *
  37135. * @method Phaser.Sound.WebAudioSound#update
  37136. * @fires Phaser.Sound.WebAudioSound#endedEvent
  37137. * @fires Phaser.Sound.WebAudioSound#loopedEvent
  37138. * @protected
  37139. * @since 3.0.0
  37140. *
  37141. * @param {number} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  37142. * @param {number} delta - The delta time elapsed since the last frame.
  37143. */
  37144. // eslint-disable-next-line no-unused-vars
  37145. update: function (time, delta)
  37146. {
  37147. if (this.hasEnded)
  37148. {
  37149. this.hasEnded = false;
  37150. BaseSound.prototype.stop.call(this);
  37151. this.stopAndRemoveBufferSource();
  37152. this.emit('ended', this);
  37153. }
  37154. else if (this.hasLooped)
  37155. {
  37156. this.hasLooped = false;
  37157. this.source = this.loopSource;
  37158. this.loopSource = null;
  37159. this.playTime = this.startTime = this.loopTime;
  37160. this.rateUpdates.length = 0;
  37161. this.rateUpdates.push({
  37162. time: 0,
  37163. rate: this.totalRate
  37164. });
  37165. this.createAndStartLoopBufferSource();
  37166. this.emit('looped', this);
  37167. }
  37168. },
  37169. /**
  37170. * Calls Phaser.Sound.BaseSound#destroy method
  37171. * and cleans up all Web Audio API related stuff.
  37172. *
  37173. * @method Phaser.Sound.WebAudioSound#destroy
  37174. * @since 3.0.0
  37175. */
  37176. destroy: function ()
  37177. {
  37178. BaseSound.prototype.destroy.call(this);
  37179. this.audioBuffer = null;
  37180. this.stopAndRemoveBufferSource();
  37181. this.muteNode.disconnect();
  37182. this.muteNode = null;
  37183. this.volumeNode.disconnect();
  37184. this.volumeNode = null;
  37185. this.rateUpdates.length = 0;
  37186. this.rateUpdates = null;
  37187. },
  37188. /**
  37189. * Method used internally to calculate total playback rate of the sound.
  37190. *
  37191. * @method Phaser.Sound.WebAudioSound#calculateRate
  37192. * @protected
  37193. * @since 3.0.0
  37194. */
  37195. calculateRate: function ()
  37196. {
  37197. BaseSound.prototype.calculateRate.call(this);
  37198. var now = this.manager.context.currentTime;
  37199. if (this.source && typeof this.totalRate === 'number')
  37200. {
  37201. this.source.playbackRate.setValueAtTime(this.totalRate, now);
  37202. }
  37203. if (this.isPlaying)
  37204. {
  37205. this.rateUpdates.push({
  37206. time: Math.max(this.startTime, now) - this.playTime,
  37207. rate: this.totalRate
  37208. });
  37209. if (this.loopSource)
  37210. {
  37211. this.stopAndRemoveLoopBufferSource();
  37212. this.createAndStartLoopBufferSource();
  37213. }
  37214. }
  37215. },
  37216. /**
  37217. * Method used internally for calculating current playback time of a playing sound.
  37218. *
  37219. * @method Phaser.Sound.WebAudioSound#getCurrentTime
  37220. * @private
  37221. * @since 3.0.0
  37222. */
  37223. getCurrentTime: function ()
  37224. {
  37225. var currentTime = 0;
  37226. for (var i = 0; i < this.rateUpdates.length; i++)
  37227. {
  37228. var nextTime = 0;
  37229. if (i < this.rateUpdates.length - 1)
  37230. {
  37231. nextTime = this.rateUpdates[i + 1].time;
  37232. }
  37233. else
  37234. {
  37235. nextTime = this.manager.context.currentTime - this.playTime;
  37236. }
  37237. currentTime += (nextTime - this.rateUpdates[i].time) * this.rateUpdates[i].rate;
  37238. }
  37239. return currentTime;
  37240. },
  37241. /**
  37242. * Method used internally for calculating the time
  37243. * at witch the loop source should start playing.
  37244. *
  37245. * @method Phaser.Sound.WebAudioSound#getLoopTime
  37246. * @private
  37247. * @since 3.0.0
  37248. */
  37249. getLoopTime: function ()
  37250. {
  37251. var lastRateUpdateCurrentTime = 0;
  37252. for (var i = 0; i < this.rateUpdates.length - 1; i++)
  37253. {
  37254. lastRateUpdateCurrentTime += (this.rateUpdates[i + 1].time - this.rateUpdates[i].time) * this.rateUpdates[i].rate;
  37255. }
  37256. var lastRateUpdate = this.rateUpdates[this.rateUpdates.length - 1];
  37257. return this.playTime + lastRateUpdate.time + (this.duration - lastRateUpdateCurrentTime) / lastRateUpdate.rate;
  37258. },
  37259. /**
  37260. * @event Phaser.Sound.WebAudioSound#rateEvent
  37261. * @param {Phaser.Sound.WebAudioSound} sound - Reference to the sound that emitted the event.
  37262. * @param {number} value - An updated value of Phaser.Sound.WebAudioSound#rate property.
  37263. */
  37264. /**
  37265. * Rate at which this Sound will be played.
  37266. * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed
  37267. * and 2.0 doubles the audios playback speed.
  37268. *
  37269. * @name Phaser.Sound.WebAudioSound#rate
  37270. * @type {number}
  37271. * @default 1
  37272. * @since 3.0.0
  37273. */
  37274. rate: {
  37275. get: function ()
  37276. {
  37277. return this.currentConfig.rate;
  37278. },
  37279. set: function (value)
  37280. {
  37281. this.currentConfig.rate = value;
  37282. this.calculateRate();
  37283. this.emit('rate', this, value);
  37284. }
  37285. },
  37286. /**
  37287. * Sets the playback rate of this Sound.
  37288. *
  37289. * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed
  37290. * and 2.0 doubles the audios playback speed.
  37291. *
  37292. * @method Phaser.Sound.WebAudioSound#setRate
  37293. * @fires Phaser.Sound.WebAudioSound#rateEvent
  37294. * @since 3.3.0
  37295. *
  37296. * @param {number} value - The playback rate at of this Sound.
  37297. *
  37298. * @return {Phaser.Sound.WebAudioSound} This Sound.
  37299. */
  37300. setRate: function (value)
  37301. {
  37302. this.rate = value;
  37303. return this;
  37304. },
  37305. /**
  37306. * @event Phaser.Sound.WebAudioSound#detuneEvent
  37307. * @param {Phaser.Sound.WebAudioSound} sound - Reference to the Sound that emitted event.
  37308. * @param {number} value - An updated value of Phaser.Sound.WebAudioSound#detune property.
  37309. */
  37310. /**
  37311. * The detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  37312. * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  37313. *
  37314. * @name Phaser.Sound.WebAudioSound#detune
  37315. * @type {number}
  37316. * @default 0
  37317. * @since 3.0.0
  37318. */
  37319. detune: {
  37320. get: function ()
  37321. {
  37322. return this.currentConfig.detune;
  37323. },
  37324. set: function (value)
  37325. {
  37326. this.currentConfig.detune = value;
  37327. this.calculateRate();
  37328. this.emit('detune', this, value);
  37329. }
  37330. },
  37331. /**
  37332. * Sets the detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  37333. * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  37334. *
  37335. * @method Phaser.Sound.WebAudioSound#setDetune
  37336. * @fires Phaser.Sound.WebAudioSound#detuneEvent
  37337. * @since 3.3.0
  37338. *
  37339. * @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).
  37340. *
  37341. * @return {Phaser.Sound.WebAudioSound} This Sound.
  37342. */
  37343. setDetune: function (value)
  37344. {
  37345. this.detune = value;
  37346. return this;
  37347. },
  37348. /**
  37349. * @event Phaser.Sound.WebAudioSound#muteEvent
  37350. * @param {Phaser.Sound.WebAudioSound} sound - Reference to the sound that emitted event.
  37351. * @param {boolean} value - An updated value of Phaser.Sound.WebAudioSound#mute property.
  37352. */
  37353. /**
  37354. * Boolean indicating whether the sound is muted or not.
  37355. * Gets or sets the muted state of this sound.
  37356. *
  37357. * @name Phaser.Sound.WebAudioSound#mute
  37358. * @type {boolean}
  37359. * @default false
  37360. * @since 3.0.0
  37361. */
  37362. mute: {
  37363. get: function ()
  37364. {
  37365. return (this.muteNode.gain.value === 0);
  37366. },
  37367. set: function (value)
  37368. {
  37369. this.currentConfig.mute = value;
  37370. this.muteNode.gain.setValueAtTime(value ? 0 : 1, 0);
  37371. this.emit('mute', this, value);
  37372. }
  37373. },
  37374. /**
  37375. * Sets the muted state of this Sound.
  37376. *
  37377. * @method Phaser.Sound.WebAudioSound#setMute
  37378. * @fires Phaser.Sound.WebAudioSound#muteEvent
  37379. * @since 3.4.0
  37380. *
  37381. * @param {boolean} value - `true` to mute this sound, `false` to unmute it.
  37382. *
  37383. * @return {Phaser.Sound.WebAudioSound} This Sound instance.
  37384. */
  37385. setMute: function (value)
  37386. {
  37387. this.mute = value;
  37388. return this;
  37389. },
  37390. /**
  37391. * @event Phaser.Sound.WebAudioSound#volumeEvent
  37392. * @param {Phaser.Sound.WebAudioSound} sound - Reference to the sound that emitted event.
  37393. * @param {number} value - An updated value of Phaser.Sound.WebAudioSound#volume property.
  37394. */
  37395. /**
  37396. * Gets or sets the volume of this sound, a value between 0 (silence) and 1 (full volume).
  37397. *
  37398. * @name Phaser.Sound.WebAudioSound#volume
  37399. * @type {number}
  37400. * @default 1
  37401. * @since 3.0.0
  37402. */
  37403. volume: {
  37404. get: function ()
  37405. {
  37406. return this.volumeNode.gain.value;
  37407. },
  37408. set: function (value)
  37409. {
  37410. this.currentConfig.volume = value;
  37411. this.volumeNode.gain.setValueAtTime(value, 0);
  37412. this.emit('volume', this, value);
  37413. }
  37414. },
  37415. /**
  37416. * Sets the volume of this Sound.
  37417. *
  37418. * @method Phaser.Sound.WebAudioSound#setVolume
  37419. * @fires Phaser.Sound.WebAudioSound#volumeEvent
  37420. * @since 3.4.0
  37421. *
  37422. * @param {number} value - The volume of the sound.
  37423. *
  37424. * @return {Phaser.Sound.WebAudioSound} This Sound instance.
  37425. */
  37426. setVolume: function (value)
  37427. {
  37428. this.volume = value;
  37429. return this;
  37430. },
  37431. /**
  37432. * @event Phaser.Sound.WebAudioSound#seekEvent
  37433. * @param {Phaser.Sound.WebAudioSound} sound - Reference to the sound that emitted event.
  37434. * @param {number} value - An updated value of Phaser.Sound.WebAudioSound#seek property.
  37435. */
  37436. /**
  37437. * Property representing the position of playback for this sound, in seconds.
  37438. * Setting it to a specific value moves current playback to that position.
  37439. * The value given is clamped to the range 0 to current marker duration.
  37440. * Setting seek of a stopped sound has no effect.
  37441. *
  37442. * @name Phaser.Sound.WebAudioSound#seek
  37443. * @type {number}
  37444. * @since 3.0.0
  37445. */
  37446. seek: {
  37447. get: function ()
  37448. {
  37449. if (this.isPlaying)
  37450. {
  37451. if (this.manager.context.currentTime < this.startTime)
  37452. {
  37453. return this.startTime - this.playTime;
  37454. }
  37455. return this.getCurrentTime();
  37456. }
  37457. else if (this.isPaused)
  37458. {
  37459. return this.currentConfig.seek;
  37460. }
  37461. else
  37462. {
  37463. return 0;
  37464. }
  37465. },
  37466. set: function (value)
  37467. {
  37468. if (this.manager.context.currentTime < this.startTime)
  37469. {
  37470. return;
  37471. }
  37472. if (this.isPlaying || this.isPaused)
  37473. {
  37474. value = Math.min(Math.max(0, value), this.duration);
  37475. this.currentConfig.seek = value;
  37476. if (this.isPlaying)
  37477. {
  37478. this.stopAndRemoveBufferSource();
  37479. this.createAndStartBufferSource();
  37480. }
  37481. this.emit('seek', this, value);
  37482. }
  37483. }
  37484. },
  37485. /**
  37486. * Seeks to a specific point in this sound.
  37487. *
  37488. * @method Phaser.Sound.WebAudioSound#setSeek
  37489. * @fires Phaser.Sound.WebAudioSound#seekEvent
  37490. * @since 3.4.0
  37491. *
  37492. * @param {number} value - The point in the sound to seek to.
  37493. *
  37494. * @return {Phaser.Sound.WebAudioSound} This Sound instance.
  37495. */
  37496. setSeek: function (value)
  37497. {
  37498. this.seek = value;
  37499. return this;
  37500. },
  37501. /**
  37502. * @event Phaser.Sound.WebAudioSound#loopEvent
  37503. * @param {Phaser.Sound.WebAudioSound} sound - Reference to the sound that emitted event.
  37504. * @param {boolean} value - An updated value of Phaser.Sound.WebAudioSound#loop property.
  37505. */
  37506. /**
  37507. * Flag indicating whether or not the sound or current sound marker will loop.
  37508. *
  37509. * @name Phaser.Sound.WebAudioSound#loop
  37510. * @type {boolean}
  37511. * @default false
  37512. * @since 3.0.0
  37513. */
  37514. loop: {
  37515. get: function ()
  37516. {
  37517. return this.currentConfig.loop;
  37518. },
  37519. set: function (value)
  37520. {
  37521. this.currentConfig.loop = value;
  37522. if (this.isPlaying)
  37523. {
  37524. this.stopAndRemoveLoopBufferSource();
  37525. if (value)
  37526. {
  37527. this.createAndStartLoopBufferSource();
  37528. }
  37529. }
  37530. this.emit('loop', this, value);
  37531. }
  37532. },
  37533. /**
  37534. * Sets the loop state of this Sound.
  37535. *
  37536. * @method Phaser.Sound.WebAudioSound#setLoop
  37537. * @fires Phaser.Sound.WebAudioSound#loopEvent
  37538. * @since 3.4.0
  37539. *
  37540. * @param {boolean} value - `true` to loop this sound, `false` to not loop it.
  37541. *
  37542. * @return {Phaser.Sound.WebAudioSound} This Sound instance.
  37543. */
  37544. setLoop: function (value)
  37545. {
  37546. this.loop = value;
  37547. return this;
  37548. }
  37549. });
  37550. module.exports = WebAudioSound;
  37551. /***/ }),
  37552. /* 191 */
  37553. /***/ (function(module, exports, __webpack_require__) {
  37554. /**
  37555. * @author Richard Davey <rich@photonstorm.com>
  37556. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  37557. * @copyright 2018 Photon Storm Ltd.
  37558. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37559. */
  37560. var BaseSoundManager = __webpack_require__(78);
  37561. var Class = __webpack_require__(0);
  37562. var WebAudioSound = __webpack_require__(190);
  37563. /**
  37564. * @classdesc
  37565. * Web Audio API implementation of the sound manager.
  37566. *
  37567. * @class WebAudioSoundManager
  37568. * @extends Phaser.Sound.BaseSoundManager
  37569. * @memberOf Phaser.Sound
  37570. * @constructor
  37571. * @since 3.0.0
  37572. *
  37573. * @param {Phaser.Game} game - Reference to the current game instance.
  37574. */
  37575. var WebAudioSoundManager = new Class({
  37576. Extends: BaseSoundManager,
  37577. initialize:
  37578. function WebAudioSoundManager (game)
  37579. {
  37580. /**
  37581. * The AudioContext being used for playback.
  37582. *
  37583. * @name Phaser.Sound.WebAudioSoundManager#context
  37584. * @type {AudioContext}
  37585. * @private
  37586. * @since 3.0.0
  37587. */
  37588. this.context = this.createAudioContext(game);
  37589. /**
  37590. * Gain node responsible for controlling global muting.
  37591. *
  37592. * @name Phaser.Sound.WebAudioSoundManager#masterMuteNode
  37593. * @type {GainNode}
  37594. * @private
  37595. * @since 3.0.0
  37596. */
  37597. this.masterMuteNode = this.context.createGain();
  37598. /**
  37599. * Gain node responsible for controlling global volume.
  37600. *
  37601. * @name Phaser.Sound.WebAudioSoundManager#masterVolumeNode
  37602. * @type {GainNode}
  37603. * @private
  37604. * @since 3.0.0
  37605. */
  37606. this.masterVolumeNode = this.context.createGain();
  37607. this.masterMuteNode.connect(this.masterVolumeNode);
  37608. this.masterVolumeNode.connect(this.context.destination);
  37609. /**
  37610. * Destination node for connecting individual sounds to.
  37611. *
  37612. * @name Phaser.Sound.WebAudioSoundManager#destination
  37613. * @type {AudioNode}
  37614. * @private
  37615. * @since 3.0.0
  37616. */
  37617. this.destination = this.masterMuteNode;
  37618. this.locked = this.context.state === 'suspended' && ('ontouchstart' in window || 'onclick' in window);
  37619. BaseSoundManager.call(this, game);
  37620. if (this.locked)
  37621. {
  37622. this.unlock();
  37623. }
  37624. },
  37625. /**
  37626. * Method responsible for instantiating and returning AudioContext instance.
  37627. * If an instance of an AudioContext class was provided through the game config,
  37628. * that instance will be returned instead. This can come in handy if you are reloading
  37629. * a Phaser game on a page that never properly refreshes (such as in an SPA project)
  37630. * and you want to reuse already instantiated AudioContext.
  37631. *
  37632. * @method Phaser.Sound.WebAudioSoundManager#createAudioContext
  37633. * @private
  37634. * @since 3.0.0
  37635. *
  37636. * @param {Phaser.Game} game - Reference to the current game instance.
  37637. *
  37638. * @return {AudioContext} The AudioContext instance to be used for playback.
  37639. */
  37640. createAudioContext: function (game)
  37641. {
  37642. var audioConfig = game.config.audio;
  37643. if (audioConfig && audioConfig.context)
  37644. {
  37645. audioConfig.context.resume();
  37646. return audioConfig.context;
  37647. }
  37648. return new AudioContext();
  37649. },
  37650. /**
  37651. * Adds a new sound into the sound manager.
  37652. *
  37653. * @method Phaser.Sound.WebAudioSoundManager#add
  37654. * @since 3.0.0
  37655. *
  37656. * @param {string} key - Asset key for the sound.
  37657. * @param {SoundConfig} [config] - An optional config object containing default sound settings.
  37658. *
  37659. * @return {Phaser.Sound.WebAudioSound} The new sound instance.
  37660. */
  37661. add: function (key, config)
  37662. {
  37663. var sound = new WebAudioSound(this, key, config);
  37664. this.sounds.push(sound);
  37665. return sound;
  37666. },
  37667. /**
  37668. * Unlocks Web Audio API on the initial input event.
  37669. *
  37670. * Read more about how this issue is handled here in [this article](https://medium.com/@pgoloskokovic/unlocking-web-audio-the-smarter-way-8858218c0e09).
  37671. *
  37672. * @method Phaser.Sound.WebAudioSoundManager#unlock
  37673. * @since 3.0.0
  37674. */
  37675. unlock: function ()
  37676. {
  37677. var _this = this;
  37678. var unlock = function ()
  37679. {
  37680. _this.context.resume().then(function ()
  37681. {
  37682. document.body.removeEventListener('touchstart', unlock);
  37683. document.body.removeEventListener('touchend', unlock);
  37684. document.body.removeEventListener('click', unlock);
  37685. _this.unlocked = true;
  37686. });
  37687. };
  37688. if (document.body)
  37689. {
  37690. document.body.addEventListener('touchstart', unlock, false);
  37691. document.body.addEventListener('touchend', unlock, false);
  37692. document.body.addEventListener('click', unlock, false);
  37693. }
  37694. },
  37695. /**
  37696. * Method used internally for pausing sound manager if
  37697. * Phaser.Sound.WebAudioSoundManager#pauseOnBlur is set to true.
  37698. *
  37699. * @method Phaser.Sound.WebAudioSoundManager#onBlur
  37700. * @protected
  37701. * @since 3.0.0
  37702. */
  37703. onBlur: function ()
  37704. {
  37705. this.context.suspend();
  37706. },
  37707. /**
  37708. * Method used internally for resuming sound manager if
  37709. * Phaser.Sound.WebAudioSoundManager#pauseOnBlur is set to true.
  37710. *
  37711. * @method Phaser.Sound.WebAudioSoundManager#onFocus
  37712. * @protected
  37713. * @since 3.0.0
  37714. */
  37715. onFocus: function ()
  37716. {
  37717. this.context.resume();
  37718. },
  37719. /**
  37720. * Calls Phaser.Sound.BaseSoundManager#destroy method
  37721. * and cleans up all Web Audio API related stuff.
  37722. *
  37723. * @method Phaser.Sound.WebAudioSoundManager#destroy
  37724. * @since 3.0.0
  37725. */
  37726. destroy: function ()
  37727. {
  37728. this.destination = null;
  37729. this.masterVolumeNode.disconnect();
  37730. this.masterVolumeNode = null;
  37731. this.masterMuteNode.disconnect();
  37732. this.masterMuteNode = null;
  37733. if (this.game.config.audio && this.game.config.audio.context)
  37734. {
  37735. this.context.suspend();
  37736. }
  37737. else
  37738. {
  37739. var _this = this;
  37740. this.context.close().then(function ()
  37741. {
  37742. _this.context = null;
  37743. });
  37744. }
  37745. BaseSoundManager.prototype.destroy.call(this);
  37746. },
  37747. /**
  37748. * @event Phaser.Sound.WebAudioSoundManager#muteEvent
  37749. * @param {Phaser.Sound.WebAudioSoundManager} soundManager - Reference to the sound manager that emitted event.
  37750. * @param {boolean} value - An updated value of Phaser.Sound.WebAudioSoundManager#mute property.
  37751. */
  37752. /**
  37753. * Sets the muted state of all this Sound Manager.
  37754. *
  37755. * @method Phaser.Sound.WebAudioSoundManager#setMute
  37756. * @fires Phaser.Sound.WebAudioSoundManager#muteEvent
  37757. * @since 3.3.0
  37758. *
  37759. * @param {boolean} value - `true` to mute all sounds, `false` to unmute them.
  37760. *
  37761. * @return {Phaser.Sound.WebAudioSoundManager} This Sound Manager.
  37762. */
  37763. setMute: function (value)
  37764. {
  37765. this.mute = value;
  37766. return this;
  37767. },
  37768. /**
  37769. * @name Phaser.Sound.WebAudioSoundManager#mute
  37770. * @type {boolean}
  37771. * @fires Phaser.Sound.WebAudioSoundManager#MuteEvent
  37772. * @since 3.0.0
  37773. */
  37774. mute: {
  37775. get: function ()
  37776. {
  37777. return (this.masterMuteNode.gain.value === 0);
  37778. },
  37779. set: function (value)
  37780. {
  37781. this.masterMuteNode.gain.setValueAtTime(value ? 0 : 1, 0);
  37782. this.emit('mute', this, value);
  37783. }
  37784. },
  37785. /**
  37786. * @event Phaser.Sound.WebAudioSoundManager#VolumeEvent
  37787. * @param {Phaser.Sound.WebAudioSoundManager} soundManager - Reference to the sound manager that emitted event.
  37788. * @param {number} value - An updated value of Phaser.Sound.WebAudioSoundManager#volume property.
  37789. */
  37790. /**
  37791. * Sets the volume of this Sound Manager.
  37792. *
  37793. * @method Phaser.Sound.WebAudioSoundManager#setVolume
  37794. * @fires Phaser.Sound.WebAudioSoundManager#VolumeEvent
  37795. * @since 3.3.0
  37796. *
  37797. * @param {number} value - The global volume of this Sound Manager.
  37798. *
  37799. * @return {Phaser.Sound.WebAudioSoundManager} This Sound Manager.
  37800. */
  37801. setVolume: function (value)
  37802. {
  37803. this.volume = value;
  37804. return this;
  37805. },
  37806. /**
  37807. * @name Phaser.Sound.WebAudioSoundManager#volume
  37808. * @type {number}
  37809. * @fires Phaser.Sound.WebAudioSoundManager#VolumeEvent
  37810. * @since 3.0.0
  37811. */
  37812. volume: {
  37813. get: function ()
  37814. {
  37815. return this.masterVolumeNode.gain.value;
  37816. },
  37817. set: function (value)
  37818. {
  37819. this.masterVolumeNode.gain.setValueAtTime(value, 0);
  37820. this.emit('volume', this, value);
  37821. }
  37822. }
  37823. });
  37824. module.exports = WebAudioSoundManager;
  37825. /***/ }),
  37826. /* 192 */
  37827. /***/ (function(module, exports, __webpack_require__) {
  37828. /**
  37829. * @author Richard Davey <rich@photonstorm.com>
  37830. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  37831. * @copyright 2018 Photon Storm Ltd.
  37832. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37833. */
  37834. var BaseSound = __webpack_require__(77);
  37835. var Class = __webpack_require__(0);
  37836. var EventEmitter = __webpack_require__(9);
  37837. var Extend = __webpack_require__(16);
  37838. /**
  37839. * @classdesc
  37840. * No audio implementation of the sound. It is used if audio has been
  37841. * disabled in the game config or the device doesn't support any audio.
  37842. *
  37843. * It represents a graceful degradation of sound logic that provides
  37844. * minimal functionality and prevents Phaser projects that use audio from
  37845. * breaking on devices that don't support any audio playback technologies.
  37846. *
  37847. * @class NoAudioSound
  37848. * @extends Phaser.Sound.BaseSound
  37849. * @memberOf Phaser.Sound
  37850. * @constructor
  37851. * @since 3.0.0
  37852. *
  37853. * @param {Phaser.Sound.NoAudioSoundManager} manager - Reference to the current sound manager instance.
  37854. * @param {string} key - Asset key for the sound.
  37855. * @param {SoundConfig} [config={}] - An optional config object containing default sound settings.
  37856. */
  37857. var NoAudioSound = new Class({
  37858. Extends: EventEmitter,
  37859. initialize:
  37860. function NoAudioSound (manager, key, config)
  37861. {
  37862. if (config === void 0) { config = {}; }
  37863. EventEmitter.call(this);
  37864. this.manager = manager;
  37865. this.key = key;
  37866. this.isPlaying = false;
  37867. this.isPaused = false;
  37868. this.totalRate = 1;
  37869. this.duration = 0;
  37870. this.totalDuration = 0;
  37871. this.config = Extend({
  37872. mute: false,
  37873. volume: 1,
  37874. rate: 1,
  37875. detune: 0,
  37876. seek: 0,
  37877. loop: false,
  37878. delay: 0
  37879. }, config);
  37880. this.currentConfig = this.config;
  37881. this.mute = false;
  37882. this.volume = 1;
  37883. this.rate = 1;
  37884. this.detune = 0;
  37885. this.seek = 0;
  37886. this.loop = false;
  37887. this.markers = {};
  37888. this.currentMarker = null;
  37889. this.pendingRemove = false;
  37890. },
  37891. // eslint-disable-next-line no-unused-vars
  37892. addMarker: function (marker)
  37893. {
  37894. return false;
  37895. },
  37896. // eslint-disable-next-line no-unused-vars
  37897. updateMarker: function (marker)
  37898. {
  37899. return false;
  37900. },
  37901. // eslint-disable-next-line no-unused-vars
  37902. removeMarker: function (markerName)
  37903. {
  37904. return null;
  37905. },
  37906. // eslint-disable-next-line no-unused-vars
  37907. play: function (markerName, config)
  37908. {
  37909. return false;
  37910. },
  37911. pause: function ()
  37912. {
  37913. return false;
  37914. },
  37915. resume: function ()
  37916. {
  37917. return false;
  37918. },
  37919. stop: function ()
  37920. {
  37921. return false;
  37922. },
  37923. destroy: function ()
  37924. {
  37925. this.manager.remove(this);
  37926. BaseSound.prototype.destroy.call(this);
  37927. }
  37928. });
  37929. module.exports = NoAudioSound;
  37930. /***/ }),
  37931. /* 193 */
  37932. /***/ (function(module, exports, __webpack_require__) {
  37933. /**
  37934. * @author Richard Davey <rich@photonstorm.com>
  37935. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  37936. * @copyright 2018 Photon Storm Ltd.
  37937. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  37938. */
  37939. var BaseSoundManager = __webpack_require__(78);
  37940. var Class = __webpack_require__(0);
  37941. var EventEmitter = __webpack_require__(9);
  37942. var NoAudioSound = __webpack_require__(192);
  37943. var NOOP = __webpack_require__(3);
  37944. /**
  37945. * @classdesc
  37946. * No audio implementation of the sound manager. It is used if audio has been
  37947. * disabled in the game config or the device doesn't support any audio.
  37948. *
  37949. * It represents a graceful degradation of sound manager logic that provides
  37950. * minimal functionality and prevents Phaser projects that use audio from
  37951. * breaking on devices that don't support any audio playback technologies.
  37952. *
  37953. * @class NoAudioSoundManager
  37954. * @extends Phaser.Sound.BaseSoundManager
  37955. * @memberOf Phaser.Sound
  37956. * @constructor
  37957. * @since 3.0.0
  37958. *
  37959. * @param {Phaser.Game} game - Reference to the current game instance.
  37960. */
  37961. var NoAudioSoundManager = new Class({
  37962. Extends: EventEmitter,
  37963. initialize:
  37964. function NoAudioSoundManager (game)
  37965. {
  37966. EventEmitter.call(this);
  37967. this.game = game;
  37968. this.sounds = [];
  37969. this.mute = false;
  37970. this.volume = 1;
  37971. this.rate = 1;
  37972. this.detune = 0;
  37973. this.pauseOnBlur = true;
  37974. this.locked = false;
  37975. },
  37976. add: function (key, config)
  37977. {
  37978. var sound = new NoAudioSound(this, key, config);
  37979. this.sounds.push(sound);
  37980. return sound;
  37981. },
  37982. addAudioSprite: function (key, config)
  37983. {
  37984. var sound = this.add(key, config);
  37985. sound.spritemap = {};
  37986. return sound;
  37987. },
  37988. // eslint-disable-next-line no-unused-vars
  37989. play: function (key, extra)
  37990. {
  37991. return false;
  37992. },
  37993. // eslint-disable-next-line no-unused-vars
  37994. playAudioSprite: function (key, spriteName, config)
  37995. {
  37996. return false;
  37997. },
  37998. remove: function (sound)
  37999. {
  38000. return BaseSoundManager.prototype.remove.call(this, sound);
  38001. },
  38002. removeByKey: function (key)
  38003. {
  38004. return BaseSoundManager.prototype.removeByKey.call(this, key);
  38005. },
  38006. pauseAll: NOOP,
  38007. resumeAll: NOOP,
  38008. stopAll: NOOP,
  38009. update: NOOP,
  38010. setRate: NOOP,
  38011. setDetune: NOOP,
  38012. setMute: NOOP,
  38013. setVolume: NOOP,
  38014. forEachActiveSound: function (callbackfn, scope)
  38015. {
  38016. BaseSoundManager.prototype.forEachActiveSound.call(this, callbackfn, scope);
  38017. },
  38018. destroy: function ()
  38019. {
  38020. BaseSoundManager.prototype.destroy.call(this);
  38021. }
  38022. });
  38023. module.exports = NoAudioSoundManager;
  38024. /***/ }),
  38025. /* 194 */
  38026. /***/ (function(module, exports, __webpack_require__) {
  38027. /**
  38028. * @author Richard Davey <rich@photonstorm.com>
  38029. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  38030. * @copyright 2018 Photon Storm Ltd.
  38031. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  38032. */
  38033. var BaseSound = __webpack_require__(77);
  38034. var Class = __webpack_require__(0);
  38035. /**
  38036. * @classdesc
  38037. * HTML5 Audio implementation of the sound.
  38038. *
  38039. * @class HTML5AudioSound
  38040. * @extends Phaser.Sound.BaseSound
  38041. * @memberOf Phaser.Sound
  38042. * @constructor
  38043. * @since 3.0.0
  38044. *
  38045. * @param {Phaser.Sound.HTML5AudioSoundManager} manager - Reference to the current sound manager instance.
  38046. * @param {string} key - Asset key for the sound.
  38047. * @param {SoundConfig} [config={}] - An optional config object containing default sound settings.
  38048. */
  38049. var HTML5AudioSound = new Class({
  38050. Extends: BaseSound,
  38051. initialize:
  38052. function HTML5AudioSound (manager, key, config)
  38053. {
  38054. if (config === undefined) { config = {}; }
  38055. /**
  38056. * An array containing all HTML5 Audio tags that could be used for individual
  38057. * sound's playback. Number of instances depends on the config value passed
  38058. * to the Loader#audio method call, default is 1.
  38059. *
  38060. * @name Phaser.Sound.HTML5AudioSound#tags
  38061. * @type {HTMLAudioElement[]}
  38062. * @private
  38063. * @since 3.0.0
  38064. */
  38065. this.tags = manager.game.cache.audio.get(key);
  38066. if (!this.tags)
  38067. {
  38068. // eslint-disable-next-line no-console
  38069. console.warn('Audio cache entry missing: ' + key);
  38070. return;
  38071. }
  38072. /**
  38073. * Reference to an HTML5 Audio tag used for playing sound.
  38074. *
  38075. * @name Phaser.Sound.HTML5AudioSound#audio
  38076. * @type {HTMLAudioElement}
  38077. * @private
  38078. * @default null
  38079. * @since 3.0.0
  38080. */
  38081. this.audio = null;
  38082. /**
  38083. * Timestamp as generated by the Request Animation Frame or SetTimeout
  38084. * representing the time at which the delayed sound playback should start.
  38085. * Set to 0 if sound playback is not delayed.
  38086. *
  38087. * @name Phaser.Sound.HTML5AudioSound#startTime
  38088. * @type {number}
  38089. * @private
  38090. * @default 0
  38091. * @since 3.0.0
  38092. */
  38093. this.startTime = 0;
  38094. /**
  38095. * Audio tag's playback position recorded on previous
  38096. * update method call. Set to 0 if sound is not playing.
  38097. *
  38098. * @name Phaser.Sound.HTML5AudioSound#previousTime
  38099. * @type {number}
  38100. * @private
  38101. * @default 0
  38102. * @since 3.0.0
  38103. */
  38104. this.previousTime = 0;
  38105. this.duration = this.tags[0].duration;
  38106. this.totalDuration = this.tags[0].duration;
  38107. BaseSound.call(this, manager, key, config);
  38108. },
  38109. /**
  38110. * @event Phaser.Sound.HTML5AudioSound#playEvent
  38111. * @param {Phaser.Sound.HTML5AudioSound} sound - Reference to the sound that emitted event.
  38112. */
  38113. /**
  38114. * Play this sound, or a marked section of it.
  38115. * It always plays the sound from the start. If you want to start playback from a specific time
  38116. * you can set 'seek' setting of the config object, provided to this call, to that value.
  38117. *
  38118. * @method Phaser.Sound.HTML5AudioSound#play
  38119. * @fires Phaser.Sound.HTML5AudioSound#playEvent
  38120. * @since 3.0.0
  38121. *
  38122. * @param {string} [markerName=''] - If you want to play a marker then provide the marker name here, otherwise omit it to play the full sound.
  38123. * @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.
  38124. *
  38125. * @return {boolean} Whether the sound started playing successfully.
  38126. */
  38127. play: function (markerName, config)
  38128. {
  38129. if (this.manager.isLocked(this, 'play', [ markerName, config ]))
  38130. {
  38131. return false;
  38132. }
  38133. if (!BaseSound.prototype.play.call(this, markerName, config))
  38134. {
  38135. return false;
  38136. }
  38137. // \/\/\/ isPlaying = true, isPaused = false \/\/\/
  38138. if (!this.pickAndPlayAudioTag())
  38139. {
  38140. return false;
  38141. }
  38142. this.emit('play', this);
  38143. return true;
  38144. },
  38145. /**
  38146. * @event Phaser.Sound.HTML5AudioSound#pauseEvent
  38147. * @param {Phaser.Sound.HTML5AudioSound} sound - Reference to the sound that emitted event.
  38148. */
  38149. /**
  38150. * Pauses the sound.
  38151. *
  38152. * @method Phaser.Sound.HTML5AudioSound#pause
  38153. * @fires Phaser.Sound.HTML5AudioSound#pauseEvent
  38154. * @since 3.0.0
  38155. *
  38156. * @return {boolean} Whether the sound was paused successfully.
  38157. */
  38158. pause: function ()
  38159. {
  38160. if (this.manager.isLocked(this, 'pause'))
  38161. {
  38162. return false;
  38163. }
  38164. if (this.startTime > 0)
  38165. {
  38166. return false;
  38167. }
  38168. if (!BaseSound.prototype.pause.call(this))
  38169. {
  38170. return false;
  38171. }
  38172. // \/\/\/ isPlaying = false, isPaused = true \/\/\/
  38173. this.currentConfig.seek = this.audio.currentTime - (this.currentMarker ? this.currentMarker.start : 0);
  38174. this.stopAndReleaseAudioTag();
  38175. this.emit('pause', this);
  38176. return true;
  38177. },
  38178. /**
  38179. * @event Phaser.Sound.HTML5AudioSound#resumeEvent
  38180. * @param {Phaser.Sound.HTML5AudioSound} sound - Reference to the sound that emitted event.
  38181. */
  38182. /**
  38183. * Resumes the sound.
  38184. *
  38185. * @method Phaser.Sound.HTML5AudioSound#resume
  38186. * @fires Phaser.Sound.HTML5AudioSound#resumeEvent
  38187. * @since 3.0.0
  38188. *
  38189. * @return {boolean} Whether the sound was resumed successfully.
  38190. */
  38191. resume: function ()
  38192. {
  38193. if (this.manager.isLocked(this, 'resume'))
  38194. {
  38195. return false;
  38196. }
  38197. if (this.startTime > 0)
  38198. {
  38199. return false;
  38200. }
  38201. if (!BaseSound.prototype.resume.call(this))
  38202. {
  38203. return false;
  38204. }
  38205. // \/\/\/ isPlaying = true, isPaused = false \/\/\/
  38206. if (!this.pickAndPlayAudioTag())
  38207. {
  38208. return false;
  38209. }
  38210. this.emit('resume', this);
  38211. return true;
  38212. },
  38213. /**
  38214. * @event Phaser.Sound.HTML5AudioSound#stopEvent
  38215. * @param {Phaser.Sound.HTML5AudioSound} sound - Reference to the sound that emitted event.
  38216. */
  38217. /**
  38218. * Stop playing this sound.
  38219. *
  38220. * @method Phaser.Sound.HTML5AudioSound#stop
  38221. * @fires Phaser.Sound.HTML5AudioSound#stopEvent
  38222. * @since 3.0.0
  38223. *
  38224. * @return {boolean} Whether the sound was stopped successfully.
  38225. */
  38226. stop: function ()
  38227. {
  38228. if (this.manager.isLocked(this, 'stop'))
  38229. {
  38230. return false;
  38231. }
  38232. if (!BaseSound.prototype.stop.call(this))
  38233. {
  38234. return false;
  38235. }
  38236. // \/\/\/ isPlaying = false, isPaused = false \/\/\/
  38237. this.stopAndReleaseAudioTag();
  38238. this.emit('stop', this);
  38239. return true;
  38240. },
  38241. /**
  38242. * Used internally to do what the name says.
  38243. *
  38244. * @method Phaser.Sound.HTML5AudioSound#pickAndPlayAudioTag
  38245. * @private
  38246. * @since 3.0.0
  38247. *
  38248. * @return {boolean} Whether the sound was assigned an audio tag successfully.
  38249. */
  38250. pickAndPlayAudioTag: function ()
  38251. {
  38252. if (!this.pickAudioTag())
  38253. {
  38254. this.reset();
  38255. return false;
  38256. }
  38257. var seek = this.currentConfig.seek;
  38258. var delay = this.currentConfig.delay;
  38259. var offset = (this.currentMarker ? this.currentMarker.start : 0) + seek;
  38260. this.previousTime = offset;
  38261. this.audio.currentTime = offset;
  38262. this.applyConfig();
  38263. if (delay === 0)
  38264. {
  38265. this.startTime = 0;
  38266. if (this.audio.paused)
  38267. {
  38268. this.playCatchPromise();
  38269. }
  38270. }
  38271. else
  38272. {
  38273. this.startTime = window.performance.now() + delay * 1000;
  38274. if (!this.audio.paused)
  38275. {
  38276. this.audio.pause();
  38277. }
  38278. }
  38279. this.resetConfig();
  38280. return true;
  38281. },
  38282. /**
  38283. * This method performs the audio tag pooling logic. It first looks for
  38284. * unused audio tag to assign to this sound object. If there are no unused
  38285. * audio tags, based on HTML5AudioSoundManager#override property value, it
  38286. * looks for sound with most advanced playback and hijacks its audio tag or
  38287. * does nothing.
  38288. *
  38289. * @method Phaser.Sound.HTML5AudioSound#pickAudioTag
  38290. * @private
  38291. * @since 3.0.0
  38292. *
  38293. * @return {boolean} Whether the sound was assigned an audio tag successfully.
  38294. */
  38295. pickAudioTag: function ()
  38296. {
  38297. if (this.audio)
  38298. {
  38299. return true;
  38300. }
  38301. for (var i = 0; i < this.tags.length; i++)
  38302. {
  38303. var audio = this.tags[i];
  38304. if (audio.dataset.used === 'false')
  38305. {
  38306. audio.dataset.used = 'true';
  38307. this.audio = audio;
  38308. return true;
  38309. }
  38310. }
  38311. if (!this.manager.override)
  38312. {
  38313. return false;
  38314. }
  38315. var otherSounds = [];
  38316. this.manager.forEachActiveSound(function (sound)
  38317. {
  38318. if (sound.key === this.key && sound.audio)
  38319. {
  38320. otherSounds.push(sound);
  38321. }
  38322. }, this);
  38323. otherSounds.sort(function (a1, a2)
  38324. {
  38325. if (a1.loop === a2.loop)
  38326. {
  38327. // sort by progress
  38328. return (a2.seek / a2.duration) - (a1.seek / a1.duration);
  38329. }
  38330. return a1.loop ? 1 : -1;
  38331. });
  38332. var selectedSound = otherSounds[0];
  38333. this.audio = selectedSound.audio;
  38334. selectedSound.reset();
  38335. selectedSound.audio = null;
  38336. selectedSound.startTime = 0;
  38337. selectedSound.previousTime = 0;
  38338. return true;
  38339. },
  38340. /**
  38341. * Method used for playing audio tag and catching possible exceptions
  38342. * thrown from rejected Promise returned from play method call.
  38343. *
  38344. * @method Phaser.Sound.HTML5AudioSound#playCatchPromise
  38345. * @private
  38346. * @since 3.0.0
  38347. */
  38348. playCatchPromise: function ()
  38349. {
  38350. var playPromise = this.audio.play();
  38351. if (playPromise)
  38352. {
  38353. // eslint-disable-next-line no-unused-vars
  38354. playPromise.catch(function (reason)
  38355. {
  38356. console.warn(reason);
  38357. });
  38358. }
  38359. },
  38360. /**
  38361. * Used internally to do what the name says.
  38362. *
  38363. * @method Phaser.Sound.HTML5AudioSound#stopAndReleaseAudioTag
  38364. * @private
  38365. * @since 3.0.0
  38366. */
  38367. stopAndReleaseAudioTag: function ()
  38368. {
  38369. this.audio.pause();
  38370. this.audio.dataset.used = 'false';
  38371. this.audio = null;
  38372. this.startTime = 0;
  38373. this.previousTime = 0;
  38374. },
  38375. /**
  38376. * Method used internally to reset sound state, usually when stopping sound
  38377. * or when hijacking audio tag from another sound.
  38378. *
  38379. * @method Phaser.Sound.HTML5AudioSound#reset
  38380. * @private
  38381. * @since 3.0.0
  38382. */
  38383. reset: function ()
  38384. {
  38385. BaseSound.prototype.stop.call(this);
  38386. },
  38387. /**
  38388. * Method used internally by sound manager for pausing sound if
  38389. * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true.
  38390. *
  38391. * @method Phaser.Sound.HTML5AudioSoundManager#onBlur
  38392. * @private
  38393. * @since 3.0.0
  38394. */
  38395. onBlur: function ()
  38396. {
  38397. this.isPlaying = false;
  38398. this.isPaused = true;
  38399. this.currentConfig.seek = this.audio.currentTime - (this.currentMarker ? this.currentMarker.start : 0);
  38400. this.currentConfig.delay = Math.max(0, (this.startTime - window.performance.now()) / 1000);
  38401. this.stopAndReleaseAudioTag();
  38402. },
  38403. /**
  38404. * Method used internally by sound manager for resuming sound if
  38405. * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true.
  38406. *
  38407. * @method Phaser.Sound.HTML5AudioSound#onFocus
  38408. * @private
  38409. * @since 3.0.0
  38410. */
  38411. onFocus: function ()
  38412. {
  38413. this.isPlaying = true;
  38414. this.isPaused = false;
  38415. this.pickAndPlayAudioTag();
  38416. },
  38417. /**
  38418. * @event Phaser.Sound.HTML5AudioSound#loopedEvent
  38419. * @param {Phaser.Sound.HTML5AudioSound} sound - Reference to the sound that emitted event.
  38420. */
  38421. /**
  38422. * @event Phaser.Sound.HTML5AudioSound#endedEvent
  38423. * @param {Phaser.Sound.HTML5AudioSound} sound - Reference to the sound that emitted event.
  38424. */
  38425. /**
  38426. * Update method called automatically by sound manager on every game step.
  38427. *
  38428. * @method Phaser.Sound.HTML5AudioSound#update
  38429. * @fires Phaser.Sound.HTML5AudioSound#loopedEvent
  38430. * @fires Phaser.Sound.HTML5AudioSound#endedEvent
  38431. * @protected
  38432. * @since 3.0.0
  38433. *
  38434. * @param {number} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  38435. * @param {number} delta - The delta time elapsed since the last frame.
  38436. */
  38437. // eslint-disable-next-line no-unused-vars
  38438. update: function (time, delta)
  38439. {
  38440. if (!this.isPlaying)
  38441. {
  38442. return;
  38443. }
  38444. // handling delayed playback
  38445. if (this.startTime > 0)
  38446. {
  38447. if (this.startTime < time - this.manager.audioPlayDelay)
  38448. {
  38449. this.audio.currentTime += Math.max(0, time - this.startTime) / 1000;
  38450. this.startTime = 0;
  38451. this.previousTime = this.audio.currentTime;
  38452. this.playCatchPromise();
  38453. }
  38454. return;
  38455. }
  38456. // handle looping and ending
  38457. var startTime = this.currentMarker ? this.currentMarker.start : 0;
  38458. var endTime = startTime + this.duration;
  38459. var currentTime = this.audio.currentTime;
  38460. if (this.currentConfig.loop)
  38461. {
  38462. if (currentTime >= endTime - this.manager.loopEndOffset)
  38463. {
  38464. this.audio.currentTime = startTime + Math.max(0, currentTime - endTime);
  38465. currentTime = this.audio.currentTime;
  38466. }
  38467. else if (currentTime < startTime)
  38468. {
  38469. this.audio.currentTime += startTime;
  38470. currentTime = this.audio.currentTime;
  38471. }
  38472. if (currentTime < this.previousTime)
  38473. {
  38474. this.emit('looped', this);
  38475. }
  38476. }
  38477. else if (currentTime >= endTime)
  38478. {
  38479. this.reset();
  38480. this.stopAndReleaseAudioTag();
  38481. this.emit('ended', this);
  38482. return;
  38483. }
  38484. this.previousTime = currentTime;
  38485. },
  38486. /**
  38487. * Calls Phaser.Sound.BaseSound#destroy method
  38488. * and cleans up all HTML5 Audio related stuff.
  38489. *
  38490. * @method Phaser.Sound.HTML5AudioSound#destroy
  38491. * @since 3.0.0
  38492. */
  38493. destroy: function ()
  38494. {
  38495. BaseSound.prototype.destroy.call(this);
  38496. this.tags = null;
  38497. if (this.audio)
  38498. {
  38499. this.stopAndReleaseAudioTag();
  38500. }
  38501. },
  38502. /**
  38503. * Method used internally to determine mute setting of the sound.
  38504. *
  38505. * @method Phaser.Sound.HTML5AudioSound#updateMute
  38506. * @private
  38507. * @since 3.0.0
  38508. */
  38509. updateMute: function ()
  38510. {
  38511. if (this.audio)
  38512. {
  38513. this.audio.muted = this.currentConfig.mute || this.manager.mute;
  38514. }
  38515. },
  38516. /**
  38517. * Method used internally to calculate total volume of the sound.
  38518. *
  38519. * @method Phaser.Sound.HTML5AudioSound#updateVolume
  38520. * @private
  38521. * @since 3.0.0
  38522. */
  38523. updateVolume: function ()
  38524. {
  38525. if (this.audio)
  38526. {
  38527. this.audio.volume = this.currentConfig.volume * this.manager.volume;
  38528. }
  38529. },
  38530. /**
  38531. * Method used internally to calculate total playback rate of the sound.
  38532. *
  38533. * @method Phaser.Sound.HTML5AudioSound#calculateRate
  38534. * @protected
  38535. * @since 3.0.0
  38536. */
  38537. calculateRate: function ()
  38538. {
  38539. BaseSound.prototype.calculateRate.call(this);
  38540. if (this.audio)
  38541. {
  38542. this.audio.playbackRate = this.totalRate;
  38543. }
  38544. },
  38545. /**
  38546. * @event Phaser.Sound.HTML5AudioSound#muteEvent
  38547. * @param {Phaser.Sound.HTML5AudioSound} sound - Reference to the sound that emitted event.
  38548. * @param {boolean} value - An updated value of Phaser.Sound.HTML5AudioSound#mute property.
  38549. */
  38550. /**
  38551. * Boolean indicating whether the sound is muted or not.
  38552. * Gets or sets the muted state of this sound.
  38553. *
  38554. * @name Phaser.Sound.HTML5AudioSound#mute
  38555. * @type {boolean}
  38556. * @default false
  38557. * @since 3.0.0
  38558. */
  38559. mute: {
  38560. get: function ()
  38561. {
  38562. return this.currentConfig.mute;
  38563. },
  38564. set: function (value)
  38565. {
  38566. this.currentConfig.mute = value;
  38567. if (this.manager.isLocked(this, 'mute', value))
  38568. {
  38569. return;
  38570. }
  38571. this.emit('mute', this, value);
  38572. }
  38573. },
  38574. /**
  38575. * Sets the muted state of this Sound.
  38576. *
  38577. * @method Phaser.Sound.HTML5AudioSound#setMute
  38578. * @fires Phaser.Sound.HTML5AudioSound#muteEvent
  38579. * @since 3.4.0
  38580. *
  38581. * @param {boolean} value - `true` to mute this sound, `false` to unmute it.
  38582. *
  38583. * @return {Phaser.Sound.HTML5AudioSound} This Sound instance.
  38584. */
  38585. setMute: function (value)
  38586. {
  38587. this.mute = value;
  38588. return this;
  38589. },
  38590. /**
  38591. * @event Phaser.Sound.HTML5AudioSound#volumeEvent
  38592. * @param {Phaser.Sound.HTML5AudioSound} sound - Reference to the sound that emitted event.
  38593. * @param {number} value - An updated value of Phaser.Sound.HTML5AudioSound#volume property.
  38594. */
  38595. /**
  38596. * Gets or sets the volume of this sound, a value between 0 (silence) and 1 (full volume).
  38597. *
  38598. * @name Phaser.Sound.HTML5AudioSound#volume
  38599. * @type {number}
  38600. * @default 1
  38601. * @since 3.0.0
  38602. */
  38603. volume: {
  38604. get: function ()
  38605. {
  38606. return this.currentConfig.volume;
  38607. },
  38608. set: function (value)
  38609. {
  38610. this.currentConfig.volume = value;
  38611. if (this.manager.isLocked(this, 'volume', value))
  38612. {
  38613. return;
  38614. }
  38615. this.emit('volume', this, value);
  38616. }
  38617. },
  38618. /**
  38619. * Sets the volume of this Sound.
  38620. *
  38621. * @method Phaser.Sound.HTML5AudioSound#setVolume
  38622. * @fires Phaser.Sound.HTML5AudioSound#volumeEvent
  38623. * @since 3.4.0
  38624. *
  38625. * @param {number} value - The volume of the sound.
  38626. *
  38627. * @return {Phaser.Sound.HTML5AudioSound} This Sound instance.
  38628. */
  38629. setVolume: function (value)
  38630. {
  38631. this.volume = value;
  38632. return this;
  38633. },
  38634. /**
  38635. * @event Phaser.Sound.HTML5AudioSound#rateEvent
  38636. * @param {Phaser.Sound.HTML5AudioSound} sound - Reference to the sound that emitted the event.
  38637. * @param {number} value - An updated value of Phaser.Sound.HTML5AudioSound#rate property.
  38638. */
  38639. /**
  38640. * Rate at which this Sound will be played.
  38641. * Value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed
  38642. * and 2.0 doubles the audios playback speed.
  38643. *
  38644. * @name Phaser.Sound.HTML5AudioSound#rate
  38645. * @type {number}
  38646. * @default 1
  38647. * @since 3.0.0
  38648. */
  38649. rate: {
  38650. get: function ()
  38651. {
  38652. return this.currentConfig.rate;
  38653. },
  38654. set: function (value)
  38655. {
  38656. this.currentConfig.rate = value;
  38657. if (this.manager.isLocked(this, 'rate', value))
  38658. {
  38659. return;
  38660. }
  38661. else
  38662. {
  38663. this.calculateRate();
  38664. this.emit('rate', this, value);
  38665. }
  38666. }
  38667. },
  38668. /**
  38669. * Sets the playback rate of this Sound.
  38670. *
  38671. * For example, a value of 1.0 plays the audio at full speed, 0.5 plays the audio at half speed
  38672. * and 2.0 doubles the audios playback speed.
  38673. *
  38674. * @method Phaser.Sound.HTML5AudioSound#setRate
  38675. * @fires Phaser.Sound.HTML5AudioSound#rateEvent
  38676. * @since 3.3.0
  38677. *
  38678. * @param {number} value - The playback rate at of this Sound.
  38679. *
  38680. * @return {Phaser.Sound.HTML5AudioSound} This Sound.
  38681. */
  38682. setRate: function (value)
  38683. {
  38684. this.rate = value;
  38685. return this;
  38686. },
  38687. /**
  38688. * @event Phaser.Sound.HTML5AudioSound#detuneEvent
  38689. * @param {Phaser.Sound.HTML5AudioSound} sound - Reference to the Sound that emitted event.
  38690. * @param {number} value - An updated value of Phaser.Sound.HTML5AudioSound#detune property.
  38691. */
  38692. /**
  38693. * The detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  38694. * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  38695. *
  38696. * @name Phaser.Sound.HTML5AudioSound#detune
  38697. * @type {number}
  38698. * @default 0
  38699. * @since 3.0.0
  38700. */
  38701. detune: {
  38702. get: function ()
  38703. {
  38704. return this.currentConfig.detune;
  38705. },
  38706. set: function (value)
  38707. {
  38708. this.currentConfig.detune = value;
  38709. if (this.manager.isLocked(this, 'detune', value))
  38710. {
  38711. return;
  38712. }
  38713. else
  38714. {
  38715. this.calculateRate();
  38716. this.emit('detune', this, value);
  38717. }
  38718. }
  38719. },
  38720. /**
  38721. * Sets the detune value of this Sound, given in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  38722. * The range of the value is -1200 to 1200, but we recommend setting it to [50](https://en.wikipedia.org/wiki/50_Cent).
  38723. *
  38724. * @method Phaser.Sound.HTML5AudioSound#setDetune
  38725. * @fires Phaser.Sound.HTML5AudioSound#detuneEvent
  38726. * @since 3.3.0
  38727. *
  38728. * @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).
  38729. *
  38730. * @return {Phaser.Sound.HTML5AudioSound} This Sound.
  38731. */
  38732. setDetune: function (value)
  38733. {
  38734. this.detune = value;
  38735. return this;
  38736. },
  38737. /**
  38738. * @event Phaser.Sound.HTML5AudioSound#seekEvent
  38739. * @param {Phaser.Sound.HTML5AudioSound} sound - Reference to the sound that emitted event.
  38740. * @param {number} value - An updated value of Phaser.Sound.HTML5AudioSound#seek property.
  38741. */
  38742. /**
  38743. * Property representing the position of playback for this sound, in seconds.
  38744. * Setting it to a specific value moves current playback to that position.
  38745. * The value given is clamped to the range 0 to current marker duration.
  38746. * Setting seek of a stopped sound has no effect.
  38747. *
  38748. * @name Phaser.Sound.HTML5AudioSound#seek
  38749. * @type {number}
  38750. * @since 3.0.0
  38751. */
  38752. seek: {
  38753. get: function ()
  38754. {
  38755. if (this.isPlaying)
  38756. {
  38757. return this.audio.currentTime - (this.currentMarker ? this.currentMarker.start : 0);
  38758. }
  38759. else if (this.isPaused)
  38760. {
  38761. return this.currentConfig.seek;
  38762. }
  38763. else
  38764. {
  38765. return 0;
  38766. }
  38767. },
  38768. set: function (value)
  38769. {
  38770. if (this.manager.isLocked(this, 'seek', value))
  38771. {
  38772. return;
  38773. }
  38774. if (this.startTime > 0)
  38775. {
  38776. return;
  38777. }
  38778. if (this.isPlaying || this.isPaused)
  38779. {
  38780. value = Math.min(Math.max(0, value), this.duration);
  38781. if (this.isPlaying)
  38782. {
  38783. this.previousTime = value;
  38784. this.audio.currentTime = value;
  38785. }
  38786. else if (this.isPaused)
  38787. {
  38788. this.currentConfig.seek = value;
  38789. }
  38790. this.emit('seek', this, value);
  38791. }
  38792. }
  38793. },
  38794. /**
  38795. * Seeks to a specific point in this sound.
  38796. *
  38797. * @method Phaser.Sound.HTML5AudioSound#setSeek
  38798. * @fires Phaser.Sound.HTML5AudioSound#seekEvent
  38799. * @since 3.4.0
  38800. *
  38801. * @param {number} value - The point in the sound to seek to.
  38802. *
  38803. * @return {Phaser.Sound.HTML5AudioSound} This Sound instance.
  38804. */
  38805. setSeek: function (value)
  38806. {
  38807. this.seek = value;
  38808. return this;
  38809. },
  38810. /**
  38811. * @event Phaser.Sound.HTML5AudioSound#loopEvent
  38812. * @param {Phaser.Sound.HTML5AudioSound} sound - Reference to the sound that emitted event.
  38813. * @param {boolean} value - An updated value of Phaser.Sound.HTML5AudioSound#loop property.
  38814. */
  38815. /**
  38816. * Flag indicating whether or not the sound or current sound marker will loop.
  38817. *
  38818. * @name Phaser.Sound.HTML5AudioSound#loop
  38819. * @type {boolean}
  38820. * @default false
  38821. * @since 3.0.0
  38822. */
  38823. loop: {
  38824. get: function ()
  38825. {
  38826. return this.currentConfig.loop;
  38827. },
  38828. set: function (value)
  38829. {
  38830. this.currentConfig.loop = value;
  38831. if (this.manager.isLocked(this, 'loop', value))
  38832. {
  38833. return;
  38834. }
  38835. if (this.audio)
  38836. {
  38837. this.audio.loop = value;
  38838. }
  38839. this.emit('loop', this, value);
  38840. }
  38841. },
  38842. /**
  38843. * Sets the loop state of this Sound.
  38844. *
  38845. * @method Phaser.Sound.HTML5AudioSound#setLoop
  38846. * @fires Phaser.Sound.HTML5AudioSound#loopEvent
  38847. * @since 3.4.0
  38848. *
  38849. * @param {boolean} value - `true` to loop this sound, `false` to not loop it.
  38850. *
  38851. * @return {Phaser.Sound.HTML5AudioSound} This Sound instance.
  38852. */
  38853. setLoop: function (value)
  38854. {
  38855. this.loop = value;
  38856. return this;
  38857. }
  38858. });
  38859. module.exports = HTML5AudioSound;
  38860. /***/ }),
  38861. /* 195 */
  38862. /***/ (function(module, exports, __webpack_require__) {
  38863. /**
  38864. * @author Richard Davey <rich@photonstorm.com>
  38865. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  38866. * @copyright 2018 Photon Storm Ltd.
  38867. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  38868. */
  38869. var BaseSoundManager = __webpack_require__(78);
  38870. var Class = __webpack_require__(0);
  38871. var HTML5AudioSound = __webpack_require__(194);
  38872. /**
  38873. * HTML5 Audio implementation of the Sound Manager.
  38874. *
  38875. * @class HTML5AudioSoundManager
  38876. * @extends Phaser.Sound.BaseSoundManager
  38877. * @memberOf Phaser.Sound
  38878. * @constructor
  38879. * @since 3.0.0
  38880. *
  38881. * @param {Phaser.Game} game - Reference to the current game instance.
  38882. */
  38883. var HTML5AudioSoundManager = new Class({
  38884. Extends: BaseSoundManager,
  38885. initialize:
  38886. function HTML5AudioSoundManager (game)
  38887. {
  38888. /**
  38889. * Flag indicating whether if there are no idle instances of HTML5 Audio tag,
  38890. * for any particular sound, if one of the used tags should be hijacked and used
  38891. * for succeeding playback or if succeeding Phaser.Sound.HTML5AudioSound#play
  38892. * call should be ignored.
  38893. *
  38894. * @name Phaser.Sound.HTML5AudioSoundManager#override
  38895. * @type {boolean}
  38896. * @default true
  38897. * @since 3.0.0
  38898. */
  38899. this.override = true;
  38900. /**
  38901. * Value representing time difference, in seconds, between calling
  38902. * play method on an audio tag and when it actually starts playing.
  38903. * It is used to achieve more accurate delayed sound playback.
  38904. *
  38905. * You might need to tweak this value to get the desired results
  38906. * since audio play delay varies depending on the browser/platform.
  38907. *
  38908. * @name Phaser.Sound.HTML5AudioSoundManager#audioPlayDelay
  38909. * @type {number}
  38910. * @default 0.1
  38911. * @since 3.0.0
  38912. */
  38913. this.audioPlayDelay = 0.1;
  38914. /**
  38915. * A value by which we should offset the loop end marker of the
  38916. * looping sound to compensate for lag, caused by changing audio
  38917. * tag playback position, in order to achieve gapless looping.
  38918. *
  38919. * You might need to tweak this value to get the desired results
  38920. * since loop lag varies depending on the browser/platform.
  38921. *
  38922. * @name Phaser.Sound.HTML5AudioSoundManager#loopEndOffset
  38923. * @type {number}
  38924. * @default 0.05
  38925. * @since 3.0.0
  38926. */
  38927. this.loopEndOffset = 0.05;
  38928. /**
  38929. * An array for keeping track of all the sounds
  38930. * that were paused when game lost focus.
  38931. *
  38932. * @name Phaser.Sound.HTML5AudioSoundManager#onBlurPausedSounds
  38933. * @type {Phaser.Sound.HTML5AudioSound[]}
  38934. * @private
  38935. * @default []
  38936. * @since 3.0.0
  38937. */
  38938. this.onBlurPausedSounds = [];
  38939. this.locked = 'ontouchstart' in window;
  38940. /**
  38941. * A queue of all actions performed on sound objects while audio was locked.
  38942. * Once the audio gets unlocked, after an explicit user interaction,
  38943. * all actions will be performed in chronological order.
  38944. * Array of object types: { sound: Phaser.Sound.HTML5AudioSound, name: string, value?: * }
  38945. *
  38946. * @name Phaser.Sound.HTML5AudioSoundManager#lockedActionsQueue
  38947. * @type {array}
  38948. * @private
  38949. * @since 3.0.0
  38950. */
  38951. this.lockedActionsQueue = this.locked ? [] : null;
  38952. /**
  38953. * Property that actually holds the value of global mute
  38954. * for HTML5 Audio sound manager implementation.
  38955. *
  38956. * @name Phaser.Sound.HTML5AudioSoundManager#_mute
  38957. * @type {boolean}
  38958. * @private
  38959. * @default false
  38960. * @since 3.0.0
  38961. */
  38962. this._mute = false;
  38963. /**
  38964. * Property that actually holds the value of global volume
  38965. * for HTML5 Audio sound manager implementation.
  38966. *
  38967. * @name Phaser.Sound.HTML5AudioSoundManager#_volume
  38968. * @type {boolean}
  38969. * @private
  38970. * @default 1
  38971. * @since 3.0.0
  38972. */
  38973. this._volume = 1;
  38974. BaseSoundManager.call(this, game);
  38975. },
  38976. /**
  38977. * Adds a new sound into the sound manager.
  38978. *
  38979. * @method Phaser.Sound.HTML5AudioSoundManager#add
  38980. * @since 3.0.0
  38981. *
  38982. * @param {string} key - Asset key for the sound.
  38983. * @param {SoundConfig} [config] - An optional config object containing default sound settings.
  38984. *
  38985. * @return {Phaser.Sound.HTML5AudioSound} The new sound instance.
  38986. */
  38987. add: function (key, config)
  38988. {
  38989. var sound = new HTML5AudioSound(this, key, config);
  38990. this.sounds.push(sound);
  38991. return sound;
  38992. },
  38993. /**
  38994. * Unlocks HTML5 Audio loading and playback on mobile
  38995. * devices on the initial explicit user interaction.
  38996. *
  38997. * @method Phaser.Sound.HTML5AudioSoundManager#unlock
  38998. * @since 3.0.0
  38999. */
  39000. unlock: function ()
  39001. {
  39002. this.locked = false;
  39003. var _this = this;
  39004. this.game.cache.audio.entries.each(function (key, tags)
  39005. {
  39006. for (var i = 0; i < tags.length; i++)
  39007. {
  39008. if (tags[i].dataset.locked === 'true')
  39009. {
  39010. _this.locked = true;
  39011. return false;
  39012. }
  39013. }
  39014. return true;
  39015. });
  39016. if (!this.locked)
  39017. {
  39018. return;
  39019. }
  39020. var moved = false;
  39021. var detectMove = function ()
  39022. {
  39023. moved = true;
  39024. };
  39025. var unlock = function ()
  39026. {
  39027. if (moved)
  39028. {
  39029. moved = false;
  39030. return;
  39031. }
  39032. document.body.removeEventListener('touchmove', detectMove);
  39033. document.body.removeEventListener('touchend', unlock);
  39034. var lockedTags = [];
  39035. _this.game.cache.audio.entries.each(function (key, tags)
  39036. {
  39037. for (var i = 0; i < tags.length; i++)
  39038. {
  39039. var tag = tags[i];
  39040. if (tag.dataset.locked === 'true')
  39041. {
  39042. lockedTags.push(tag);
  39043. }
  39044. }
  39045. return true;
  39046. });
  39047. if (lockedTags.length === 0)
  39048. {
  39049. return;
  39050. }
  39051. var lastTag = lockedTags[lockedTags.length - 1];
  39052. lastTag.oncanplaythrough = function ()
  39053. {
  39054. lastTag.oncanplaythrough = null;
  39055. lockedTags.forEach(function (tag)
  39056. {
  39057. tag.dataset.locked = 'false';
  39058. });
  39059. _this.unlocked = true;
  39060. };
  39061. lockedTags.forEach(function (tag)
  39062. {
  39063. tag.load();
  39064. });
  39065. };
  39066. this.once('unlocked', function ()
  39067. {
  39068. this.forEachActiveSound(function (sound)
  39069. {
  39070. if (sound.currentMarker === null && sound.duration === 0)
  39071. {
  39072. sound.duration = sound.tags[0].duration;
  39073. }
  39074. sound.totalDuration = sound.tags[0].duration;
  39075. });
  39076. while (this.lockedActionsQueue.length)
  39077. {
  39078. var lockedAction = this.lockedActionsQueue.shift();
  39079. if (lockedAction.sound[lockedAction.prop].apply)
  39080. {
  39081. lockedAction.sound[lockedAction.prop].apply(lockedAction.sound, lockedAction.value || []);
  39082. }
  39083. else
  39084. {
  39085. lockedAction.sound[lockedAction.prop] = lockedAction.value;
  39086. }
  39087. }
  39088. }, this);
  39089. document.body.addEventListener('touchmove', detectMove, false);
  39090. document.body.addEventListener('touchend', unlock, false);
  39091. },
  39092. /**
  39093. * Method used internally for pausing sound manager if
  39094. * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true.
  39095. *
  39096. * @method Phaser.Sound.HTML5AudioSoundManager#onBlur
  39097. * @protected
  39098. * @since 3.0.0
  39099. */
  39100. onBlur: function ()
  39101. {
  39102. this.forEachActiveSound(function (sound)
  39103. {
  39104. if (sound.isPlaying)
  39105. {
  39106. this.onBlurPausedSounds.push(sound);
  39107. sound.onBlur();
  39108. }
  39109. });
  39110. },
  39111. /**
  39112. * Method used internally for resuming sound manager if
  39113. * Phaser.Sound.HTML5AudioSoundManager#pauseOnBlur is set to true.
  39114. *
  39115. * @method Phaser.Sound.HTML5AudioSoundManager#onFocus
  39116. * @protected
  39117. * @since 3.0.0
  39118. */
  39119. onFocus: function ()
  39120. {
  39121. this.onBlurPausedSounds.forEach(function (sound)
  39122. {
  39123. sound.onFocus();
  39124. });
  39125. this.onBlurPausedSounds.length = 0;
  39126. },
  39127. /**
  39128. * Calls Phaser.Sound.BaseSoundManager#destroy method
  39129. * and cleans up all HTML5 Audio related stuff.
  39130. *
  39131. * @method Phaser.Sound.HTML5AudioSoundManager#destroy
  39132. * @since 3.0.0
  39133. */
  39134. destroy: function ()
  39135. {
  39136. BaseSoundManager.prototype.destroy.call(this);
  39137. this.onBlurPausedSounds.length = 0;
  39138. this.onBlurPausedSounds = null;
  39139. },
  39140. /**
  39141. * Method used internally by Phaser.Sound.HTML5AudioSound class methods and property setters
  39142. * to check if sound manager is locked and then either perform action immediately or queue it
  39143. * to be performed once the sound manager gets unlocked.
  39144. *
  39145. * @method Phaser.Sound.HTML5AudioSoundManager#isLocked
  39146. * @protected
  39147. * @since 3.0.0
  39148. *
  39149. * @param {Phaser.Sound.HTML5AudioSound} sound - Sound object on which to perform queued action.
  39150. * @param {string} prop - Name of the method to be called or property to be assigned a value to.
  39151. * @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.
  39152. *
  39153. * @return {boolean} Whether the sound manager is locked.
  39154. */
  39155. isLocked: function (sound, prop, value)
  39156. {
  39157. if (sound.tags[0].dataset.locked === 'true')
  39158. {
  39159. this.lockedActionsQueue.push({
  39160. sound: sound,
  39161. prop: prop,
  39162. value: value
  39163. });
  39164. return true;
  39165. }
  39166. return false;
  39167. },
  39168. /**
  39169. * @event Phaser.Sound.HTML5AudioSoundManager#muteEvent
  39170. * @param {Phaser.Sound.HTML5AudioSoundManager} soundManager - Reference to the sound manager that emitted event.
  39171. * @param {boolean} value - An updated value of Phaser.Sound.HTML5AudioSoundManager#mute property.
  39172. */
  39173. /**
  39174. * Sets the muted state of all this Sound Manager.
  39175. *
  39176. * @method Phaser.Sound.HTML5AudioSoundManager#setMute
  39177. * @fires Phaser.Sound.HTML5AudioSoundManager#muteEvent
  39178. * @since 3.3.0
  39179. *
  39180. * @param {boolean} value - `true` to mute all sounds, `false` to unmute them.
  39181. *
  39182. * @return {Phaser.Sound.HTML5AudioSoundManager} This Sound Manager.
  39183. */
  39184. setMute: function (value)
  39185. {
  39186. this.mute = value;
  39187. return this;
  39188. },
  39189. /**
  39190. * @name Phaser.Sound.HTML5AudioSoundManager#mute
  39191. * @type {boolean}
  39192. * @fires Phaser.Sound.HTML5AudioSoundManager#muteEvent
  39193. * @since 3.0.0
  39194. */
  39195. mute: {
  39196. get: function ()
  39197. {
  39198. return this._mute;
  39199. },
  39200. set: function (value)
  39201. {
  39202. this._mute = value;
  39203. this.forEachActiveSound(function (sound)
  39204. {
  39205. sound.updateMute();
  39206. });
  39207. this.emit('mute', this, value);
  39208. }
  39209. },
  39210. /**
  39211. * @event Phaser.Sound.HTML5AudioSoundManager#volumeEvent
  39212. * @param {Phaser.Sound.HTML5AudioSoundManager} soundManager - Reference to the sound manager that emitted event.
  39213. * @param {number} value - An updated value of Phaser.Sound.HTML5AudioSoundManager#volume property.
  39214. */
  39215. /**
  39216. * Sets the volume of this Sound Manager.
  39217. *
  39218. * @method Phaser.Sound.HTML5AudioSoundManager#setVolume
  39219. * @fires Phaser.Sound.HTML5AudioSoundManager#volumeEvent
  39220. * @since 3.3.0
  39221. *
  39222. * @param {number} value - The global volume of this Sound Manager.
  39223. *
  39224. * @return {Phaser.Sound.HTML5AudioSoundManager} This Sound Manager.
  39225. */
  39226. setVolume: function (value)
  39227. {
  39228. this.volume = value;
  39229. return this;
  39230. },
  39231. /**
  39232. * @name Phaser.Sound.HTML5AudioSoundManager#volume
  39233. * @type {number}
  39234. * @fires Phaser.Sound.HTML5AudioSoundManager#volumeEvent
  39235. * @since 3.0.0
  39236. */
  39237. volume: {
  39238. get: function ()
  39239. {
  39240. return this._volume;
  39241. },
  39242. set: function (value)
  39243. {
  39244. this._volume = value;
  39245. this.forEachActiveSound(function (sound)
  39246. {
  39247. sound.updateVolume();
  39248. });
  39249. this.emit('volume', this, value);
  39250. }
  39251. }
  39252. });
  39253. module.exports = HTML5AudioSoundManager;
  39254. /***/ }),
  39255. /* 196 */
  39256. /***/ (function(module, exports, __webpack_require__) {
  39257. /**
  39258. * @author Richard Davey <rich@photonstorm.com>
  39259. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  39260. * @copyright 2018 Photon Storm Ltd.
  39261. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  39262. */
  39263. var HTML5AudioSoundManager = __webpack_require__(195);
  39264. var NoAudioSoundManager = __webpack_require__(193);
  39265. var WebAudioSoundManager = __webpack_require__(191);
  39266. /**
  39267. * Creates a Web Audio, HTML5 Audio or No Audio Sound Manager based on config and device settings.
  39268. *
  39269. * Be aware of https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
  39270. *
  39271. * @function Phaser.Sound.SoundManagerCreator
  39272. * @since 3.0.0
  39273. *
  39274. * @param {Phaser.Game} game - Reference to the current game instance.
  39275. */
  39276. var SoundManagerCreator = {
  39277. create: function (game)
  39278. {
  39279. var audioConfig = game.config.audio;
  39280. var deviceAudio = game.device.audio;
  39281. if ((audioConfig && audioConfig.noAudio) || (!deviceAudio.webAudio && !deviceAudio.audioData))
  39282. {
  39283. return new NoAudioSoundManager(game);
  39284. }
  39285. if (deviceAudio.webAudio && !(audioConfig && audioConfig.disableWebAudio))
  39286. {
  39287. return new WebAudioSoundManager(game);
  39288. }
  39289. return new HTML5AudioSoundManager(game);
  39290. }
  39291. };
  39292. module.exports = SoundManagerCreator;
  39293. /***/ }),
  39294. /* 197 */
  39295. /***/ (function(module, exports, __webpack_require__) {
  39296. /**
  39297. * @author Richard Davey <rich@photonstorm.com>
  39298. * @copyright 2018 Photon Storm Ltd.
  39299. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  39300. */
  39301. var CONST = __webpack_require__(79);
  39302. var GetValue = __webpack_require__(4);
  39303. var Merge = __webpack_require__(94);
  39304. var InjectionMap = __webpack_require__(486);
  39305. /**
  39306. * @namespace Phaser.Scenes.Settings
  39307. */
  39308. /**
  39309. * @typedef {object} Phaser.Scenes.Settings.Config
  39310. *
  39311. * @property {string} [key] - [description]
  39312. * @property {boolean} [active=false] - [description]
  39313. * @property {boolean} [visible=true] - [description]
  39314. * @property {(false|Phaser.Loader.FileTypes.PackFileConfig)} [pack=false] - [description]
  39315. * @property {?(InputJSONCameraObject|InputJSONCameraObject[])} [cameras=null] - [description]
  39316. * @property {Object.<string, string>} [map] - Overwrites the default injection map for a scene.
  39317. * @property {Object.<string, string>} [mapAdd] - Extends the injection map for a scene.
  39318. * @property {object} [physics={}] - [description]
  39319. * @property {object} [loader={}] - [description]
  39320. * @property {(false|*)} [plugins=false] - [description]
  39321. */
  39322. /**
  39323. * @typedef {object} Phaser.Scenes.Settings.Object
  39324. *
  39325. * @property {number} status - [description]
  39326. * @property {string} key - [description]
  39327. * @property {boolean} active - [description]
  39328. * @property {boolean} visible - [description]
  39329. * @property {boolean} isBooted - [description]
  39330. * @property {boolean} isTransition - [description]
  39331. * @property {?Phaser.Scene} transitionFrom - [description]
  39332. * @property {integer} transitionDuration - [description]
  39333. * @property {boolean} transitionAllowInput - [description]
  39334. * @property {object} data - [description]
  39335. * @property {(false|Phaser.Loader.FileTypes.PackFileConfig)} pack - [description]
  39336. * @property {?(InputJSONCameraObject|InputJSONCameraObject[])} cameras - [description]
  39337. * @property {Object.<string, string>} map - [description]
  39338. * @property {object} physics - [description]
  39339. * @property {object} loader - [description]
  39340. * @property {(false|*)} plugins - [description]
  39341. */
  39342. var Settings = {
  39343. /**
  39344. * Takes a Scene configuration object and returns a fully formed Systems object.
  39345. *
  39346. * @function Phaser.Scenes.Settings.create
  39347. * @since 3.0.0
  39348. *
  39349. * @param {(string|Phaser.Scenes.Settings.Config)} config - [description]
  39350. *
  39351. * @return {Phaser.Scenes.Settings.Object} [description]
  39352. */
  39353. create: function (config)
  39354. {
  39355. if (typeof config === 'string')
  39356. {
  39357. config = { key: config };
  39358. }
  39359. else if (config === undefined)
  39360. {
  39361. // Pass the 'hasOwnProperty' checks
  39362. config = {};
  39363. }
  39364. return {
  39365. status: CONST.PENDING,
  39366. key: GetValue(config, 'key', ''),
  39367. active: GetValue(config, 'active', false),
  39368. visible: GetValue(config, 'visible', true),
  39369. isBooted: false,
  39370. isTransition: false,
  39371. transitionFrom: null,
  39372. transitionDuration: 0,
  39373. transitionAllowInput: true,
  39374. // Loader payload array
  39375. data: {},
  39376. pack: GetValue(config, 'pack', false),
  39377. // Cameras
  39378. cameras: GetValue(config, 'cameras', null),
  39379. // Scene Property Injection Map
  39380. map: GetValue(config, 'map', Merge(InjectionMap, GetValue(config, 'mapAdd', {}))),
  39381. // Physics
  39382. physics: GetValue(config, 'physics', {}),
  39383. // Loader
  39384. loader: GetValue(config, 'loader', {}),
  39385. // Plugins
  39386. plugins: GetValue(config, 'plugins', false),
  39387. // Input
  39388. input: GetValue(config, 'input', {})
  39389. };
  39390. }
  39391. };
  39392. module.exports = Settings;
  39393. /***/ }),
  39394. /* 198 */
  39395. /***/ (function(module, exports, __webpack_require__) {
  39396. /**
  39397. * @author Richard Davey <rich@photonstorm.com>
  39398. * @copyright 2018 Photon Storm Ltd.
  39399. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  39400. */
  39401. var Class = __webpack_require__(0);
  39402. var Systems = __webpack_require__(118);
  39403. /**
  39404. * @classdesc
  39405. * [description]
  39406. *
  39407. * @class Scene
  39408. * @memberOf Phaser
  39409. * @constructor
  39410. * @since 3.0.0
  39411. *
  39412. * @param {(string|Phaser.Scenes.Settings.Config)} config - Scene specific configuration settings.
  39413. */
  39414. var Scene = new Class({
  39415. initialize:
  39416. function Scene (config)
  39417. {
  39418. /**
  39419. * The Scene Systems. You must never overwrite this property, or all hell will break lose.
  39420. *
  39421. * @name Phaser.Scene#sys
  39422. * @type {Phaser.Scenes.Systems}
  39423. * @since 3.0.0
  39424. */
  39425. this.sys = new Systems(this, config);
  39426. /**
  39427. * A reference to the Phaser.Game instance.
  39428. * This property will only be available if defined in the Scene Injection Map.
  39429. *
  39430. * @name Phaser.Scene#game
  39431. * @type {Phaser.Game}
  39432. * @since 3.0.0
  39433. */
  39434. this.game;
  39435. /**
  39436. * A reference to the global Animation Manager.
  39437. * This property will only be available if defined in the Scene Injection Map.
  39438. *
  39439. * @name Phaser.Scene#anims
  39440. * @type {Phaser.Animations.AnimationManager}
  39441. * @since 3.0.0
  39442. */
  39443. this.anims;
  39444. /**
  39445. * A reference to the global Cache.
  39446. * This property will only be available if defined in the Scene Injection Map.
  39447. *
  39448. * @name Phaser.Scene#cache
  39449. * @type {Phaser.Cache.CacheManager}
  39450. * @since 3.0.0
  39451. */
  39452. this.cache;
  39453. /**
  39454. * A reference to the game level Data Manager.
  39455. * This property will only be available if defined in the Scene Injection Map.
  39456. *
  39457. * @name Phaser.Scene#registry
  39458. * @type {Phaser.Data.DataManager}
  39459. * @since 3.0.0
  39460. */
  39461. this.registry;
  39462. /**
  39463. * A reference to the Sound Manager.
  39464. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  39465. *
  39466. * @name Phaser.Scene#sound
  39467. * @type {Phaser.Sound.BaseSoundManager}
  39468. * @since 3.0.0
  39469. */
  39470. this.sound;
  39471. /**
  39472. * A reference to the Texture Manager.
  39473. * This property will only be available if defined in the Scene Injection Map.
  39474. *
  39475. * @name Phaser.Scene#textures
  39476. * @type {Phaser.Textures.TextureManager}
  39477. * @since 3.0.0
  39478. */
  39479. this.textures;
  39480. /**
  39481. * A scene level Event Emitter.
  39482. * This property will only be available if defined in the Scene Injection Map.
  39483. *
  39484. * @name Phaser.Scene#events
  39485. * @type {Phaser.Events.EventEmitter}
  39486. * @since 3.0.0
  39487. */
  39488. this.events;
  39489. /**
  39490. * A scene level Camera System.
  39491. * This property will only be available if defined in the Scene Injection Map.
  39492. *
  39493. * @name Phaser.Scene#cameras
  39494. * @type {Phaser.Cameras.Scene2D.CameraManager}
  39495. * @since 3.0.0
  39496. */
  39497. this.cameras;
  39498. /**
  39499. * A scene level 3D Camera System.
  39500. * This property will only be available if defined in the Scene Injection Map.
  39501. *
  39502. * @name Phaser.Scene#cameras3d
  39503. * @type {Phaser.Cameras.Sprite3D.CameraManager}
  39504. * @since 3.0.0
  39505. */
  39506. this.cameras3d;
  39507. /**
  39508. * A scene level Game Object Factory.
  39509. * This property will only be available if defined in the Scene Injection Map.
  39510. *
  39511. * @name Phaser.Scene#add
  39512. * @type {Phaser.GameObjects.GameObjectFactory}
  39513. * @since 3.0.0
  39514. */
  39515. this.add;
  39516. /**
  39517. * A scene level Game Object Creator.
  39518. * This property will only be available if defined in the Scene Injection Map.
  39519. *
  39520. * @name Phaser.Scene#make
  39521. * @type {Phaser.GameObjects.GameObjectCreator}
  39522. * @since 3.0.0
  39523. */
  39524. this.make;
  39525. /**
  39526. * A reference to the Scene Manager Plugin.
  39527. * This property will only be available if defined in the Scene Injection Map.
  39528. *
  39529. * @name Phaser.Scene#scene
  39530. * @type {Phaser.Scenes.ScenePlugin}
  39531. * @since 3.0.0
  39532. */
  39533. this.scene;
  39534. /**
  39535. * A scene level Game Object Display List.
  39536. * This property will only be available if defined in the Scene Injection Map.
  39537. *
  39538. * @name Phaser.Scene#children
  39539. * @type {Phaser.GameObjects.DisplayList}
  39540. * @since 3.0.0
  39541. */
  39542. this.children;
  39543. /**
  39544. * A scene level Lights Manager Plugin.
  39545. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  39546. *
  39547. * @name Phaser.Scene#lights
  39548. * @type {Phaser.GameObjects.LightsManager}
  39549. * @since 3.0.0
  39550. */
  39551. this.lights;
  39552. /**
  39553. * A scene level Data Manager Plugin.
  39554. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  39555. *
  39556. * @name Phaser.Scene#data
  39557. * @type {Phaser.Data.DataManager}
  39558. * @since 3.0.0
  39559. */
  39560. this.data;
  39561. /**
  39562. * A scene level Input Manager Plugin.
  39563. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  39564. *
  39565. * @name Phaser.Scene#input
  39566. * @type {Phaser.Input.InputPlugin}
  39567. * @since 3.0.0
  39568. */
  39569. this.input;
  39570. /**
  39571. * A scene level Loader Plugin.
  39572. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  39573. *
  39574. * @name Phaser.Scene#load
  39575. * @type {Phaser.Loader.LoaderPlugin}
  39576. * @since 3.0.0
  39577. */
  39578. this.load;
  39579. /**
  39580. * A scene level Time and Clock Plugin.
  39581. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  39582. *
  39583. * @name Phaser.Scene#time
  39584. * @type {Phaser.Time.Clock}
  39585. * @since 3.0.0
  39586. */
  39587. this.time;
  39588. /**
  39589. * A scene level Tween Manager Plugin.
  39590. * This property will only be available if defined in the Scene Injection Map and the plugin is installed.
  39591. *
  39592. * @name Phaser.Scene#tweens
  39593. * @type {Phaser.Tweens.TweenManager}
  39594. * @since 3.0.0
  39595. */
  39596. this.tweens;
  39597. /**
  39598. * A scene level Arcade Physics Plugin.
  39599. * This property will only be available if defined in the Scene Injection Map, the plugin is installed and configured.
  39600. *
  39601. * @name Phaser.Scene#physics
  39602. * @type {Phaser.Physics.Arcade.ArcadePhysics}
  39603. * @since 3.0.0
  39604. */
  39605. this.physics;
  39606. /**
  39607. * A scene level Impact Physics Plugin.
  39608. * This property will only be available if defined in the Scene Injection Map, the plugin is installed and configured.
  39609. *
  39610. * @name Phaser.Scene#impact
  39611. * @type {Phaser.Physics.Impact.ImpactPhysics}
  39612. * @since 3.0.0
  39613. */
  39614. this.impact;
  39615. /**
  39616. * A scene level Matter Physics Plugin.
  39617. * This property will only be available if defined in the Scene Injection Map, the plugin is installed and configured.
  39618. *
  39619. * @name Phaser.Scene#matter
  39620. * @type {Phaser.Physics.Matter.MatterPhysics}
  39621. * @since 3.0.0
  39622. */
  39623. this.matter;
  39624. },
  39625. /**
  39626. * Should be overridden by your own Scenes.
  39627. *
  39628. * @method Phaser.Scene#update
  39629. * @override
  39630. * @since 3.0.0
  39631. *
  39632. * @param {number} time - [description]
  39633. * @param {number} delta - [description]
  39634. */
  39635. update: function ()
  39636. {
  39637. }
  39638. });
  39639. module.exports = Scene;
  39640. /***/ }),
  39641. /* 199 */
  39642. /***/ (function(module, exports, __webpack_require__) {
  39643. /**
  39644. * @author Richard Davey <rich@photonstorm.com>
  39645. * @copyright 2018 Photon Storm Ltd.
  39646. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  39647. */
  39648. var Class = __webpack_require__(0);
  39649. var CONST = __webpack_require__(79);
  39650. var GetValue = __webpack_require__(4);
  39651. var NOOP = __webpack_require__(3);
  39652. var Scene = __webpack_require__(198);
  39653. var Systems = __webpack_require__(118);
  39654. /**
  39655. * @classdesc
  39656. * The Scene Manager.
  39657. *
  39658. * The Scene Manager is a Game level system, responsible for creating, processing and updating all of the
  39659. * Scenes in a Game instance.
  39660. *
  39661. *
  39662. * @class SceneManager
  39663. * @memberOf Phaser.Scenes
  39664. * @constructor
  39665. * @since 3.0.0
  39666. *
  39667. * @param {Phaser.Game} game - The Phaser.Game instance this Scene Manager belongs to.
  39668. * @param {object} sceneConfig - Scene specific configuration settings.
  39669. */
  39670. var SceneManager = new Class({
  39671. initialize:
  39672. function SceneManager (game, sceneConfig)
  39673. {
  39674. /**
  39675. * The Game that this SceneManager belongs to.
  39676. *
  39677. * @name Phaser.Scenes.SceneManager#game
  39678. * @type {Phaser.Game}
  39679. * @since 3.0.0
  39680. */
  39681. this.game = game;
  39682. /**
  39683. * An object that maps the keys to the scene so we can quickly get a scene from a key without iteration.
  39684. *
  39685. * @name Phaser.Scenes.SceneManager#keys
  39686. * @type {object}
  39687. * @since 3.0.0
  39688. */
  39689. this.keys = {};
  39690. /**
  39691. * The array in which all of the scenes are kept.
  39692. *
  39693. * @name Phaser.Scenes.SceneManager#scenes
  39694. * @type {array}
  39695. * @since 3.0.0
  39696. */
  39697. this.scenes = [];
  39698. /**
  39699. * Scenes pending to be added are stored in here until the manager has time to add it.
  39700. *
  39701. * @name Phaser.Scenes.SceneManager#_pending
  39702. * @type {array}
  39703. * @private
  39704. * @since 3.0.0
  39705. */
  39706. this._pending = [];
  39707. /**
  39708. * An array of scenes waiting to be started once the game has booted.
  39709. *
  39710. * @name Phaser.Scenes.SceneManager#_start
  39711. * @type {array}
  39712. * @private
  39713. * @since 3.0.0
  39714. */
  39715. this._start = [];
  39716. /**
  39717. * An operations queue, because we don't manipulate the scenes array during processing.
  39718. *
  39719. * @name Phaser.Scenes.SceneManager#_queue
  39720. * @type {array}
  39721. * @private
  39722. * @since 3.0.0
  39723. */
  39724. this._queue = [];
  39725. /**
  39726. * Boot time data to merge.
  39727. *
  39728. * @name Phaser.Scenes.SceneManager#_data
  39729. * @type {object}
  39730. * @private
  39731. * @since 3.4.0
  39732. */
  39733. this._data = {};
  39734. /**
  39735. * Is the Scene Manager actively processing the Scenes list?
  39736. *
  39737. * @name Phaser.Scenes.SceneManager#isProcessing
  39738. * @type {boolean}
  39739. * @default false
  39740. * @readOnly
  39741. * @since 3.0.0
  39742. */
  39743. this.isProcessing = false;
  39744. /**
  39745. * Has the Scene Manager properly started?
  39746. *
  39747. * @name Phaser.Scenes.SceneManager#isBooted
  39748. * @type {boolean}
  39749. * @default false
  39750. * @readOnly
  39751. * @since 3.4.0
  39752. */
  39753. this.isBooted = false;
  39754. if (sceneConfig)
  39755. {
  39756. if (!Array.isArray(sceneConfig))
  39757. {
  39758. sceneConfig = [ sceneConfig ];
  39759. }
  39760. for (var i = 0; i < sceneConfig.length; i++)
  39761. {
  39762. // The i === 0 part just autostarts the first Scene given (unless it says otherwise in its config)
  39763. this._pending.push({
  39764. key: 'default',
  39765. scene: sceneConfig[i],
  39766. autoStart: (i === 0),
  39767. data: {}
  39768. });
  39769. }
  39770. }
  39771. game.events.once('ready', this.bootQueue, this);
  39772. },
  39773. /**
  39774. * Internal first-time Scene boot handler.
  39775. *
  39776. * @method Phaser.Scenes.SceneManager#bootQueue
  39777. * @private
  39778. * @since 3.2.0
  39779. */
  39780. bootQueue: function ()
  39781. {
  39782. if (this.isBooted)
  39783. {
  39784. return;
  39785. }
  39786. var i;
  39787. var entry;
  39788. var key;
  39789. var sceneConfig;
  39790. for (i = 0; i < this._pending.length; i++)
  39791. {
  39792. entry = this._pending[i];
  39793. key = entry.key;
  39794. sceneConfig = entry.scene;
  39795. var newScene;
  39796. if (sceneConfig instanceof Scene)
  39797. {
  39798. newScene = this.createSceneFromInstance(key, sceneConfig);
  39799. }
  39800. else if (typeof sceneConfig === 'object')
  39801. {
  39802. newScene = this.createSceneFromObject(key, sceneConfig);
  39803. }
  39804. else if (typeof sceneConfig === 'function')
  39805. {
  39806. newScene = this.createSceneFromFunction(key, sceneConfig);
  39807. }
  39808. // Replace key in case the scene changed it
  39809. key = newScene.sys.settings.key;
  39810. this.keys[key] = newScene;
  39811. this.scenes.push(newScene);
  39812. // Any data to inject?
  39813. if (this._data[key])
  39814. {
  39815. newScene.sys.settings.data = this._data[key].data;
  39816. if (this._data[key].autoStart)
  39817. {
  39818. entry.autoStart = true;
  39819. }
  39820. }
  39821. if (entry.autoStart || newScene.sys.settings.active)
  39822. {
  39823. this._start.push(key);
  39824. }
  39825. }
  39826. // Clear the pending lists
  39827. this._pending.length = 0;
  39828. this._data = {};
  39829. this.isBooted = true;
  39830. // _start might have been populated by the above
  39831. for (i = 0; i < this._start.length; i++)
  39832. {
  39833. entry = this._start[i];
  39834. this.start(entry);
  39835. }
  39836. this._start.length = 0;
  39837. },
  39838. /**
  39839. * Process the Scene operations queue.
  39840. *
  39841. * @method Phaser.Scenes.SceneManager#processQueue
  39842. * @since 3.0.0
  39843. */
  39844. processQueue: function ()
  39845. {
  39846. var pendingLength = this._pending.length;
  39847. var queueLength = this._queue.length;
  39848. if (pendingLength === 0 && queueLength === 0)
  39849. {
  39850. return;
  39851. }
  39852. var i;
  39853. var entry;
  39854. if (pendingLength)
  39855. {
  39856. for (i = 0; i < pendingLength; i++)
  39857. {
  39858. entry = this._pending[i];
  39859. this.add(entry.key, entry.scene, entry.autoStart, entry.data);
  39860. }
  39861. // _start might have been populated by this.add
  39862. for (i = 0; i < this._start.length; i++)
  39863. {
  39864. entry = this._start[i];
  39865. this.start(entry);
  39866. }
  39867. // Clear the pending lists
  39868. this._start.length = 0;
  39869. this._pending.length = 0;
  39870. return;
  39871. }
  39872. for (i = 0; i < this._queue.length; i++)
  39873. {
  39874. entry = this._queue[i];
  39875. this[entry.op](entry.keyA, entry.keyB);
  39876. }
  39877. this._queue.length = 0;
  39878. },
  39879. /**
  39880. * Adds a new Scene into the SceneManager.
  39881. * You must give each Scene a unique key by which you'll identify it.
  39882. *
  39883. * The `sceneConfig` can be:
  39884. *
  39885. * * A `Phaser.Scene` object, or an object that extends it.
  39886. * * A plain JavaScript object
  39887. * * A JavaScript ES6 Class that extends `Phaser.Scene`
  39888. * * A JavaScript ES5 prototype based Class
  39889. * * A JavaScript function
  39890. *
  39891. * If a function is given then a new Scene will be created by calling it.
  39892. *
  39893. * @method Phaser.Scenes.SceneManager#add
  39894. * @since 3.0.0
  39895. *
  39896. * @param {string} key - A unique key used to reference the Scene, i.e. `MainMenu` or `Level1`.
  39897. * @param {(Phaser.Scene|Phaser.Scenes.Settings.Config|function)} sceneConfig - The config for the Scene
  39898. * @param {boolean} [autoStart=false] - If `true` the Scene will be started immediately after being added.
  39899. * @param {object} [data] - Optional data object. This will be set as Scene.settings.data and passed to `Scene.init`.
  39900. *
  39901. * @return {?Phaser.Scene} The added Scene, if it was added immediately, otherwise `null`.
  39902. */
  39903. add: function (key, sceneConfig, autoStart, data)
  39904. {
  39905. if (autoStart === undefined) { autoStart = false; }
  39906. if (data === undefined) { data = {}; }
  39907. // If processing or not booted then put scene into a holding pattern
  39908. if (this.isProcessing || !this.isBooted)
  39909. {
  39910. this._pending.push({
  39911. key: key,
  39912. scene: sceneConfig,
  39913. autoStart: autoStart,
  39914. data: data
  39915. });
  39916. if (!this.isBooted)
  39917. {
  39918. this._data[key] = { data: data };
  39919. }
  39920. return null;
  39921. }
  39922. key = this.getKey(key, sceneConfig);
  39923. var newScene;
  39924. if (sceneConfig instanceof Scene)
  39925. {
  39926. newScene = this.createSceneFromInstance(key, sceneConfig);
  39927. }
  39928. else if (typeof sceneConfig === 'object')
  39929. {
  39930. sceneConfig.key = key;
  39931. newScene = this.createSceneFromObject(key, sceneConfig);
  39932. }
  39933. else if (typeof sceneConfig === 'function')
  39934. {
  39935. newScene = this.createSceneFromFunction(key, sceneConfig);
  39936. }
  39937. // Any data to inject?
  39938. newScene.sys.settings.data = data;
  39939. // Replace key in case the scene changed it
  39940. key = newScene.sys.settings.key;
  39941. this.keys[key] = newScene;
  39942. this.scenes.push(newScene);
  39943. if (autoStart || newScene.sys.settings.active)
  39944. {
  39945. if (this._pending.length)
  39946. {
  39947. this._start.push(key);
  39948. }
  39949. else
  39950. {
  39951. this.start(key);
  39952. }
  39953. }
  39954. return newScene;
  39955. },
  39956. /**
  39957. * Removes a Scene from the SceneManager.
  39958. *
  39959. * The Scene is removed from the local scenes array, it's key is cleared from the keys
  39960. * cache and Scene.Systems.destroy is then called on it.
  39961. *
  39962. * If the SceneManager is processing the Scenes when this method is called it wil
  39963. * queue the operation for the next update sequence.
  39964. *
  39965. * @method Phaser.Scenes.SceneManager#remove
  39966. * @since 3.2.0
  39967. *
  39968. * @param {(string|Phaser.Scene)} scene - The Scene to be removed.
  39969. *
  39970. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  39971. */
  39972. remove: function (key)
  39973. {
  39974. if (this.isProcessing)
  39975. {
  39976. this._queue.push({ op: 'remove', keyA: key, keyB: null });
  39977. }
  39978. else
  39979. {
  39980. var sceneToRemove = this.getScene(key);
  39981. if (!sceneToRemove || sceneToRemove.sys.isTransitioning())
  39982. {
  39983. return this;
  39984. }
  39985. var index = this.scenes.indexOf(sceneToRemove);
  39986. var sceneKey = sceneToRemove.sys.settings.key;
  39987. if (index > -1)
  39988. {
  39989. delete this.keys[sceneKey];
  39990. this.scenes.splice(index, 1);
  39991. if (this._start.indexOf(sceneKey) > -1)
  39992. {
  39993. index = this._start.indexOf(sceneKey);
  39994. this._start.splice(index, 1);
  39995. }
  39996. sceneToRemove.sys.destroy();
  39997. }
  39998. }
  39999. return this;
  40000. },
  40001. /**
  40002. * Boot the given Scene.
  40003. *
  40004. * @method Phaser.Scenes.SceneManager#bootScene
  40005. * @private
  40006. * @since 3.0.0
  40007. *
  40008. * @param {Phaser.Scene} scene - The Scene to boot.
  40009. */
  40010. bootScene: function (scene)
  40011. {
  40012. var sys = scene.sys;
  40013. var settings = sys.settings;
  40014. if (scene.init)
  40015. {
  40016. scene.init.call(scene, settings.data);
  40017. settings.status = CONST.INIT;
  40018. if (settings.isTransition)
  40019. {
  40020. sys.events.emit('transitioninit', settings.transitionFrom, settings.transitionDuration);
  40021. }
  40022. }
  40023. var loader;
  40024. if (sys.load)
  40025. {
  40026. loader = sys.load;
  40027. loader.reset();
  40028. }
  40029. if (loader && scene.preload)
  40030. {
  40031. scene.preload.call(scene);
  40032. // Is the loader empty?
  40033. if (loader.list.size === 0)
  40034. {
  40035. this.create(scene);
  40036. }
  40037. else
  40038. {
  40039. settings.status = CONST.LOADING;
  40040. // Start the loader going as we have something in the queue
  40041. loader.once('complete', this.loadComplete, this);
  40042. loader.start();
  40043. }
  40044. }
  40045. else
  40046. {
  40047. // No preload? Then there was nothing to load either
  40048. this.create(scene);
  40049. }
  40050. },
  40051. /**
  40052. * Handles load completion for a Scene's Loader.
  40053. *
  40054. * Starts the Scene that the Loader belongs to.
  40055. *
  40056. * @method Phaser.Scenes.SceneManager#loadComplete
  40057. * @private
  40058. * @since 3.0.0
  40059. *
  40060. * @param {Phaser.Loader.LoaderPlugin} loader - The loader that has completed loading.
  40061. */
  40062. loadComplete: function (loader)
  40063. {
  40064. var scene = loader.scene;
  40065. // Try to unlock HTML5 sounds every time any loader completes
  40066. if (this.game.sound.onBlurPausedSounds)
  40067. {
  40068. this.game.sound.unlock();
  40069. }
  40070. this.create(scene);
  40071. },
  40072. /**
  40073. * Handle payload completion for a Scene.
  40074. *
  40075. * @method Phaser.Scenes.SceneManager#payloadComplete
  40076. * @private
  40077. * @since 3.0.0
  40078. *
  40079. * @param {Phaser.Loader.LoaderPlugin} loader - The loader that has completed loading its Scene's payload.
  40080. */
  40081. payloadComplete: function (loader)
  40082. {
  40083. this.bootScene(loader.scene);
  40084. },
  40085. /**
  40086. * Updates the Scenes.
  40087. *
  40088. * @method Phaser.Scenes.SceneManager#update
  40089. * @since 3.0.0
  40090. *
  40091. * @param {number} time - Time elapsed.
  40092. * @param {number} delta - Delta time from the last update.
  40093. */
  40094. update: function (time, delta)
  40095. {
  40096. this.processQueue();
  40097. this.isProcessing = true;
  40098. // Loop through the active scenes in reverse order
  40099. for (var i = this.scenes.length - 1; i >= 0; i--)
  40100. {
  40101. var sys = this.scenes[i].sys;
  40102. if (sys.settings.status > CONST.START && sys.settings.status <= CONST.RUNNING)
  40103. {
  40104. sys.step(time, delta);
  40105. }
  40106. }
  40107. },
  40108. /**
  40109. * Informs the Scenes of the Game being resized.
  40110. *
  40111. * @method Phaser.Scenes.SceneManager#resize
  40112. * @since 3.2.0
  40113. *
  40114. * @param {number} width - The new width of the game.
  40115. * @param {number} height - The new height of the game.
  40116. */
  40117. resize: function (width, height)
  40118. {
  40119. // Loop through the scenes in forward order
  40120. for (var i = 0; i < this.scenes.length; i++)
  40121. {
  40122. var sys = this.scenes[i].sys;
  40123. sys.resize(width, height);
  40124. }
  40125. },
  40126. /**
  40127. * Renders the Scenes.
  40128. *
  40129. * @method Phaser.Scenes.SceneManager#render
  40130. * @since 3.0.0
  40131. *
  40132. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - The renderer to use.
  40133. */
  40134. render: function (renderer)
  40135. {
  40136. // Loop through the scenes in forward order
  40137. for (var i = 0; i < this.scenes.length; i++)
  40138. {
  40139. var sys = this.scenes[i].sys;
  40140. if (sys.settings.visible && sys.settings.status >= CONST.LOADING && sys.settings.status < CONST.SLEEPING)
  40141. {
  40142. sys.render(renderer);
  40143. }
  40144. }
  40145. this.isProcessing = false;
  40146. },
  40147. /**
  40148. * Calls the given Scene's {@link Phaser.Scene#create} method and updates its status.
  40149. *
  40150. * @method Phaser.Scenes.SceneManager#create
  40151. * @private
  40152. * @since 3.0.0
  40153. *
  40154. * @param {Phaser.Scene} scene - The Scene to create.
  40155. */
  40156. create: function (scene)
  40157. {
  40158. var sys = scene.sys;
  40159. var settings = sys.settings;
  40160. if (scene.create)
  40161. {
  40162. settings.status = CONST.CREATING;
  40163. scene.create.call(scene, settings.data);
  40164. if (settings.isTransition)
  40165. {
  40166. sys.events.emit('transitionstart', settings.transitionFrom, settings.transitionDuration);
  40167. }
  40168. }
  40169. // If the Scene has an update function we'll set it now, otherwise it'll remain as NOOP
  40170. if (scene.update)
  40171. {
  40172. sys.sceneUpdate = scene.update;
  40173. }
  40174. settings.status = CONST.RUNNING;
  40175. },
  40176. /**
  40177. * Creates and initializes a Scene from a function.
  40178. *
  40179. * @method Phaser.Scenes.SceneManager#createSceneFromFunction
  40180. * @private
  40181. * @since 3.0.0
  40182. *
  40183. * @param {string} key - The key of the Scene.
  40184. * @param {function} scene - The function to create the Scene from.
  40185. *
  40186. * @return {Phaser.Scene} The created Scene.
  40187. */
  40188. createSceneFromFunction: function (key, scene)
  40189. {
  40190. var newScene = new scene();
  40191. if (newScene instanceof Scene)
  40192. {
  40193. var configKey = newScene.sys.settings.key;
  40194. if (configKey !== '')
  40195. {
  40196. key = configKey;
  40197. }
  40198. if (this.keys.hasOwnProperty(key))
  40199. {
  40200. throw new Error('Cannot add a Scene with duplicate key: ' + key);
  40201. }
  40202. return this.createSceneFromInstance(key, newScene);
  40203. }
  40204. else
  40205. {
  40206. newScene.sys = new Systems(newScene);
  40207. newScene.sys.settings.key = key;
  40208. newScene.sys.init(this.game);
  40209. return newScene;
  40210. }
  40211. },
  40212. /**
  40213. * Creates and initializes a Scene instance.
  40214. *
  40215. * @method Phaser.Scenes.SceneManager#createSceneFromInstance
  40216. * @private
  40217. * @since 3.0.0
  40218. *
  40219. * @param {string} key - The key of the Scene.
  40220. * @param {Phaser.Scene} newScene - The Scene instance.
  40221. *
  40222. * @return {Phaser.Scene} The created Scene.
  40223. */
  40224. createSceneFromInstance: function (key, newScene)
  40225. {
  40226. var configKey = newScene.sys.settings.key;
  40227. if (configKey !== '')
  40228. {
  40229. key = configKey;
  40230. }
  40231. else
  40232. {
  40233. newScene.sys.settings.key = key;
  40234. }
  40235. newScene.sys.init(this.game);
  40236. return newScene;
  40237. },
  40238. /**
  40239. * Creates and initializes a Scene from an Object definition.
  40240. *
  40241. * @method Phaser.Scenes.SceneManager#createSceneFromObject
  40242. * @private
  40243. * @since 3.0.0
  40244. *
  40245. * @param {string} key - The key of the Scene.
  40246. * @param {(string|Phaser.Scenes.Settings.Config)} sceneConfig - The Scene config.
  40247. *
  40248. * @return {Phaser.Scene} The created Scene.
  40249. */
  40250. createSceneFromObject: function (key, sceneConfig)
  40251. {
  40252. var newScene = new Scene(sceneConfig);
  40253. var configKey = newScene.sys.settings.key;
  40254. if (configKey !== '')
  40255. {
  40256. key = configKey;
  40257. }
  40258. else
  40259. {
  40260. newScene.sys.settings.key = key;
  40261. }
  40262. newScene.sys.init(this.game);
  40263. // Extract callbacks
  40264. var defaults = [ 'init', 'preload', 'create', 'update', 'render' ];
  40265. for (var i = 0; i < defaults.length; i++)
  40266. {
  40267. var sceneCallback = GetValue(sceneConfig, defaults[i], null);
  40268. if (sceneCallback)
  40269. {
  40270. newScene[defaults[i]] = sceneCallback;
  40271. }
  40272. }
  40273. // Now let's move across any other functions or properties that may exist in the extend object:
  40274. /*
  40275. scene: {
  40276. preload: preload,
  40277. create: create,
  40278. extend: {
  40279. hello: 1,
  40280. test: 'atari',
  40281. addImage: addImage
  40282. }
  40283. }
  40284. */
  40285. if (sceneConfig.hasOwnProperty('extend'))
  40286. {
  40287. for (var propertyKey in sceneConfig.extend)
  40288. {
  40289. var value = sceneConfig.extend[propertyKey];
  40290. if (propertyKey === 'data' && newScene.hasOwnProperty('data') && typeof value === 'object')
  40291. {
  40292. // Populate the DataManager
  40293. newScene.data.merge(value);
  40294. }
  40295. else if (propertyKey !== 'sys')
  40296. {
  40297. newScene[propertyKey] = value;
  40298. }
  40299. }
  40300. }
  40301. return newScene;
  40302. },
  40303. /**
  40304. * Retrieves the key of a Scene from a Scene config.
  40305. *
  40306. * @method Phaser.Scenes.SceneManager#getKey
  40307. * @private
  40308. * @since 3.0.0
  40309. *
  40310. * @param {string} key - The key to check in the Scene config.
  40311. * @param {(Phaser.Scene|Phaser.Scenes.Settings.Config|function)} sceneConfig - The Scene config.
  40312. *
  40313. * @return {string} The Scene key.
  40314. */
  40315. getKey: function (key, sceneConfig)
  40316. {
  40317. if (!key) { key = 'default'; }
  40318. if (typeof sceneConfig === 'function')
  40319. {
  40320. return key;
  40321. }
  40322. else if (sceneConfig instanceof Scene)
  40323. {
  40324. key = sceneConfig.sys.settings.key;
  40325. }
  40326. else if (typeof sceneConfig === 'object' && sceneConfig.hasOwnProperty('key'))
  40327. {
  40328. key = sceneConfig.key;
  40329. }
  40330. // By this point it's either 'default' or extracted from the Scene
  40331. if (this.keys.hasOwnProperty(key))
  40332. {
  40333. throw new Error('Cannot add a Scene with duplicate key: ' + key);
  40334. }
  40335. else
  40336. {
  40337. return key;
  40338. }
  40339. },
  40340. /**
  40341. * Retrieves a Scene.
  40342. *
  40343. * @method Phaser.Scenes.SceneManager#getScene
  40344. * @since 3.0.0
  40345. *
  40346. * @param {string|Phaser.Scene} key - The Scene to retrieve.
  40347. *
  40348. * @return {?Phaser.Scene} The Scene.
  40349. */
  40350. getScene: function (key)
  40351. {
  40352. if (typeof key === 'string')
  40353. {
  40354. if (this.keys[key])
  40355. {
  40356. return this.keys[key];
  40357. }
  40358. }
  40359. else
  40360. {
  40361. for (var i = 0; i < this.scenes.length; i++)
  40362. {
  40363. if (key === this.scenes[i])
  40364. {
  40365. return key;
  40366. }
  40367. }
  40368. }
  40369. return null;
  40370. },
  40371. /**
  40372. * Determines whether a Scene is active.
  40373. *
  40374. * @method Phaser.Scenes.SceneManager#isActive
  40375. * @since 3.0.0
  40376. *
  40377. * @param {string} key - The Scene to check.
  40378. *
  40379. * @return {boolean} Whether the Scene is active.
  40380. */
  40381. isActive: function (key)
  40382. {
  40383. var scene = this.getScene(key);
  40384. if (scene)
  40385. {
  40386. return scene.sys.isActive();
  40387. }
  40388. return null;
  40389. },
  40390. /**
  40391. * Determines whether a Scene is visible.
  40392. *
  40393. * @method Phaser.Scenes.SceneManager#isVisible
  40394. * @since 3.0.0
  40395. *
  40396. * @param {string} key - The Scene to check.
  40397. *
  40398. * @return {boolean} Whether the Scene is visible.
  40399. */
  40400. isVisible: function (key)
  40401. {
  40402. var scene = this.getScene(key);
  40403. if (scene)
  40404. {
  40405. return scene.sys.isVisible();
  40406. }
  40407. return null;
  40408. },
  40409. /**
  40410. * Determines whether a Scene is sleeping.
  40411. *
  40412. * @method Phaser.Scenes.SceneManager#isSleeping
  40413. * @since 3.0.0
  40414. *
  40415. * @param {string} key - The Scene to check.
  40416. *
  40417. * @return {boolean} Whether the Scene is sleeping.
  40418. */
  40419. isSleeping: function (key)
  40420. {
  40421. var scene = this.getScene(key);
  40422. if (scene)
  40423. {
  40424. return scene.sys.isSleeping();
  40425. }
  40426. return null;
  40427. },
  40428. /**
  40429. * Pauses the given Scene.
  40430. *
  40431. * @method Phaser.Scenes.SceneManager#pause
  40432. * @since 3.0.0
  40433. *
  40434. * @param {string} key - The Scene to pause.
  40435. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted by its pause event.
  40436. *
  40437. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40438. */
  40439. pause: function (key, data)
  40440. {
  40441. var scene = this.getScene(key);
  40442. if (scene)
  40443. {
  40444. scene.sys.pause(data);
  40445. }
  40446. return this;
  40447. },
  40448. /**
  40449. * Resumes the given Scene.
  40450. *
  40451. * @method Phaser.Scenes.SceneManager#resume
  40452. * @since 3.0.0
  40453. *
  40454. * @param {string} key - The Scene to resume.
  40455. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted by its resume event.
  40456. *
  40457. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40458. */
  40459. resume: function (key, data)
  40460. {
  40461. var scene = this.getScene(key);
  40462. if (scene)
  40463. {
  40464. scene.sys.resume(data);
  40465. }
  40466. return this;
  40467. },
  40468. /**
  40469. * Puts the given Scene to sleep.
  40470. *
  40471. * @method Phaser.Scenes.SceneManager#sleep
  40472. * @since 3.0.0
  40473. *
  40474. * @param {string} key - The Scene to put to sleep.
  40475. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted by its sleep event.
  40476. *
  40477. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40478. */
  40479. sleep: function (key, data)
  40480. {
  40481. var scene = this.getScene(key);
  40482. if (scene && !scene.sys.isTransitioning())
  40483. {
  40484. scene.sys.sleep(data);
  40485. }
  40486. return this;
  40487. },
  40488. /**
  40489. * Awakens the given Scene.
  40490. *
  40491. * @method Phaser.Scenes.SceneManager#wake
  40492. * @since 3.0.0
  40493. *
  40494. * @param {string} key - The Scene to wake up.
  40495. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted by its wake event.
  40496. *
  40497. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40498. */
  40499. wake: function (key, data)
  40500. {
  40501. var scene = this.getScene(key);
  40502. if (scene)
  40503. {
  40504. scene.sys.wake(data);
  40505. }
  40506. return this;
  40507. },
  40508. /**
  40509. * Runs the given Scene, but does not change the state of this Scene.
  40510. *
  40511. * If the given Scene is paused, it will resume it. If sleeping, it will wake it.
  40512. * If not running at all, it will be started.
  40513. *
  40514. * Use this if you wish to open a modal Scene by calling `pause` on the current
  40515. * Scene, then `run` on the modal Scene.
  40516. *
  40517. * @method Phaser.Scenes.SceneManager#run
  40518. * @since 3.10.0
  40519. *
  40520. * @param {string} key - The Scene to run.
  40521. * @param {object} [data] - A data object that will be passed to the Scene on start, wake, or resume.
  40522. *
  40523. * @return {Phaser.Scenes.SceneManager} This Scene Manager.
  40524. */
  40525. run: function (key, data)
  40526. {
  40527. var scene = this.getScene(key);
  40528. if (!scene)
  40529. {
  40530. for (var i = 0; i < this._pending.length; i++)
  40531. {
  40532. if (this._pending[i].key === key)
  40533. {
  40534. this.queueOp('start', key, data);
  40535. break;
  40536. }
  40537. }
  40538. return this;
  40539. }
  40540. if (scene.sys.isSleeping())
  40541. {
  40542. // Sleeping?
  40543. scene.sys.wake(data);
  40544. }
  40545. else if (scene.sys.isBooted && !scene.sys.isActive())
  40546. {
  40547. // Paused?
  40548. scene.sys.resume(data);
  40549. }
  40550. else
  40551. {
  40552. // Not actually running?
  40553. this.start(key, data);
  40554. }
  40555. },
  40556. /**
  40557. * Starts the given Scene.
  40558. *
  40559. * @method Phaser.Scenes.SceneManager#start
  40560. * @since 3.0.0
  40561. *
  40562. * @param {string} key - The Scene to start.
  40563. * @param {object} [data] - Optional data object to pass to Scene.Settings and Scene.init.
  40564. *
  40565. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40566. */
  40567. start: function (key, data)
  40568. {
  40569. // If the Scene Manager is not running, then put the Scene into a holding pattern
  40570. if (!this.isBooted)
  40571. {
  40572. this._data[key] = {
  40573. autoStart: true,
  40574. data: data
  40575. };
  40576. return this;
  40577. }
  40578. var scene = this.getScene(key);
  40579. if (scene)
  40580. {
  40581. scene.sys.start(data);
  40582. var loader;
  40583. if (scene.sys.load)
  40584. {
  40585. loader = scene.sys.load;
  40586. }
  40587. // Files payload?
  40588. if (loader && scene.sys.settings.hasOwnProperty('pack'))
  40589. {
  40590. loader.reset();
  40591. if (loader.addPack({ payload: scene.sys.settings.pack }))
  40592. {
  40593. scene.sys.settings.status = CONST.LOADING;
  40594. loader.once('complete', this.payloadComplete, this);
  40595. loader.start();
  40596. return this;
  40597. }
  40598. }
  40599. this.bootScene(scene);
  40600. }
  40601. return this;
  40602. },
  40603. /**
  40604. * Stops the given Scene.
  40605. *
  40606. * @method Phaser.Scenes.SceneManager#stop
  40607. * @since 3.0.0
  40608. *
  40609. * @param {string} key - The Scene to stop.
  40610. *
  40611. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40612. */
  40613. stop: function (key)
  40614. {
  40615. var scene = this.getScene(key);
  40616. if (scene && !scene.sys.isTransitioning())
  40617. {
  40618. scene.sys.shutdown();
  40619. }
  40620. return this;
  40621. },
  40622. /**
  40623. * Sleeps one one Scene and starts the other.
  40624. *
  40625. * @method Phaser.Scenes.SceneManager#switch
  40626. * @since 3.0.0
  40627. *
  40628. * @param {string} from - The Scene to sleep.
  40629. * @param {string} to - The Scene to start.
  40630. *
  40631. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40632. */
  40633. switch: function (from, to)
  40634. {
  40635. var sceneA = this.getScene(from);
  40636. var sceneB = this.getScene(to);
  40637. if (sceneA && sceneB && sceneA !== sceneB)
  40638. {
  40639. this.sleep(from);
  40640. if (this.isSleeping(to))
  40641. {
  40642. this.wake(to);
  40643. }
  40644. else
  40645. {
  40646. this.start(to);
  40647. }
  40648. }
  40649. return this;
  40650. },
  40651. /**
  40652. * Retrieves a Scene by numeric index.
  40653. *
  40654. * @method Phaser.Scenes.SceneManager#getAt
  40655. * @since 3.0.0
  40656. *
  40657. * @param {integer} index - The index of the Scene to retrieve.
  40658. *
  40659. * @return {(Phaser.Scene|undefined)} The Scene.
  40660. */
  40661. getAt: function (index)
  40662. {
  40663. return this.scenes[index];
  40664. },
  40665. /**
  40666. * Retrieves the numeric index of a Scene.
  40667. *
  40668. * @method Phaser.Scenes.SceneManager#getIndex
  40669. * @since 3.0.0
  40670. *
  40671. * @param {(string|Phaser.Scene)} key - The key of the Scene.
  40672. *
  40673. * @return {integer} The index of the Scene.
  40674. */
  40675. getIndex: function (key)
  40676. {
  40677. var scene = this.getScene(key);
  40678. return this.scenes.indexOf(scene);
  40679. },
  40680. /**
  40681. * Brings a Scene to the top of the Scenes list.
  40682. *
  40683. * This means it will render above all other Scenes.
  40684. *
  40685. * @method Phaser.Scenes.SceneManager#bringToTop
  40686. * @since 3.0.0
  40687. *
  40688. * @param {(string|Phaser.Scene)} key - The Scene to move.
  40689. *
  40690. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40691. */
  40692. bringToTop: function (key)
  40693. {
  40694. if (this.isProcessing)
  40695. {
  40696. this._queue.push({ op: 'bringToTop', keyA: key, keyB: null });
  40697. }
  40698. else
  40699. {
  40700. var index = this.getIndex(key);
  40701. if (index !== -1 && index < this.scenes.length)
  40702. {
  40703. var scene = this.getScene(key);
  40704. this.scenes.splice(index, 1);
  40705. this.scenes.push(scene);
  40706. }
  40707. }
  40708. return this;
  40709. },
  40710. /**
  40711. * Sends a Scene to the back of the Scenes list.
  40712. *
  40713. * This means it will render below all other Scenes.
  40714. *
  40715. * @method Phaser.Scenes.SceneManager#sendToBack
  40716. * @since 3.0.0
  40717. *
  40718. * @param {(string|Phaser.Scene)} key - The Scene to move.
  40719. *
  40720. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40721. */
  40722. sendToBack: function (key)
  40723. {
  40724. if (this.isProcessing)
  40725. {
  40726. this._queue.push({ op: 'sendToBack', keyA: key, keyB: null });
  40727. }
  40728. else
  40729. {
  40730. var index = this.getIndex(key);
  40731. if (index !== -1 && index > 0)
  40732. {
  40733. var scene = this.getScene(key);
  40734. this.scenes.splice(index, 1);
  40735. this.scenes.unshift(scene);
  40736. }
  40737. }
  40738. return this;
  40739. },
  40740. /**
  40741. * Moves a Scene down one position in the Scenes list.
  40742. *
  40743. * @method Phaser.Scenes.SceneManager#moveDown
  40744. * @since 3.0.0
  40745. *
  40746. * @param {(string|Phaser.Scene)} key - The Scene to move.
  40747. *
  40748. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40749. */
  40750. moveDown: function (key)
  40751. {
  40752. if (this.isProcessing)
  40753. {
  40754. this._queue.push({ op: 'moveDown', keyA: key, keyB: null });
  40755. }
  40756. else
  40757. {
  40758. var indexA = this.getIndex(key);
  40759. if (indexA > 0)
  40760. {
  40761. var indexB = indexA - 1;
  40762. var sceneA = this.getScene(key);
  40763. var sceneB = this.getAt(indexB);
  40764. this.scenes[indexA] = sceneB;
  40765. this.scenes[indexB] = sceneA;
  40766. }
  40767. }
  40768. return this;
  40769. },
  40770. /**
  40771. * Moves a Scene up one position in the Scenes list.
  40772. *
  40773. * @method Phaser.Scenes.SceneManager#moveUp
  40774. * @since 3.0.0
  40775. *
  40776. * @param {(string|Phaser.Scene)} key - The Scene to move.
  40777. *
  40778. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40779. */
  40780. moveUp: function (key)
  40781. {
  40782. if (this.isProcessing)
  40783. {
  40784. this._queue.push({ op: 'moveUp', keyA: key, keyB: null });
  40785. }
  40786. else
  40787. {
  40788. var indexA = this.getIndex(key);
  40789. if (indexA < this.scenes.length - 1)
  40790. {
  40791. var indexB = indexA + 1;
  40792. var sceneA = this.getScene(key);
  40793. var sceneB = this.getAt(indexB);
  40794. this.scenes[indexA] = sceneB;
  40795. this.scenes[indexB] = sceneA;
  40796. }
  40797. }
  40798. return this;
  40799. },
  40800. /**
  40801. * Moves a Scene so it is immediately above another Scene in the Scenes list.
  40802. *
  40803. * This means it will render over the top of the other Scene.
  40804. *
  40805. * @method Phaser.Scenes.SceneManager#moveAbove
  40806. * @since 3.2.0
  40807. *
  40808. * @param {(string|Phaser.Scene)} keyA - The Scene that Scene B will be moved above.
  40809. * @param {(string|Phaser.Scene)} keyB - The Scene to be moved.
  40810. *
  40811. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40812. */
  40813. moveAbove: function (keyA, keyB)
  40814. {
  40815. if (keyA === keyB)
  40816. {
  40817. return this;
  40818. }
  40819. if (this.isProcessing)
  40820. {
  40821. this._queue.push({ op: 'moveAbove', keyA: keyA, keyB: keyB });
  40822. }
  40823. else
  40824. {
  40825. var indexA = this.getIndex(keyA);
  40826. var indexB = this.getIndex(keyB);
  40827. if (indexA !== -1 && indexB !== -1)
  40828. {
  40829. var tempScene = this.getAt(indexB);
  40830. // Remove
  40831. this.scenes.splice(indexB, 1);
  40832. // Add in new location
  40833. this.scenes.splice(indexA + 1, 0, tempScene);
  40834. }
  40835. }
  40836. return this;
  40837. },
  40838. /**
  40839. * Moves a Scene so it is immediately below another Scene in the Scenes list.
  40840. *
  40841. * This means it will render behind the other Scene.
  40842. *
  40843. * @method Phaser.Scenes.SceneManager#moveBelow
  40844. * @since 3.2.0
  40845. *
  40846. * @param {(string|Phaser.Scene)} keyA - The Scene that Scene B will be moved above.
  40847. * @param {(string|Phaser.Scene)} keyB - The Scene to be moved.
  40848. *
  40849. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40850. */
  40851. moveBelow: function (keyA, keyB)
  40852. {
  40853. if (keyA === keyB)
  40854. {
  40855. return this;
  40856. }
  40857. if (this.isProcessing)
  40858. {
  40859. this._queue.push({ op: 'moveBelow', keyA: keyA, keyB: keyB });
  40860. }
  40861. else
  40862. {
  40863. var indexA = this.getIndex(keyA);
  40864. var indexB = this.getIndex(keyB);
  40865. if (indexA !== -1 && indexB !== -1)
  40866. {
  40867. var tempScene = this.getAt(indexB);
  40868. // Remove
  40869. this.scenes.splice(indexB, 1);
  40870. if (indexA === 0)
  40871. {
  40872. this.scenes.unshift(tempScene);
  40873. }
  40874. else
  40875. {
  40876. // Add in new location
  40877. this.scenes.splice(indexA, 0, tempScene);
  40878. }
  40879. }
  40880. }
  40881. return this;
  40882. },
  40883. /**
  40884. * Queue a Scene operation for the next update.
  40885. *
  40886. * @method Phaser.Scenes.SceneManager#queueOp
  40887. * @private
  40888. * @since 3.0.0
  40889. *
  40890. * @param {string} op - The operation to perform.
  40891. * @param {(string|Phaser.Scene)} keyA - Scene A.
  40892. * @param {(string|Phaser.Scene)} [keyB] - Scene B.
  40893. *
  40894. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40895. */
  40896. queueOp: function (op, keyA, keyB)
  40897. {
  40898. this._queue.push({ op: op, keyA: keyA, keyB: keyB });
  40899. return this;
  40900. },
  40901. /**
  40902. * Swaps the positions of two Scenes in the Scenes list.
  40903. *
  40904. * @method Phaser.Scenes.SceneManager#swapPosition
  40905. * @since 3.0.0
  40906. *
  40907. * @param {(string|Phaser.Scene)} keyA - The first Scene to swap.
  40908. * @param {(string|Phaser.Scene)} keyB - The second Scene to swap.
  40909. *
  40910. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  40911. */
  40912. swapPosition: function (keyA, keyB)
  40913. {
  40914. if (keyA === keyB)
  40915. {
  40916. return this;
  40917. }
  40918. if (this.isProcessing)
  40919. {
  40920. this._queue.push({ op: 'swapPosition', keyA: keyA, keyB: keyB });
  40921. }
  40922. else
  40923. {
  40924. var indexA = this.getIndex(keyA);
  40925. var indexB = this.getIndex(keyB);
  40926. if (indexA !== indexB && indexA !== -1 && indexB !== -1)
  40927. {
  40928. var tempScene = this.getAt(indexA);
  40929. this.scenes[indexA] = this.scenes[indexB];
  40930. this.scenes[indexB] = tempScene;
  40931. }
  40932. }
  40933. return this;
  40934. },
  40935. /**
  40936. * Dumps debug information about each Scene to the developer console.
  40937. *
  40938. * @method Phaser.Scenes.SceneManager#dump
  40939. * @since 3.2.0
  40940. */
  40941. dump: function ()
  40942. {
  40943. var out = [];
  40944. var map = [ 'pending', 'init', 'start', 'loading', 'creating', 'running', 'paused', 'sleeping', 'shutdown', 'destroyed' ];
  40945. for (var i = 0; i < this.scenes.length; i++)
  40946. {
  40947. var sys = this.scenes[i].sys;
  40948. var key = (sys.settings.visible && (sys.settings.status === CONST.RUNNING || sys.settings.status === CONST.PAUSED)) ? '[*] ' : '[-] ';
  40949. key += sys.settings.key + ' (' + map[sys.settings.status] + ')';
  40950. out.push(key);
  40951. }
  40952. console.log(out.join('\n'));
  40953. },
  40954. /**
  40955. * Destroy the SceneManager and all of its Scene's systems.
  40956. *
  40957. * @method Phaser.Scenes.SceneManager#destroy
  40958. * @since 3.0.0
  40959. */
  40960. destroy: function ()
  40961. {
  40962. for (var i = this.scenes.length - 1; i >= 0; i--)
  40963. {
  40964. var sys = this.scenes[i].sys;
  40965. sys.destroy();
  40966. }
  40967. this.update = NOOP;
  40968. this.scenes = [];
  40969. this._pending = [];
  40970. this._start = [];
  40971. this._queue = [];
  40972. this.game = null;
  40973. }
  40974. });
  40975. module.exports = SceneManager;
  40976. /***/ }),
  40977. /* 200 */
  40978. /***/ (function(module, exports, __webpack_require__) {
  40979. /**
  40980. * @author Richard Davey <rich@photonstorm.com>
  40981. * @copyright 2018 Photon Storm Ltd.
  40982. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  40983. */
  40984. var SpliceOne = __webpack_require__(56);
  40985. /**
  40986. * Removes the given item, or array of items, from the array.
  40987. *
  40988. * The array is modified in-place.
  40989. *
  40990. * You can optionally specify a callback to be invoked for each item successfully removed from the array.
  40991. *
  40992. * @function Phaser.Utils.Array.Remove
  40993. * @since 3.4.0
  40994. *
  40995. * @param {array} array - The array to be modified.
  40996. * @param {*|Array.<*>} item - The item, or array of items, to be removed from the array.
  40997. * @param {function} [callback] - A callback to be invoked for each item successfully removed from the array.
  40998. * @param {object} [context] - The context in which the callback is invoked.
  40999. *
  41000. * @return {*|Array.<*>} The item, or array of items, that were successfully removed from the array.
  41001. */
  41002. var Remove = function (array, item, callback, context)
  41003. {
  41004. if (context === undefined) { context = array; }
  41005. var index;
  41006. // Fast path to avoid array mutation and iteration
  41007. if (!Array.isArray(item))
  41008. {
  41009. index = array.indexOf(item);
  41010. if (index !== -1)
  41011. {
  41012. SpliceOne(array, index);
  41013. if (callback)
  41014. {
  41015. callback.call(context, item);
  41016. }
  41017. return item;
  41018. }
  41019. else
  41020. {
  41021. return null;
  41022. }
  41023. }
  41024. // If we got this far, we have an array of items to remove
  41025. var itemLength = item.length - 1;
  41026. while (itemLength >= 0)
  41027. {
  41028. var entry = item[itemLength];
  41029. index = array.indexOf(entry);
  41030. if (index !== -1)
  41031. {
  41032. SpliceOne(array, index);
  41033. if (callback)
  41034. {
  41035. callback.call(context, entry);
  41036. }
  41037. }
  41038. else
  41039. {
  41040. // Item wasn't found in the array, so remove it from our return results
  41041. item.pop();
  41042. }
  41043. itemLength--;
  41044. }
  41045. return item;
  41046. };
  41047. module.exports = Remove;
  41048. /***/ }),
  41049. /* 201 */
  41050. /***/ (function(module, exports, __webpack_require__) {
  41051. /**
  41052. * @author Richard Davey <rich@photonstorm.com>
  41053. * @copyright 2018 Photon Storm Ltd.
  41054. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  41055. */
  41056. var Class = __webpack_require__(0);
  41057. var EventEmitter = __webpack_require__(9);
  41058. var FileTypesManager = __webpack_require__(7);
  41059. var GameObjectCreator = __webpack_require__(14);
  41060. var GameObjectFactory = __webpack_require__(11);
  41061. var GetFastValue = __webpack_require__(1);
  41062. var PluginCache = __webpack_require__(12);
  41063. var Remove = __webpack_require__(200);
  41064. /**
  41065. * @typedef {object} GlobalPlugin
  41066. *
  41067. * @property {string} key - The unique name of this plugin within the plugin cache.
  41068. * @property {function} plugin - An instance of the plugin.
  41069. * @property {boolean} [active] - Is the plugin active or not?
  41070. * @property {string} [mapping] - If this plugin is to be injected into the Scene Systems, this is the property key map used.
  41071. */
  41072. /**
  41073. * @classdesc
  41074. * The PluginManager is responsible for installing and adding plugins to Phaser.
  41075. *
  41076. * It is a global system and therefore belongs to the Game instance, not a specific Scene.
  41077. *
  41078. * It works in conjunction with the PluginCache. Core internal plugins automatically register themselves
  41079. * with the Cache, but it's the Plugin Manager that is responsible for injecting them into the Scenes.
  41080. *
  41081. * There are two types of plugin:
  41082. *
  41083. * 1) A Global Plugin
  41084. * 2) A Scene Plugin
  41085. *
  41086. * A Global Plugin is a plugin that lives within the Plugin Manager rather than a Scene. You can get
  41087. * access to it by calling `PluginManager.get` and providing a key. Any Scene that requests a plugin in
  41088. * this way will all get access to the same plugin instance, allowing you to use a single plugin across
  41089. * multiple Scenes.
  41090. *
  41091. * A Scene Plugin is a plugin dedicated to running within a Scene. These are different to Global Plugins
  41092. * in that their instances do not live within the Plugin Manager, but within the Scene Systems class instead.
  41093. * And that every Scene created is given its own unique instance of a Scene Plugin. Examples of core Scene
  41094. * Plugins include the Input Plugin, the Tween Plugin and the physics Plugins.
  41095. *
  41096. * You can add a plugin to Phaser in three different ways:
  41097. *
  41098. * 1) Preload it
  41099. * 2) Include it in your source code and install it via the Game Config
  41100. * 3) Include it in your source code and install it within a Scene
  41101. *
  41102. * For examples of all of these approaches please see the Phaser 3 Examples Repo `plugins` folder.
  41103. *
  41104. * For information on creating your own plugin please see the Phaser 3 Plugin Template.
  41105. *
  41106. * @class PluginManager
  41107. * @memberOf Phaser.Plugins
  41108. * @constructor
  41109. * @since 3.0.0
  41110. *
  41111. * @param {Phaser.Game} game - The game instance that owns this Plugin Manager.
  41112. */
  41113. var PluginManager = new Class({
  41114. Extends: EventEmitter,
  41115. initialize:
  41116. function PluginManager (game)
  41117. {
  41118. EventEmitter.call(this);
  41119. /**
  41120. * The game instance that owns this Plugin Manager.
  41121. *
  41122. * @name Phaser.Plugins.PluginManager#game
  41123. * @type {Phaser.Game}
  41124. * @since 3.0.0
  41125. */
  41126. this.game = game;
  41127. /**
  41128. * The global plugins currently running and managed by this Plugin Manager.
  41129. * A plugin must have been started at least once in order to appear in this list.
  41130. *
  41131. * @name Phaser.Plugins.PluginManager#plugins
  41132. * @type {GlobalPlugin[]}
  41133. * @since 3.8.0
  41134. */
  41135. this.plugins = [];
  41136. /**
  41137. * A list of plugin keys that should be installed into Scenes as well as the Core Plugins.
  41138. *
  41139. * @name Phaser.Plugins.PluginManager#scenePlugins
  41140. * @type {string[]}
  41141. * @since 3.8.0
  41142. */
  41143. this.scenePlugins = [];
  41144. /**
  41145. * A temporary list of plugins to install when the game has booted.
  41146. *
  41147. * @name Phaser.Plugins.PluginManager#_pendingGlobal
  41148. * @private
  41149. * @type {array}
  41150. * @since 3.8.0
  41151. */
  41152. this._pendingGlobal = [];
  41153. /**
  41154. * A temporary list of scene plugins to install when the game has booted.
  41155. *
  41156. * @name Phaser.Plugins.PluginManager#_pendingScene
  41157. * @private
  41158. * @type {array}
  41159. * @since 3.8.0
  41160. */
  41161. this._pendingScene = [];
  41162. if (game.isBooted)
  41163. {
  41164. this.boot();
  41165. }
  41166. else
  41167. {
  41168. game.events.once('boot', this.boot, this);
  41169. }
  41170. },
  41171. /**
  41172. * Run once the game has booted and installs all of the plugins configured in the Game Config.
  41173. *
  41174. * @method Phaser.Plugins.PluginManager#boot
  41175. * @protected
  41176. * @since 3.0.0
  41177. */
  41178. boot: function ()
  41179. {
  41180. var i;
  41181. var entry;
  41182. var key;
  41183. var plugin;
  41184. var start;
  41185. var mapping;
  41186. var config = this.game.config;
  41187. // Any plugins to install?
  41188. var list = config.installGlobalPlugins;
  41189. // Any plugins added outside of the game config, but before the game booted?
  41190. list = list.concat(this._pendingGlobal);
  41191. for (i = 0; i < list.length; i++)
  41192. {
  41193. entry = list[i];
  41194. // { key: 'TestPlugin', plugin: TestPlugin, start: true, mapping: 'test' }
  41195. key = GetFastValue(entry, 'key', null);
  41196. plugin = GetFastValue(entry, 'plugin', null);
  41197. start = GetFastValue(entry, 'start', false);
  41198. mapping = GetFastValue(entry, 'mapping', null);
  41199. if (key && plugin)
  41200. {
  41201. this.install(key, plugin, start, mapping);
  41202. }
  41203. }
  41204. // Any scene plugins to install?
  41205. list = config.installScenePlugins;
  41206. // Any plugins added outside of the game config, but before the game booted?
  41207. list = list.concat(this._pendingScene);
  41208. for (i = 0; i < list.length; i++)
  41209. {
  41210. entry = list[i];
  41211. // { key: 'moveSpritePlugin', plugin: MoveSpritePlugin, , mapping: 'move' }
  41212. key = GetFastValue(entry, 'key', null);
  41213. plugin = GetFastValue(entry, 'plugin', null);
  41214. mapping = GetFastValue(entry, 'mapping', null);
  41215. if (key && plugin)
  41216. {
  41217. this.installScenePlugin(key, plugin, mapping);
  41218. }
  41219. }
  41220. this._pendingGlobal = [];
  41221. this._pendingScene = [];
  41222. this.game.events.once('destroy', this.destroy, this);
  41223. },
  41224. /**
  41225. * Called by the Scene Systems class. Tells the plugin manager to install all Scene plugins into it.
  41226. *
  41227. * First it will install global references, i.e. references from the Game systems into the Scene Systems (and Scene if mapped.)
  41228. * Then it will install Core Scene Plugins followed by Scene Plugins registered with the PluginManager.
  41229. * Finally it will install any references to Global Plugins that have a Scene mapping property into the Scene itself.
  41230. *
  41231. * @method Phaser.Plugins.PluginManager#addToScene
  41232. * @protected
  41233. * @since 3.8.0
  41234. *
  41235. * @param {Phaser.Scenes.Systems} sys - The Scene Systems class to install all the plugins in to.
  41236. * @param {array} globalPlugins - An array of global plugins to install.
  41237. * @param {array} scenePlugins - An array of scene plugins to install.
  41238. */
  41239. addToScene: function (sys, globalPlugins, scenePlugins)
  41240. {
  41241. var i;
  41242. var pluginKey;
  41243. var pluginList;
  41244. var game = this.game;
  41245. var scene = sys.scene;
  41246. var map = sys.settings.map;
  41247. var isBooted = sys.settings.isBooted;
  41248. // Reference the GlobalPlugins from Game into Scene.Systems
  41249. for (i = 0; i < globalPlugins.length; i++)
  41250. {
  41251. pluginKey = globalPlugins[i];
  41252. if (game[pluginKey])
  41253. {
  41254. sys[pluginKey] = game[pluginKey];
  41255. // Scene level injection
  41256. if (map.hasOwnProperty(pluginKey))
  41257. {
  41258. scene[map[pluginKey]] = sys[pluginKey];
  41259. }
  41260. }
  41261. }
  41262. for (var s = 0; s < scenePlugins.length; s++)
  41263. {
  41264. pluginList = scenePlugins[s];
  41265. for (i = 0; i < pluginList.length; i++)
  41266. {
  41267. pluginKey = pluginList[i];
  41268. if (!PluginCache.hasCore(pluginKey))
  41269. {
  41270. continue;
  41271. }
  41272. var source = PluginCache.getCore(pluginKey);
  41273. var plugin = new source.plugin(scene, this);
  41274. sys[source.mapping] = plugin;
  41275. // Scene level injection
  41276. if (source.custom)
  41277. {
  41278. scene[source.mapping] = plugin;
  41279. }
  41280. else if (map.hasOwnProperty(source.mapping))
  41281. {
  41282. scene[map[source.mapping]] = plugin;
  41283. }
  41284. // Scene is already booted, usually because this method is being called at run-time, so boot the plugin
  41285. if (isBooted)
  41286. {
  41287. plugin.boot();
  41288. }
  41289. }
  41290. }
  41291. // And finally, inject any 'global scene plugins'
  41292. pluginList = this.plugins;
  41293. for (i = 0; i < pluginList.length; i++)
  41294. {
  41295. var entry = pluginList[i];
  41296. if (entry.mapping)
  41297. {
  41298. scene[entry.mapping] = entry.plugin;
  41299. }
  41300. }
  41301. },
  41302. /**
  41303. * Called by the Scene Systems class. Returns a list of plugins to be installed.
  41304. *
  41305. * @method Phaser.Plugins.PluginManager#getDefaultScenePlugins
  41306. * @protected
  41307. * @since 3.8.0
  41308. *
  41309. * @return {string[]} A list keys of all the Scene Plugins to install.
  41310. */
  41311. getDefaultScenePlugins: function ()
  41312. {
  41313. var list = this.game.config.defaultPlugins;
  41314. // Merge in custom Scene plugins
  41315. list = list.concat(this.scenePlugins);
  41316. return list;
  41317. },
  41318. /**
  41319. * Installs a new Scene Plugin into the Plugin Manager and optionally adds it
  41320. * to the given Scene as well. A Scene Plugin added to the manager in this way
  41321. * will be automatically installed into all new Scenes using the key and mapping given.
  41322. *
  41323. * The `key` property is what the plugin is injected into Scene.Systems as.
  41324. * The `mapping` property is optional, and if specified is what the plugin is installed into
  41325. * the Scene as. For example:
  41326. *
  41327. * ```javascript
  41328. * this.plugins.installScenePlugin('powerupsPlugin', pluginCode, 'powerups');
  41329. *
  41330. * // and from within the scene:
  41331. * this.sys.powerupsPlugin; // key value
  41332. * this.powerups; // mapping value
  41333. * ```
  41334. *
  41335. * This method is called automatically by Phaser if you install your plugins using either the
  41336. * Game Configuration object, or by preloading them via the Loader.
  41337. *
  41338. * @method Phaser.Plugins.PluginManager#installScenePlugin
  41339. * @since 3.8.0
  41340. *
  41341. * @param {string} key - The property key that will be used to add this plugin to Scene.Systems.
  41342. * @param {function} plugin - The plugin code. This should be the non-instantiated version.
  41343. * @param {string} [mapping] - If this plugin is injected into the Phaser.Scene class, this is the property key to use.
  41344. * @param {Phaser.Scene} [addToScene] - Optionally automatically add this plugin to the given Scene.
  41345. */
  41346. installScenePlugin: function (key, plugin, mapping, addToScene)
  41347. {
  41348. if (typeof plugin !== 'function')
  41349. {
  41350. console.warn('Invalid Scene Plugin: ' + key);
  41351. return;
  41352. }
  41353. if (PluginCache.hasCore(key))
  41354. {
  41355. console.warn('Scene Plugin key in use: ' + key);
  41356. return;
  41357. }
  41358. PluginCache.register(key, plugin, mapping, true);
  41359. this.scenePlugins.push(key);
  41360. if (addToScene)
  41361. {
  41362. var instance = new plugin(addToScene, this);
  41363. addToScene.sys[key] = instance;
  41364. if (mapping && mapping !== '')
  41365. {
  41366. addToScene[mapping] = instance;
  41367. }
  41368. instance.boot();
  41369. }
  41370. },
  41371. /**
  41372. * Installs a new Global Plugin into the Plugin Manager and optionally starts it running.
  41373. * A global plugin belongs to the Plugin Manager, rather than a specific Scene, and can be accessed
  41374. * and used by all Scenes in your game.
  41375. *
  41376. * The `key` property is what you use to access this plugin from the Plugin Manager.
  41377. *
  41378. * ```javascript
  41379. * this.plugins.install('powerupsPlugin', pluginCode);
  41380. *
  41381. * // and from within the scene:
  41382. * this.plugins.get('powerupsPlugin');
  41383. * ```
  41384. *
  41385. * This method is called automatically by Phaser if you install your plugins using either the
  41386. * Game Configuration object, or by preloading them via the Loader.
  41387. *
  41388. * The same plugin can be installed multiple times into the Plugin Manager by simply giving each
  41389. * instance its own unique key.
  41390. *
  41391. * @method Phaser.Plugins.PluginManager#install
  41392. * @since 3.8.0
  41393. *
  41394. * @param {string} key - The unique handle given to this plugin within the Plugin Manager.
  41395. * @param {function} plugin - The plugin code. This should be the non-instantiated version.
  41396. * @param {boolean} [start=false] - Automatically start the plugin running? This is always `true` if you provide a mapping value.
  41397. * @param {string} [mapping] - If this plugin is injected into the Phaser.Scene class, this is the property key to use.
  41398. */
  41399. install: function (key, plugin, start, mapping)
  41400. {
  41401. if (start === undefined) { start = false; }
  41402. if (mapping === undefined) { mapping = null; }
  41403. if (typeof plugin !== 'function')
  41404. {
  41405. console.warn('Invalid Plugin: ' + key);
  41406. return;
  41407. }
  41408. if (PluginCache.hasCustom(key))
  41409. {
  41410. console.warn('Plugin key in use: ' + key);
  41411. return;
  41412. }
  41413. if (mapping !== null)
  41414. {
  41415. start = true;
  41416. }
  41417. if (!this.game.isBooted)
  41418. {
  41419. this._pendingGlobal.push({ key: key, plugin: plugin, start: start, mapping: mapping });
  41420. }
  41421. else
  41422. {
  41423. // Add it to the plugin store
  41424. PluginCache.registerCustom(key, plugin, mapping);
  41425. if (start)
  41426. {
  41427. return this.start(key);
  41428. }
  41429. }
  41430. },
  41431. /**
  41432. * Gets an index of a global plugin based on the given key.
  41433. *
  41434. * @method Phaser.Plugins.PluginManager#getIndex
  41435. * @protected
  41436. * @since 3.8.0
  41437. *
  41438. * @param {string} key - The unique plugin key.
  41439. *
  41440. * @return {integer} The index of the plugin within the plugins array.
  41441. */
  41442. getIndex: function (key)
  41443. {
  41444. var list = this.plugins;
  41445. for (var i = 0; i < list.length; i++)
  41446. {
  41447. var entry = list[i];
  41448. if (entry.key === key)
  41449. {
  41450. return i;
  41451. }
  41452. }
  41453. return -1;
  41454. },
  41455. /**
  41456. * Gets a global plugin based on the given key.
  41457. *
  41458. * @method Phaser.Plugins.PluginManager#getEntry
  41459. * @protected
  41460. * @since 3.8.0
  41461. *
  41462. * @param {string} key - The unique plugin key.
  41463. *
  41464. * @return {GlobalPlugin} The plugin entry.
  41465. */
  41466. getEntry: function (key)
  41467. {
  41468. var idx = this.getIndex(key);
  41469. if (idx !== -1)
  41470. {
  41471. return this.plugins[idx];
  41472. }
  41473. },
  41474. /**
  41475. * Checks if the given global plugin, based on its key, is active or not.
  41476. *
  41477. * @method Phaser.Plugins.PluginManager#isActive
  41478. * @since 3.8.0
  41479. *
  41480. * @param {string} key - The unique plugin key.
  41481. *
  41482. * @return {boolean} `true` if the plugin is active, otherwise `false`.
  41483. */
  41484. isActive: function (key)
  41485. {
  41486. var entry = this.getEntry(key);
  41487. return (entry && entry.active);
  41488. },
  41489. /**
  41490. * Starts a global plugin running.
  41491. *
  41492. * If the plugin was previously active then calling `start` will reset it to an active state and then
  41493. * call its `start` method.
  41494. *
  41495. * If the plugin has never been run before a new instance of it will be created within the Plugin Manager,
  41496. * its active state set and then both of its `init` and `start` methods called, in that order.
  41497. *
  41498. * If the plugin is already running under the given key then nothing happens.
  41499. *
  41500. * @method Phaser.Plugins.PluginManager#start
  41501. * @since 3.8.0
  41502. *
  41503. * @param {string} key - The key of the plugin to start.
  41504. * @param {string} [runAs] - Run the plugin under a new key. This allows you to run one plugin multiple times.
  41505. *
  41506. * @return {?Phaser.Plugins.BasePlugin} The plugin that was started, or `null` if invalid key given or plugin is already stopped.
  41507. */
  41508. start: function (key, runAs)
  41509. {
  41510. if (runAs === undefined) { runAs = key; }
  41511. var entry = this.getEntry(runAs);
  41512. // Plugin already running under this key?
  41513. if (entry && !entry.active)
  41514. {
  41515. // It exists, we just need to start it up again
  41516. entry.active = true;
  41517. entry.plugin.start();
  41518. }
  41519. else if (!entry)
  41520. {
  41521. entry = this.createEntry(key, runAs);
  41522. }
  41523. return (entry) ? entry.plugin : null;
  41524. },
  41525. /**
  41526. * Creates a new instance of a global plugin, adds an entry into the plugins array and returns it.
  41527. *
  41528. * @method Phaser.Plugins.PluginManager#createEntry
  41529. * @private
  41530. * @since 3.9.0
  41531. *
  41532. * @param {string} key - The key of the plugin to create an instance of.
  41533. * @param {string} [runAs] - Run the plugin under a new key. This allows you to run one plugin multiple times.
  41534. *
  41535. * @return {?Phaser.Plugins.BasePlugin} The plugin that was started, or `null` if invalid key given.
  41536. */
  41537. createEntry: function (key, runAs)
  41538. {
  41539. var entry = PluginCache.getCustom(key);
  41540. if (entry)
  41541. {
  41542. var instance = new entry.plugin(this);
  41543. entry = {
  41544. key: runAs,
  41545. plugin: instance,
  41546. active: true,
  41547. mapping: entry.mapping
  41548. };
  41549. this.plugins.push(entry);
  41550. instance.init();
  41551. instance.start();
  41552. }
  41553. return entry;
  41554. },
  41555. /**
  41556. * Stops a global plugin from running.
  41557. *
  41558. * If the plugin is active then its active state will be set to false and the plugins `stop` method
  41559. * will be called.
  41560. *
  41561. * If the plugin is not already running, nothing will happen.
  41562. *
  41563. * @method Phaser.Plugins.PluginManager#stop
  41564. * @since 3.8.0
  41565. *
  41566. * @param {string} key - The key of the plugin to stop.
  41567. *
  41568. * @return {Phaser.Plugins.PluginManager} The Plugin Manager.
  41569. */
  41570. stop: function (key)
  41571. {
  41572. var entry = this.getEntry(key);
  41573. if (entry && entry.active)
  41574. {
  41575. entry.active = false;
  41576. entry.plugin.stop();
  41577. }
  41578. return this;
  41579. },
  41580. /**
  41581. * Gets a global plugin from the Plugin Manager based on the given key and returns it.
  41582. *
  41583. * If it cannot find an active plugin based on the key, but there is one in the Plugin Cache with the same key,
  41584. * then it will create a new instance of the cached plugin and return that.
  41585. *
  41586. * @method Phaser.Plugins.PluginManager#get
  41587. * @since 3.8.0
  41588. *
  41589. * @param {string} key - The key of the plugin to get.
  41590. * @param {boolean} [autoStart=true] - Automatically start a new instance of the plugin if found in the cache, but not actively running.
  41591. *
  41592. * @return {?(Phaser.Plugins.BasePlugin|function)} The plugin, or `null` if no plugin was found matching the key.
  41593. */
  41594. get: function (key, autoStart)
  41595. {
  41596. if (autoStart === undefined) { autoStart = true; }
  41597. var entry = this.getEntry(key);
  41598. if (entry)
  41599. {
  41600. return entry.plugin;
  41601. }
  41602. else
  41603. {
  41604. var plugin = this.getClass(key);
  41605. if (plugin && autoStart)
  41606. {
  41607. entry = this.createEntry(key, key);
  41608. return (entry) ? entry.plugin : null;
  41609. }
  41610. else if (plugin)
  41611. {
  41612. return plugin;
  41613. }
  41614. }
  41615. return null;
  41616. },
  41617. /**
  41618. * Returns the plugin class from the cache.
  41619. * Used internally by the Plugin Manager.
  41620. *
  41621. * @method Phaser.Plugins.PluginManager#getClass
  41622. * @since 3.8.0
  41623. *
  41624. * @param {string} key - The key of the plugin to get.
  41625. *
  41626. * @return {Phaser.Plugins.BasePlugin} A Plugin object
  41627. */
  41628. getClass: function (key)
  41629. {
  41630. return PluginCache.getCustomClass(key);
  41631. },
  41632. /**
  41633. * Removes a global plugin from the Plugin Manager and Plugin Cache.
  41634. *
  41635. * It is up to you to remove all references to this plugin that you may hold within your game code.
  41636. *
  41637. * @method Phaser.Plugins.PluginManager#removeGlobalPlugin
  41638. * @since 3.8.0
  41639. *
  41640. * @param {string} key - The key of the plugin to remove.
  41641. */
  41642. removeGlobalPlugin: function (key)
  41643. {
  41644. var entry = this.getEntry(key);
  41645. if (entry)
  41646. {
  41647. Remove(this.plugins, entry);
  41648. }
  41649. PluginCache.removeCustom(key);
  41650. },
  41651. /**
  41652. * Removes a scene plugin from the Plugin Manager and Plugin Cache.
  41653. *
  41654. * This will not remove the plugin from any active Scenes that are already using it.
  41655. *
  41656. * It is up to you to remove all references to this plugin that you may hold within your game code.
  41657. *
  41658. * @method Phaser.Plugins.PluginManager#removeScenePlugin
  41659. * @since 3.8.0
  41660. *
  41661. * @param {string} key - The key of the plugin to remove.
  41662. */
  41663. removeScenePlugin: function (key)
  41664. {
  41665. Remove(this.scenePlugins, key);
  41666. PluginCache.remove(key);
  41667. },
  41668. /**
  41669. * Registers a new type of Game Object with the global Game Object Factory and / or Creator.
  41670. * This is usually called from within your Plugin code and is a helpful short-cut for creating
  41671. * new Game Objects.
  41672. *
  41673. * The key is the property that will be injected into the factories and used to create the
  41674. * Game Object. For example:
  41675. *
  41676. * ```javascript
  41677. * this.plugins.registerGameObject('clown', clownFactoryCallback, clownCreatorCallback);
  41678. * // later in your game code:
  41679. * this.add.clown();
  41680. * this.make.clown();
  41681. * ```
  41682. *
  41683. * The callbacks are what are called when the factories try to create a Game Object
  41684. * matching the given key. It's important to understand that the callbacks are invoked within
  41685. * the context of the GameObjectFactory. In this context there are several properties available
  41686. * to use:
  41687. *
  41688. * this.scene - A reference to the Scene that owns the GameObjectFactory.
  41689. * this.displayList - A reference to the Display List the Scene owns.
  41690. * this.updateList - A reference to the Update List the Scene owns.
  41691. *
  41692. * See the GameObjectFactory and GameObjectCreator classes for more details.
  41693. * Any public property or method listed is available from your callbacks under `this`.
  41694. *
  41695. * @method Phaser.Plugins.PluginManager#registerGameObject
  41696. * @since 3.8.0
  41697. *
  41698. * @param {string} key - The key of the Game Object that the given callbacks will create, i.e. `image`, `sprite`.
  41699. * @param {function} [factoryCallback] - The callback to invoke when the Game Object Factory is called.
  41700. * @param {function} [creatorCallback] - The callback to invoke when the Game Object Creator is called.
  41701. */
  41702. registerGameObject: function (key, factoryCallback, creatorCallback)
  41703. {
  41704. if (factoryCallback)
  41705. {
  41706. GameObjectFactory.register(key, factoryCallback);
  41707. }
  41708. if (creatorCallback)
  41709. {
  41710. GameObjectCreator.register(key, creatorCallback);
  41711. }
  41712. return this;
  41713. },
  41714. /**
  41715. * Registers a new file type with the global File Types Manager, making it available to all Loader
  41716. * Plugins created after this.
  41717. *
  41718. * This is usually called from within your Plugin code and is a helpful short-cut for creating
  41719. * new loader file types.
  41720. *
  41721. * The key is the property that will be injected into the Loader Plugin and used to load the
  41722. * files. For example:
  41723. *
  41724. * ```javascript
  41725. * this.plugins.registerFileType('wad', doomWadLoaderCallback);
  41726. * // later in your preload code:
  41727. * this.load.wad();
  41728. * ```
  41729. *
  41730. * The callback is what is called when the loader tries to load a file matching the given key.
  41731. * It's important to understand that the callback is invoked within
  41732. * the context of the LoaderPlugin. In this context there are several properties / methods available
  41733. * to use:
  41734. *
  41735. * this.addFile - A method to add the new file to the load queue.
  41736. * this.scene - The Scene that owns the Loader Plugin instance.
  41737. *
  41738. * See the LoaderPlugin class for more details. Any public property or method listed is available from
  41739. * your callback under `this`.
  41740. *
  41741. * @method Phaser.Plugins.PluginManager#registerFileType
  41742. * @since 3.8.0
  41743. *
  41744. * @param {string} key - The key of the Game Object that the given callbacks will create, i.e. `image`, `sprite`.
  41745. * @param {function} callback - The callback to invoke when the Game Object Factory is called.
  41746. * @param {Phaser.Scene} [addToScene] - Optionally add this file type into the Loader Plugin owned by the given Scene.
  41747. */
  41748. registerFileType: function (key, callback, addToScene)
  41749. {
  41750. FileTypesManager.register(key, callback);
  41751. if (addToScene && addToScene.sys.load)
  41752. {
  41753. addToScene.sys.load[key] = callback;
  41754. }
  41755. },
  41756. /**
  41757. * Destroys this Plugin Manager and all associated plugins.
  41758. * It will iterate all plugins found and call their `destroy` methods.
  41759. * Note that the PluginCache is NOT cleared by this as it doesn't hold any plugin instances.
  41760. *
  41761. * @method Phaser.Plugins.PluginManager#destroy
  41762. * @since 3.8.0
  41763. */
  41764. destroy: function ()
  41765. {
  41766. for (var i = 0; i < this.plugins.length; i++)
  41767. {
  41768. this.plugins[i].plugin.destroy();
  41769. }
  41770. this.game = null;
  41771. this.plugins = [];
  41772. this.scenePlugins = [];
  41773. }
  41774. });
  41775. /*
  41776. * "Sometimes, the elegant implementation is just a function.
  41777. * Not a method. Not a class. Not a framework. Just a function."
  41778. * -- John Carmack
  41779. */
  41780. module.exports = PluginManager;
  41781. /***/ }),
  41782. /* 202 */
  41783. /***/ (function(module, exports, __webpack_require__) {
  41784. /**
  41785. * @author Richard Davey <rich@photonstorm.com>
  41786. * @copyright 2018 Photon Storm Ltd.
  41787. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  41788. */
  41789. var Class = __webpack_require__(0);
  41790. // https://developer.mozilla.org/en-US/docs/Web/API/Touch_events
  41791. // https://patrickhlauke.github.io/touch/tests/results/
  41792. // https://www.html5rocks.com/en/mobile/touch/
  41793. /**
  41794. * @classdesc
  41795. * The Touch Manager is a helper class that belongs to the Input Manager.
  41796. *
  41797. * Its role is to listen for native DOM Touch Events and then pass them onto the Input Manager for further processing.
  41798. *
  41799. * You do not need to create this class directly, the Input Manager will create an instance of it automatically.
  41800. *
  41801. * @class TouchManager
  41802. * @memberOf Phaser.Input.Touch
  41803. * @constructor
  41804. * @since 3.0.0
  41805. *
  41806. * @param {Phaser.Input.InputManager} inputManager - A reference to the Input Manager.
  41807. */
  41808. var TouchManager = new Class({
  41809. initialize:
  41810. function TouchManager (inputManager)
  41811. {
  41812. /**
  41813. * A reference to the Input Manager.
  41814. *
  41815. * @name Phaser.Input.Touch.TouchManager#manager
  41816. * @type {Phaser.Input.InputManager}
  41817. * @since 3.0.0
  41818. */
  41819. this.manager = inputManager;
  41820. /**
  41821. * If true the DOM events will have event.preventDefault applied to them, if false they will propagate fully.
  41822. *
  41823. * @name Phaser.Input.Touch.TouchManager#capture
  41824. * @type {boolean}
  41825. * @default true
  41826. * @since 3.0.0
  41827. */
  41828. this.capture = true;
  41829. /**
  41830. * A boolean that controls if the Touch Manager is enabled or not.
  41831. * Can be toggled on the fly.
  41832. *
  41833. * @name Phaser.Input.Touch.TouchManager#enabled
  41834. * @type {boolean}
  41835. * @default false
  41836. * @since 3.0.0
  41837. */
  41838. this.enabled = false;
  41839. /**
  41840. * The Touch Event target, as defined in the Game Config.
  41841. * Typically the canvas to which the game is rendering, but can be any interactive DOM element.
  41842. *
  41843. * @name Phaser.Input.Touch.TouchManager#target
  41844. * @type {any}
  41845. * @since 3.0.0
  41846. */
  41847. this.target;
  41848. inputManager.events.once('boot', this.boot, this);
  41849. },
  41850. /**
  41851. * The Touch Manager boot process.
  41852. *
  41853. * @method Phaser.Input.Touch.TouchManager#boot
  41854. * @private
  41855. * @since 3.0.0
  41856. */
  41857. boot: function ()
  41858. {
  41859. var config = this.manager.config;
  41860. this.enabled = config.inputTouch;
  41861. this.target = config.inputTouchEventTarget;
  41862. this.capture = config.inputTouchCapture;
  41863. if (!this.target)
  41864. {
  41865. this.target = this.manager.game.canvas;
  41866. }
  41867. if (this.enabled)
  41868. {
  41869. this.startListeners();
  41870. }
  41871. },
  41872. /**
  41873. * The Touch Start Event Handler.
  41874. *
  41875. * @method Phaser.Input.Touch.TouchManager#onTouchStart
  41876. * @since 3.10.0
  41877. *
  41878. * @param {TouchEvent} event - The native DOM Touch Start Event.
  41879. */
  41880. onTouchStart: function (event)
  41881. {
  41882. if (event.defaultPrevented || !this.enabled)
  41883. {
  41884. // Do nothing if event already handled
  41885. return;
  41886. }
  41887. this.manager.queueTouchStart(event);
  41888. if (this.capture)
  41889. {
  41890. event.preventDefault();
  41891. }
  41892. },
  41893. /**
  41894. * The Touch Move Event Handler.
  41895. *
  41896. * @method Phaser.Input.Touch.TouchManager#onTouchMove
  41897. * @since 3.10.0
  41898. *
  41899. * @param {TouchEvent} event - The native DOM Touch Move Event.
  41900. */
  41901. onTouchMove: function (event)
  41902. {
  41903. if (event.defaultPrevented || !this.enabled)
  41904. {
  41905. // Do nothing if event already handled
  41906. return;
  41907. }
  41908. this.manager.queueTouchMove(event);
  41909. if (this.capture)
  41910. {
  41911. event.preventDefault();
  41912. }
  41913. },
  41914. /**
  41915. * The Touch End Event Handler.
  41916. *
  41917. * @method Phaser.Input.Touch.TouchManager#onTouchEnd
  41918. * @since 3.10.0
  41919. *
  41920. * @param {TouchEvent} event - The native DOM Touch End Event.
  41921. */
  41922. onTouchEnd: function (event)
  41923. {
  41924. if (event.defaultPrevented || !this.enabled)
  41925. {
  41926. // Do nothing if event already handled
  41927. return;
  41928. }
  41929. this.manager.queueTouchEnd(event);
  41930. if (this.capture)
  41931. {
  41932. event.preventDefault();
  41933. }
  41934. },
  41935. /**
  41936. * Starts the Touch Event listeners running.
  41937. * This is called automatically and does not need to be manually invoked.
  41938. *
  41939. * @method Phaser.Input.Touch.TouchManager#startListeners
  41940. * @since 3.0.0
  41941. */
  41942. startListeners: function ()
  41943. {
  41944. var target = this.target;
  41945. var passive = { passive: true };
  41946. var nonPassive = { passive: false };
  41947. if (this.capture)
  41948. {
  41949. target.addEventListener('touchstart', this.onTouchStart.bind(this), nonPassive);
  41950. target.addEventListener('touchmove', this.onTouchMove.bind(this), nonPassive);
  41951. target.addEventListener('touchend', this.onTouchEnd.bind(this), nonPassive);
  41952. }
  41953. else
  41954. {
  41955. target.addEventListener('touchstart', this.onTouchStart.bind(this), passive);
  41956. target.addEventListener('touchmove', this.onTouchMove.bind(this), passive);
  41957. target.addEventListener('touchend', this.onTouchEnd.bind(this), passive);
  41958. }
  41959. },
  41960. /**
  41961. * Stops the Touch Event listeners.
  41962. * This is called automatically and does not need to be manually invoked.
  41963. *
  41964. * @method Phaser.Input.Touch.TouchManager#stopListeners
  41965. * @since 3.0.0
  41966. */
  41967. stopListeners: function ()
  41968. {
  41969. var target = this.target;
  41970. target.removeEventListener('touchstart', this.onTouchStart);
  41971. target.removeEventListener('touchmove', this.onTouchMove);
  41972. target.removeEventListener('touchend', this.onTouchEnd);
  41973. },
  41974. /**
  41975. * Destroys this Touch Manager instance.
  41976. *
  41977. * @method Phaser.Input.Touch.TouchManager#destroy
  41978. * @since 3.0.0
  41979. */
  41980. destroy: function ()
  41981. {
  41982. this.stopListeners();
  41983. this.target = null;
  41984. this.manager = null;
  41985. }
  41986. });
  41987. module.exports = TouchManager;
  41988. /***/ }),
  41989. /* 203 */
  41990. /***/ (function(module, exports, __webpack_require__) {
  41991. /**
  41992. * @author Richard Davey <rich@photonstorm.com>
  41993. * @copyright 2018 Photon Storm Ltd.
  41994. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  41995. */
  41996. var Class = __webpack_require__(0);
  41997. var SmoothStepInterpolation = __webpack_require__(251);
  41998. var Vector2 = __webpack_require__(6);
  41999. /**
  42000. * @classdesc
  42001. * A Pointer object encapsulates both mouse and touch input within Phaser.
  42002. *
  42003. * By default, Phaser will create 2 pointers for your game to use. If you require more, i.e. for a multi-touch
  42004. * game, then use the `InputPlugin.addPointer` method to do so, rather than instantiating this class directly,
  42005. * otherwise it won't be managed by the input system.
  42006. *
  42007. * You can reference the current active pointer via `InputPlugin.activePointer`. You can also use the properties
  42008. * `InputPlugin.pointer1` through to `pointer10`, for each pointer you have enabled in your game.
  42009. *
  42010. * The properties of this object are set by the Input Plugin during processing. This object is then sent in all
  42011. * input related events that the Input Plugin emits, so you can reference properties from it directly in your
  42012. * callbacks.
  42013. *
  42014. * @class Pointer
  42015. * @memberOf Phaser.Input
  42016. * @constructor
  42017. * @since 3.0.0
  42018. *
  42019. * @param {Phaser.Input.InputManager} manager - A reference to the Input Manager.
  42020. * @param {integer} id - The internal ID of this Pointer.
  42021. */
  42022. var Pointer = new Class({
  42023. initialize:
  42024. function Pointer (manager, id)
  42025. {
  42026. /**
  42027. * A reference to the Input Manager.
  42028. *
  42029. * @name Phaser.Input.Pointer#manager
  42030. * @type {Phaser.Input.InputManager}
  42031. * @since 3.0.0
  42032. */
  42033. this.manager = manager;
  42034. /**
  42035. * The internal ID of this Pointer.
  42036. *
  42037. * @name Phaser.Input.Pointer#id
  42038. * @type {integer}
  42039. * @readOnly
  42040. * @since 3.0.0
  42041. */
  42042. this.id = id;
  42043. /**
  42044. * The most recent native DOM Event this Pointer has processed.
  42045. *
  42046. * @name Phaser.Input.Pointer#event
  42047. * @type {(TouchEvent|MouseEvent)}
  42048. * @since 3.0.0
  42049. */
  42050. this.event;
  42051. /**
  42052. * The camera the Pointer interacted with during its last update.
  42053. *
  42054. * A Pointer can only ever interact with one camera at once, which will be the top-most camera
  42055. * in the list should multiple cameras be positioned on-top of each other.
  42056. *
  42057. * @name Phaser.Input.Pointer#camera
  42058. * @type {Phaser.Cameras.Scene2D.Camera}
  42059. * @default null
  42060. * @since 3.0.0
  42061. */
  42062. this.camera = null;
  42063. /**
  42064. * 0: No button or un-initialized
  42065. * 1: Left button
  42066. * 2: Right button
  42067. * 4: Wheel button or middle button
  42068. * 8: 4th button (typically the "Browser Back" button)
  42069. * 16: 5th button (typically the "Browser Forward" button)
  42070. *
  42071. * For a mouse configured for left-handed use, the button actions are reversed.
  42072. * In this case, the values are read from right to left.
  42073. *
  42074. * @name Phaser.Input.Pointer#buttons
  42075. * @type {integer}
  42076. * @default 0
  42077. * @since 3.0.0
  42078. */
  42079. this.buttons = 0;
  42080. /**
  42081. * The position of the Pointer in screen space.
  42082. *
  42083. * @name Phaser.Input.Pointer#position
  42084. * @type {Phaser.Math.Vector2}
  42085. * @since 3.0.0
  42086. */
  42087. this.position = new Vector2();
  42088. /**
  42089. * The previous position of the Pointer in screen space.
  42090. *
  42091. * The old x and y values are stored in here during the InputManager.transformPointer call.
  42092. *
  42093. * You can use it to track how fast the pointer is moving, or to smoothly interpolate between the old and current position.
  42094. * See the `Pointer.getInterpolatedPosition` method to assist in this.
  42095. *
  42096. * @name Phaser.Input.Pointer#prevPosition
  42097. * @type {Phaser.Math.Vector2}
  42098. * @since 3.11.0
  42099. */
  42100. this.prevPosition = new Vector2();
  42101. /**
  42102. * The x position of this Pointer, translated into the coordinate space of the most recent Camera it interacted with.
  42103. *
  42104. * @name Phaser.Input.Pointer#worldX
  42105. * @type {number}
  42106. * @default 0
  42107. * @since 3.10.0
  42108. */
  42109. this.worldX = 0;
  42110. /**
  42111. * The y position of this Pointer, translated into the coordinate space of the most recent Camera it interacted with.
  42112. *
  42113. * @name Phaser.Input.Pointer#worldY
  42114. * @type {number}
  42115. * @default 0
  42116. * @since 3.10.0
  42117. */
  42118. this.worldY = 0;
  42119. /**
  42120. * X coordinate of the Pointer when Button 1 (left button), or Touch, was pressed, used for dragging objects.
  42121. *
  42122. * @name Phaser.Input.Pointer#downX
  42123. * @type {number}
  42124. * @default 0
  42125. * @since 3.0.0
  42126. */
  42127. this.downX = 0;
  42128. /**
  42129. * Y coordinate of the Pointer when Button 1 (left button), or Touch, was pressed, used for dragging objects.
  42130. *
  42131. * @name Phaser.Input.Pointer#downY
  42132. * @type {number}
  42133. * @default 0
  42134. * @since 3.0.0
  42135. */
  42136. this.downY = 0;
  42137. /**
  42138. * Time when Button 1 (left button), or Touch, was pressed, used for dragging objects.
  42139. *
  42140. * @name Phaser.Input.Pointer#downTime
  42141. * @type {number}
  42142. * @default 0
  42143. * @since 3.0.0
  42144. */
  42145. this.downTime = 0;
  42146. /**
  42147. * X coordinate of the Pointer when Button 1 (left button), or Touch, was released, used for dragging objects.
  42148. *
  42149. * @name Phaser.Input.Pointer#upX
  42150. * @type {number}
  42151. * @default 0
  42152. * @since 3.0.0
  42153. */
  42154. this.upX = 0;
  42155. /**
  42156. * Y coordinate of the Pointer when Button 1 (left button), or Touch, was released, used for dragging objects.
  42157. *
  42158. * @name Phaser.Input.Pointer#upY
  42159. * @type {number}
  42160. * @default 0
  42161. * @since 3.0.0
  42162. */
  42163. this.upY = 0;
  42164. /**
  42165. * Time when Button 1 (left button), or Touch, was released, used for dragging objects.
  42166. *
  42167. * @name Phaser.Input.Pointer#upTime
  42168. * @type {number}
  42169. * @default 0
  42170. * @since 3.0.0
  42171. */
  42172. this.upTime = 0;
  42173. /**
  42174. * Is the primary button down? (usually button 0, the left mouse button)
  42175. *
  42176. * @name Phaser.Input.Pointer#primaryDown
  42177. * @type {boolean}
  42178. * @default false
  42179. * @since 3.0.0
  42180. */
  42181. this.primaryDown = false;
  42182. /**
  42183. * The Drag State of the Pointer:
  42184. *
  42185. * 0 = Not dragging anything
  42186. * 1 = Being checked if dragging
  42187. * 2 = Dragging something
  42188. *
  42189. * @name Phaser.Input.Pointer#dragState
  42190. * @type {number}
  42191. * @default 0
  42192. * @since 3.0.0
  42193. */
  42194. this.dragState = 0;
  42195. /**
  42196. * Is _any_ button on this pointer considered as being down?
  42197. *
  42198. * @name Phaser.Input.Pointer#isDown
  42199. * @type {boolean}
  42200. * @default false
  42201. * @since 3.0.0
  42202. */
  42203. this.isDown = false;
  42204. /**
  42205. * A dirty flag for this Pointer, used internally by the Input Plugin.
  42206. *
  42207. * @name Phaser.Input.Pointer#dirty
  42208. * @type {boolean}
  42209. * @default false
  42210. * @since 3.0.0
  42211. */
  42212. this.dirty = false;
  42213. /**
  42214. * Is this Pointer considered as being "just down" or not?
  42215. *
  42216. * @name Phaser.Input.Pointer#justDown
  42217. * @type {boolean}
  42218. * @default false
  42219. * @since 3.0.0
  42220. */
  42221. this.justDown = false;
  42222. /**
  42223. * Is this Pointer considered as being "just up" or not?
  42224. *
  42225. * @name Phaser.Input.Pointer#justUp
  42226. * @type {boolean}
  42227. * @default false
  42228. * @since 3.0.0
  42229. */
  42230. this.justUp = false;
  42231. /**
  42232. * Is this Pointer considered as being "just moved" or not?
  42233. *
  42234. * @name Phaser.Input.Pointer#justMoved
  42235. * @type {boolean}
  42236. * @default false
  42237. * @since 3.0.0
  42238. */
  42239. this.justMoved = false;
  42240. /**
  42241. * Did the previous input event come from a Touch input (true) or Mouse? (false)
  42242. *
  42243. * @name Phaser.Input.Pointer#wasTouch
  42244. * @type {boolean}
  42245. * @default false
  42246. * @since 3.0.0
  42247. */
  42248. this.wasTouch = false;
  42249. /**
  42250. * If the mouse is locked, the horizontal relative movement of the Pointer in pixels since last frame.
  42251. *
  42252. * @name Phaser.Input.Pointer#movementX
  42253. * @type {number}
  42254. * @default 0
  42255. * @since 3.0.0
  42256. */
  42257. this.movementX = 0;
  42258. /**
  42259. * If the mouse is locked, the vertical relative movement of the Pointer in pixels since last frame.
  42260. *
  42261. * @name Phaser.Input.Pointer#movementY
  42262. * @type {number}
  42263. * @default 0
  42264. * @since 3.0.0
  42265. */
  42266. this.movementY = 0;
  42267. /**
  42268. * The identifier property of the Pointer as set by the DOM event when this Pointer is started.
  42269. *
  42270. * @name Phaser.Input.Pointer#identifier
  42271. * @type {number}
  42272. * @since 3.10.0
  42273. */
  42274. this.identifier = 0;
  42275. /**
  42276. * The pointerId property of the Pointer as set by the DOM event when this Pointer is started.
  42277. * The browser can and will recycle this value.
  42278. *
  42279. * @name Phaser.Input.Pointer#pointerId
  42280. * @type {number}
  42281. * @since 3.10.0
  42282. */
  42283. this.pointerId = null;
  42284. /**
  42285. * An active Pointer is one that is currently pressed down on the display.
  42286. * A Mouse is always considered as active.
  42287. *
  42288. * @name Phaser.Input.Pointer#active
  42289. * @type {boolean}
  42290. * @since 3.10.0
  42291. */
  42292. this.active = (id === 0) ? true : false;
  42293. },
  42294. /**
  42295. * Takes a Camera and returns a Vector2 containing the translated position of this Pointer
  42296. * within that Camera. This can be used to convert this Pointers position into camera space.
  42297. *
  42298. * @method Phaser.Input.Pointer#positionToCamera
  42299. * @since 3.0.0
  42300. *
  42301. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to use for the translation.
  42302. * @param {(Phaser.Math.Vector2|object)} [output] - A Vector2-like object in which to store the translated position.
  42303. *
  42304. * @return {(Phaser.Math.Vector2|object)} A Vector2 containing the translated coordinates of this Pointer, based on the given camera.
  42305. */
  42306. positionToCamera: function (camera, output)
  42307. {
  42308. return camera.getWorldPoint(this.x, this.y, output);
  42309. },
  42310. /**
  42311. * Resets the temporal properties of this Pointer.
  42312. * Called automatically by the Input Plugin each update.
  42313. *
  42314. * @method Phaser.Input.Pointer#reset
  42315. * @private
  42316. * @since 3.0.0
  42317. */
  42318. reset: function ()
  42319. {
  42320. this.dirty = false;
  42321. this.justDown = false;
  42322. this.justUp = false;
  42323. this.justMoved = false;
  42324. this.movementX = 0;
  42325. this.movementY = 0;
  42326. },
  42327. /**
  42328. * Internal method to handle a Mouse Up Event.
  42329. *
  42330. * @method Phaser.Input.Pointer#up
  42331. * @private
  42332. * @since 3.0.0
  42333. *
  42334. * @param {MouseEvent} event - The Mouse Event to process.
  42335. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  42336. */
  42337. up: function (event, time)
  42338. {
  42339. if (event.buttons)
  42340. {
  42341. this.buttons = event.buttons;
  42342. }
  42343. this.event = event;
  42344. // Sets the local x/y properties
  42345. this.manager.transformPointer(this, event.pageX, event.pageY);
  42346. // 0: Main button pressed, usually the left button or the un-initialized state
  42347. if (event.button === 0)
  42348. {
  42349. this.primaryDown = false;
  42350. this.upX = this.x;
  42351. this.upY = this.y;
  42352. this.upTime = time;
  42353. }
  42354. this.justUp = true;
  42355. this.isDown = false;
  42356. this.dirty = true;
  42357. this.wasTouch = false;
  42358. },
  42359. /**
  42360. * Internal method to handle a Mouse Down Event.
  42361. *
  42362. * @method Phaser.Input.Pointer#down
  42363. * @private
  42364. * @since 3.0.0
  42365. *
  42366. * @param {MouseEvent} event - The Mouse Event to process.
  42367. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  42368. */
  42369. down: function (event, time)
  42370. {
  42371. if (event.buttons)
  42372. {
  42373. this.buttons = event.buttons;
  42374. }
  42375. this.event = event;
  42376. // Sets the local x/y properties
  42377. this.manager.transformPointer(this, event.pageX, event.pageY);
  42378. // 0: Main button pressed, usually the left button or the un-initialized state
  42379. if (event.button === 0)
  42380. {
  42381. this.primaryDown = true;
  42382. this.downX = this.x;
  42383. this.downY = this.y;
  42384. this.downTime = time;
  42385. }
  42386. this.justDown = true;
  42387. this.isDown = true;
  42388. this.dirty = true;
  42389. this.wasTouch = false;
  42390. },
  42391. /**
  42392. * Internal method to handle a Mouse Move Event.
  42393. *
  42394. * @method Phaser.Input.Pointer#move
  42395. * @private
  42396. * @since 3.0.0
  42397. *
  42398. * @param {MouseEvent} event - The Mouse Event to process.
  42399. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  42400. */
  42401. move: function (event)
  42402. {
  42403. if (event.buttons)
  42404. {
  42405. this.buttons = event.buttons;
  42406. }
  42407. this.event = event;
  42408. // Sets the local x/y properties
  42409. this.manager.transformPointer(this, event.pageX, event.pageY);
  42410. if (this.manager.mouse.locked)
  42411. {
  42412. // Multiple DOM events may occur within one frame, but only one Phaser event will fire
  42413. this.movementX += event.movementX || event.mozMovementX || event.webkitMovementX || 0;
  42414. this.movementY += event.movementY || event.mozMovementY || event.webkitMovementY || 0;
  42415. }
  42416. this.justMoved = true;
  42417. this.dirty = true;
  42418. this.wasTouch = false;
  42419. },
  42420. /**
  42421. * Internal method to handle a Touch Start Event.
  42422. *
  42423. * @method Phaser.Input.Pointer#touchstart
  42424. * @private
  42425. * @since 3.0.0
  42426. *
  42427. * @param {TouchEvent} event - The Touch Event to process.
  42428. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  42429. */
  42430. touchstart: function (event, time)
  42431. {
  42432. if (event['pointerId'])
  42433. {
  42434. this.pointerId = event.pointerId;
  42435. }
  42436. this.identifier = event.identifier;
  42437. this.target = event.target;
  42438. this.active = true;
  42439. this.buttons = 1;
  42440. this.event = event;
  42441. // Sets the local x/y properties
  42442. this.manager.transformPointer(this, event.pageX, event.pageY);
  42443. this.primaryDown = true;
  42444. this.downX = this.x;
  42445. this.downY = this.y;
  42446. this.downTime = time;
  42447. this.justDown = true;
  42448. this.isDown = true;
  42449. this.dirty = true;
  42450. this.wasTouch = true;
  42451. },
  42452. /**
  42453. * Internal method to handle a Touch Move Event.
  42454. *
  42455. * @method Phaser.Input.Pointer#touchmove
  42456. * @private
  42457. * @since 3.0.0
  42458. *
  42459. * @param {TouchEvent} event - The Touch Event to process.
  42460. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  42461. */
  42462. touchmove: function (event)
  42463. {
  42464. this.event = event;
  42465. // Sets the local x/y properties
  42466. this.manager.transformPointer(this, event.pageX, event.pageY);
  42467. this.justMoved = true;
  42468. this.dirty = true;
  42469. this.wasTouch = true;
  42470. },
  42471. /**
  42472. * Internal method to handle a Touch End Event.
  42473. *
  42474. * @method Phaser.Input.Pointer#touchend
  42475. * @private
  42476. * @since 3.0.0
  42477. *
  42478. * @param {TouchEvent} event - The Touch Event to process.
  42479. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  42480. */
  42481. touchend: function (event, time)
  42482. {
  42483. this.buttons = 0;
  42484. this.event = event;
  42485. // Sets the local x/y properties
  42486. this.manager.transformPointer(this, event.pageX, event.pageY);
  42487. this.primaryDown = false;
  42488. this.upX = this.x;
  42489. this.upY = this.y;
  42490. this.upTime = time;
  42491. this.justUp = true;
  42492. this.isDown = false;
  42493. this.dirty = true;
  42494. this.wasTouch = true;
  42495. this.active = false;
  42496. },
  42497. /**
  42498. * Checks to see if any buttons are being held down on this Pointer.
  42499. *
  42500. * @method Phaser.Input.Pointer#noButtonDown
  42501. * @since 3.0.0
  42502. *
  42503. * @return {boolean} `true` if no buttons are being held down.
  42504. */
  42505. noButtonDown: function ()
  42506. {
  42507. return (this.buttons === 0);
  42508. },
  42509. /**
  42510. * Checks to see if the left button is being held down on this Pointer.
  42511. *
  42512. * @method Phaser.Input.Pointer#leftButtonDown
  42513. * @since 3.0.0
  42514. *
  42515. * @return {boolean} `true` if the left button is being held down.
  42516. */
  42517. leftButtonDown: function ()
  42518. {
  42519. return (this.buttons & 1);
  42520. },
  42521. /**
  42522. * Checks to see if the right button is being held down on this Pointer.
  42523. *
  42524. * @method Phaser.Input.Pointer#rightButtonDown
  42525. * @since 3.0.0
  42526. *
  42527. * @return {boolean} `true` if the right button is being held down.
  42528. */
  42529. rightButtonDown: function ()
  42530. {
  42531. return (this.buttons & 2);
  42532. },
  42533. /**
  42534. * Checks to see if the middle button is being held down on this Pointer.
  42535. *
  42536. * @method Phaser.Input.Pointer#middleButtonDown
  42537. * @since 3.0.0
  42538. *
  42539. * @return {boolean} `true` if the middle button is being held down.
  42540. */
  42541. middleButtonDown: function ()
  42542. {
  42543. return (this.buttons & 4);
  42544. },
  42545. /**
  42546. * Checks to see if the back button is being held down on this Pointer.
  42547. *
  42548. * @method Phaser.Input.Pointer#backButtonDown
  42549. * @since 3.0.0
  42550. *
  42551. * @return {boolean} `true` if the back button is being held down.
  42552. */
  42553. backButtonDown: function ()
  42554. {
  42555. return (this.buttons & 8);
  42556. },
  42557. /**
  42558. * Checks to see if the forward button is being held down on this Pointer.
  42559. *
  42560. * @method Phaser.Input.Pointer#forwardButtonDown
  42561. * @since 3.0.0
  42562. *
  42563. * @return {boolean} `true` if the forward button is being held down.
  42564. */
  42565. forwardButtonDown: function ()
  42566. {
  42567. return (this.buttons & 16);
  42568. },
  42569. /**
  42570. * Takes the previous and current Pointer positions and then generates an array of interpolated values between
  42571. * the two. The array will be populated up to the size of the `steps` argument.
  42572. *
  42573. * ```javaScript
  42574. * var points = pointer.getInterpolatedPosition(4);
  42575. *
  42576. * // points[0] = { x: 0, y: 0 }
  42577. * // points[1] = { x: 2, y: 1 }
  42578. * // points[2] = { x: 3, y: 2 }
  42579. * // points[3] = { x: 6, y: 3 }
  42580. * ```
  42581. *
  42582. * Use this if you need to get smoothed values between the previous and current pointer positions. DOM pointer
  42583. * events can often fire faster than the main browser loop, and this will help you avoid janky movement
  42584. * especially if you have an object following a Pointer.
  42585. *
  42586. * Note that if you provide an output array it will only be populated up to the number of steps provided.
  42587. * It will not clear any previous data that may have existed beyond the range of the steps count.
  42588. *
  42589. * Internally it uses the Smooth Step interpolation calculation.
  42590. *
  42591. * @method Phaser.Input.Pointer#getInterpolatedPosition
  42592. * @since 3.11.0
  42593. *
  42594. * @param {integer} [steps=10] - The number of interpolation steps to use.
  42595. * @param {array} [out] - An array to store the results in. If not provided a new one will be created.
  42596. *
  42597. * @return {array} An array of interpolated values.
  42598. */
  42599. getInterpolatedPosition: function (steps, out)
  42600. {
  42601. if (steps === undefined) { steps = 10; }
  42602. if (out === undefined) { out = []; }
  42603. var prevX = this.prevPosition.x;
  42604. var prevY = this.prevPosition.y;
  42605. var curX = this.position.x;
  42606. var curY = this.position.y;
  42607. for (var i = 0; i < steps; i++)
  42608. {
  42609. var t = (1 / steps) * i;
  42610. out[i] = { x: SmoothStepInterpolation(t, prevX, curX), y: SmoothStepInterpolation(t, prevY, curY) };
  42611. }
  42612. return out;
  42613. },
  42614. /**
  42615. * Destroys this Pointer instance and resets its external references.
  42616. *
  42617. * @method Phaser.Input.Pointer#destroy
  42618. * @since 3.0.0
  42619. */
  42620. destroy: function ()
  42621. {
  42622. this.camera = null;
  42623. this.manager = null;
  42624. this.position = null;
  42625. },
  42626. /**
  42627. * The x position of this Pointer.
  42628. * The value is in screen space.
  42629. * See `worldX` to get a camera converted position.
  42630. *
  42631. * @name Phaser.Input.Pointer#x
  42632. * @type {number}
  42633. * @since 3.0.0
  42634. */
  42635. x: {
  42636. get: function ()
  42637. {
  42638. return this.position.x;
  42639. },
  42640. set: function (value)
  42641. {
  42642. this.position.x = value;
  42643. }
  42644. },
  42645. /**
  42646. * The y position of this Pointer.
  42647. * The value is in screen space.
  42648. * See `worldY` to get a camera converted position.
  42649. *
  42650. * @name Phaser.Input.Pointer#y
  42651. * @type {number}
  42652. * @since 3.0.0
  42653. */
  42654. y: {
  42655. get: function ()
  42656. {
  42657. return this.position.y;
  42658. },
  42659. set: function (value)
  42660. {
  42661. this.position.y = value;
  42662. }
  42663. }
  42664. });
  42665. module.exports = Pointer;
  42666. /***/ }),
  42667. /* 204 */
  42668. /***/ (function(module, exports, __webpack_require__) {
  42669. /**
  42670. * @author Richard Davey <rich@photonstorm.com>
  42671. * @copyright 2018 Photon Storm Ltd.
  42672. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  42673. */
  42674. var Class = __webpack_require__(0);
  42675. var Features = __webpack_require__(120);
  42676. // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent
  42677. // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
  42678. /**
  42679. * @classdesc
  42680. * The Mouse Manager is a helper class that belongs to the Input Manager.
  42681. *
  42682. * Its role is to listen for native DOM Mouse Events and then pass them onto the Input Manager for further processing.
  42683. *
  42684. * You do not need to create this class directly, the Input Manager will create an instance of it automatically.
  42685. *
  42686. * @class MouseManager
  42687. * @memberOf Phaser.Input.Mouse
  42688. * @constructor
  42689. * @since 3.0.0
  42690. *
  42691. * @param {Phaser.Input.InputManager} inputManager - A reference to the Input Manager.
  42692. */
  42693. var MouseManager = new Class({
  42694. initialize:
  42695. function MouseManager (inputManager)
  42696. {
  42697. /**
  42698. * A reference to the Input Manager.
  42699. *
  42700. * @name Phaser.Input.Mouse.MouseManager#manager
  42701. * @type {Phaser.Input.InputManager}
  42702. * @since 3.0.0
  42703. */
  42704. this.manager = inputManager;
  42705. /**
  42706. * If true the DOM mouse events will have event.preventDefault applied to them, if false they will propagate fully.
  42707. *
  42708. * @name Phaser.Input.Mouse.MouseManager#capture
  42709. * @type {boolean}
  42710. * @default true
  42711. * @since 3.0.0
  42712. */
  42713. this.capture = true;
  42714. /**
  42715. * A boolean that controls if the Mouse Manager is enabled or not.
  42716. * Can be toggled on the fly.
  42717. *
  42718. * @name Phaser.Input.Mouse.MouseManager#enabled
  42719. * @type {boolean}
  42720. * @default false
  42721. * @since 3.0.0
  42722. */
  42723. this.enabled = false;
  42724. /**
  42725. * The Touch Event target, as defined in the Game Config.
  42726. * Typically the canvas to which the game is rendering, but can be any interactive DOM element.
  42727. *
  42728. * @name Phaser.Input.Mouse.MouseManager#target
  42729. * @type {any}
  42730. * @since 3.0.0
  42731. */
  42732. this.target;
  42733. /**
  42734. * If the mouse has been pointer locked successfully this will be set to true.
  42735. *
  42736. * @name Phaser.Input.Mouse.MouseManager#locked
  42737. * @type {boolean}
  42738. * @default false
  42739. * @since 3.0.0
  42740. */
  42741. this.locked = false;
  42742. inputManager.events.once('boot', this.boot, this);
  42743. },
  42744. /**
  42745. * The Touch Manager boot process.
  42746. *
  42747. * @method Phaser.Input.Mouse.MouseManager#boot
  42748. * @private
  42749. * @since 3.0.0
  42750. */
  42751. boot: function ()
  42752. {
  42753. var config = this.manager.config;
  42754. this.enabled = config.inputMouse;
  42755. this.target = config.inputMouseEventTarget;
  42756. this.capture = config.inputMouseCapture;
  42757. if (!this.target)
  42758. {
  42759. this.target = this.manager.game.canvas;
  42760. }
  42761. if (config.disableContextMenu)
  42762. {
  42763. this.disableContextMenu();
  42764. }
  42765. if (this.enabled)
  42766. {
  42767. this.startListeners();
  42768. }
  42769. },
  42770. /**
  42771. * Attempts to disable the context menu from appearing if you right-click on the browser.
  42772. *
  42773. * Works by listening for the `contextmenu` event and prevent defaulting it.
  42774. *
  42775. * Use this if you need to enable right-button mouse support in your game, and the browser
  42776. * menu keeps getting in the way.
  42777. *
  42778. * @method Phaser.Input.Mouse.MouseManager#disableContextMenu
  42779. * @since 3.0.0
  42780. *
  42781. * @return {Phaser.Input.Mouse.MouseManager} This Mouse Manager instance.
  42782. */
  42783. disableContextMenu: function ()
  42784. {
  42785. document.body.addEventListener('contextmenu', function (event)
  42786. {
  42787. event.preventDefault();
  42788. return false;
  42789. });
  42790. return this;
  42791. },
  42792. /**
  42793. * If the browser supports it, you can request that the pointer be locked to the browser window.
  42794. *
  42795. * This is classically known as 'FPS controls', where the pointer can't leave the browser until
  42796. * the user presses an exit key.
  42797. *
  42798. * If the browser successfully enters a locked state, a `POINTER_LOCK_CHANGE_EVENT` will be dispatched,
  42799. * from the games Input Manager, with an `isPointerLocked` property.
  42800. *
  42801. * It is important to note that pointer lock can only be enabled after an 'engagement gesture',
  42802. * see: https://w3c.github.io/pointerlock/#dfn-engagement-gesture.
  42803. *
  42804. * @method Phaser.Input.Mouse.MouseManager#requestPointerLock
  42805. * @since 3.0.0
  42806. */
  42807. requestPointerLock: function ()
  42808. {
  42809. if (Features.pointerLock)
  42810. {
  42811. var element = this.target;
  42812. element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock;
  42813. element.requestPointerLock();
  42814. }
  42815. },
  42816. /**
  42817. * Internal pointerLockChange handler.
  42818. *
  42819. * @method Phaser.Input.Mouse.MouseManager#pointerLockChange
  42820. * @since 3.0.0
  42821. *
  42822. * @param {MouseEvent} event - The native event from the browser.
  42823. */
  42824. pointerLockChange: function (event)
  42825. {
  42826. var element = this.target;
  42827. this.locked = (document.pointerLockElement === element || document.mozPointerLockElement === element || document.webkitPointerLockElement === element) ? true : false;
  42828. this.manager.queue.push(event);
  42829. },
  42830. /**
  42831. * If the browser supports pointer lock, this will request that the pointer lock is released. If
  42832. * the browser successfully enters a locked state, a 'POINTER_LOCK_CHANGE_EVENT' will be
  42833. * dispatched - from the game's input manager - with an `isPointerLocked` property.
  42834. *
  42835. * @method Phaser.Input.Mouse.MouseManager#releasePointerLock
  42836. * @since 3.0.0
  42837. */
  42838. releasePointerLock: function ()
  42839. {
  42840. if (Features.pointerLock)
  42841. {
  42842. document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock || document.webkitExitPointerLock;
  42843. document.exitPointerLock();
  42844. }
  42845. },
  42846. /**
  42847. * The Mouse Move Event Handler.
  42848. *
  42849. * @method Phaser.Input.Mouse.MouseManager#onMouseMove
  42850. * @since 3.10.0
  42851. *
  42852. * @param {MouseEvent} event - The native DOM Mouse Move Event.
  42853. */
  42854. onMouseMove: function (event)
  42855. {
  42856. if (event.defaultPrevented || !this.enabled)
  42857. {
  42858. // Do nothing if event already handled
  42859. return;
  42860. }
  42861. this.manager.queueMouseMove(event);
  42862. if (this.capture)
  42863. {
  42864. event.preventDefault();
  42865. }
  42866. },
  42867. /**
  42868. * The Mouse Down Event Handler.
  42869. *
  42870. * @method Phaser.Input.Mouse.MouseManager#onMouseDown
  42871. * @since 3.10.0
  42872. *
  42873. * @param {MouseEvent} event - The native DOM Mouse Down Event.
  42874. */
  42875. onMouseDown: function (event)
  42876. {
  42877. if (event.defaultPrevented || !this.enabled)
  42878. {
  42879. // Do nothing if event already handled
  42880. return;
  42881. }
  42882. this.manager.queueMouseDown(event);
  42883. if (this.capture)
  42884. {
  42885. event.preventDefault();
  42886. }
  42887. },
  42888. /**
  42889. * The Mouse Up Event Handler.
  42890. *
  42891. * @method Phaser.Input.Mouse.MouseManager#onMouseUp
  42892. * @since 3.10.0
  42893. *
  42894. * @param {MouseEvent} event - The native DOM Mouse Up Event.
  42895. */
  42896. onMouseUp: function (event)
  42897. {
  42898. if (event.defaultPrevented || !this.enabled)
  42899. {
  42900. // Do nothing if event already handled
  42901. return;
  42902. }
  42903. this.manager.queueMouseUp(event);
  42904. if (this.capture)
  42905. {
  42906. event.preventDefault();
  42907. }
  42908. },
  42909. /**
  42910. * Starts the Mouse Event listeners running.
  42911. * This is called automatically and does not need to be manually invoked.
  42912. *
  42913. * @method Phaser.Input.Mouse.MouseManager#startListeners
  42914. * @since 3.0.0
  42915. */
  42916. startListeners: function ()
  42917. {
  42918. var target = this.target;
  42919. var passive = { passive: true };
  42920. var nonPassive = { passive: false };
  42921. if (this.capture)
  42922. {
  42923. target.addEventListener('mousemove', this.onMouseMove.bind(this), nonPassive);
  42924. target.addEventListener('mousedown', this.onMouseDown.bind(this), nonPassive);
  42925. target.addEventListener('mouseup', this.onMouseUp.bind(this), nonPassive);
  42926. }
  42927. else
  42928. {
  42929. target.addEventListener('mousemove', this.onMouseMove.bind(this), passive);
  42930. target.addEventListener('mousedown', this.onMouseDown.bind(this), passive);
  42931. target.addEventListener('mouseup', this.onMouseUp.bind(this), passive);
  42932. }
  42933. if (Features.pointerLock)
  42934. {
  42935. this.pointerLockChange = this.pointerLockChange.bind(this);
  42936. document.addEventListener('pointerlockchange', this.pointerLockChange, true);
  42937. document.addEventListener('mozpointerlockchange', this.pointerLockChange, true);
  42938. document.addEventListener('webkitpointerlockchange', this.pointerLockChange, true);
  42939. }
  42940. },
  42941. /**
  42942. * Stops the Mouse Event listeners.
  42943. * This is called automatically and does not need to be manually invoked.
  42944. *
  42945. * @method Phaser.Input.Mouse.MouseManager#stopListeners
  42946. * @since 3.0.0
  42947. */
  42948. stopListeners: function ()
  42949. {
  42950. var target = this.target;
  42951. target.removeEventListener('mousemove', this.onMouseMove);
  42952. target.removeEventListener('mousedown', this.onMouseDown);
  42953. target.removeEventListener('mouseup', this.onMouseUp);
  42954. if (Features.pointerLock)
  42955. {
  42956. document.removeEventListener('pointerlockchange', this.pointerLockChange, true);
  42957. document.removeEventListener('mozpointerlockchange', this.pointerLockChange, true);
  42958. document.removeEventListener('webkitpointerlockchange', this.pointerLockChange, true);
  42959. }
  42960. },
  42961. /**
  42962. * Destroys this Mouse Manager instance.
  42963. *
  42964. * @method Phaser.Input.Mouse.MouseManager#destroy
  42965. * @since 3.0.0
  42966. */
  42967. destroy: function ()
  42968. {
  42969. this.stopListeners();
  42970. this.target = null;
  42971. this.manager = null;
  42972. }
  42973. });
  42974. module.exports = MouseManager;
  42975. /***/ }),
  42976. /* 205 */
  42977. /***/ (function(module, exports) {
  42978. /**
  42979. * @author Richard Davey <rich@photonstorm.com>
  42980. * @copyright 2018 Photon Storm Ltd.
  42981. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  42982. */
  42983. var INPUT_CONST = {
  42984. /**
  42985. * The mouse pointer is being held down.
  42986. *
  42987. * @name Phaser.Input.MOUSE_DOWN
  42988. * @type {integer}
  42989. * @since 3.10.0
  42990. */
  42991. MOUSE_DOWN: 0,
  42992. /**
  42993. * The mouse pointer is being moved.
  42994. *
  42995. * @name Phaser.Input.MOUSE_MOVE
  42996. * @type {integer}
  42997. * @since 3.10.0
  42998. */
  42999. MOUSE_MOVE: 1,
  43000. /**
  43001. * The mouse pointer is released.
  43002. *
  43003. * @name Phaser.Input.MOUSE_UP
  43004. * @type {integer}
  43005. * @since 3.10.0
  43006. */
  43007. MOUSE_UP: 2,
  43008. /**
  43009. * A touch pointer has been started.
  43010. *
  43011. * @name Phaser.Input.TOUCH_START
  43012. * @type {integer}
  43013. * @since 3.10.0
  43014. */
  43015. TOUCH_START: 3,
  43016. /**
  43017. * A touch pointer has been started.
  43018. *
  43019. * @name Phaser.Input.TOUCH_MOVE
  43020. * @type {integer}
  43021. * @since 3.10.0
  43022. */
  43023. TOUCH_MOVE: 4,
  43024. /**
  43025. * A touch pointer has been started.
  43026. *
  43027. * @name Phaser.Input.TOUCH_END
  43028. * @type {integer}
  43029. * @since 3.10.0
  43030. */
  43031. TOUCH_END: 5,
  43032. /**
  43033. * The pointer lock has changed.
  43034. *
  43035. * @name Phaser.Input.POINTER_LOCK_CHANGE
  43036. * @type {integer}
  43037. * @since 3.10.0
  43038. */
  43039. POINTER_LOCK_CHANGE: 6
  43040. };
  43041. module.exports = INPUT_CONST;
  43042. /***/ }),
  43043. /* 206 */
  43044. /***/ (function(module, exports, __webpack_require__) {
  43045. /**
  43046. * @author Richard Davey <rich@photonstorm.com>
  43047. * @copyright 2018 Photon Storm Ltd.
  43048. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  43049. */
  43050. var Class = __webpack_require__(0);
  43051. var CONST = __webpack_require__(205);
  43052. var EventEmitter = __webpack_require__(9);
  43053. var Mouse = __webpack_require__(204);
  43054. var Pointer = __webpack_require__(203);
  43055. var Rectangle = __webpack_require__(13);
  43056. var Touch = __webpack_require__(202);
  43057. var TransformMatrix = __webpack_require__(32);
  43058. var TransformXY = __webpack_require__(250);
  43059. /**
  43060. * @classdesc
  43061. * The Input Manager is responsible for handling the pointer related systems in a single Phaser Game instance.
  43062. *
  43063. * Based on the Game Config it will create handlers for mouse and touch support.
  43064. *
  43065. * Keyboard and Gamepad are plugins, handled directly by the InputPlugin class.
  43066. *
  43067. * It then manages the event queue, pointer creation and general hit test related operations.
  43068. *
  43069. * You rarely need to interact with the Input Manager directly, and as such, all of its properties and methods
  43070. * should be considered private. Instead, you should use the Input Plugin, which is a Scene level system, responsible
  43071. * for dealing with all input events for a Scene.
  43072. *
  43073. * @class InputManager
  43074. * @memberOf Phaser.Input
  43075. * @constructor
  43076. * @since 3.0.0
  43077. *
  43078. * @param {Phaser.Game} game - The Game instance that owns the Input Manager.
  43079. * @param {object} config - The Input Configuration object, as set in the Game Config.
  43080. */
  43081. var InputManager = new Class({
  43082. initialize:
  43083. function InputManager (game, config)
  43084. {
  43085. /**
  43086. * The Game instance that owns the Input Manager.
  43087. * A Game only maintains on instance of the Input Manager at any time.
  43088. *
  43089. * @name Phaser.Input.InputManager#game
  43090. * @type {Phaser.Game}
  43091. * @readOnly
  43092. * @since 3.0.0
  43093. */
  43094. this.game = game;
  43095. /**
  43096. * The Canvas that is used for all DOM event input listeners.
  43097. *
  43098. * @name Phaser.Input.InputManager#canvas
  43099. * @type {HTMLCanvasElement}
  43100. * @since 3.0.0
  43101. */
  43102. this.canvas;
  43103. /**
  43104. * The Input Configuration object, as set in the Game Config.
  43105. *
  43106. * @name Phaser.Input.InputManager#config
  43107. * @type {object}
  43108. * @since 3.0.0
  43109. */
  43110. this.config = config;
  43111. /**
  43112. * If set, the Input Manager will run its update loop every frame.
  43113. *
  43114. * @name Phaser.Input.InputManager#enabled
  43115. * @type {boolean}
  43116. * @default true
  43117. * @since 3.0.0
  43118. */
  43119. this.enabled = true;
  43120. /**
  43121. * The Event Emitter instance that the Input Manager uses to emit events from.
  43122. *
  43123. * @name Phaser.Input.InputManager#events
  43124. * @type {Phaser.Events.EventEmitter}
  43125. * @since 3.0.0
  43126. */
  43127. this.events = new EventEmitter();
  43128. /**
  43129. * A standard FIFO queue for the native DOM events waiting to be handled by the Input Manager.
  43130. *
  43131. * @name Phaser.Input.InputManager#queue
  43132. * @type {array}
  43133. * @default []
  43134. * @since 3.0.0
  43135. */
  43136. this.queue = [];
  43137. /**
  43138. * DOM Callbacks container.
  43139. *
  43140. * @name Phaser.Input.InputManager#domCallbacks
  43141. * @private
  43142. * @type {object}
  43143. * @since 3.10.0
  43144. */
  43145. this.domCallbacks = { up: [], down: [], move: [], upOnce: [], downOnce: [], moveOnce: [] };
  43146. /**
  43147. * Are there any up callbacks defined?
  43148. *
  43149. * @name Phaser.Input.InputManager#_hasUpCallback
  43150. * @private
  43151. * @type {boolean}
  43152. * @since 3.10.0
  43153. */
  43154. this._hasUpCallback = false;
  43155. /**
  43156. * Are there any down callbacks defined?
  43157. *
  43158. * @name Phaser.Input.InputManager#_hasDownCallback
  43159. * @private
  43160. * @type {boolean}
  43161. * @since 3.10.0
  43162. */
  43163. this._hasDownCallback = false;
  43164. /**
  43165. * Are there any move callbacks defined?
  43166. *
  43167. * @name Phaser.Input.InputManager#_hasMoveCallback
  43168. * @private
  43169. * @type {boolean}
  43170. * @since 3.10.0
  43171. */
  43172. this._hasMoveCallback = false;
  43173. /**
  43174. * Is a custom cursor currently set? (desktop only)
  43175. *
  43176. * @name Phaser.Input.InputManager#_customCursor
  43177. * @private
  43178. * @type {string}
  43179. * @since 3.10.0
  43180. */
  43181. this._customCursor = '';
  43182. /**
  43183. * Custom cursor tracking value.
  43184. *
  43185. * 0 - No change.
  43186. * 1 - Set new cursor.
  43187. * 2 - Reset cursor.
  43188. *
  43189. * @name Phaser.Input.InputManager#_setCursor
  43190. * @private
  43191. * @type {integer}
  43192. * @since 3.10.0
  43193. */
  43194. this._setCursor = 0;
  43195. /**
  43196. * The default CSS cursor to be used when interacting with your game.
  43197. *
  43198. * See the `setDefaultCursor` method for more details.
  43199. *
  43200. * @name Phaser.Input.InputManager#defaultCursor
  43201. * @type {string}
  43202. * @since 3.10.0
  43203. */
  43204. this.defaultCursor = '';
  43205. /**
  43206. * A reference to the Mouse Manager class, if enabled via the `input.mouse` Game Config property.
  43207. *
  43208. * @name Phaser.Input.InputManager#mouse
  43209. * @type {?Phaser.Input.Mouse.MouseManager}
  43210. * @since 3.0.0
  43211. */
  43212. this.mouse = (config.inputMouse) ? new Mouse(this) : null;
  43213. /**
  43214. * A reference to the Touch Manager class, if enabled via the `input.touch` Game Config property.
  43215. *
  43216. * @name Phaser.Input.InputManager#touch
  43217. * @type {Phaser.Input.Touch.TouchManager}
  43218. * @since 3.0.0
  43219. */
  43220. this.touch = (config.inputTouch) ? new Touch(this) : null;
  43221. /**
  43222. * An array of Pointers that have been added to the game.
  43223. * The first entry is reserved for the Mouse Pointer, the rest are Touch Pointers.
  43224. *
  43225. * By default there is 1 touch pointer enabled. If you need more use the `addPointer` method to start them,
  43226. * or set the `input.activePointers` property in the Game Config.
  43227. *
  43228. * @name Phaser.Input.InputManager#pointers
  43229. * @type {Phaser.Input.Pointer[]}
  43230. * @since 3.10.0
  43231. */
  43232. this.pointers = [];
  43233. /**
  43234. * The number of touch objects activated and being processed each update.
  43235. *
  43236. * You can change this by either calling `addPointer` at run-time, or by
  43237. * setting the `input.activePointers` property in the Game Config.
  43238. *
  43239. * @name Phaser.Input.InputManager#pointersTotal
  43240. * @type {integer}
  43241. * @readOnly
  43242. * @since 3.10.0
  43243. */
  43244. this.pointersTotal = config.inputActivePointers;
  43245. if (config.inputTouch && this.pointersTotal === 1)
  43246. {
  43247. this.pointersTotal = 2;
  43248. }
  43249. for (var i = 0; i <= this.pointersTotal; i++)
  43250. {
  43251. this.pointers.push(new Pointer(this, i));
  43252. }
  43253. /**
  43254. * The mouse has its own unique Pointer object, which you can reference directly if making a _desktop specific game_.
  43255. * If you are supporting both desktop and touch devices then do not use this property, instead use `activePointer`
  43256. * which will always map to the most recently interacted pointer.
  43257. *
  43258. * @name Phaser.Input.InputManager#mousePointer
  43259. * @type {?Phaser.Input.Pointer}
  43260. * @since 3.10.0
  43261. */
  43262. this.mousePointer = (config.inputMouse) ? this.pointers[0] : null;
  43263. /**
  43264. * The most recently active Pointer object.
  43265. *
  43266. * If you've only 1 Pointer in your game then this will accurately be either the first finger touched, or the mouse.
  43267. *
  43268. * If your game doesn't need to support multi-touch then you can safely use this property in all of your game
  43269. * code and it will adapt to be either the mouse or the touch, based on device.
  43270. *
  43271. * @name Phaser.Input.InputManager#activePointer
  43272. * @type {Phaser.Input.Pointer}
  43273. * @since 3.0.0
  43274. */
  43275. this.activePointer = this.pointers[0];
  43276. /**
  43277. * Reset every frame. Set to `true` if any of the Pointers are dirty this frame.
  43278. *
  43279. * @name Phaser.Input.InputManager#dirty
  43280. * @type {boolean}
  43281. * @since 3.10.0
  43282. */
  43283. this.dirty = false;
  43284. /**
  43285. * The Scale factor being applied to input coordinates.
  43286. *
  43287. * @name Phaser.Input.InputManager#scale
  43288. * @type { { x:number, y:number } }
  43289. * @since 3.0.0
  43290. */
  43291. this.scale = { x: 1, y: 1 };
  43292. /**
  43293. * If the top-most Scene in the Scene List receives an input it will stop input from
  43294. * propagating any lower down the scene list, i.e. if you have a UI Scene at the top
  43295. * and click something on it, that click will not then be passed down to any other
  43296. * Scene below. Disable this to have input events passed through all Scenes, all the time.
  43297. *
  43298. * @name Phaser.Input.InputManager#globalTopOnly
  43299. * @type {boolean}
  43300. * @default true
  43301. * @since 3.0.0
  43302. */
  43303. this.globalTopOnly = true;
  43304. /**
  43305. * An internal flag that controls if the Input Manager will ignore or process native DOM events this frame.
  43306. * Set via the InputPlugin.stopPropagation method.
  43307. *
  43308. * @name Phaser.Input.InputManager#ignoreEvents
  43309. * @type {boolean}
  43310. * @default false
  43311. * @since 3.0.0
  43312. */
  43313. this.ignoreEvents = false;
  43314. /**
  43315. * The bounds of the Input Manager, used for pointer hit test calculations.
  43316. *
  43317. * @name Phaser.Input.InputManager#bounds
  43318. * @type {Phaser.Geom.Rectangle}
  43319. * @since 3.0.0
  43320. */
  43321. this.bounds = new Rectangle();
  43322. /**
  43323. * A re-cycled point-like object to store hit test values in.
  43324. *
  43325. * @name Phaser.Input.InputManager#_tempPoint
  43326. * @type {{x:number,y:number}}
  43327. * @private
  43328. * @since 3.0.0
  43329. */
  43330. this._tempPoint = { x: 0, y: 0 };
  43331. /**
  43332. * A re-cycled array to store hit results in.
  43333. *
  43334. * @name Phaser.Input.InputManager#_tempHitTest
  43335. * @type {array}
  43336. * @private
  43337. * @default []
  43338. * @since 3.0.0
  43339. */
  43340. this._tempHitTest = [];
  43341. /**
  43342. * A re-cycled matrix used in hit test calculations.
  43343. *
  43344. * @name Phaser.Input.InputManager#_tempMatrix
  43345. * @type {Phaser.GameObjects.Components.TransformMatrix}
  43346. * @private
  43347. * @since 3.4.0
  43348. */
  43349. this._tempMatrix = new TransformMatrix();
  43350. game.events.once('boot', this.boot, this);
  43351. },
  43352. /**
  43353. * The Boot handler is called by Phaser.Game when it first starts up.
  43354. * The renderer is available by now.
  43355. *
  43356. * @method Phaser.Input.InputManager#boot
  43357. * @protected
  43358. * @since 3.0.0
  43359. */
  43360. boot: function ()
  43361. {
  43362. this.canvas = this.game.canvas;
  43363. this.updateBounds();
  43364. this.events.emit('boot');
  43365. this.game.events.on('prestep', this.update, this);
  43366. this.game.events.on('poststep', this.postUpdate, this);
  43367. this.game.events.once('destroy', this.destroy, this);
  43368. },
  43369. /**
  43370. * Updates the Input Manager bounds rectangle to match the bounding client rectangle of the
  43371. * canvas element being used to track input events.
  43372. *
  43373. * @method Phaser.Input.InputManager#updateBounds
  43374. * @since 3.0.0
  43375. */
  43376. updateBounds: function ()
  43377. {
  43378. var bounds = this.bounds;
  43379. var clientRect = this.canvas.getBoundingClientRect();
  43380. bounds.x = clientRect.left + window.pageXOffset - document.documentElement.clientLeft;
  43381. bounds.y = clientRect.top + window.pageYOffset - document.documentElement.clientTop;
  43382. bounds.width = clientRect.width;
  43383. bounds.height = clientRect.height;
  43384. },
  43385. /**
  43386. * Resizes the Input Manager internal values, including the bounds and scale factor.
  43387. *
  43388. * @method Phaser.Input.InputManager#resize
  43389. * @since 3.2.0
  43390. */
  43391. resize: function ()
  43392. {
  43393. this.updateBounds();
  43394. // Game config size
  43395. var gw = this.game.config.width;
  43396. var gh = this.game.config.height;
  43397. // Actual canvas size
  43398. var bw = this.bounds.width;
  43399. var bh = this.bounds.height;
  43400. // Scale factor
  43401. this.scale.x = gw / bw;
  43402. this.scale.y = gh / bh;
  43403. },
  43404. /**
  43405. * Internal update loop, called automatically by the Game Step.
  43406. *
  43407. * @method Phaser.Input.InputManager#update
  43408. * @private
  43409. * @since 3.0.0
  43410. *
  43411. * @param {number} time - The time stamp value of this game step.
  43412. */
  43413. update: function (time)
  43414. {
  43415. var i;
  43416. this._setCursor = 0;
  43417. this.events.emit('update');
  43418. this.ignoreEvents = false;
  43419. this.dirty = false;
  43420. var len = this.queue.length;
  43421. var pointers = this.pointers;
  43422. for (i = 0; i < this.pointersTotal; i++)
  43423. {
  43424. pointers[i].reset();
  43425. }
  43426. if (!this.enabled || len === 0)
  43427. {
  43428. return;
  43429. }
  43430. this.dirty = true;
  43431. this.updateBounds();
  43432. this.scale.x = this.game.config.width / this.bounds.width;
  43433. this.scale.y = this.game.config.height / this.bounds.height;
  43434. // Clears the queue array, and also means we don't work on array data that could potentially
  43435. // be modified during the processing phase
  43436. var queue = this.queue.splice(0, len);
  43437. var mouse = this.mousePointer;
  43438. // Process the event queue, dispatching all of the events that have stored up
  43439. for (i = 0; i < len; i += 2)
  43440. {
  43441. var type = queue[i];
  43442. var event = queue[i + 1];
  43443. switch (type)
  43444. {
  43445. case CONST.MOUSE_DOWN:
  43446. mouse.down(event, time);
  43447. break;
  43448. case CONST.MOUSE_MOVE:
  43449. mouse.move(event, time);
  43450. break;
  43451. case CONST.MOUSE_UP:
  43452. mouse.up(event, time);
  43453. break;
  43454. case CONST.TOUCH_START:
  43455. this.startPointer(event, time);
  43456. break;
  43457. case CONST.TOUCH_MOVE:
  43458. this.updatePointer(event, time);
  43459. break;
  43460. case CONST.TOUCH_END:
  43461. this.stopPointer(event, time);
  43462. break;
  43463. case CONST.POINTER_LOCK_CHANGE:
  43464. this.events.emit('pointerlockchange', event, this.mouse.locked);
  43465. break;
  43466. }
  43467. }
  43468. },
  43469. /**
  43470. * Internal post-update, called automatically by the Game step.
  43471. *
  43472. * @method Phaser.Input.InputManager#postUpdate
  43473. * @private
  43474. * @since 3.10.0
  43475. */
  43476. postUpdate: function ()
  43477. {
  43478. if (this._setCursor === 1)
  43479. {
  43480. this.canvas.style.cursor = this._customCursor;
  43481. }
  43482. else if (this._setCursor === 2)
  43483. {
  43484. this.canvas.style.cursor = this.defaultCursor;
  43485. }
  43486. },
  43487. /**
  43488. * Tells the Input system to set a custom cursor.
  43489. *
  43490. * This cursor will be the default cursor used when interacting with the game canvas.
  43491. *
  43492. * If an Interactive Object also sets a custom cursor, this is the cursor that is reset after its use.
  43493. *
  43494. * Any valid CSS cursor value is allowed, including paths to image files, i.e.:
  43495. *
  43496. * ```javascript
  43497. * this.input.setDefaultCursor('url(assets/cursors/sword.cur), pointer');
  43498. * ```
  43499. *
  43500. * Please read about the differences between browsers when it comes to the file formats and sizes they support:
  43501. *
  43502. * https://developer.mozilla.org/en-US/docs/Web/CSS/cursor
  43503. * https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_User_Interface/Using_URL_values_for_the_cursor_property
  43504. *
  43505. * It's up to you to pick a suitable cursor format that works across the range of browsers you need to support.
  43506. *
  43507. * @method Phaser.Input.InputManager#setDefaultCursor
  43508. * @since 3.10.0
  43509. *
  43510. * @param {string} cursor - The CSS to be used when setting the default cursor.
  43511. */
  43512. setDefaultCursor: function (cursor)
  43513. {
  43514. this.defaultCursor = cursor;
  43515. if (this.canvas.style.cursor !== cursor)
  43516. {
  43517. this.canvas.style.cursor = cursor;
  43518. }
  43519. },
  43520. /**
  43521. * Called by the InputPlugin when processing over and out events.
  43522. *
  43523. * Tells the Input Manager to set a custom cursor during its postUpdate step.
  43524. *
  43525. * https://developer.mozilla.org/en-US/docs/Web/CSS/cursor
  43526. *
  43527. * @method Phaser.Input.InputManager#setCursor
  43528. * @private
  43529. * @since 3.10.0
  43530. *
  43531. * @param {Phaser.Input.InteractiveObject} interactiveObject - The Interactive Object that called this method.
  43532. */
  43533. setCursor: function (interactiveObject)
  43534. {
  43535. if (interactiveObject.cursor)
  43536. {
  43537. this._setCursor = 1;
  43538. this._customCursor = interactiveObject.cursor;
  43539. }
  43540. },
  43541. /**
  43542. * Called by the InputPlugin when processing over and out events.
  43543. *
  43544. * Tells the Input Manager to clear the hand cursor, if set, during its postUpdate step.
  43545. *
  43546. * @method Phaser.Input.InputManager#resetCursor
  43547. * @private
  43548. * @since 3.10.0
  43549. *
  43550. * @param {Phaser.Input.InteractiveObject} interactiveObject - The Interactive Object that called this method.
  43551. */
  43552. resetCursor: function (interactiveObject)
  43553. {
  43554. if (interactiveObject.cursor)
  43555. {
  43556. this._setCursor = 2;
  43557. }
  43558. },
  43559. // event.targetTouches = list of all touches on the TARGET ELEMENT (i.e. game dom element)
  43560. // event.touches = list of all touches on the ENTIRE DOCUMENT, not just the target element
  43561. // event.changedTouches = the touches that CHANGED in this event, not the total number of them
  43562. /**
  43563. * Called by the main update loop when a Touch Start Event is received.
  43564. *
  43565. * @method Phaser.Input.InputManager#startPointer
  43566. * @private
  43567. * @since 3.10.0
  43568. *
  43569. * @param {TouchEvent} event - The native DOM event to be processed.
  43570. * @param {number} time - The time stamp value of this game step.
  43571. */
  43572. startPointer: function (event, time)
  43573. {
  43574. var pointers = this.pointers;
  43575. for (var c = 0; c < event.changedTouches.length; c++)
  43576. {
  43577. var changedTouch = event.changedTouches[c];
  43578. for (var i = 1; i < this.pointersTotal; i++)
  43579. {
  43580. var pointer = pointers[i];
  43581. if (!pointer.active)
  43582. {
  43583. pointer.touchstart(changedTouch, time);
  43584. this.activePointer = pointer;
  43585. break;
  43586. }
  43587. }
  43588. }
  43589. },
  43590. /**
  43591. * Called by the main update loop when a Touch Move Event is received.
  43592. *
  43593. * @method Phaser.Input.InputManager#updatePointer
  43594. * @private
  43595. * @since 3.10.0
  43596. *
  43597. * @param {TouchEvent} event - The native DOM event to be processed.
  43598. * @param {number} time - The time stamp value of this game step.
  43599. */
  43600. updatePointer: function (event, time)
  43601. {
  43602. var pointers = this.pointers;
  43603. for (var c = 0; c < event.changedTouches.length; c++)
  43604. {
  43605. var changedTouch = event.changedTouches[c];
  43606. for (var i = 1; i < this.pointersTotal; i++)
  43607. {
  43608. var pointer = pointers[i];
  43609. if (pointer.active && pointer.identifier === changedTouch.identifier)
  43610. {
  43611. pointer.touchmove(changedTouch, time);
  43612. this.activePointer = pointer;
  43613. break;
  43614. }
  43615. }
  43616. }
  43617. },
  43618. // For touch end its a list of the touch points that have been removed from the surface
  43619. // https://developer.mozilla.org/en-US/docs/DOM/TouchList
  43620. // event.changedTouches = the touches that CHANGED in this event, not the total number of them
  43621. /**
  43622. * Called by the main update loop when a Touch End Event is received.
  43623. *
  43624. * @method Phaser.Input.InputManager#stopPointer
  43625. * @private
  43626. * @since 3.10.0
  43627. *
  43628. * @param {TouchEvent} event - The native DOM event to be processed.
  43629. * @param {number} time - The time stamp value of this game step.
  43630. */
  43631. stopPointer: function (event, time)
  43632. {
  43633. var pointers = this.pointers;
  43634. for (var c = 0; c < event.changedTouches.length; c++)
  43635. {
  43636. var changedTouch = event.changedTouches[c];
  43637. for (var i = 1; i < this.pointersTotal; i++)
  43638. {
  43639. var pointer = pointers[i];
  43640. if (pointer.active && pointer.identifier === changedTouch.identifier)
  43641. {
  43642. pointer.touchend(changedTouch, time);
  43643. break;
  43644. }
  43645. }
  43646. }
  43647. },
  43648. /**
  43649. * Adds new Pointer objects to the Input Manager.
  43650. *
  43651. * By default Phaser creates 2 pointer objects: `mousePointer` and `pointer1`.
  43652. *
  43653. * You can create more either by calling this method, or by setting the `input.activePointers` property
  43654. * in the Game Config, up to a maximum of 10 pointers.
  43655. *
  43656. * The first 10 pointers are available via the `InputPlugin.pointerX` properties, once they have been added
  43657. * via this method.
  43658. *
  43659. * @method Phaser.Input.InputManager#addPointer
  43660. * @since 3.10.0
  43661. *
  43662. * @param {integer} [quantity=1] The number of new Pointers to create. A maximum of 10 is allowed in total.
  43663. *
  43664. * @return {Phaser.Input.Pointer[]} An array containing all of the new Pointer objects that were created.
  43665. */
  43666. addPointer: function (quantity)
  43667. {
  43668. if (quantity === undefined) { quantity = 1; }
  43669. var output = [];
  43670. if (this.pointersTotal + quantity > 10)
  43671. {
  43672. quantity = 10 - this.pointersTotal;
  43673. }
  43674. for (var i = 0; i < quantity; i++)
  43675. {
  43676. var id = this.pointers.length;
  43677. var pointer = new Pointer(this, id);
  43678. this.pointers.push(pointer);
  43679. this.pointersTotal++;
  43680. output.push(pointer);
  43681. }
  43682. return output;
  43683. },
  43684. /**
  43685. * Process any pending DOM callbacks.
  43686. *
  43687. * @method Phaser.Input.InputManager#processDomCallbacks
  43688. * @private
  43689. * @since 3.10.0
  43690. *
  43691. * @param {array} once - The isOnce callbacks to invoke.
  43692. * @param {array} every - The every frame callbacks to invoke.
  43693. * @param {any} event - The native DOM event that is passed to the callbacks.
  43694. *
  43695. * @return {boolean} `true` if there are callbacks still in the list, otherwise `false`.
  43696. */
  43697. processDomCallbacks: function (once, every, event)
  43698. {
  43699. var i = 0;
  43700. for (i = 0; i < once.length; i++)
  43701. {
  43702. once[i](event);
  43703. }
  43704. for (i = 0; i < every.length; i++)
  43705. {
  43706. every[i](event);
  43707. }
  43708. once = [];
  43709. return (every.length > 0);
  43710. },
  43711. /**
  43712. * Queues a touch start event, as passed in by the TouchManager.
  43713. * Also dispatches any DOM callbacks for this event.
  43714. *
  43715. * @method Phaser.Input.InputManager#queueTouchStart
  43716. * @private
  43717. * @since 3.10.0
  43718. *
  43719. * @param {TouchEvent} event - The native DOM Touch event.
  43720. */
  43721. queueTouchStart: function (event)
  43722. {
  43723. this.queue.push(CONST.TOUCH_START, event);
  43724. if (this._hasDownCallback)
  43725. {
  43726. var callbacks = this.domCallbacks;
  43727. this._hasDownCallback = this.processDomCallbacks(callbacks.downOnce, callbacks.down, event);
  43728. }
  43729. },
  43730. /**
  43731. * Queues a touch move event, as passed in by the TouchManager.
  43732. * Also dispatches any DOM callbacks for this event.
  43733. *
  43734. * @method Phaser.Input.InputManager#queueTouchMove
  43735. * @private
  43736. * @since 3.10.0
  43737. *
  43738. * @param {TouchEvent} event - The native DOM Touch event.
  43739. */
  43740. queueTouchMove: function (event)
  43741. {
  43742. this.queue.push(CONST.TOUCH_MOVE, event);
  43743. if (this._hasMoveCallback)
  43744. {
  43745. var callbacks = this.domCallbacks;
  43746. this._hasMoveCallback = this.processDomCallbacks(callbacks.moveOnce, callbacks.move, event);
  43747. }
  43748. },
  43749. /**
  43750. * Queues a touch end event, as passed in by the TouchManager.
  43751. * Also dispatches any DOM callbacks for this event.
  43752. *
  43753. * @method Phaser.Input.InputManager#queueTouchEnd
  43754. * @private
  43755. * @since 3.10.0
  43756. *
  43757. * @param {TouchEvent} event - The native DOM Touch event.
  43758. */
  43759. queueTouchEnd: function (event)
  43760. {
  43761. this.queue.push(CONST.TOUCH_END, event);
  43762. if (this._hasUpCallback)
  43763. {
  43764. var callbacks = this.domCallbacks;
  43765. this._hasUpCallback = this.processDomCallbacks(callbacks.upOnce, callbacks.up, event);
  43766. }
  43767. },
  43768. /**
  43769. * Queues a mouse down event, as passed in by the MouseManager.
  43770. * Also dispatches any DOM callbacks for this event.
  43771. *
  43772. * @method Phaser.Input.InputManager#queueMouseDown
  43773. * @private
  43774. * @since 3.10.0
  43775. *
  43776. * @param {MouseEvent} event - The native DOM Mouse event.
  43777. */
  43778. queueMouseDown: function (event)
  43779. {
  43780. this.queue.push(CONST.MOUSE_DOWN, event);
  43781. if (this._hasDownCallback)
  43782. {
  43783. var callbacks = this.domCallbacks;
  43784. this._hasDownCallback = this.processDomCallbacks(callbacks.downOnce, callbacks.down, event);
  43785. }
  43786. },
  43787. /**
  43788. * Queues a mouse move event, as passed in by the MouseManager.
  43789. * Also dispatches any DOM callbacks for this event.
  43790. *
  43791. * @method Phaser.Input.InputManager#queueMouseMove
  43792. * @private
  43793. * @since 3.10.0
  43794. *
  43795. * @param {MouseEvent} event - The native DOM Mouse event.
  43796. */
  43797. queueMouseMove: function (event)
  43798. {
  43799. this.queue.push(CONST.MOUSE_MOVE, event);
  43800. if (this._hasMoveCallback)
  43801. {
  43802. var callbacks = this.domCallbacks;
  43803. this._hasMoveCallback = this.processDomCallbacks(callbacks.moveOnce, callbacks.move, event);
  43804. }
  43805. },
  43806. /**
  43807. * Queues a mouse up event, as passed in by the MouseManager.
  43808. * Also dispatches any DOM callbacks for this event.
  43809. *
  43810. * @method Phaser.Input.InputManager#queueMouseUp
  43811. * @private
  43812. * @since 3.10.0
  43813. *
  43814. * @param {MouseEvent} event - The native DOM Mouse event.
  43815. */
  43816. queueMouseUp: function (event)
  43817. {
  43818. this.queue.push(CONST.MOUSE_UP, event);
  43819. if (this._hasUpCallback)
  43820. {
  43821. var callbacks = this.domCallbacks;
  43822. this._hasUpCallback = this.processDomCallbacks(callbacks.upOnce, callbacks.up, event);
  43823. }
  43824. },
  43825. /**
  43826. * Adds a callback to be invoked whenever the native DOM `mouseup` or `touchend` events are received.
  43827. * By setting the `isOnce` argument you can control if the callback is called once,
  43828. * or every time the DOM event occurs.
  43829. *
  43830. * Callbacks passed to this method are invoked _immediately_ when the DOM event happens,
  43831. * within the scope of the DOM event handler. Therefore, they are considered as 'native'
  43832. * from the perspective of the browser. This means they can be used for tasks such as
  43833. * opening new browser windows, or anything which explicitly requires user input to activate.
  43834. * However, as a result of this, they come with their own risks, and as such should not be used
  43835. * for general game input, but instead be reserved for special circumstances.
  43836. *
  43837. * If all you're trying to do is execute a callback when a pointer is released, then
  43838. * please use the internal Input event system instead.
  43839. *
  43840. * Please understand that these callbacks are invoked when the browser feels like doing so,
  43841. * which may be entirely out of the normal flow of the Phaser Game Loop. Therefore, you should absolutely keep
  43842. * Phaser related operations to a minimum in these callbacks. For example, don't destroy Game Objects,
  43843. * change Scenes or manipulate internal systems, otherwise you run a very real risk of creating
  43844. * heisenbugs (https://en.wikipedia.org/wiki/Heisenbug) that prove a challenge to reproduce, never mind
  43845. * solve.
  43846. *
  43847. * @method Phaser.Input.InputManager#addUpCallback
  43848. * @since 3.10.0
  43849. *
  43850. * @param {function} callback - The callback to be invoked on this dom event.
  43851. * @param {boolean} [isOnce=true] - `true` if the callback will only be invoked once, `false` to call every time this event happens.
  43852. *
  43853. * @return {this} The Input Manager.
  43854. */
  43855. addUpCallback: function (callback, isOnce)
  43856. {
  43857. if (isOnce === undefined) { isOnce = true; }
  43858. if (isOnce)
  43859. {
  43860. this.domCallbacks.upOnce.push(callback);
  43861. }
  43862. else
  43863. {
  43864. this.domCallbacks.up.push(callback);
  43865. }
  43866. this._hasUpCallback = true;
  43867. return this;
  43868. },
  43869. /**
  43870. * Adds a callback to be invoked whenever the native DOM `mousedown` or `touchstart` events are received.
  43871. * By setting the `isOnce` argument you can control if the callback is called once,
  43872. * or every time the DOM event occurs.
  43873. *
  43874. * Callbacks passed to this method are invoked _immediately_ when the DOM event happens,
  43875. * within the scope of the DOM event handler. Therefore, they are considered as 'native'
  43876. * from the perspective of the browser. This means they can be used for tasks such as
  43877. * opening new browser windows, or anything which explicitly requires user input to activate.
  43878. * However, as a result of this, they come with their own risks, and as such should not be used
  43879. * for general game input, but instead be reserved for special circumstances.
  43880. *
  43881. * If all you're trying to do is execute a callback when a pointer is down, then
  43882. * please use the internal Input event system instead.
  43883. *
  43884. * Please understand that these callbacks are invoked when the browser feels like doing so,
  43885. * which may be entirely out of the normal flow of the Phaser Game Loop. Therefore, you should absolutely keep
  43886. * Phaser related operations to a minimum in these callbacks. For example, don't destroy Game Objects,
  43887. * change Scenes or manipulate internal systems, otherwise you run a very real risk of creating
  43888. * heisenbugs (https://en.wikipedia.org/wiki/Heisenbug) that prove a challenge to reproduce, never mind
  43889. * solve.
  43890. *
  43891. * @method Phaser.Input.InputManager#addDownCallback
  43892. * @since 3.10.0
  43893. *
  43894. * @param {function} callback - The callback to be invoked on this dom event.
  43895. * @param {boolean} [isOnce=true] - `true` if the callback will only be invoked once, `false` to call every time this event happens.
  43896. *
  43897. * @return {this} The Input Manager.
  43898. */
  43899. addDownCallback: function (callback, isOnce)
  43900. {
  43901. if (isOnce === undefined) { isOnce = true; }
  43902. if (isOnce)
  43903. {
  43904. this.domCallbacks.downOnce.push(callback);
  43905. }
  43906. else
  43907. {
  43908. this.domCallbacks.down.push(callback);
  43909. }
  43910. this._hasDownCallback = true;
  43911. return this;
  43912. },
  43913. /**
  43914. * Adds a callback to be invoked whenever the native DOM `mousemove` or `touchmove` events are received.
  43915. * By setting the `isOnce` argument you can control if the callback is called once,
  43916. * or every time the DOM event occurs.
  43917. *
  43918. * Callbacks passed to this method are invoked _immediately_ when the DOM event happens,
  43919. * within the scope of the DOM event handler. Therefore, they are considered as 'native'
  43920. * from the perspective of the browser. This means they can be used for tasks such as
  43921. * opening new browser windows, or anything which explicitly requires user input to activate.
  43922. * However, as a result of this, they come with their own risks, and as such should not be used
  43923. * for general game input, but instead be reserved for special circumstances.
  43924. *
  43925. * If all you're trying to do is execute a callback when a pointer is moved, then
  43926. * please use the internal Input event system instead.
  43927. *
  43928. * Please understand that these callbacks are invoked when the browser feels like doing so,
  43929. * which may be entirely out of the normal flow of the Phaser Game Loop. Therefore, you should absolutely keep
  43930. * Phaser related operations to a minimum in these callbacks. For example, don't destroy Game Objects,
  43931. * change Scenes or manipulate internal systems, otherwise you run a very real risk of creating
  43932. * heisenbugs (https://en.wikipedia.org/wiki/Heisenbug) that prove a challenge to reproduce, never mind
  43933. * solve.
  43934. *
  43935. * @method Phaser.Input.InputManager#addMoveCallback
  43936. * @since 3.10.0
  43937. *
  43938. * @param {function} callback - The callback to be invoked on this dom event.
  43939. * @param {boolean} [isOnce=false] - `true` if the callback will only be invoked once, `false` to call every time this event happens.
  43940. *
  43941. * @return {this} The Input Manager.
  43942. */
  43943. addMoveCallback: function (callback, isOnce)
  43944. {
  43945. if (isOnce === undefined) { isOnce = false; }
  43946. if (isOnce)
  43947. {
  43948. this.domCallbacks.moveOnce.push(callback);
  43949. }
  43950. else
  43951. {
  43952. this.domCallbacks.move.push(callback);
  43953. }
  43954. this._hasMoveCallback = true;
  43955. return this;
  43956. },
  43957. /**
  43958. * Checks if the given Game Object should be considered as a candidate for input or not.
  43959. *
  43960. * Checks if the Game Object has an input component that is enabled, that it will render,
  43961. * and finally, if it has a parent, that the parent parent, or any ancestor, is visible or not.
  43962. *
  43963. * @method Phaser.Input.InputManager#inputCandidate
  43964. * @private
  43965. * @since 3.10.0
  43966. *
  43967. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to test.
  43968. *
  43969. * @return {boolean} `true` if the Game Object should be considered for input, otherwise `false`.
  43970. */
  43971. inputCandidate: function (gameObject)
  43972. {
  43973. var input = gameObject.input;
  43974. if (!input || !input.enabled || !gameObject.willRender())
  43975. {
  43976. return false;
  43977. }
  43978. var visible = true;
  43979. var parent = gameObject.parentContainer;
  43980. if (parent)
  43981. {
  43982. do
  43983. {
  43984. if (!parent.visible)
  43985. {
  43986. visible = false;
  43987. break;
  43988. }
  43989. parent = parent.parentContainer;
  43990. } while (parent);
  43991. }
  43992. return visible;
  43993. },
  43994. /**
  43995. * Performs a hit test using the given Pointer and camera, against an array of interactive Game Objects.
  43996. *
  43997. * The Game Objects are culled against the camera, and then the coordinates are translated into the local camera space
  43998. * and used to determine if they fall within the remaining Game Objects hit areas or not.
  43999. *
  44000. * If nothing is matched an empty array is returned.
  44001. *
  44002. * This method is called automatically by InputPlugin.hitTestPointer and doesn't usually need to be invoked directly.
  44003. *
  44004. * @method Phaser.Input.InputManager#hitTest
  44005. * @since 3.0.0
  44006. *
  44007. * @param {Phaser.Input.Pointer} pointer - The Pointer to test against.
  44008. * @param {array} gameObjects - An array of interactive Game Objects to check.
  44009. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera which is being tested against.
  44010. * @param {array} [output] - An array to store the results in. If not given, a new empty array is created.
  44011. *
  44012. * @return {array} An array of the Game Objects that were hit during this hit test.
  44013. */
  44014. hitTest: function (pointer, gameObjects, camera, output)
  44015. {
  44016. if (output === undefined) { output = this._tempHitTest; }
  44017. var tempPoint = this._tempPoint;
  44018. var cameraW = camera.width;
  44019. var cameraH = camera.height;
  44020. output.length = 0;
  44021. var x = pointer.x;
  44022. var y = pointer.y;
  44023. if (!(x >= camera.x && y >= camera.y && x <= camera.x + cameraW && y <= camera.y + cameraH))
  44024. {
  44025. return output;
  44026. }
  44027. // Stores the world point inside of tempPoint
  44028. camera.getWorldPoint(x, y, tempPoint);
  44029. pointer.worldX = tempPoint.x;
  44030. pointer.worldY = tempPoint.y;
  44031. // Disable until fixed.
  44032. // var culledGameObjects = camera.cull(gameObjects);
  44033. var point = { x: 0, y: 0 };
  44034. var res = this.game.config.resolution;
  44035. var matrix = this._tempMatrix;
  44036. for (var i = 0; i < gameObjects.length; i++)
  44037. {
  44038. var gameObject = gameObjects[i];
  44039. if (!this.inputCandidate(gameObject))
  44040. {
  44041. continue;
  44042. }
  44043. var px = tempPoint.x * res + (camera.scrollX * gameObject.scrollFactorX) - camera.scrollX;
  44044. var py = tempPoint.y * res + (camera.scrollY * gameObject.scrollFactorY) - camera.scrollY;
  44045. if (gameObject.parentContainer)
  44046. {
  44047. gameObject.getWorldTransformMatrix(matrix);
  44048. TransformXY(px, py, matrix.tx, matrix.ty, matrix.rotation, matrix.scaleX, matrix.scaleY, point);
  44049. }
  44050. else
  44051. {
  44052. TransformXY(px, py, gameObject.x, gameObject.y, gameObject.rotation, gameObject.scaleX, gameObject.scaleY, point);
  44053. }
  44054. if (this.pointWithinHitArea(gameObject, point.x, point.y))
  44055. {
  44056. output.push(gameObject);
  44057. }
  44058. }
  44059. return output;
  44060. },
  44061. /**
  44062. * Checks if the given x and y coordinate are within the hit area of the Game Object.
  44063. *
  44064. * This method assumes that the coordinate values have already been translated into the space of the Game Object.
  44065. *
  44066. * If the coordinates are within the hit area they are set into the Game Objects Input `localX` and `localY` properties.
  44067. *
  44068. * @method Phaser.Input.InputManager#pointWithinHitArea
  44069. * @since 3.0.0
  44070. *
  44071. * @param {Phaser.GameObjects.GameObject} gameObject - The interactive Game Object to check against.
  44072. * @param {number} x - The translated x coordinate for the hit test.
  44073. * @param {number} y - The translated y coordinate for the hit test.
  44074. *
  44075. * @return {boolean} `true` if the coordinates were inside the Game Objects hit area, otherwise `false`.
  44076. */
  44077. pointWithinHitArea: function (gameObject, x, y)
  44078. {
  44079. // Normalize the origin
  44080. x += gameObject.displayOriginX;
  44081. y += gameObject.displayOriginY;
  44082. var input = gameObject.input;
  44083. if (input && input.hitAreaCallback(input.hitArea, x, y, gameObject))
  44084. {
  44085. input.localX = x;
  44086. input.localY = y;
  44087. return true;
  44088. }
  44089. else
  44090. {
  44091. return false;
  44092. }
  44093. },
  44094. /**
  44095. * Checks if the given x and y coordinate are within the hit area of the Interactive Object.
  44096. *
  44097. * This method assumes that the coordinate values have already been translated into the space of the Interactive Object.
  44098. *
  44099. * If the coordinates are within the hit area they are set into the Interactive Objects Input `localX` and `localY` properties.
  44100. *
  44101. * @method Phaser.Input.InputManager#pointWithinInteractiveObject
  44102. * @since 3.0.0
  44103. *
  44104. * @param {Phaser.Input.InteractiveObject} object - The Interactive Object to check against.
  44105. * @param {number} x - The translated x coordinate for the hit test.
  44106. * @param {number} y - The translated y coordinate for the hit test.
  44107. *
  44108. * @return {boolean} `true` if the coordinates were inside the Game Objects hit area, otherwise `false`.
  44109. */
  44110. pointWithinInteractiveObject: function (object, x, y)
  44111. {
  44112. if (!object.hitArea)
  44113. {
  44114. return false;
  44115. }
  44116. // Normalize the origin
  44117. x += object.gameObject.displayOriginX;
  44118. y += object.gameObject.displayOriginY;
  44119. object.localX = x;
  44120. object.localY = y;
  44121. return object.hitAreaCallback(object.hitArea, x, y, object);
  44122. },
  44123. /**
  44124. * Transforms the pageX and pageY values of a Pointer into the scaled coordinate space of the Input Manager.
  44125. *
  44126. * @method Phaser.Input.InputManager#transformPointer
  44127. * @since 3.10.0
  44128. *
  44129. * @param {Phaser.Input.Pointer} pointer - The Pointer to transform the values for.
  44130. *
  44131. * @return {number} The translated value.
  44132. */
  44133. transformPointer: function (pointer, pageX, pageY)
  44134. {
  44135. // Store the previous position
  44136. pointer.prevPosition.x = pointer.x;
  44137. pointer.prevPosition.y = pointer.y;
  44138. // Set the new position
  44139. pointer.x = (pageX - this.bounds.left) * this.scale.x;
  44140. pointer.y = (pageY - this.bounds.top) * this.scale.y;
  44141. },
  44142. /**
  44143. * Transforms the pageX value into the scaled coordinate space of the Input Manager.
  44144. *
  44145. * @method Phaser.Input.InputManager#transformX
  44146. * @since 3.0.0
  44147. *
  44148. * @param {number} pageX - The DOM pageX value.
  44149. *
  44150. * @return {number} The translated value.
  44151. */
  44152. transformX: function (pageX)
  44153. {
  44154. return (pageX - this.bounds.left) * this.scale.x;
  44155. },
  44156. /**
  44157. * Transforms the pageY value into the scaled coordinate space of the Input Manager.
  44158. *
  44159. * @method Phaser.Input.InputManager#transformY
  44160. * @since 3.0.0
  44161. *
  44162. * @param {number} pageY - The DOM pageY value.
  44163. *
  44164. * @return {number} The translated value.
  44165. */
  44166. transformY: function (pageY)
  44167. {
  44168. return (pageY - this.bounds.top) * this.scale.y;
  44169. },
  44170. /**
  44171. * Returns the left offset of the Input bounds.
  44172. *
  44173. * @method Phaser.Input.InputManager#getOffsetX
  44174. * @since 3.0.0
  44175. *
  44176. * @return {number} The left bounds value.
  44177. */
  44178. getOffsetX: function ()
  44179. {
  44180. return this.bounds.left;
  44181. },
  44182. /**
  44183. * Returns the top offset of the Input bounds.
  44184. *
  44185. * @method Phaser.Input.InputManager#getOffsetY
  44186. * @since 3.0.0
  44187. *
  44188. * @return {number} The top bounds value.
  44189. */
  44190. getOffsetY: function ()
  44191. {
  44192. return this.bounds.top;
  44193. },
  44194. /**
  44195. * Returns the horizontal Input Scale value.
  44196. *
  44197. * @method Phaser.Input.InputManager#getScaleX
  44198. * @since 3.0.0
  44199. *
  44200. * @return {number} The horizontal scale factor of the input.
  44201. */
  44202. getScaleX: function ()
  44203. {
  44204. return this.game.config.width / this.bounds.width;
  44205. },
  44206. /**
  44207. * Returns the vertical Input Scale value.
  44208. *
  44209. * @method Phaser.Input.InputManager#getScaleY
  44210. * @since 3.0.0
  44211. *
  44212. * @return {number} The vertical scale factor of the input.
  44213. */
  44214. getScaleY: function ()
  44215. {
  44216. return this.game.config.height / this.bounds.height;
  44217. },
  44218. /**
  44219. * Destroys the Input Manager and all of its systems.
  44220. *
  44221. * There is no way to recover from doing this.
  44222. *
  44223. * @method Phaser.Input.InputManager#destroy
  44224. * @since 3.0.0
  44225. */
  44226. destroy: function ()
  44227. {
  44228. this.events.removeAllListeners();
  44229. if (this.mouse)
  44230. {
  44231. this.mouse.destroy();
  44232. }
  44233. if (this.touch)
  44234. {
  44235. this.touch.destroy();
  44236. }
  44237. for (var i = 0; i < this.pointers.length; i++)
  44238. {
  44239. this.pointers[i].destroy();
  44240. }
  44241. this.domCallbacks = {};
  44242. this.pointers = [];
  44243. this.queue = [];
  44244. this._tempHitTest = [];
  44245. this._tempMatrix.destroy();
  44246. this.canvas = null;
  44247. this.game = null;
  44248. }
  44249. });
  44250. module.exports = InputManager;
  44251. /***/ }),
  44252. /* 207 */
  44253. /***/ (function(module, exports) {
  44254. /**
  44255. * @author Richard Davey <rich@photonstorm.com>
  44256. * @copyright 2018 Photon Storm Ltd.
  44257. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  44258. */
  44259. /**
  44260. * Implements a model view projection matrices.
  44261. * Pipelines can implement this for doing 2D and 3D rendering.
  44262. */
  44263. var ModelViewProjection = {
  44264. /**
  44265. * Dirty flag for checking if model matrix needs to be updated on GPU.
  44266. */
  44267. modelMatrixDirty: false,
  44268. /**
  44269. * Dirty flag for checking if view matrix needs to be updated on GPU.
  44270. */
  44271. viewMatrixDirty: false,
  44272. /**
  44273. * Dirty flag for checking if projection matrix needs to be updated on GPU.
  44274. */
  44275. projectionMatrixDirty: false,
  44276. /**
  44277. * Model matrix
  44278. */
  44279. modelMatrix: null,
  44280. /**
  44281. * View matrix
  44282. */
  44283. viewMatrix: null,
  44284. /**
  44285. * Projection matrix
  44286. */
  44287. projectionMatrix: null,
  44288. /**
  44289. * Initializes MVP matrices with an identity matrix
  44290. */
  44291. mvpInit: function ()
  44292. {
  44293. this.modelMatrixDirty = true;
  44294. this.viewMatrixDirty = true;
  44295. this.projectionMatrixDirty = true;
  44296. this.modelMatrix = new Float32Array([
  44297. 1, 0, 0, 0,
  44298. 0, 1, 0, 0,
  44299. 0, 0, 1, 0,
  44300. 0, 0, 0, 1
  44301. ]);
  44302. this.viewMatrix = new Float32Array([
  44303. 1, 0, 0, 0,
  44304. 0, 1, 0, 0,
  44305. 0, 0, 1, 0,
  44306. 0, 0, 0, 1
  44307. ]);
  44308. this.projectionMatrix = new Float32Array([
  44309. 1, 0, 0, 0,
  44310. 0, 1, 0, 0,
  44311. 0, 0, 1, 0,
  44312. 0, 0, 0, 1
  44313. ]);
  44314. return this;
  44315. },
  44316. /**
  44317. * If dirty flags are set then the matrices are uploaded to the GPU.
  44318. */
  44319. mvpUpdate: function ()
  44320. {
  44321. var program = this.program;
  44322. if (this.modelMatrixDirty)
  44323. {
  44324. this.renderer.setMatrix4(program, 'uModelMatrix', false, this.modelMatrix);
  44325. this.modelMatrixDirty = false;
  44326. }
  44327. if (this.viewMatrixDirty)
  44328. {
  44329. this.renderer.setMatrix4(program, 'uViewMatrix', false, this.viewMatrix);
  44330. this.viewMatrixDirty = false;
  44331. }
  44332. if (this.projectionMatrixDirty)
  44333. {
  44334. this.renderer.setMatrix4(program, 'uProjectionMatrix', false, this.projectionMatrix);
  44335. this.projectionMatrixDirty = false;
  44336. }
  44337. return this;
  44338. },
  44339. /**
  44340. * Loads an identity matrix to the model matrix
  44341. */
  44342. modelIdentity: function ()
  44343. {
  44344. var modelMatrix = this.modelMatrix;
  44345. modelMatrix[0] = 1;
  44346. modelMatrix[1] = 0;
  44347. modelMatrix[2] = 0;
  44348. modelMatrix[3] = 0;
  44349. modelMatrix[4] = 0;
  44350. modelMatrix[5] = 1;
  44351. modelMatrix[6] = 0;
  44352. modelMatrix[7] = 0;
  44353. modelMatrix[8] = 0;
  44354. modelMatrix[9] = 0;
  44355. modelMatrix[10] = 1;
  44356. modelMatrix[11] = 0;
  44357. modelMatrix[12] = 0;
  44358. modelMatrix[13] = 0;
  44359. modelMatrix[14] = 0;
  44360. modelMatrix[15] = 1;
  44361. this.modelMatrixDirty = true;
  44362. return this;
  44363. },
  44364. /**
  44365. * Scale model matrix
  44366. */
  44367. modelScale: function (x, y, z)
  44368. {
  44369. var modelMatrix = this.modelMatrix;
  44370. modelMatrix[0] = modelMatrix[0] * x;
  44371. modelMatrix[1] = modelMatrix[1] * x;
  44372. modelMatrix[2] = modelMatrix[2] * x;
  44373. modelMatrix[3] = modelMatrix[3] * x;
  44374. modelMatrix[4] = modelMatrix[4] * y;
  44375. modelMatrix[5] = modelMatrix[5] * y;
  44376. modelMatrix[6] = modelMatrix[6] * y;
  44377. modelMatrix[7] = modelMatrix[7] * y;
  44378. modelMatrix[8] = modelMatrix[8] * z;
  44379. modelMatrix[9] = modelMatrix[9] * z;
  44380. modelMatrix[10] = modelMatrix[10] * z;
  44381. modelMatrix[11] = modelMatrix[11] * z;
  44382. this.modelMatrixDirty = true;
  44383. return this;
  44384. },
  44385. /**
  44386. * Translate model matrix
  44387. */
  44388. modelTranslate: function (x, y, z)
  44389. {
  44390. var modelMatrix = this.modelMatrix;
  44391. modelMatrix[12] = modelMatrix[0] * x + modelMatrix[4] * y + modelMatrix[8] * z + modelMatrix[12];
  44392. modelMatrix[13] = modelMatrix[1] * x + modelMatrix[5] * y + modelMatrix[9] * z + modelMatrix[13];
  44393. modelMatrix[14] = modelMatrix[2] * x + modelMatrix[6] * y + modelMatrix[10] * z + modelMatrix[14];
  44394. modelMatrix[15] = modelMatrix[3] * x + modelMatrix[7] * y + modelMatrix[11] * z + modelMatrix[15];
  44395. this.modelMatrixDirty = true;
  44396. return this;
  44397. },
  44398. /**
  44399. * Rotates the model matrix in the X axis.
  44400. */
  44401. modelRotateX: function (radians)
  44402. {
  44403. var modelMatrix = this.modelMatrix;
  44404. var s = Math.sin(radians);
  44405. var c = Math.cos(radians);
  44406. var a10 = modelMatrix[4];
  44407. var a11 = modelMatrix[5];
  44408. var a12 = modelMatrix[6];
  44409. var a13 = modelMatrix[7];
  44410. var a20 = modelMatrix[8];
  44411. var a21 = modelMatrix[9];
  44412. var a22 = modelMatrix[10];
  44413. var a23 = modelMatrix[11];
  44414. modelMatrix[4] = a10 * c + a20 * s;
  44415. modelMatrix[5] = a11 * c + a21 * s;
  44416. modelMatrix[6] = a12 * c + a22 * s;
  44417. modelMatrix[7] = a13 * c + a23 * s;
  44418. modelMatrix[8] = a20 * c - a10 * s;
  44419. modelMatrix[9] = a21 * c - a11 * s;
  44420. modelMatrix[10] = a22 * c - a12 * s;
  44421. modelMatrix[11] = a23 * c - a13 * s;
  44422. this.modelMatrixDirty = true;
  44423. return this;
  44424. },
  44425. /**
  44426. * Rotates the model matrix in the Y axis.
  44427. */
  44428. modelRotateY: function (radians)
  44429. {
  44430. var modelMatrix = this.modelMatrix;
  44431. var s = Math.sin(radians);
  44432. var c = Math.cos(radians);
  44433. var a00 = modelMatrix[0];
  44434. var a01 = modelMatrix[1];
  44435. var a02 = modelMatrix[2];
  44436. var a03 = modelMatrix[3];
  44437. var a20 = modelMatrix[8];
  44438. var a21 = modelMatrix[9];
  44439. var a22 = modelMatrix[10];
  44440. var a23 = modelMatrix[11];
  44441. modelMatrix[0] = a00 * c - a20 * s;
  44442. modelMatrix[1] = a01 * c - a21 * s;
  44443. modelMatrix[2] = a02 * c - a22 * s;
  44444. modelMatrix[3] = a03 * c - a23 * s;
  44445. modelMatrix[8] = a00 * s + a20 * c;
  44446. modelMatrix[9] = a01 * s + a21 * c;
  44447. modelMatrix[10] = a02 * s + a22 * c;
  44448. modelMatrix[11] = a03 * s + a23 * c;
  44449. this.modelMatrixDirty = true;
  44450. return this;
  44451. },
  44452. /**
  44453. * Rotates the model matrix in the Z axis.
  44454. */
  44455. modelRotateZ: function (radians)
  44456. {
  44457. var modelMatrix = this.modelMatrix;
  44458. var s = Math.sin(radians);
  44459. var c = Math.cos(radians);
  44460. var a00 = modelMatrix[0];
  44461. var a01 = modelMatrix[1];
  44462. var a02 = modelMatrix[2];
  44463. var a03 = modelMatrix[3];
  44464. var a10 = modelMatrix[4];
  44465. var a11 = modelMatrix[5];
  44466. var a12 = modelMatrix[6];
  44467. var a13 = modelMatrix[7];
  44468. modelMatrix[0] = a00 * c + a10 * s;
  44469. modelMatrix[1] = a01 * c + a11 * s;
  44470. modelMatrix[2] = a02 * c + a12 * s;
  44471. modelMatrix[3] = a03 * c + a13 * s;
  44472. modelMatrix[4] = a10 * c - a00 * s;
  44473. modelMatrix[5] = a11 * c - a01 * s;
  44474. modelMatrix[6] = a12 * c - a02 * s;
  44475. modelMatrix[7] = a13 * c - a03 * s;
  44476. this.modelMatrixDirty = true;
  44477. return this;
  44478. },
  44479. /**
  44480. * Loads identity matrix into the view matrix
  44481. */
  44482. viewIdentity: function ()
  44483. {
  44484. var viewMatrix = this.viewMatrix;
  44485. viewMatrix[0] = 1;
  44486. viewMatrix[1] = 0;
  44487. viewMatrix[2] = 0;
  44488. viewMatrix[3] = 0;
  44489. viewMatrix[4] = 0;
  44490. viewMatrix[5] = 1;
  44491. viewMatrix[6] = 0;
  44492. viewMatrix[7] = 0;
  44493. viewMatrix[8] = 0;
  44494. viewMatrix[9] = 0;
  44495. viewMatrix[10] = 1;
  44496. viewMatrix[11] = 0;
  44497. viewMatrix[12] = 0;
  44498. viewMatrix[13] = 0;
  44499. viewMatrix[14] = 0;
  44500. viewMatrix[15] = 1;
  44501. this.viewMatrixDirty = true;
  44502. return this;
  44503. },
  44504. /**
  44505. * Scales view matrix
  44506. */
  44507. viewScale: function (x, y, z)
  44508. {
  44509. var viewMatrix = this.viewMatrix;
  44510. viewMatrix[0] = viewMatrix[0] * x;
  44511. viewMatrix[1] = viewMatrix[1] * x;
  44512. viewMatrix[2] = viewMatrix[2] * x;
  44513. viewMatrix[3] = viewMatrix[3] * x;
  44514. viewMatrix[4] = viewMatrix[4] * y;
  44515. viewMatrix[5] = viewMatrix[5] * y;
  44516. viewMatrix[6] = viewMatrix[6] * y;
  44517. viewMatrix[7] = viewMatrix[7] * y;
  44518. viewMatrix[8] = viewMatrix[8] * z;
  44519. viewMatrix[9] = viewMatrix[9] * z;
  44520. viewMatrix[10] = viewMatrix[10] * z;
  44521. viewMatrix[11] = viewMatrix[11] * z;
  44522. this.viewMatrixDirty = true;
  44523. return this;
  44524. },
  44525. /**
  44526. * Translates view matrix
  44527. */
  44528. viewTranslate: function (x, y, z)
  44529. {
  44530. var viewMatrix = this.viewMatrix;
  44531. viewMatrix[12] = viewMatrix[0] * x + viewMatrix[4] * y + viewMatrix[8] * z + viewMatrix[12];
  44532. viewMatrix[13] = viewMatrix[1] * x + viewMatrix[5] * y + viewMatrix[9] * z + viewMatrix[13];
  44533. viewMatrix[14] = viewMatrix[2] * x + viewMatrix[6] * y + viewMatrix[10] * z + viewMatrix[14];
  44534. viewMatrix[15] = viewMatrix[3] * x + viewMatrix[7] * y + viewMatrix[11] * z + viewMatrix[15];
  44535. this.viewMatrixDirty = true;
  44536. return this;
  44537. },
  44538. /**
  44539. * Rotates view matrix in the X axis.
  44540. */
  44541. viewRotateX: function (radians)
  44542. {
  44543. var viewMatrix = this.viewMatrix;
  44544. var s = Math.sin(radians);
  44545. var c = Math.cos(radians);
  44546. var a10 = viewMatrix[4];
  44547. var a11 = viewMatrix[5];
  44548. var a12 = viewMatrix[6];
  44549. var a13 = viewMatrix[7];
  44550. var a20 = viewMatrix[8];
  44551. var a21 = viewMatrix[9];
  44552. var a22 = viewMatrix[10];
  44553. var a23 = viewMatrix[11];
  44554. viewMatrix[4] = a10 * c + a20 * s;
  44555. viewMatrix[5] = a11 * c + a21 * s;
  44556. viewMatrix[6] = a12 * c + a22 * s;
  44557. viewMatrix[7] = a13 * c + a23 * s;
  44558. viewMatrix[8] = a20 * c - a10 * s;
  44559. viewMatrix[9] = a21 * c - a11 * s;
  44560. viewMatrix[10] = a22 * c - a12 * s;
  44561. viewMatrix[11] = a23 * c - a13 * s;
  44562. this.viewMatrixDirty = true;
  44563. return this;
  44564. },
  44565. /**
  44566. * Rotates view matrix in the Y axis.
  44567. */
  44568. viewRotateY: function (radians)
  44569. {
  44570. var viewMatrix = this.viewMatrix;
  44571. var s = Math.sin(radians);
  44572. var c = Math.cos(radians);
  44573. var a00 = viewMatrix[0];
  44574. var a01 = viewMatrix[1];
  44575. var a02 = viewMatrix[2];
  44576. var a03 = viewMatrix[3];
  44577. var a20 = viewMatrix[8];
  44578. var a21 = viewMatrix[9];
  44579. var a22 = viewMatrix[10];
  44580. var a23 = viewMatrix[11];
  44581. viewMatrix[0] = a00 * c - a20 * s;
  44582. viewMatrix[1] = a01 * c - a21 * s;
  44583. viewMatrix[2] = a02 * c - a22 * s;
  44584. viewMatrix[3] = a03 * c - a23 * s;
  44585. viewMatrix[8] = a00 * s + a20 * c;
  44586. viewMatrix[9] = a01 * s + a21 * c;
  44587. viewMatrix[10] = a02 * s + a22 * c;
  44588. viewMatrix[11] = a03 * s + a23 * c;
  44589. this.viewMatrixDirty = true;
  44590. return this;
  44591. },
  44592. /**
  44593. * Rotates view matrix in the Z axis.
  44594. */
  44595. viewRotateZ: function (radians)
  44596. {
  44597. var viewMatrix = this.viewMatrix;
  44598. var s = Math.sin(radians);
  44599. var c = Math.cos(radians);
  44600. var a00 = viewMatrix[0];
  44601. var a01 = viewMatrix[1];
  44602. var a02 = viewMatrix[2];
  44603. var a03 = viewMatrix[3];
  44604. var a10 = viewMatrix[4];
  44605. var a11 = viewMatrix[5];
  44606. var a12 = viewMatrix[6];
  44607. var a13 = viewMatrix[7];
  44608. viewMatrix[0] = a00 * c + a10 * s;
  44609. viewMatrix[1] = a01 * c + a11 * s;
  44610. viewMatrix[2] = a02 * c + a12 * s;
  44611. viewMatrix[3] = a03 * c + a13 * s;
  44612. viewMatrix[4] = a10 * c - a00 * s;
  44613. viewMatrix[5] = a11 * c - a01 * s;
  44614. viewMatrix[6] = a12 * c - a02 * s;
  44615. viewMatrix[7] = a13 * c - a03 * s;
  44616. this.viewMatrixDirty = true;
  44617. return this;
  44618. },
  44619. /**
  44620. * Loads a 2D view matrix (3x2 matrix) into a 4x4 view matrix
  44621. */
  44622. viewLoad2D: function (matrix2D)
  44623. {
  44624. var vm = this.viewMatrix;
  44625. vm[0] = matrix2D[0];
  44626. vm[1] = matrix2D[1];
  44627. vm[2] = 0.0;
  44628. vm[3] = 0.0;
  44629. vm[4] = matrix2D[2];
  44630. vm[5] = matrix2D[3];
  44631. vm[6] = 0.0;
  44632. vm[7] = 0.0;
  44633. vm[8] = matrix2D[4];
  44634. vm[9] = matrix2D[5];
  44635. vm[10] = 1.0;
  44636. vm[11] = 0.0;
  44637. vm[12] = 0.0;
  44638. vm[13] = 0.0;
  44639. vm[14] = 0.0;
  44640. vm[15] = 1.0;
  44641. this.viewMatrixDirty = true;
  44642. return this;
  44643. },
  44644. /**
  44645. * Copies a 4x4 matrix into the view matrix
  44646. */
  44647. viewLoad: function (matrix)
  44648. {
  44649. var vm = this.viewMatrix;
  44650. vm[0] = matrix[0];
  44651. vm[1] = matrix[1];
  44652. vm[2] = matrix[2];
  44653. vm[3] = matrix[3];
  44654. vm[4] = matrix[4];
  44655. vm[5] = matrix[5];
  44656. vm[6] = matrix[6];
  44657. vm[7] = matrix[7];
  44658. vm[8] = matrix[8];
  44659. vm[9] = matrix[9];
  44660. vm[10] = matrix[10];
  44661. vm[11] = matrix[11];
  44662. vm[12] = matrix[12];
  44663. vm[13] = matrix[13];
  44664. vm[14] = matrix[14];
  44665. vm[15] = matrix[15];
  44666. this.viewMatrixDirty = true;
  44667. return this;
  44668. },
  44669. /**
  44670. * Loads identity matrix into the projection matrix.
  44671. */
  44672. projIdentity: function ()
  44673. {
  44674. var projectionMatrix = this.projectionMatrix;
  44675. projectionMatrix[0] = 1;
  44676. projectionMatrix[1] = 0;
  44677. projectionMatrix[2] = 0;
  44678. projectionMatrix[3] = 0;
  44679. projectionMatrix[4] = 0;
  44680. projectionMatrix[5] = 1;
  44681. projectionMatrix[6] = 0;
  44682. projectionMatrix[7] = 0;
  44683. projectionMatrix[8] = 0;
  44684. projectionMatrix[9] = 0;
  44685. projectionMatrix[10] = 1;
  44686. projectionMatrix[11] = 0;
  44687. projectionMatrix[12] = 0;
  44688. projectionMatrix[13] = 0;
  44689. projectionMatrix[14] = 0;
  44690. projectionMatrix[15] = 1;
  44691. this.projectionMatrixDirty = true;
  44692. return this;
  44693. },
  44694. /**
  44695. * Sets up an orthographics projection matrix
  44696. */
  44697. projOrtho: function (left, right, bottom, top, near, far)
  44698. {
  44699. var projectionMatrix = this.projectionMatrix;
  44700. var leftRight = 1.0 / (left - right);
  44701. var bottomTop = 1.0 / (bottom - top);
  44702. var nearFar = 1.0 / (near - far);
  44703. projectionMatrix[0] = -2.0 * leftRight;
  44704. projectionMatrix[1] = 0.0;
  44705. projectionMatrix[2] = 0.0;
  44706. projectionMatrix[3] = 0.0;
  44707. projectionMatrix[4] = 0.0;
  44708. projectionMatrix[5] = -2.0 * bottomTop;
  44709. projectionMatrix[6] = 0.0;
  44710. projectionMatrix[7] = 0.0;
  44711. projectionMatrix[8] = 0.0;
  44712. projectionMatrix[9] = 0.0;
  44713. projectionMatrix[10] = 2.0 * nearFar;
  44714. projectionMatrix[11] = 0.0;
  44715. projectionMatrix[12] = (left + right) * leftRight;
  44716. projectionMatrix[13] = (top + bottom) * bottomTop;
  44717. projectionMatrix[14] = (far + near) * nearFar;
  44718. projectionMatrix[15] = 1.0;
  44719. this.projectionMatrixDirty = true;
  44720. return this;
  44721. },
  44722. /**
  44723. * Sets up a perspective projection matrix
  44724. */
  44725. projPersp: function (fovy, aspectRatio, near, far)
  44726. {
  44727. var projectionMatrix = this.projectionMatrix;
  44728. var fov = 1.0 / Math.tan(fovy / 2.0);
  44729. var nearFar = 1.0 / (near - far);
  44730. projectionMatrix[0] = fov / aspectRatio;
  44731. projectionMatrix[1] = 0.0;
  44732. projectionMatrix[2] = 0.0;
  44733. projectionMatrix[3] = 0.0;
  44734. projectionMatrix[4] = 0.0;
  44735. projectionMatrix[5] = fov;
  44736. projectionMatrix[6] = 0.0;
  44737. projectionMatrix[7] = 0.0;
  44738. projectionMatrix[8] = 0.0;
  44739. projectionMatrix[9] = 0.0;
  44740. projectionMatrix[10] = (far + near) * nearFar;
  44741. projectionMatrix[11] = -1.0;
  44742. projectionMatrix[12] = 0.0;
  44743. projectionMatrix[13] = 0.0;
  44744. projectionMatrix[14] = (2.0 * far * near) * nearFar;
  44745. projectionMatrix[15] = 0.0;
  44746. this.projectionMatrixDirty = true;
  44747. return this;
  44748. }
  44749. };
  44750. module.exports = ModelViewProjection;
  44751. /***/ }),
  44752. /* 208 */
  44753. /***/ (function(module, exports, __webpack_require__) {
  44754. /**
  44755. * @author Richard Davey <rich@photonstorm.com>
  44756. * @copyright 2018 Photon Storm Ltd.
  44757. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  44758. */
  44759. var CanvasPool = __webpack_require__(24);
  44760. /**
  44761. * Determines the canvas features of the browser running this Phaser Game instance.
  44762. * These values are read-only and populated during the boot sequence of the game.
  44763. * They are then referenced by internal game systems and are available for you to access
  44764. * via `this.sys.game.device.canvasFeatures` from within any Scene.
  44765. *
  44766. * @typedef {object} Phaser.Device.CanvasFeatures
  44767. * @since 3.0.0
  44768. *
  44769. * @property {boolean} supportInverseAlpha - Set to true if the browser supports inversed alpha.
  44770. * @property {boolean} supportNewBlendModes - Set to true if the browser supports new canvas blend modes.
  44771. */
  44772. var CanvasFeatures = {
  44773. supportInverseAlpha: false,
  44774. supportNewBlendModes: false
  44775. };
  44776. function checkBlendMode ()
  44777. {
  44778. var pngHead = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAABAQMAAADD8p2OAAAAA1BMVEX/';
  44779. var pngEnd = 'AAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg==';
  44780. var magenta = new Image();
  44781. magenta.onload = function ()
  44782. {
  44783. var yellow = new Image();
  44784. yellow.onload = function ()
  44785. {
  44786. var canvas = CanvasPool.create(yellow, 6, 1);
  44787. var context = canvas.getContext('2d');
  44788. context.globalCompositeOperation = 'multiply';
  44789. context.drawImage(magenta, 0, 0);
  44790. context.drawImage(yellow, 2, 0);
  44791. if (!context.getImageData(2, 0, 1, 1))
  44792. {
  44793. return false;
  44794. }
  44795. var data = context.getImageData(2, 0, 1, 1).data;
  44796. CanvasPool.remove(yellow);
  44797. CanvasFeatures.supportNewBlendModes = (data[0] === 255 && data[1] === 0 && data[2] === 0);
  44798. };
  44799. yellow.src = pngHead + '/wCKxvRF' + pngEnd;
  44800. };
  44801. magenta.src = pngHead + 'AP804Oa6' + pngEnd;
  44802. return false;
  44803. }
  44804. function checkInverseAlpha ()
  44805. {
  44806. var canvas = CanvasPool.create(this, 2, 1);
  44807. var context = canvas.getContext('2d');
  44808. context.fillStyle = 'rgba(10, 20, 30, 0.5)';
  44809. // Draw a single pixel
  44810. context.fillRect(0, 0, 1, 1);
  44811. // Get the color values
  44812. var s1 = context.getImageData(0, 0, 1, 1);
  44813. if (s1 === null)
  44814. {
  44815. return false;
  44816. }
  44817. // Plot them to x2
  44818. context.putImageData(s1, 1, 0);
  44819. // Get those values
  44820. var s2 = context.getImageData(1, 0, 1, 1);
  44821. // Compare and return
  44822. 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]);
  44823. }
  44824. function init ()
  44825. {
  44826. if (document !== undefined)
  44827. {
  44828. CanvasFeatures.supportNewBlendModes = checkBlendMode();
  44829. CanvasFeatures.supportInverseAlpha = checkInverseAlpha();
  44830. }
  44831. return CanvasFeatures;
  44832. }
  44833. module.exports = init();
  44834. /***/ }),
  44835. /* 209 */
  44836. /***/ (function(module, exports, __webpack_require__) {
  44837. /**
  44838. * @author Richard Davey <rich@photonstorm.com>
  44839. * @copyright 2018 Photon Storm Ltd.
  44840. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  44841. */
  44842. /**
  44843. * @namespace Phaser.Cameras.Scene2D.Effects
  44844. */
  44845. module.exports = {
  44846. Fade: __webpack_require__(569),
  44847. Flash: __webpack_require__(568),
  44848. Pan: __webpack_require__(567),
  44849. Shake: __webpack_require__(534),
  44850. Zoom: __webpack_require__(533)
  44851. };
  44852. /***/ }),
  44853. /* 210 */
  44854. /***/ (function(module, exports, __webpack_require__) {
  44855. /**
  44856. * @author Richard Davey <rich@photonstorm.com>
  44857. * @copyright 2018 Photon Storm Ltd.
  44858. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  44859. */
  44860. var BaseCache = __webpack_require__(211);
  44861. var Class = __webpack_require__(0);
  44862. /**
  44863. * @classdesc
  44864. * The Cache Manager is the global cache owned and maintained by the Game instance.
  44865. *
  44866. * Various systems, such as the file Loader, rely on this cache in order to store the files
  44867. * it has loaded. The manager itself doesn't store any files, but instead owns multiple BaseCache
  44868. * instances, one per type of file. You can also add your own custom caches.
  44869. *
  44870. * @class CacheManager
  44871. * @memberOf Phaser.Cache
  44872. * @constructor
  44873. * @since 3.0.0
  44874. *
  44875. * @param {Phaser.Game} game - A reference to the Phaser.Game instance that owns this CacheManager.
  44876. */
  44877. var CacheManager = new Class({
  44878. initialize:
  44879. function CacheManager (game)
  44880. {
  44881. /**
  44882. * A reference to the Phaser.Game instance that owns this CacheManager.
  44883. *
  44884. * @name Phaser.Cache.CacheManager#game
  44885. * @type {Phaser.Game}
  44886. * @protected
  44887. * @since 3.0.0
  44888. */
  44889. this.game = game;
  44890. /**
  44891. * A Cache storing all binary files, typically added via the Loader.
  44892. *
  44893. * @name Phaser.Cache.CacheManager#binary
  44894. * @type {Phaser.Cache.BaseCache}
  44895. * @since 3.0.0
  44896. */
  44897. this.binary = new BaseCache();
  44898. /**
  44899. * A Cache storing all bitmap font data files, typically added via the Loader.
  44900. * Only the font data is stored in this cache, the textures are part of the Texture Manager.
  44901. *
  44902. * @name Phaser.Cache.CacheManager#bitmapFont
  44903. * @type {Phaser.Cache.BaseCache}
  44904. * @since 3.0.0
  44905. */
  44906. this.bitmapFont = new BaseCache();
  44907. /**
  44908. * A Cache storing all JSON data files, typically added via the Loader.
  44909. *
  44910. * @name Phaser.Cache.CacheManager#json
  44911. * @type {Phaser.Cache.BaseCache}
  44912. * @since 3.0.0
  44913. */
  44914. this.json = new BaseCache();
  44915. /**
  44916. * A Cache storing all physics data files, typically added via the Loader.
  44917. *
  44918. * @name Phaser.Cache.CacheManager#physics
  44919. * @type {Phaser.Cache.BaseCache}
  44920. * @since 3.0.0
  44921. */
  44922. this.physics = new BaseCache();
  44923. /**
  44924. * A Cache storing all shader source files, typically added via the Loader.
  44925. *
  44926. * @name Phaser.Cache.CacheManager#shader
  44927. * @type {Phaser.Cache.BaseCache}
  44928. * @since 3.0.0
  44929. */
  44930. this.shader = new BaseCache();
  44931. /**
  44932. * A Cache storing all non-streaming audio files, typically added via the Loader.
  44933. *
  44934. * @name Phaser.Cache.CacheManager#audio
  44935. * @type {Phaser.Cache.BaseCache}
  44936. * @since 3.0.0
  44937. */
  44938. this.audio = new BaseCache();
  44939. /**
  44940. * A Cache storing all text files, typically added via the Loader.
  44941. *
  44942. * @name Phaser.Cache.CacheManager#text
  44943. * @type {Phaser.Cache.BaseCache}
  44944. * @since 3.0.0
  44945. */
  44946. this.text = new BaseCache();
  44947. /**
  44948. * A Cache storing all WaveFront OBJ files, typically added via the Loader.
  44949. *
  44950. * @name Phaser.Cache.CacheManager#obj
  44951. * @type {Phaser.Cache.BaseCache}
  44952. * @since 3.0.0
  44953. */
  44954. this.obj = new BaseCache();
  44955. /**
  44956. * A Cache storing all tilemap data files, typically added via the Loader.
  44957. * Only the data is stored in this cache, the textures are part of the Texture Manager.
  44958. *
  44959. * @name Phaser.Cache.CacheManager#tilemap
  44960. * @type {Phaser.Cache.BaseCache}
  44961. * @since 3.0.0
  44962. */
  44963. this.tilemap = new BaseCache();
  44964. /**
  44965. * A Cache storing all xml data files, typically added via the Loader.
  44966. *
  44967. * @name Phaser.Cache.CacheManager#xml
  44968. * @type {Phaser.Cache.BaseCache}
  44969. * @since 3.0.0
  44970. */
  44971. this.xml = new BaseCache();
  44972. /**
  44973. * An object that contains your own custom BaseCache entries.
  44974. * Add to this via the `addCustom` method.
  44975. *
  44976. * @name Phaser.Cache.CacheManager#custom
  44977. * @type {Object.<Phaser.Cache.BaseCache>}
  44978. * @since 3.0.0
  44979. */
  44980. this.custom = {};
  44981. this.game.events.once('destroy', this.destroy, this);
  44982. },
  44983. /**
  44984. * Add your own custom Cache for storing your own files.
  44985. * The cache will be available under `Cache.custom.key`.
  44986. * The cache will only be created if the key is not already in use.
  44987. *
  44988. * @method Phaser.Cache.CacheManager#addCustom
  44989. * @since 3.0.0
  44990. *
  44991. * @param {string} key - The unique key of your custom cache.
  44992. *
  44993. * @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.
  44994. */
  44995. addCustom: function (key)
  44996. {
  44997. if (!this.custom.hasOwnProperty(key))
  44998. {
  44999. this.custom[key] = new BaseCache();
  45000. }
  45001. return this.custom[key];
  45002. },
  45003. /**
  45004. * Removes all entries from all BaseCaches and destroys all custom caches.
  45005. *
  45006. * @method Phaser.Cache.CacheManager#destroy
  45007. * @since 3.0.0
  45008. */
  45009. destroy: function ()
  45010. {
  45011. var keys = [
  45012. 'binary',
  45013. 'bitmapFont',
  45014. 'json',
  45015. 'physics',
  45016. 'shader',
  45017. 'audio',
  45018. 'text',
  45019. 'obj',
  45020. 'tilemap',
  45021. 'xml'
  45022. ];
  45023. for (var i = 0; i < keys.length; i++)
  45024. {
  45025. this[keys[i]].destroy();
  45026. this[keys[i]] = null;
  45027. }
  45028. for (var key in this.custom)
  45029. {
  45030. this.custom[key].destroy();
  45031. }
  45032. this.custom = null;
  45033. this.game = null;
  45034. }
  45035. });
  45036. module.exports = CacheManager;
  45037. /***/ }),
  45038. /* 211 */
  45039. /***/ (function(module, exports, __webpack_require__) {
  45040. /**
  45041. * @author Richard Davey <rich@photonstorm.com>
  45042. * @copyright 2018 Photon Storm Ltd.
  45043. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  45044. */
  45045. var Class = __webpack_require__(0);
  45046. var CustomMap = __webpack_require__(125);
  45047. var EventEmitter = __webpack_require__(9);
  45048. /**
  45049. * @classdesc
  45050. * The BaseCache is a base Cache class that can be used for storing references to any kind of data.
  45051. *
  45052. * Data can be added, retrieved and removed based on the given keys.
  45053. *
  45054. * Keys are string-based.
  45055. *
  45056. * @class BaseCache
  45057. * @memberOf Phaser.Cache
  45058. * @constructor
  45059. * @since 3.0.0
  45060. */
  45061. var BaseCache = new Class({
  45062. initialize:
  45063. function BaseCache ()
  45064. {
  45065. /**
  45066. * The Map in which the cache objects are stored.
  45067. *
  45068. * You can query the Map directly or use the BaseCache methods.
  45069. *
  45070. * @name Phaser.Cache.BaseCache#entries
  45071. * @type {Phaser.Structs.Map.<String, *>}
  45072. * @since 3.0.0
  45073. */
  45074. this.entries = new CustomMap();
  45075. /**
  45076. * An instance of EventEmitter used by the cache to emit related events.
  45077. *
  45078. * @name Phaser.Cache.BaseCache#events
  45079. * @type {Phaser.Events.EventEmitter}
  45080. * @since 3.0.0
  45081. */
  45082. this.events = new EventEmitter();
  45083. },
  45084. /**
  45085. * Cache add event.
  45086. *
  45087. * This event is fired by the Cache each time a new object is added to it.
  45088. *
  45089. * @event Phaser.Cache.BaseCache#addEvent
  45090. * @param {Phaser.Cache.BaseCache} cache - The BaseCache to which the object was added.
  45091. * @param {string} key - The key of the object added to the cache.
  45092. * @param {*} object - A reference to the object added to the cache.
  45093. */
  45094. /**
  45095. * Adds an item to this cache. The item is referenced by a unique string, which you are responsible
  45096. * for setting and keeping track of. The item can only be retrieved by using this string.
  45097. *
  45098. * @method Phaser.Cache.BaseCache#add
  45099. * @fires Phaser.Cache.BaseCache#addEvent
  45100. * @since 3.0.0
  45101. *
  45102. * @param {string} key - The unique key by which the data added to the cache will be referenced.
  45103. * @param {*} data - The data to be stored in the cache.
  45104. *
  45105. * @return {Phaser.Cache.BaseCache} This BaseCache object.
  45106. */
  45107. add: function (key, data)
  45108. {
  45109. this.entries.set(key, data);
  45110. this.events.emit('add', this, key, data);
  45111. return this;
  45112. },
  45113. /**
  45114. * Checks if this cache contains an item matching the given key.
  45115. * This performs the same action as `BaseCache.exists`.
  45116. *
  45117. * @method Phaser.Cache.BaseCache#has
  45118. * @since 3.0.0
  45119. *
  45120. * @param {string} key - The unique key of the item to be checked in this cache.
  45121. *
  45122. * @return {boolean} Returns `true` if the cache contains an item matching the given key, otherwise `false`.
  45123. */
  45124. has: function (key)
  45125. {
  45126. return this.entries.has(key);
  45127. },
  45128. /**
  45129. * Checks if this cache contains an item matching the given key.
  45130. * This performs the same action as `BaseCache.has` and is called directly by the Loader.
  45131. *
  45132. * @method Phaser.Cache.BaseCache#exists
  45133. * @since 3.7.0
  45134. *
  45135. * @param {string} key - The unique key of the item to be checked in this cache.
  45136. *
  45137. * @return {boolean} Returns `true` if the cache contains an item matching the given key, otherwise `false`.
  45138. */
  45139. exists: function (key)
  45140. {
  45141. return this.entries.has(key);
  45142. },
  45143. /**
  45144. * Gets an item from this cache based on the given key.
  45145. *
  45146. * @method Phaser.Cache.BaseCache#get
  45147. * @since 3.0.0
  45148. *
  45149. * @param {string} key - The unique key of the item to be retrieved from this cache.
  45150. *
  45151. * @return {*} The item in the cache, or `null` if no item matching the given key was found.
  45152. */
  45153. get: function (key)
  45154. {
  45155. return this.entries.get(key);
  45156. },
  45157. /**
  45158. * Cache remove event.
  45159. *
  45160. * This event is fired by the Cache each time an object is removed from it.
  45161. *
  45162. * @event Phaser.Cache.BaseCache#removeEvent
  45163. * @param {Phaser.Cache.BaseCache} cache - The BaseCache from which the object was removed.
  45164. * @param {string} key - The key of the object removed from the cache.
  45165. * @param {*} object - The object that was removed from the cache.
  45166. */
  45167. /**
  45168. * Removes and item from this cache based on the given key.
  45169. *
  45170. * If an entry matching the key is found it is removed from the cache and a `remove` event emitted.
  45171. * No additional checks are done on the item removed. If other systems or parts of your game code
  45172. * are relying on this item, it is up to you to sever those relationships prior to removing the item.
  45173. *
  45174. * @method Phaser.Cache.BaseCache#remove
  45175. * @fires Phaser.Cache.BaseCache#removeEvent
  45176. * @since 3.0.0
  45177. *
  45178. * @param {string} key - The unique key of the item to remove from the cache.
  45179. *
  45180. * @return {Phaser.Cache.BaseCache} This BaseCache object.
  45181. */
  45182. remove: function (key)
  45183. {
  45184. var entry = this.get(key);
  45185. if (entry)
  45186. {
  45187. this.entries.delete(key);
  45188. this.events.emit('remove', this, key, entry.data);
  45189. }
  45190. return this;
  45191. },
  45192. /**
  45193. * Destroys this cache and all items within it.
  45194. *
  45195. * @method Phaser.Cache.BaseCache#destroy
  45196. * @since 3.0.0
  45197. */
  45198. destroy: function ()
  45199. {
  45200. this.entries.clear();
  45201. this.events.removeAllListeners();
  45202. this.entries = null;
  45203. this.events = null;
  45204. }
  45205. });
  45206. module.exports = BaseCache;
  45207. /***/ }),
  45208. /* 212 */
  45209. /***/ (function(module, exports, __webpack_require__) {
  45210. /**
  45211. * @author Richard Davey <rich@photonstorm.com>
  45212. * @copyright 2018 Photon Storm Ltd.
  45213. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  45214. */
  45215. var Animation = __webpack_require__(215);
  45216. var Class = __webpack_require__(0);
  45217. var CustomMap = __webpack_require__(125);
  45218. var EventEmitter = __webpack_require__(9);
  45219. var GetValue = __webpack_require__(4);
  45220. var Pad = __webpack_require__(134);
  45221. /**
  45222. * @typedef {object} JSONAnimationManager
  45223. *
  45224. * @property {JSONAnimation[]} anims - [description]
  45225. * @property {number} globalTimeScale - [description]
  45226. */
  45227. /**
  45228. * @classdesc
  45229. * The Animation Manager.
  45230. *
  45231. * Animations are managed by the global Animation Manager. This is a singleton class that is
  45232. * responsible for creating and delivering animations and their corresponding data to all Game Objects.
  45233. * Unlike plugins it is owned by the Game instance, not the Scene.
  45234. *
  45235. * Sprites and other Game Objects get the data they need from the AnimationManager.
  45236. *
  45237. * @class AnimationManager
  45238. * @extends Phaser.Events.EventEmitter
  45239. * @memberOf Phaser.Animations
  45240. * @constructor
  45241. * @since 3.0.0
  45242. *
  45243. * @param {Phaser.Game} game - [description]
  45244. */
  45245. var AnimationManager = new Class({
  45246. Extends: EventEmitter,
  45247. initialize:
  45248. function AnimationManager (game)
  45249. {
  45250. EventEmitter.call(this);
  45251. /**
  45252. * [description]
  45253. *
  45254. * @name Phaser.Animations.AnimationManager#game
  45255. * @type {Phaser.Game}
  45256. * @protected
  45257. * @since 3.0.0
  45258. */
  45259. this.game = game;
  45260. /**
  45261. * [description]
  45262. *
  45263. * @name Phaser.Animations.AnimationManager#textureManager
  45264. * @type {Phaser.Textures.TextureManager}
  45265. * @protected
  45266. * @since 3.0.0
  45267. */
  45268. this.textureManager = null;
  45269. /**
  45270. * [description]
  45271. *
  45272. * @name Phaser.Animations.AnimationManager#globalTimeScale
  45273. * @type {number}
  45274. * @default 1
  45275. * @since 3.0.0
  45276. */
  45277. this.globalTimeScale = 1;
  45278. /**
  45279. * [description]
  45280. *
  45281. * @name Phaser.Animations.AnimationManager#anims
  45282. * @type {Phaser.Structs.Map.<string, Phaser.Animations.Animation>}
  45283. * @protected
  45284. * @since 3.0.0
  45285. */
  45286. this.anims = new CustomMap();
  45287. /**
  45288. * [description]
  45289. *
  45290. * @name Phaser.Animations.AnimationManager#paused
  45291. * @type {boolean}
  45292. * @default false
  45293. * @since 3.0.0
  45294. */
  45295. this.paused = false;
  45296. /**
  45297. * [description]
  45298. *
  45299. * @name Phaser.Animations.AnimationManager#name
  45300. * @type {string}
  45301. * @since 3.0.0
  45302. */
  45303. this.name = 'AnimationManager';
  45304. game.events.once('boot', this.boot, this);
  45305. },
  45306. /**
  45307. * [description]
  45308. *
  45309. * @method Phaser.Animations.AnimationManager#boot
  45310. * @since 3.0.0
  45311. */
  45312. boot: function ()
  45313. {
  45314. this.textureManager = this.game.textures;
  45315. this.game.events.once('destroy', this.destroy, this);
  45316. },
  45317. /**
  45318. * [description]
  45319. *
  45320. * @method Phaser.Animations.AnimationManager#add
  45321. * @fires AddAnimationEvent
  45322. * @since 3.0.0
  45323. *
  45324. * @param {string} key - [description]
  45325. * @param {Phaser.Animations.Animation} animation - [description]
  45326. *
  45327. * @return {Phaser.Animations.AnimationManager} This Animation Manager.
  45328. */
  45329. add: function (key, animation)
  45330. {
  45331. if (this.anims.has(key))
  45332. {
  45333. console.warn('Animation with key', key, 'already exists');
  45334. return;
  45335. }
  45336. animation.key = key;
  45337. this.anims.set(key, animation);
  45338. this.emit('add', key, animation);
  45339. return this;
  45340. },
  45341. /**
  45342. * [description]
  45343. *
  45344. * @method Phaser.Animations.AnimationManager#create
  45345. * @fires AddAnimationEvent
  45346. * @since 3.0.0
  45347. *
  45348. * @param {AnimationConfig} config - [description]
  45349. *
  45350. * @return {Phaser.Animations.Animation} The Animation that was created.
  45351. */
  45352. create: function (config)
  45353. {
  45354. var key = config.key;
  45355. if (!key || this.anims.has(key))
  45356. {
  45357. console.warn('Invalid Animation Key, or Key already in use: ' + key);
  45358. return;
  45359. }
  45360. var anim = new Animation(this, key, config);
  45361. this.anims.set(key, anim);
  45362. this.emit('add', key, anim);
  45363. return anim;
  45364. },
  45365. /**
  45366. * [description]
  45367. *
  45368. * @method Phaser.Animations.AnimationManager#fromJSON
  45369. * @since 3.0.0
  45370. *
  45371. * @param {(string|JSONAnimationManager|JSONAnimation)} data - [description]
  45372. * @param {boolean} [clearCurrentAnimations=false] - [description]
  45373. *
  45374. * @return {Phaser.Animations.Animation[]} An array containing all of the Animation objects that were created as a result of this call.
  45375. */
  45376. fromJSON: function (data, clearCurrentAnimations)
  45377. {
  45378. if (clearCurrentAnimations === undefined) { clearCurrentAnimations = false; }
  45379. if (clearCurrentAnimations)
  45380. {
  45381. this.anims.clear();
  45382. }
  45383. // Do we have a String (i.e. from JSON, or an Object?)
  45384. if (typeof data === 'string')
  45385. {
  45386. data = JSON.parse(data);
  45387. }
  45388. var output = [];
  45389. // Array of animations, or a single animation?
  45390. if (data.hasOwnProperty('anims') && Array.isArray(data.anims))
  45391. {
  45392. for (var i = 0; i < data.anims.length; i++)
  45393. {
  45394. output.push(this.create(data.anims[i]));
  45395. }
  45396. if (data.hasOwnProperty('globalTimeScale'))
  45397. {
  45398. this.globalTimeScale = data.globalTimeScale;
  45399. }
  45400. }
  45401. else if (data.hasOwnProperty('key') && data.type === 'frame')
  45402. {
  45403. output.push(this.create(data));
  45404. }
  45405. return output;
  45406. },
  45407. /**
  45408. * @typedef {object} GenerateFrameNamesConfig
  45409. *
  45410. * @property {string} [prefix=''] - [description]
  45411. * @property {integer} [start=0] - [description]
  45412. * @property {integer} [end=0] - [description]
  45413. * @property {string} [suffix=''] - [description]
  45414. * @property {integer} [zeroPad=0] - [description]
  45415. * @property {AnimationFrameConfig[]} [outputArray=[]] - [description]
  45416. * @property {boolean} [frames=false] - [description]
  45417. */
  45418. /**
  45419. * [description]
  45420. *
  45421. * @method Phaser.Animations.AnimationManager#generateFrameNames
  45422. * @since 3.0.0
  45423. *
  45424. * @param {string} key - [description]
  45425. * @param {GenerateFrameNamesConfig} [config] - [description]
  45426. *
  45427. * @return {AnimationFrameConfig[]} [description]
  45428. */
  45429. generateFrameNames: function (key, config)
  45430. {
  45431. var prefix = GetValue(config, 'prefix', '');
  45432. var start = GetValue(config, 'start', 0);
  45433. var end = GetValue(config, 'end', 0);
  45434. var suffix = GetValue(config, 'suffix', '');
  45435. var zeroPad = GetValue(config, 'zeroPad', 0);
  45436. var out = GetValue(config, 'outputArray', []);
  45437. var frames = GetValue(config, 'frames', false);
  45438. var texture = this.textureManager.get(key);
  45439. if (!texture)
  45440. {
  45441. return out;
  45442. }
  45443. var diff = (start < end) ? 1 : -1;
  45444. // Adjust because we use i !== end in the for loop
  45445. end += diff;
  45446. var i;
  45447. var frame;
  45448. if (!config)
  45449. {
  45450. // Use every frame in the atlas?
  45451. frames = texture.getFrameNames();
  45452. for (i = 0; i < frames.length; i++)
  45453. {
  45454. out.push({ key: key, frame: frames[i] });
  45455. }
  45456. }
  45457. else if (Array.isArray(frames))
  45458. {
  45459. // Have they provided their own custom frame sequence array?
  45460. for (i = 0; i < frames.length; i++)
  45461. {
  45462. frame = prefix + Pad(frames[i], zeroPad, '0', 1) + suffix;
  45463. if (texture.has(frame))
  45464. {
  45465. out.push({ key: key, frame: frame });
  45466. }
  45467. }
  45468. }
  45469. else
  45470. {
  45471. for (i = start; i !== end; i += diff)
  45472. {
  45473. frame = prefix + Pad(i, zeroPad, '0', 1) + suffix;
  45474. if (texture.has(frame))
  45475. {
  45476. out.push({ key: key, frame: frame });
  45477. }
  45478. }
  45479. }
  45480. return out;
  45481. },
  45482. /**
  45483. * @typedef {object} GenerateFrameNumbersConfig
  45484. *
  45485. * @property {integer} [start=0] - [description]
  45486. * @property {integer} [end=-1] - [description]
  45487. * @property {boolean} [first=false] - [description]
  45488. * @property {AnimationFrameConfig[]} [outputArray=[]] - [description]
  45489. * @property {boolean} [frames=false] - [description]
  45490. */
  45491. /**
  45492. * [description]
  45493. *
  45494. * @method Phaser.Animations.AnimationManager#generateFrameNumbers
  45495. * @since 3.0.0
  45496. *
  45497. * @param {string} key - [description]
  45498. * @param {GenerateFrameNumbersConfig} config - [description]
  45499. *
  45500. * @return {AnimationFrameConfig[]} [description]
  45501. */
  45502. generateFrameNumbers: function (key, config)
  45503. {
  45504. var startFrame = GetValue(config, 'start', 0);
  45505. var endFrame = GetValue(config, 'end', -1);
  45506. var firstFrame = GetValue(config, 'first', false);
  45507. var out = GetValue(config, 'outputArray', []);
  45508. var frames = GetValue(config, 'frames', false);
  45509. var texture = this.textureManager.get(key);
  45510. if (!texture)
  45511. {
  45512. return out;
  45513. }
  45514. if (firstFrame && texture.has(firstFrame))
  45515. {
  45516. out.push({ key: key, frame: firstFrame });
  45517. }
  45518. var i;
  45519. // Have they provided their own custom frame sequence array?
  45520. if (Array.isArray(frames))
  45521. {
  45522. for (i = 0; i < frames.length; i++)
  45523. {
  45524. if (texture.has(frames[i]))
  45525. {
  45526. out.push({ key: key, frame: frames[i] });
  45527. }
  45528. }
  45529. }
  45530. else
  45531. {
  45532. // No endFrame then see if we can get it
  45533. if (endFrame === -1)
  45534. {
  45535. endFrame = texture.frameTotal;
  45536. }
  45537. for (i = startFrame; i <= endFrame; i++)
  45538. {
  45539. if (texture.has(i))
  45540. {
  45541. out.push({ key: key, frame: i });
  45542. }
  45543. }
  45544. }
  45545. return out;
  45546. },
  45547. /**
  45548. * [description]
  45549. *
  45550. * @method Phaser.Animations.AnimationManager#get
  45551. * @since 3.0.0
  45552. *
  45553. * @param {string} key - [description]
  45554. *
  45555. * @return {Phaser.Animations.Animation} [description]
  45556. */
  45557. get: function (key)
  45558. {
  45559. return this.anims.get(key);
  45560. },
  45561. /**
  45562. * Load an Animation into a Game Objects Animation Component.
  45563. *
  45564. * @method Phaser.Animations.AnimationManager#load
  45565. * @since 3.0.0
  45566. *
  45567. * @param {Phaser.GameObjects.GameObject} child - [description]
  45568. * @param {string} key - [description]
  45569. * @param {(string|integer)} [startFrame] - [description]
  45570. *
  45571. * @return {Phaser.GameObjects.GameObject} [description]
  45572. */
  45573. load: function (child, key, startFrame)
  45574. {
  45575. var anim = this.get(key);
  45576. if (anim)
  45577. {
  45578. anim.load(child, startFrame);
  45579. }
  45580. return child;
  45581. },
  45582. /**
  45583. * [description]
  45584. *
  45585. * @method Phaser.Animations.AnimationManager#pauseAll
  45586. * @fires PauseAllAnimationEvent
  45587. * @since 3.0.0
  45588. *
  45589. * @return {Phaser.Animations.AnimationManager} This Animation Manager.
  45590. */
  45591. pauseAll: function ()
  45592. {
  45593. if (!this.paused)
  45594. {
  45595. this.paused = true;
  45596. this.emit('pauseall');
  45597. }
  45598. return this;
  45599. },
  45600. /**
  45601. * [description]
  45602. *
  45603. * @method Phaser.Animations.AnimationManager#play
  45604. * @since 3.0.0
  45605. *
  45606. * @param {string} key - [description]
  45607. * @param {Phaser.GameObjects.GameObject} child - [description]
  45608. *
  45609. * @return {Phaser.Animations.AnimationManager} This Animation Manager.
  45610. */
  45611. play: function (key, child)
  45612. {
  45613. if (!Array.isArray(child))
  45614. {
  45615. child = [ child ];
  45616. }
  45617. var anim = this.get(key);
  45618. if (!anim)
  45619. {
  45620. return;
  45621. }
  45622. for (var i = 0; i < child.length; i++)
  45623. {
  45624. child[i].anims.play(key);
  45625. }
  45626. return this;
  45627. },
  45628. /**
  45629. * [description]
  45630. *
  45631. * @method Phaser.Animations.AnimationManager#remove
  45632. * @fires RemoveAnimationEvent
  45633. * @since 3.0.0
  45634. *
  45635. * @param {string} key - [description]
  45636. *
  45637. * @return {Phaser.Animations.Animation} [description]
  45638. */
  45639. remove: function (key)
  45640. {
  45641. var anim = this.get(key);
  45642. if (anim)
  45643. {
  45644. this.emit('remove', key, anim);
  45645. this.anims.delete(key);
  45646. }
  45647. return anim;
  45648. },
  45649. /**
  45650. * [description]
  45651. *
  45652. * @method Phaser.Animations.AnimationManager#resumeAll
  45653. * @fires ResumeAllAnimationEvent
  45654. * @since 3.0.0
  45655. *
  45656. * @return {Phaser.Animations.AnimationManager} This Animation Manager.
  45657. */
  45658. resumeAll: function ()
  45659. {
  45660. if (this.paused)
  45661. {
  45662. this.paused = false;
  45663. this.emit('resumeall');
  45664. }
  45665. return this;
  45666. },
  45667. /**
  45668. * Takes an array of Game Objects that have the Animation Component and then
  45669. * starts the given animation playing on them, each one offset by the
  45670. * `stagger` amount given to this method.
  45671. *
  45672. * @method Phaser.Animations.AnimationManager#staggerPlay
  45673. * @since 3.0.0
  45674. *
  45675. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  45676. *
  45677. * @param {string} key - The key of the animation to play on the Game Objects.
  45678. * @param {Phaser.GameObjects.GameObject[]} children - An array of Game Objects to play the animation on. They must have the Animation Component.
  45679. * @param {number} [stagger=0] - The amount of time, in milliseconds, to offset each play time by.
  45680. *
  45681. * @return {Phaser.Animations.AnimationManager} This Animation Manager.
  45682. */
  45683. staggerPlay: function (key, children, stagger)
  45684. {
  45685. if (stagger === undefined) { stagger = 0; }
  45686. if (!Array.isArray(children))
  45687. {
  45688. children = [ children ];
  45689. }
  45690. var anim = this.get(key);
  45691. if (!anim)
  45692. {
  45693. return;
  45694. }
  45695. for (var i = 0; i < children.length; i++)
  45696. {
  45697. children[i].anims.delayedPlay(stagger * i, key);
  45698. }
  45699. return this;
  45700. },
  45701. /**
  45702. * [description]
  45703. *
  45704. * @method Phaser.Animations.AnimationManager#toJSON
  45705. * @since 3.0.0
  45706. *
  45707. * @param {string} key - [description]
  45708. *
  45709. * @return {JSONAnimationManager} [description]
  45710. */
  45711. toJSON: function (key)
  45712. {
  45713. if (key !== undefined && key !== '')
  45714. {
  45715. return this.anims.get(key).toJSON();
  45716. }
  45717. else
  45718. {
  45719. var output = {
  45720. anims: [],
  45721. globalTimeScale: this.globalTimeScale
  45722. };
  45723. this.anims.each(function (animationKey, animation)
  45724. {
  45725. output.anims.push(animation.toJSON());
  45726. });
  45727. return output;
  45728. }
  45729. },
  45730. /**
  45731. * [description]
  45732. *
  45733. * @method Phaser.Animations.AnimationManager#destroy
  45734. * @since 3.0.0
  45735. */
  45736. destroy: function ()
  45737. {
  45738. this.anims.clear();
  45739. this.textureManager = null;
  45740. this.game = null;
  45741. }
  45742. });
  45743. module.exports = AnimationManager;
  45744. /***/ }),
  45745. /* 213 */
  45746. /***/ (function(module, exports, __webpack_require__) {
  45747. /**
  45748. * @author Richard Davey <rich@photonstorm.com>
  45749. * @copyright 2018 Photon Storm Ltd.
  45750. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  45751. */
  45752. var Class = __webpack_require__(0);
  45753. /**
  45754. * @typedef {object} JSONAnimationFrame
  45755. *
  45756. * @property {string} key - The key of the Texture this AnimationFrame uses.
  45757. * @property {(string|integer)} frame - The key of the Frame within the Texture that this AnimationFrame uses.
  45758. * @property {number} duration - Additional time (in ms) that this frame should appear for during playback.
  45759. */
  45760. /**
  45761. * @classdesc
  45762. * A single frame in an Animation sequence.
  45763. *
  45764. * An AnimationFrame consists of a reference to the Texture it uses for rendering, references to other
  45765. * frames in the animation, and index data. It also has the ability to fire its own `onUpdate` callback
  45766. * and modify the animation timing.
  45767. *
  45768. * AnimationFrames are generated automatically by the Animation class.
  45769. *
  45770. * @class AnimationFrame
  45771. * @memberOf Phaser.Animations
  45772. * @constructor
  45773. * @since 3.0.0
  45774. *
  45775. * @param {string} textureKey - The key of the Texture this AnimationFrame uses.
  45776. * @param {(string|integer)} textureFrame - The key of the Frame within the Texture that this AnimationFrame uses.
  45777. * @param {integer} index - The index of this AnimationFrame within the Animation sequence.
  45778. * @param {Phaser.Textures.Frame} frame - A reference to the Texture Frame this AnimationFrame uses for rendering.
  45779. */
  45780. var AnimationFrame = new Class({
  45781. initialize:
  45782. function AnimationFrame (textureKey, textureFrame, index, frame)
  45783. {
  45784. /**
  45785. * The key of the Texture this AnimationFrame uses.
  45786. *
  45787. * @name Phaser.Animations.AnimationFrame#textureKey
  45788. * @type {string}
  45789. * @since 3.0.0
  45790. */
  45791. this.textureKey = textureKey;
  45792. /**
  45793. * The key of the Frame within the Texture that this AnimationFrame uses.
  45794. *
  45795. * @name Phaser.Animations.AnimationFrame#textureFrame
  45796. * @type {(string|integer)}
  45797. * @since 3.0.0
  45798. */
  45799. this.textureFrame = textureFrame;
  45800. /**
  45801. * The index of this AnimationFrame within the Animation sequence.
  45802. *
  45803. * @name Phaser.Animations.AnimationFrame#index
  45804. * @type {integer}
  45805. * @since 3.0.0
  45806. */
  45807. this.index = index;
  45808. /**
  45809. * A reference to the Texture Frame this AnimationFrame uses for rendering.
  45810. *
  45811. * @name Phaser.Animations.AnimationFrame#frame
  45812. * @type {Phaser.Textures.Frame}
  45813. * @since 3.0.0
  45814. */
  45815. this.frame = frame;
  45816. /**
  45817. * Is this the first frame in an animation sequence?
  45818. *
  45819. * @name Phaser.Animations.AnimationFrame#isFirst
  45820. * @type {boolean}
  45821. * @default false
  45822. * @readOnly
  45823. * @since 3.0.0
  45824. */
  45825. this.isFirst = false;
  45826. /**
  45827. * Is this the last frame in an animation sequence?
  45828. *
  45829. * @name Phaser.Animations.AnimationFrame#isLast
  45830. * @type {boolean}
  45831. * @default false
  45832. * @readOnly
  45833. * @since 3.0.0
  45834. */
  45835. this.isLast = false;
  45836. /**
  45837. * A reference to the AnimationFrame that comes before this one in the animation, if any.
  45838. *
  45839. * @name Phaser.Animations.AnimationFrame#prevFrame
  45840. * @type {?Phaser.Animations.AnimationFrame}
  45841. * @default null
  45842. * @readOnly
  45843. * @since 3.0.0
  45844. */
  45845. this.prevFrame = null;
  45846. /**
  45847. * A reference to the AnimationFrame that comes after this one in the animation, if any.
  45848. *
  45849. * @name Phaser.Animations.AnimationFrame#nextFrame
  45850. * @type {?Phaser.Animations.AnimationFrame}
  45851. * @default null
  45852. * @readOnly
  45853. * @since 3.0.0
  45854. */
  45855. this.nextFrame = null;
  45856. /**
  45857. * Additional time (in ms) that this frame should appear for during playback.
  45858. * The value is added onto the msPerFrame set by the animation.
  45859. *
  45860. * @name Phaser.Animations.AnimationFrame#duration
  45861. * @type {number}
  45862. * @default 0
  45863. * @since 3.0.0
  45864. */
  45865. this.duration = 0;
  45866. /**
  45867. * What % through the animation does this frame come?
  45868. * This value is generated when the animation is created and cached here.
  45869. *
  45870. * @name Phaser.Animations.AnimationFrame#progress
  45871. * @type {number}
  45872. * @default 0
  45873. * @readOnly
  45874. * @since 3.0.0
  45875. */
  45876. this.progress = 0;
  45877. },
  45878. /**
  45879. * Generates a JavaScript object suitable for converting to JSON.
  45880. *
  45881. * @method Phaser.Animations.AnimationFrame#toJSON
  45882. * @since 3.0.0
  45883. *
  45884. * @return {JSONAnimationFrame} The AnimationFrame data.
  45885. */
  45886. toJSON: function ()
  45887. {
  45888. return {
  45889. key: this.textureKey,
  45890. frame: this.textureFrame,
  45891. duration: this.duration
  45892. };
  45893. },
  45894. /**
  45895. * Destroys this object by removing references to external resources and callbacks.
  45896. *
  45897. * @method Phaser.Animations.AnimationFrame#destroy
  45898. * @since 3.0.0
  45899. */
  45900. destroy: function ()
  45901. {
  45902. this.frame = undefined;
  45903. }
  45904. });
  45905. module.exports = AnimationFrame;
  45906. /***/ }),
  45907. /* 214 */
  45908. /***/ (function(module, exports) {
  45909. /**
  45910. * @author Richard Davey <rich@photonstorm.com>
  45911. * @copyright 2018 Photon Storm Ltd.
  45912. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  45913. */
  45914. /**
  45915. * [description]
  45916. *
  45917. * @function Phaser.Utils.Array.FindClosestInSorted
  45918. * @since 3.0.0
  45919. *
  45920. * @param {number} value - The value to search for in the array.
  45921. * @param {array} array - The array to search, which must be sorted.
  45922. * @param {string} [key] - An optional property key. If specified the array elements property will be checked against value.
  45923. *
  45924. * @return {number|object} The nearest value found in the array, or if a `key` was given, the nearest object with the matching property value.
  45925. */
  45926. var FindClosestInSorted = function (value, array, key)
  45927. {
  45928. if (!array.length)
  45929. {
  45930. return NaN;
  45931. }
  45932. else if (array.length === 1)
  45933. {
  45934. return array[0];
  45935. }
  45936. var i = 1;
  45937. var low;
  45938. var high;
  45939. if (key)
  45940. {
  45941. if (value < array[0][key])
  45942. {
  45943. return array[0];
  45944. }
  45945. while (array[i][key] < value)
  45946. {
  45947. i++;
  45948. }
  45949. }
  45950. else
  45951. {
  45952. while (array[i] < value)
  45953. {
  45954. i++;
  45955. }
  45956. }
  45957. if (i > array.length)
  45958. {
  45959. i = array.length;
  45960. }
  45961. if (key)
  45962. {
  45963. low = array[i - 1][key];
  45964. high = array[i][key];
  45965. return ((high - value) <= (value - low)) ? array[i] : array[i - 1];
  45966. }
  45967. else
  45968. {
  45969. low = array[i - 1];
  45970. high = array[i];
  45971. return ((high - value) <= (value - low)) ? high : low;
  45972. }
  45973. };
  45974. module.exports = FindClosestInSorted;
  45975. /***/ }),
  45976. /* 215 */
  45977. /***/ (function(module, exports, __webpack_require__) {
  45978. /**
  45979. * @author Richard Davey <rich@photonstorm.com>
  45980. * @copyright 2018 Photon Storm Ltd.
  45981. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  45982. */
  45983. var Clamp = __webpack_require__(19);
  45984. var Class = __webpack_require__(0);
  45985. var FindClosestInSorted = __webpack_require__(214);
  45986. var Frame = __webpack_require__(213);
  45987. var GetValue = __webpack_require__(4);
  45988. /**
  45989. * @typedef {object} JSONAnimation
  45990. *
  45991. * @property {string} key - The key that the animation will be associated with. i.e. sprite.animations.play(key)
  45992. * @property {string} type - A frame based animation (as opposed to a bone based animation)
  45993. * @property {JSONAnimationFrame[]} frames - [description]
  45994. * @property {integer} frameRate - The frame rate of playback in frames per second (default 24 if duration is null)
  45995. * @property {integer} duration - How long the animation should play for in milliseconds. If not given its derived from frameRate.
  45996. * @property {boolean} skipMissedFrames - Skip frames if the time lags, or always advanced anyway?
  45997. * @property {integer} delay - Delay before starting playback. Value given in milliseconds.
  45998. * @property {integer} repeat - Number of times to repeat the animation (-1 for infinity)
  45999. * @property {integer} repeatDelay - Delay before the animation repeats. Value given in milliseconds.
  46000. * @property {boolean} yoyo - Should the animation yoyo? (reverse back down to the start) before repeating?
  46001. * @property {boolean} showOnStart - Should sprite.visible = true when the animation starts to play?
  46002. * @property {boolean} hideOnComplete - Should sprite.visible = false when the animation finishes?
  46003. */
  46004. /**
  46005. * @typedef {object} AnimationFrameConfig
  46006. *
  46007. * @property {string} key - The key that the animation will be associated with. i.e. sprite.animations.play(key)
  46008. * @property {(string|number)} frame - [description]
  46009. * @property {number} [duration=0] - [description]
  46010. * @property {boolean} [visible] - [description]
  46011. */
  46012. /**
  46013. * @typedef {object} AnimationConfig
  46014. *
  46015. * @property {string} [key] - The key that the animation will be associated with. i.e. sprite.animations.play(key)
  46016. * @property {AnimationFrameConfig[]} [frames] - An object containing data used to generate the frames for the animation
  46017. * @property {string} [defaultTextureKey=null] - The key of the texture all frames of the animation will use. Can be overridden on a per frame basis.
  46018. * @property {integer} [frameRate] - The frame rate of playback in frames per second (default 24 if duration is null)
  46019. * @property {integer} [duration] - How long the animation should play for in milliseconds. If not given its derived from frameRate.
  46020. * @property {boolean} [skipMissedFrames=true] - Skip frames if the time lags, or always advanced anyway?
  46021. * @property {integer} [delay=0] - Delay before starting playback. Value given in milliseconds.
  46022. * @property {integer} [repeat=0] - Number of times to repeat the animation (-1 for infinity)
  46023. * @property {integer} [repeatDelay=0] - Delay before the animation repeats. Value given in milliseconds.
  46024. * @property {boolean} [yoyo=false] - Should the animation yoyo? (reverse back down to the start) before repeating?
  46025. * @property {boolean} [showOnStart=false] - Should sprite.visible = true when the animation starts to play?
  46026. * @property {boolean} [hideOnComplete=false] - Should sprite.visible = false when the animation finishes?
  46027. */
  46028. /**
  46029. * @classdesc
  46030. * A Frame based Animation.
  46031. *
  46032. * This consists of a key, some default values (like the frame rate) and a bunch of Frame objects.
  46033. *
  46034. * The Animation Manager creates these. Game Objects don't own an instance of these directly.
  46035. * Game Objects have the Animation Component, which are like playheads to global Animations (these objects)
  46036. * So multiple Game Objects can have playheads all pointing to this one Animation instance.
  46037. *
  46038. * @class Animation
  46039. * @memberOf Phaser.Animations
  46040. * @constructor
  46041. * @since 3.0.0
  46042. *
  46043. * @param {Phaser.Animations.AnimationManager} manager - [description]
  46044. * @param {string} key - [description]
  46045. * @param {AnimationConfig} config - [description]
  46046. */
  46047. var Animation = new Class({
  46048. initialize:
  46049. function Animation (manager, key, config)
  46050. {
  46051. /**
  46052. * A reference to the global Animation Manager
  46053. *
  46054. * @name Phaser.Animations.Animation#manager
  46055. * @type {Phaser.Animations.AnimationManager}
  46056. * @since 3.0.0
  46057. */
  46058. this.manager = manager;
  46059. /**
  46060. * The unique identifying string for this animation
  46061. *
  46062. * @name Phaser.Animations.Animation#key
  46063. * @type {string}
  46064. * @since 3.0.0
  46065. */
  46066. this.key = key;
  46067. /**
  46068. * A frame based animation (as opposed to a bone based animation)
  46069. *
  46070. * @name Phaser.Animations.Animation#type
  46071. * @type {string}
  46072. * @default frame
  46073. * @since 3.0.0
  46074. */
  46075. this.type = 'frame';
  46076. /**
  46077. * Extract all the frame data into the frames array
  46078. *
  46079. * @name Phaser.Animations.Animation#frames
  46080. * @type {Phaser.Animations.AnimationFrame[]}
  46081. * @since 3.0.0
  46082. */
  46083. this.frames = this.getFrames(
  46084. manager.textureManager,
  46085. GetValue(config, 'frames', []),
  46086. GetValue(config, 'defaultTextureKey', null)
  46087. );
  46088. /**
  46089. * The frame rate of playback in frames per second (default 24 if duration is null)
  46090. *
  46091. * @name Phaser.Animations.Animation#frameRate
  46092. * @type {integer}
  46093. * @default 24
  46094. * @since 3.0.0
  46095. */
  46096. this.frameRate = GetValue(config, 'frameRate', null);
  46097. /**
  46098. * How long the animation should play for, in milliseconds.
  46099. * If the `frameRate` property has been set then it overrides this value,
  46100. * otherwise the `frameRate` is derived from `duration`.
  46101. *
  46102. * @name Phaser.Animations.Animation#duration
  46103. * @type {integer}
  46104. * @since 3.0.0
  46105. */
  46106. this.duration = GetValue(config, 'duration', null);
  46107. if (this.duration === null && this.frameRate === null)
  46108. {
  46109. // No duration or frameRate given, use default frameRate of 24fps
  46110. this.frameRate = 24;
  46111. this.duration = (this.frameRate / this.frames.length) * 1000;
  46112. }
  46113. else if (this.duration && this.frameRate === null)
  46114. {
  46115. // Duration given but no frameRate, so set the frameRate based on duration
  46116. // I.e. 12 frames in the animation, duration = 4000 ms
  46117. // So frameRate is 12 / (4000 / 1000) = 3 fps
  46118. this.frameRate = this.frames.length / (this.duration / 1000);
  46119. }
  46120. else
  46121. {
  46122. // frameRate given, derive duration from it (even if duration also specified)
  46123. // I.e. 15 frames in the animation, frameRate = 30 fps
  46124. // So duration is 15 / 30 = 0.5 * 1000 (half a second, or 500ms)
  46125. this.duration = (this.frames.length / this.frameRate) * 1000;
  46126. }
  46127. /**
  46128. * How many ms per frame, not including frame specific modifiers.
  46129. *
  46130. * @name Phaser.Animations.Animation#msPerFrame
  46131. * @type {integer}
  46132. * @since 3.0.0
  46133. */
  46134. this.msPerFrame = 1000 / this.frameRate;
  46135. /**
  46136. * Skip frames if the time lags, or always advanced anyway?
  46137. *
  46138. * @name Phaser.Animations.Animation#skipMissedFrames
  46139. * @type {boolean}
  46140. * @default false
  46141. * @since 3.0.0
  46142. */
  46143. this.skipMissedFrames = GetValue(config, 'skipMissedFrames', true);
  46144. /**
  46145. * The delay in ms before the playback will begin.
  46146. *
  46147. * @name Phaser.Animations.Animation#delay
  46148. * @type {integer}
  46149. * @default 0
  46150. * @since 3.0.0
  46151. */
  46152. this.delay = GetValue(config, 'delay', 0);
  46153. /**
  46154. * Number of times to repeat the animation. Set to -1 to repeat forever.
  46155. *
  46156. * @name Phaser.Animations.Animation#repeat
  46157. * @type {integer}
  46158. * @default 0
  46159. * @since 3.0.0
  46160. */
  46161. this.repeat = GetValue(config, 'repeat', 0);
  46162. /**
  46163. * The delay in ms before the a repeat playthrough starts.
  46164. *
  46165. * @name Phaser.Animations.Animation#repeatDelay
  46166. * @type {integer}
  46167. * @default 0
  46168. * @since 3.0.0
  46169. */
  46170. this.repeatDelay = GetValue(config, 'repeatDelay', 0);
  46171. /**
  46172. * Should the animation yoyo? (reverse back down to the start) before repeating?
  46173. *
  46174. * @name Phaser.Animations.Animation#yoyo
  46175. * @type {boolean}
  46176. * @default false
  46177. * @since 3.0.0
  46178. */
  46179. this.yoyo = GetValue(config, 'yoyo', false);
  46180. /**
  46181. * Should sprite.visible = true when the animation starts to play?
  46182. *
  46183. * @name Phaser.Animations.Animation#showOnStart
  46184. * @type {boolean}
  46185. * @default false
  46186. * @since 3.0.0
  46187. */
  46188. this.showOnStart = GetValue(config, 'showOnStart', false);
  46189. /**
  46190. * Should sprite.visible = false when the animation finishes?
  46191. *
  46192. * @name Phaser.Animations.Animation#hideOnComplete
  46193. * @type {boolean}
  46194. * @default false
  46195. * @since 3.0.0
  46196. */
  46197. this.hideOnComplete = GetValue(config, 'hideOnComplete', false);
  46198. /**
  46199. * Global pause. All Game Objects using this Animation instance are impacted by this property.
  46200. *
  46201. * @name Phaser.Animations.Animation#paused
  46202. * @type {boolean}
  46203. * @default false
  46204. * @since 3.0.0
  46205. */
  46206. this.paused = false;
  46207. this.manager.on('pauseall', this.pause, this);
  46208. this.manager.on('resumeall', this.resume, this);
  46209. },
  46210. /**
  46211. * Add frames to the end of the animation.
  46212. *
  46213. * @method Phaser.Animations.Animation#addFrame
  46214. * @since 3.0.0
  46215. *
  46216. * @param {(string|AnimationFrameConfig[])} config - [description]
  46217. *
  46218. * @return {Phaser.Animations.Animation} This Animation object.
  46219. */
  46220. addFrame: function (config)
  46221. {
  46222. return this.addFrameAt(this.frames.length, config);
  46223. },
  46224. /**
  46225. * Add frame/s into the animation.
  46226. *
  46227. * @method Phaser.Animations.Animation#addFrameAt
  46228. * @since 3.0.0
  46229. *
  46230. * @param {integer} index - [description]
  46231. * @param {(string|AnimationFrameConfig[])} config - [description]
  46232. *
  46233. * @return {Phaser.Animations.Animation} This Animation object.
  46234. */
  46235. addFrameAt: function (index, config)
  46236. {
  46237. var newFrames = this.getFrames(this.manager.textureManager, config);
  46238. if (newFrames.length > 0)
  46239. {
  46240. if (index === 0)
  46241. {
  46242. this.frames = newFrames.concat(this.frames);
  46243. }
  46244. else if (index === this.frames.length)
  46245. {
  46246. this.frames = this.frames.concat(newFrames);
  46247. }
  46248. else
  46249. {
  46250. var pre = this.frames.slice(0, index);
  46251. var post = this.frames.slice(index);
  46252. this.frames = pre.concat(newFrames, post);
  46253. }
  46254. this.updateFrameSequence();
  46255. }
  46256. return this;
  46257. },
  46258. /**
  46259. * Check if the given frame index is valid.
  46260. *
  46261. * @method Phaser.Animations.Animation#checkFrame
  46262. * @since 3.0.0
  46263. *
  46264. * @param {integer} index - The index to be checked.
  46265. *
  46266. * @return {boolean} `true` if the index is valid, otherwise `false`.
  46267. */
  46268. checkFrame: function (index)
  46269. {
  46270. return (index >= 0 && index < this.frames.length);
  46271. },
  46272. /**
  46273. * [description]
  46274. *
  46275. * @method Phaser.Animations.Animation#completeAnimation
  46276. * @protected
  46277. * @since 3.0.0
  46278. *
  46279. * @param {Phaser.GameObjects.Components.Animation} component - [description]
  46280. */
  46281. completeAnimation: function (component)
  46282. {
  46283. if (this.hideOnComplete)
  46284. {
  46285. component.parent.visible = false;
  46286. }
  46287. component.stop();
  46288. },
  46289. /**
  46290. * [description]
  46291. *
  46292. * @method Phaser.Animations.Animation#getFirstTick
  46293. * @protected
  46294. * @since 3.0.0
  46295. *
  46296. * @param {Phaser.GameObjects.Components.Animation} component - [description]
  46297. * @param {boolean} [includeDelay=true] - [description]
  46298. */
  46299. getFirstTick: function (component, includeDelay)
  46300. {
  46301. if (includeDelay === undefined) { includeDelay = true; }
  46302. // When is the first update due?
  46303. component.accumulator = 0;
  46304. component.nextTick = component.msPerFrame + component.currentFrame.duration;
  46305. if (includeDelay)
  46306. {
  46307. component.nextTick += component._delay;
  46308. }
  46309. },
  46310. /**
  46311. * Returns the AnimationFrame at the provided index
  46312. *
  46313. * @method Phaser.Animations.Animation#getFrameAt
  46314. * @protected
  46315. * @since 3.0.0
  46316. *
  46317. * @param {integer} index - The index in the AnimationFrame array
  46318. *
  46319. * @return {Phaser.Animations.AnimationFrame} The frame at the index provided from the animation sequence
  46320. */
  46321. getFrameAt: function (index)
  46322. {
  46323. return this.frames[index];
  46324. },
  46325. /**
  46326. * [description]
  46327. *
  46328. * @method Phaser.Animations.Animation#getFrames
  46329. * @since 3.0.0
  46330. *
  46331. * @param {Phaser.Textures.TextureManager} textureManager - [description]
  46332. * @param {(string|AnimationFrameConfig[])} frames - [description]
  46333. * @param {string} [defaultTextureKey] - [description]
  46334. *
  46335. * @return {Phaser.Animations.AnimationFrame[]} [description]
  46336. */
  46337. getFrames: function (textureManager, frames, defaultTextureKey)
  46338. {
  46339. var out = [];
  46340. var prev;
  46341. var animationFrame;
  46342. var index = 1;
  46343. var i;
  46344. var textureKey;
  46345. // if frames is a string, we'll get all the frames from the texture manager as if it's a sprite sheet
  46346. if (typeof frames === 'string')
  46347. {
  46348. textureKey = frames;
  46349. var texture = textureManager.get(textureKey);
  46350. var frameKeys = texture.getFrameNames();
  46351. frames = [];
  46352. frameKeys.forEach(function (idx, value)
  46353. {
  46354. frames.push({ key: textureKey, frame: value });
  46355. });
  46356. }
  46357. if (!Array.isArray(frames) || frames.length === 0)
  46358. {
  46359. return out;
  46360. }
  46361. for (i = 0; i < frames.length; i++)
  46362. {
  46363. var item = frames[i];
  46364. var key = GetValue(item, 'key', defaultTextureKey);
  46365. if (!key)
  46366. {
  46367. continue;
  46368. }
  46369. // Could be an integer or a string
  46370. var frame = GetValue(item, 'frame', 0);
  46371. // The actual texture frame
  46372. var textureFrame = textureManager.getFrame(key, frame);
  46373. animationFrame = new Frame(key, frame, index, textureFrame);
  46374. animationFrame.duration = GetValue(item, 'duration', 0);
  46375. animationFrame.isFirst = (!prev);
  46376. // The previously created animationFrame
  46377. if (prev)
  46378. {
  46379. prev.nextFrame = animationFrame;
  46380. animationFrame.prevFrame = prev;
  46381. }
  46382. out.push(animationFrame);
  46383. prev = animationFrame;
  46384. index++;
  46385. }
  46386. if (out.length > 0)
  46387. {
  46388. animationFrame.isLast = true;
  46389. // Link them end-to-end, so they loop
  46390. animationFrame.nextFrame = out[0];
  46391. out[0].prevFrame = animationFrame;
  46392. // Generate the progress data
  46393. var slice = 1 / (out.length - 1);
  46394. for (i = 0; i < out.length; i++)
  46395. {
  46396. out[i].progress = i * slice;
  46397. }
  46398. }
  46399. return out;
  46400. },
  46401. /**
  46402. * [description]
  46403. *
  46404. * @method Phaser.Animations.Animation#getNextTick
  46405. * @since 3.0.0
  46406. *
  46407. * @param {Phaser.GameObjects.Components.Animation} component - [description]
  46408. */
  46409. getNextTick: function (component)
  46410. {
  46411. // accumulator += delta * _timeScale
  46412. // after a large delta surge (perf issue for example) we need to adjust for it here
  46413. // When is the next update due?
  46414. component.accumulator -= component.nextTick;
  46415. component.nextTick = component.msPerFrame + component.currentFrame.duration;
  46416. },
  46417. /**
  46418. * Loads the Animation values into the Animation Component.
  46419. *
  46420. * @method Phaser.Animations.Animation#load
  46421. * @private
  46422. * @since 3.0.0
  46423. *
  46424. * @param {Phaser.GameObjects.Components.Animation} component - The Animation Component to load values into.
  46425. * @param {integer} startFrame - The start frame of the animation to load.
  46426. */
  46427. load: function (component, startFrame)
  46428. {
  46429. if (startFrame >= this.frames.length)
  46430. {
  46431. startFrame = 0;
  46432. }
  46433. if (component.currentAnim !== this)
  46434. {
  46435. component.currentAnim = this;
  46436. component.frameRate = this.frameRate;
  46437. component.duration = this.duration;
  46438. component.msPerFrame = this.msPerFrame;
  46439. component.skipMissedFrames = this.skipMissedFrames;
  46440. component._timeScale = 1;
  46441. component._delay = this.delay;
  46442. component._repeat = this.repeat;
  46443. component._repeatDelay = this.repeatDelay;
  46444. component._yoyo = this.yoyo;
  46445. }
  46446. component.updateFrame(this.frames[startFrame]);
  46447. },
  46448. /**
  46449. * Returns the frame closest to the given progress value between 0 and 1.
  46450. *
  46451. * @method Phaser.Animations.Animation#getFrameByProgress
  46452. * @since 3.4.0
  46453. *
  46454. * @param {number} value - A value between 0 and 1.
  46455. *
  46456. * @return {Phaser.Animations.AnimationFrame} The frame closest to the given progress value.
  46457. */
  46458. getFrameByProgress: function (value)
  46459. {
  46460. value = Clamp(value, 0, 1);
  46461. return FindClosestInSorted(value, this.frames, 'progress');
  46462. },
  46463. /**
  46464. * Advance the animation frame.
  46465. *
  46466. * @method Phaser.Animations.Animation#nextFrame
  46467. * @since 3.0.0
  46468. *
  46469. * @param {Phaser.GameObjects.Components.Animation} component - The Animation Component to advance.
  46470. */
  46471. nextFrame: function (component)
  46472. {
  46473. var frame = component.currentFrame;
  46474. // TODO: Add frame skip support
  46475. if (frame.isLast)
  46476. {
  46477. // We're at the end of the animation
  46478. // Yoyo? (happens before repeat)
  46479. if (component._yoyo)
  46480. {
  46481. component.forward = false;
  46482. component.updateFrame(frame.prevFrame);
  46483. // Delay for the current frame
  46484. this.getNextTick(component);
  46485. }
  46486. else if (component.repeatCounter > 0)
  46487. {
  46488. // Repeat (happens before complete)
  46489. this.repeatAnimation(component);
  46490. }
  46491. else
  46492. {
  46493. this.completeAnimation(component);
  46494. }
  46495. }
  46496. else
  46497. {
  46498. component.updateFrame(frame.nextFrame);
  46499. this.getNextTick(component);
  46500. }
  46501. },
  46502. /**
  46503. * [description]
  46504. *
  46505. * @method Phaser.Animations.Animation#previousFrame
  46506. * @since 3.0.0
  46507. *
  46508. * @param {Phaser.GameObjects.Components.Animation} component - [description]
  46509. */
  46510. previousFrame: function (component)
  46511. {
  46512. var frame = component.currentFrame;
  46513. // TODO: Add frame skip support
  46514. if (frame.isFirst)
  46515. {
  46516. // We're at the start of the animation
  46517. if (component.repeatCounter > 0)
  46518. {
  46519. // Repeat (happens before complete)
  46520. this.repeatAnimation(component);
  46521. }
  46522. else
  46523. {
  46524. this.completeAnimation(component);
  46525. }
  46526. }
  46527. else
  46528. {
  46529. component.updateFrame(frame.prevFrame);
  46530. this.getNextTick(component);
  46531. }
  46532. },
  46533. /**
  46534. * [description]
  46535. *
  46536. * @method Phaser.Animations.Animation#removeFrame
  46537. * @since 3.0.0
  46538. *
  46539. * @param {Phaser.Animations.AnimationFrame} frame - [description]
  46540. *
  46541. * @return {Phaser.Animations.Animation} This Animation object.
  46542. */
  46543. removeFrame: function (frame)
  46544. {
  46545. var index = this.frames.indexOf(frame);
  46546. if (index !== -1)
  46547. {
  46548. this.removeFrameAt(index);
  46549. }
  46550. return this;
  46551. },
  46552. /**
  46553. * Removes a frame from the AnimationFrame array at the provided index
  46554. * and updates the animation accordingly.
  46555. *
  46556. * @method Phaser.Animations.Animation#removeFrameAt
  46557. * @since 3.0.0
  46558. *
  46559. * @param {integer} index - The index in the AnimationFrame array
  46560. *
  46561. * @return {Phaser.Animations.Animation} This Animation object.
  46562. */
  46563. removeFrameAt: function (index)
  46564. {
  46565. this.frames.splice(index, 1);
  46566. this.updateFrameSequence();
  46567. return this;
  46568. },
  46569. /**
  46570. * [description]
  46571. *
  46572. * @method Phaser.Animations.Animation#repeatAnimation
  46573. * @since 3.0.0
  46574. *
  46575. * @param {Phaser.GameObjects.Components.Animation} component - [description]
  46576. */
  46577. repeatAnimation: function (component)
  46578. {
  46579. if (component._pendingStop === 2)
  46580. {
  46581. return this.completeAnimation(component);
  46582. }
  46583. if (component._repeatDelay > 0 && component.pendingRepeat === false)
  46584. {
  46585. component.pendingRepeat = true;
  46586. component.accumulator -= component.nextTick;
  46587. component.nextTick += component._repeatDelay;
  46588. }
  46589. else
  46590. {
  46591. component.repeatCounter--;
  46592. component.forward = true;
  46593. component.updateFrame(component.currentFrame.nextFrame);
  46594. if (component.isPlaying)
  46595. {
  46596. this.getNextTick(component);
  46597. component.pendingRepeat = false;
  46598. component.parent.emit('animationrepeat', this, component.currentFrame, component.repeatCounter);
  46599. }
  46600. }
  46601. },
  46602. /**
  46603. * [description]
  46604. *
  46605. * @method Phaser.Animations.Animation#setFrame
  46606. * @since 3.0.0
  46607. *
  46608. * @param {Phaser.GameObjects.Components.Animation} component - [description]
  46609. */
  46610. setFrame: function (component)
  46611. {
  46612. // Work out which frame should be set next on the child, and set it
  46613. if (component.forward)
  46614. {
  46615. this.nextFrame(component);
  46616. }
  46617. else
  46618. {
  46619. this.previousFrame(component);
  46620. }
  46621. },
  46622. /**
  46623. * [description]
  46624. *
  46625. * @method Phaser.Animations.Animation#toJSON
  46626. * @since 3.0.0
  46627. *
  46628. * @return {JSONAnimation} [description]
  46629. */
  46630. toJSON: function ()
  46631. {
  46632. var output = {
  46633. key: this.key,
  46634. type: this.type,
  46635. frames: [],
  46636. frameRate: this.frameRate,
  46637. duration: this.duration,
  46638. skipMissedFrames: this.skipMissedFrames,
  46639. delay: this.delay,
  46640. repeat: this.repeat,
  46641. repeatDelay: this.repeatDelay,
  46642. yoyo: this.yoyo,
  46643. showOnStart: this.showOnStart,
  46644. hideOnComplete: this.hideOnComplete
  46645. };
  46646. this.frames.forEach(function (frame)
  46647. {
  46648. output.frames.push(frame.toJSON());
  46649. });
  46650. return output;
  46651. },
  46652. /**
  46653. * [description]
  46654. *
  46655. * @method Phaser.Animations.Animation#updateFrameSequence
  46656. * @since 3.0.0
  46657. *
  46658. * @return {Phaser.Animations.Animation} This Animation object.
  46659. */
  46660. updateFrameSequence: function ()
  46661. {
  46662. var len = this.frames.length;
  46663. var slice = 1 / (len - 1);
  46664. for (var i = 0; i < len; i++)
  46665. {
  46666. var frame = this.frames[i];
  46667. frame.index = i + 1;
  46668. frame.isFirst = false;
  46669. frame.isLast = false;
  46670. frame.progress = i * slice;
  46671. if (i === 0)
  46672. {
  46673. frame.isFirst = true;
  46674. frame.isLast = (len === 1);
  46675. frame.prevFrame = this.frames[len - 1];
  46676. frame.nextFrame = this.frames[i + 1];
  46677. }
  46678. else if (i === len - 1)
  46679. {
  46680. frame.isLast = true;
  46681. frame.prevFrame = this.frames[len - 2];
  46682. frame.nextFrame = this.frames[0];
  46683. }
  46684. else if (len > 1)
  46685. {
  46686. frame.prevFrame = this.frames[i - 1];
  46687. frame.nextFrame = this.frames[i + 1];
  46688. }
  46689. }
  46690. return this;
  46691. },
  46692. /**
  46693. * [description]
  46694. *
  46695. * @method Phaser.Animations.Animation#pause
  46696. * @since 3.0.0
  46697. *
  46698. * @return {Phaser.Animations.Animation} This Animation object.
  46699. */
  46700. pause: function ()
  46701. {
  46702. this.paused = true;
  46703. return this;
  46704. },
  46705. /**
  46706. * [description]
  46707. *
  46708. * @method Phaser.Animations.Animation#resume
  46709. * @since 3.0.0
  46710. *
  46711. * @return {Phaser.Animations.Animation} This Animation object.
  46712. */
  46713. resume: function ()
  46714. {
  46715. this.paused = false;
  46716. return this;
  46717. },
  46718. /**
  46719. * [description]
  46720. *
  46721. * @method Phaser.Animations.Animation#destroy
  46722. * @since 3.0.0
  46723. */
  46724. destroy: function ()
  46725. {
  46726. this.manager.off('pauseall', this.pause, this);
  46727. this.manager.off('resumeall', this.resume, this);
  46728. this.manager.remove(this.key);
  46729. for (var i = 0; i < this.frames.length; i++)
  46730. {
  46731. this.frames[i].destroy();
  46732. }
  46733. this.frames = [];
  46734. this.manager = null;
  46735. }
  46736. });
  46737. module.exports = Animation;
  46738. /***/ }),
  46739. /* 216 */
  46740. /***/ (function(module, exports, __webpack_require__) {
  46741. /**
  46742. * @author Richard Davey <rich@photonstorm.com>
  46743. * @copyright 2018 Photon Storm Ltd.
  46744. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  46745. */
  46746. var Wrap = __webpack_require__(40);
  46747. /**
  46748. * Wrap an angle in degrees.
  46749. *
  46750. * Wraps the angle to a value in the range of -180 to 180.
  46751. *
  46752. * @function Phaser.Math.Angle.WrapDegrees
  46753. * @since 3.0.0
  46754. *
  46755. * @param {number} angle - The angle to wrap, in degrees.
  46756. *
  46757. * @return {number} The wrapped angle, in degrees.
  46758. */
  46759. var WrapDegrees = function (angle)
  46760. {
  46761. return Wrap(angle, -180, 180);
  46762. };
  46763. module.exports = WrapDegrees;
  46764. /***/ }),
  46765. /* 217 */
  46766. /***/ (function(module, exports, __webpack_require__) {
  46767. /**
  46768. * @author Richard Davey <rich@photonstorm.com>
  46769. * @copyright 2018 Photon Storm Ltd.
  46770. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  46771. */
  46772. var MathWrap = __webpack_require__(40);
  46773. /**
  46774. * Wrap an angle.
  46775. *
  46776. * Wraps the angle to a value in the range of -PI to PI.
  46777. *
  46778. * @function Phaser.Math.Angle.Wrap
  46779. * @since 3.0.0
  46780. *
  46781. * @param {number} angle - The angle to wrap, in radians.
  46782. *
  46783. * @return {number} The wrapped angle, in radians.
  46784. */
  46785. var Wrap = function (angle)
  46786. {
  46787. return MathWrap(angle, -Math.PI, Math.PI);
  46788. };
  46789. module.exports = Wrap;
  46790. /***/ }),
  46791. /* 218 */
  46792. /***/ (function(module, exports, __webpack_require__) {
  46793. /**
  46794. * @author Richard Davey <rich@photonstorm.com>
  46795. * @copyright 2018 Photon Storm Ltd.
  46796. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  46797. */
  46798. var Class = __webpack_require__(0);
  46799. /**
  46800. * @classdesc
  46801. * [description]
  46802. *
  46803. * @class GeometryMask
  46804. * @memberOf Phaser.Display.Masks
  46805. * @constructor
  46806. * @since 3.0.0
  46807. *
  46808. * @param {Phaser.Scene} scene - [description]
  46809. * @param {Phaser.GameObjects.Graphics} graphicsGeometry - [description]
  46810. */
  46811. var GeometryMask = new Class({
  46812. initialize:
  46813. function GeometryMask (scene, graphicsGeometry)
  46814. {
  46815. /**
  46816. * [description]
  46817. *
  46818. * @name Phaser.Display.Masks.GeometryMask#geometryMask
  46819. * @type {Phaser.GameObjects.Graphics}
  46820. * @since 3.0.0
  46821. */
  46822. this.geometryMask = graphicsGeometry;
  46823. },
  46824. /**
  46825. * [description]
  46826. *
  46827. * @method Phaser.Display.Masks.GeometryMask#setShape
  46828. * @since 3.0.0
  46829. *
  46830. * @param {Phaser.GameObjects.Graphics} graphicsGeometry - [description]
  46831. */
  46832. setShape: function (graphicsGeometry)
  46833. {
  46834. this.geometryMask = graphicsGeometry;
  46835. },
  46836. /**
  46837. * [description]
  46838. *
  46839. * @method Phaser.Display.Masks.GeometryMask#preRenderWebGL
  46840. * @since 3.0.0
  46841. *
  46842. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - [description]
  46843. * @param {Phaser.GameObjects.GameObject} mask - [description]
  46844. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  46845. */
  46846. preRenderWebGL: function (renderer, mask, camera)
  46847. {
  46848. var gl = renderer.gl;
  46849. var geometryMask = this.geometryMask;
  46850. // Force flushing before drawing to stencil buffer
  46851. renderer.flush();
  46852. // Enable and setup GL state to write to stencil buffer
  46853. gl.enable(gl.STENCIL_TEST);
  46854. gl.clear(gl.STENCIL_BUFFER_BIT);
  46855. gl.colorMask(false, false, false, false);
  46856. gl.stencilFunc(gl.NOTEQUAL, 1, 1);
  46857. gl.stencilOp(gl.REPLACE, gl.REPLACE, gl.REPLACE);
  46858. // Write stencil buffer
  46859. geometryMask.renderWebGL(renderer, geometryMask, 0.0, camera);
  46860. renderer.flush();
  46861. // Use stencil buffer to affect next rendering object
  46862. gl.colorMask(true, true, true, true);
  46863. gl.stencilFunc(gl.EQUAL, 1, 1);
  46864. gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
  46865. },
  46866. /**
  46867. * [description]
  46868. *
  46869. * @method Phaser.Display.Masks.GeometryMask#postRenderWebGL
  46870. * @since 3.0.0
  46871. *
  46872. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - [description]
  46873. */
  46874. postRenderWebGL: function (renderer)
  46875. {
  46876. var gl = renderer.gl;
  46877. // Force flush before disabling stencil test
  46878. renderer.flush();
  46879. gl.disable(gl.STENCIL_TEST);
  46880. },
  46881. /**
  46882. * [description]
  46883. *
  46884. * @method Phaser.Display.Masks.GeometryMask#preRenderCanvas
  46885. * @since 3.0.0
  46886. *
  46887. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - [description]
  46888. * @param {Phaser.GameObjects.GameObject} mask - [description]
  46889. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  46890. */
  46891. preRenderCanvas: function (renderer, mask, camera)
  46892. {
  46893. var geometryMask = this.geometryMask;
  46894. renderer.currentContext.save();
  46895. geometryMask.renderCanvas(renderer, geometryMask, 0.0, camera, undefined, null, true);
  46896. renderer.currentContext.clip();
  46897. },
  46898. /**
  46899. * [description]
  46900. *
  46901. * @method Phaser.Display.Masks.GeometryMask#postRenderCanvas
  46902. * @since 3.0.0
  46903. *
  46904. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - [description]
  46905. */
  46906. postRenderCanvas: function (renderer)
  46907. {
  46908. renderer.currentContext.restore();
  46909. },
  46910. /**
  46911. * Destroys this GeometryMask and nulls any references it holds.
  46912. *
  46913. * Note that if a Game Object is currently using this mask it will _not_ automatically detect you have destroyed it,
  46914. * so be sure to call `clearMask` on any Game Object using it, before destroying it.
  46915. *
  46916. * @method Phaser.Display.Masks.GeometryMask#destroy
  46917. * @since 3.7.0
  46918. */
  46919. destroy: function ()
  46920. {
  46921. this.geometryMask = null;
  46922. }
  46923. });
  46924. module.exports = GeometryMask;
  46925. /***/ }),
  46926. /* 219 */
  46927. /***/ (function(module, exports, __webpack_require__) {
  46928. /**
  46929. * @author Richard Davey <rich@photonstorm.com>
  46930. * @copyright 2018 Photon Storm Ltd.
  46931. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  46932. */
  46933. var Class = __webpack_require__(0);
  46934. /**
  46935. * @classdesc
  46936. * [description]
  46937. *
  46938. * @class BitmapMask
  46939. * @memberOf Phaser.Display.Masks
  46940. * @constructor
  46941. * @since 3.0.0
  46942. *
  46943. * @param {Phaser.Scene} scene - [description]
  46944. * @param {Phaser.GameObjects.GameObject} renderable - A renderable Game Object that uses a texture, such as a Sprite.
  46945. */
  46946. var BitmapMask = new Class({
  46947. initialize:
  46948. function BitmapMask (scene, renderable)
  46949. {
  46950. var renderer = scene.sys.game.renderer;
  46951. /**
  46952. * A reference to either the Canvas or WebGL Renderer that this Mask is using.
  46953. *
  46954. * @name Phaser.Display.Masks.BitmapMask#renderer
  46955. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  46956. * @since 3.11.0
  46957. */
  46958. this.renderer = renderer;
  46959. /**
  46960. * A renderable Game Object that uses a texture, such as a Sprite.
  46961. *
  46962. * @name Phaser.Display.Masks.BitmapMask#bitmapMask
  46963. * @type {Phaser.GameObjects.GameObject}
  46964. * @since 3.0.0
  46965. */
  46966. this.bitmapMask = renderable;
  46967. /**
  46968. * [description]
  46969. *
  46970. * @name Phaser.Display.Masks.BitmapMask#maskTexture
  46971. * @type {WebGLTexture}
  46972. * @default null
  46973. * @since 3.0.0
  46974. */
  46975. this.maskTexture = null;
  46976. /**
  46977. * [description]
  46978. *
  46979. * @name Phaser.Display.Masks.BitmapMask#mainTexture
  46980. * @type {WebGLTexture}
  46981. * @default null
  46982. * @since 3.0.0
  46983. */
  46984. this.mainTexture = null;
  46985. /**
  46986. * [description]
  46987. *
  46988. * @name Phaser.Display.Masks.BitmapMask#dirty
  46989. * @type {boolean}
  46990. * @default true
  46991. * @since 3.0.0
  46992. */
  46993. this.dirty = true;
  46994. /**
  46995. * [description]
  46996. *
  46997. * @name Phaser.Display.Masks.BitmapMask#mainFramebuffer
  46998. * @type {WebGLFramebuffer}
  46999. * @since 3.0.0
  47000. */
  47001. this.mainFramebuffer = null;
  47002. /**
  47003. * [description]
  47004. *
  47005. * @name Phaser.Display.Masks.BitmapMask#maskFramebuffer
  47006. * @type {WebGLFramebuffer}
  47007. * @since 3.0.0
  47008. */
  47009. this.maskFramebuffer = null;
  47010. /**
  47011. * [description]
  47012. *
  47013. * @name Phaser.Display.Masks.BitmapMask#invertAlpha
  47014. * @type {boolean}
  47015. * @since 3.1.2
  47016. */
  47017. this.invertAlpha = false;
  47018. if (renderer && renderer.gl)
  47019. {
  47020. var width = renderer.width;
  47021. var height = renderer.height;
  47022. var pot = ((width & (width - 1)) === 0 && (height & (height - 1)) === 0);
  47023. var gl = renderer.gl;
  47024. var wrap = pot ? gl.REPEAT : gl.CLAMP_TO_EDGE;
  47025. var filter = gl.LINEAR;
  47026. this.mainTexture = renderer.createTexture2D(0, filter, filter, wrap, wrap, gl.RGBA, null, width, height);
  47027. this.maskTexture = renderer.createTexture2D(0, filter, filter, wrap, wrap, gl.RGBA, null, width, height);
  47028. this.mainFramebuffer = renderer.createFramebuffer(width, height, this.mainTexture, false);
  47029. this.maskFramebuffer = renderer.createFramebuffer(width, height, this.maskTexture, false);
  47030. renderer.onContextRestored(function (renderer)
  47031. {
  47032. var width = renderer.width;
  47033. var height = renderer.height;
  47034. var pot = ((width & (width - 1)) === 0 && (height & (height - 1)) === 0);
  47035. var gl = renderer.gl;
  47036. var wrap = pot ? gl.REPEAT : gl.CLAMP_TO_EDGE;
  47037. var filter = gl.LINEAR;
  47038. this.mainTexture = renderer.createTexture2D(0, filter, filter, wrap, wrap, gl.RGBA, null, width, height);
  47039. this.maskTexture = renderer.createTexture2D(0, filter, filter, wrap, wrap, gl.RGBA, null, width, height);
  47040. this.mainFramebuffer = renderer.createFramebuffer(width, height, this.mainTexture, false);
  47041. this.maskFramebuffer = renderer.createFramebuffer(width, height, this.maskTexture, false);
  47042. }, this);
  47043. }
  47044. },
  47045. /**
  47046. * [description]
  47047. *
  47048. * @method Phaser.Display.Masks.BitmapMask#setBitmap
  47049. * @since 3.0.0
  47050. *
  47051. * @param {Phaser.GameObjects.GameObject} renderable - A renderable Game Object that uses a texture, such as a Sprite.
  47052. */
  47053. setBitmap: function (renderable)
  47054. {
  47055. this.bitmapMask = renderable;
  47056. },
  47057. /**
  47058. * [description]
  47059. *
  47060. * @method Phaser.Display.Masks.BitmapMask#preRenderWebGL
  47061. * @since 3.0.0
  47062. *
  47063. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - [description]
  47064. * @param {Phaser.GameObjects.GameObject} maskedObject - [description]
  47065. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to render to.
  47066. */
  47067. preRenderWebGL: function (renderer, maskedObject, camera)
  47068. {
  47069. renderer.pipelines.BitmapMaskPipeline.beginMask(this, maskedObject, camera);
  47070. },
  47071. /**
  47072. * [description]
  47073. *
  47074. * @method Phaser.Display.Masks.BitmapMask#postRenderWebGL
  47075. * @since 3.0.0
  47076. *
  47077. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - [description]
  47078. */
  47079. postRenderWebGL: function (renderer)
  47080. {
  47081. renderer.pipelines.BitmapMaskPipeline.endMask(this);
  47082. },
  47083. /**
  47084. * [description]
  47085. *
  47086. * @method Phaser.Display.Masks.BitmapMask#preRenderCanvas
  47087. * @since 3.0.0
  47088. *
  47089. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - [description]
  47090. * @param {Phaser.GameObjects.GameObject} mask - [description]
  47091. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to render to.
  47092. */
  47093. preRenderCanvas: function ()
  47094. {
  47095. // NOOP
  47096. },
  47097. /**
  47098. * [description]
  47099. *
  47100. * @method Phaser.Display.Masks.BitmapMask#postRenderCanvas
  47101. * @since 3.0.0
  47102. *
  47103. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - [description]
  47104. */
  47105. postRenderCanvas: function ()
  47106. {
  47107. // NOOP
  47108. },
  47109. /**
  47110. * Destroys this BitmapMask and nulls any references it holds.
  47111. *
  47112. * Note that if a Game Object is currently using this mask it will _not_ automatically detect you have destroyed it,
  47113. * so be sure to call `clearMask` on any Game Object using it, before destroying it.
  47114. *
  47115. * @method Phaser.Display.Masks.BitmapMask#destroy
  47116. * @since 3.7.0
  47117. */
  47118. destroy: function ()
  47119. {
  47120. this.bitmapMask = null;
  47121. var renderer = this.renderer;
  47122. if (renderer && renderer.gl)
  47123. {
  47124. renderer.deleteTexture(this.mainTexture);
  47125. renderer.deleteTexture(this.maskTexture);
  47126. renderer.deleteFramebuffer(this.mainFramebuffer);
  47127. renderer.deleteFramebuffer(this.maskFramebuffer);
  47128. }
  47129. this.mainTexture = null;
  47130. this.maskTexture = null;
  47131. this.mainFramebuffer = null;
  47132. this.maskFramebuffer = null;
  47133. this.renderer = null;
  47134. }
  47135. });
  47136. module.exports = BitmapMask;
  47137. /***/ }),
  47138. /* 220 */
  47139. /***/ (function(module, exports) {
  47140. var g;
  47141. // This works in non-strict mode
  47142. g = (function() {
  47143. return this;
  47144. })();
  47145. try {
  47146. // This works if eval is allowed (see CSP)
  47147. g = g || Function("return this")() || (1, eval)("this");
  47148. } catch (e) {
  47149. // This works if the window reference is available
  47150. if (typeof window === "object") g = window;
  47151. }
  47152. // g can still be undefined, but nothing to do about it...
  47153. // We return undefined, instead of nothing here, so it's
  47154. // easier to handle this case. if(!global) { ...}
  47155. module.exports = g;
  47156. /***/ }),
  47157. /* 221 */
  47158. /***/ (function(module, exports, __webpack_require__) {
  47159. /**
  47160. * @author Richard Davey <rich@photonstorm.com>
  47161. * @copyright 2018 Photon Storm Ltd.
  47162. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47163. */
  47164. var Formats = __webpack_require__(27);
  47165. var MapData = __webpack_require__(103);
  47166. var Parse = __webpack_require__(324);
  47167. var Tilemap = __webpack_require__(316);
  47168. /**
  47169. * Create a Tilemap from the given key or data. If neither is given, make a blank Tilemap. When
  47170. * loading from CSV or a 2D array, you should specify the tileWidth & tileHeight. When parsing from
  47171. * a map from Tiled, the tileWidth, tileHeight, width & height will be pulled from the map data. For
  47172. * an empty map, you should specify tileWidth, tileHeight, width & height.
  47173. *
  47174. * @function Phaser.Tilemaps.ParseToTilemap
  47175. * @since 3.0.0
  47176. *
  47177. * @param {Phaser.Scene} scene - The Scene to which this Tilemap belongs.
  47178. * @param {string} [key] - The key in the Phaser cache that corresponds to the loaded tilemap data.
  47179. * @param {integer} [tileWidth=32] - The width of a tile in pixels.
  47180. * @param {integer} [tileHeight=32] - The height of a tile in pixels.
  47181. * @param {integer} [width=10] - The width of the map in tiles.
  47182. * @param {integer} [height=10] - The height of the map in tiles.
  47183. * @param {integer[][]} [data] - Instead of loading from the cache, you can also load directly from
  47184. * a 2D array of tile indexes.
  47185. * @param {boolean} [insertNull=false] - Controls how empty tiles, tiles with an index of -1, in the
  47186. * map data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  47187. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  47188. * the tile data doesn't need to change then setting this value to `true` will help with memory
  47189. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  47190. * the default value set.
  47191. *
  47192. * @return {Phaser.Tilemaps.Tilemap}
  47193. */
  47194. var ParseToTilemap = function (scene, key, tileWidth, tileHeight, width, height, data, insertNull)
  47195. {
  47196. if (tileWidth === undefined) { tileWidth = 32; }
  47197. if (tileHeight === undefined) { tileHeight = 32; }
  47198. if (width === undefined) { width = 10; }
  47199. if (height === undefined) { height = 10; }
  47200. if (insertNull === undefined) { insertNull = false; }
  47201. var mapData = null;
  47202. if (Array.isArray(data))
  47203. {
  47204. var name = key !== undefined ? key : 'map';
  47205. mapData = Parse(name, Formats.ARRAY_2D, data, tileWidth, tileHeight, insertNull);
  47206. }
  47207. else if (key !== undefined)
  47208. {
  47209. var tilemapData = scene.cache.tilemap.get(key);
  47210. if (!tilemapData)
  47211. {
  47212. console.warn('No map data found for key ' + key);
  47213. }
  47214. else
  47215. {
  47216. mapData = Parse(key, tilemapData.format, tilemapData.data, tileWidth, tileHeight, insertNull);
  47217. }
  47218. }
  47219. if (mapData === null)
  47220. {
  47221. mapData = new MapData({
  47222. tileWidth: tileWidth,
  47223. tileHeight: tileHeight,
  47224. width: width,
  47225. height: height
  47226. });
  47227. }
  47228. return new Tilemap(scene, mapData);
  47229. };
  47230. module.exports = ParseToTilemap;
  47231. /***/ }),
  47232. /* 222 */
  47233. /***/ (function(module, exports, __webpack_require__) {
  47234. /**
  47235. * @author Richard Davey <rich@photonstorm.com>
  47236. * @copyright 2018 Photon Storm Ltd.
  47237. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47238. */
  47239. var Formats = __webpack_require__(27);
  47240. var LayerData = __webpack_require__(104);
  47241. var MapData = __webpack_require__(103);
  47242. var Tile = __webpack_require__(65);
  47243. /**
  47244. * Parses a 2D array of tile indexes into a new MapData object with a single layer.
  47245. *
  47246. * @function Phaser.Tilemaps.Parsers.Parse2DArray
  47247. * @since 3.0.0
  47248. *
  47249. * @param {string} name - The name of the tilemap, used to set the name on the MapData.
  47250. * @param {integer[][]} data - 2D array, CSV string or Tiled JSON object.
  47251. * @param {integer} tileWidth - The width of a tile in pixels.
  47252. * @param {integer} tileHeight - The height of a tile in pixels.
  47253. * @param {boolean} insertNull - Controls how empty tiles, tiles with an index of -1, in the map
  47254. * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  47255. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  47256. * the tile data doesn't need to change then setting this value to `true` will help with memory
  47257. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  47258. * the default value set.
  47259. *
  47260. * @return {Phaser.Tilemaps.MapData} [description]
  47261. */
  47262. var Parse2DArray = function (name, data, tileWidth, tileHeight, insertNull)
  47263. {
  47264. var layerData = new LayerData({
  47265. tileWidth: tileWidth,
  47266. tileHeight: tileHeight
  47267. });
  47268. var mapData = new MapData({
  47269. name: name,
  47270. tileWidth: tileWidth,
  47271. tileHeight: tileHeight,
  47272. format: Formats.ARRAY_2D,
  47273. layers: [ layerData ]
  47274. });
  47275. var tiles = [];
  47276. var height = data.length;
  47277. var width = 0;
  47278. for (var y = 0; y < data.length; y++)
  47279. {
  47280. tiles[y] = [];
  47281. var row = data[y];
  47282. for (var x = 0; x < row.length; x++)
  47283. {
  47284. var tileIndex = parseInt(row[x], 10);
  47285. if (isNaN(tileIndex) || tileIndex === -1)
  47286. {
  47287. tiles[y][x] = insertNull
  47288. ? null
  47289. : new Tile(layerData, -1, x, y, tileWidth, tileHeight);
  47290. }
  47291. else
  47292. {
  47293. tiles[y][x] = new Tile(layerData, tileIndex, x, y, tileWidth, tileHeight);
  47294. }
  47295. }
  47296. if (width === 0)
  47297. {
  47298. width = row.length;
  47299. }
  47300. }
  47301. mapData.width = layerData.width = width;
  47302. mapData.height = layerData.height = height;
  47303. mapData.widthInPixels = layerData.widthInPixels = width * tileWidth;
  47304. mapData.heightInPixels = layerData.heightInPixels = height * tileHeight;
  47305. layerData.data = tiles;
  47306. return mapData;
  47307. };
  47308. module.exports = Parse2DArray;
  47309. /***/ }),
  47310. /* 223 */
  47311. /***/ (function(module, exports) {
  47312. /**
  47313. * @author Richard Davey <rich@photonstorm.com>
  47314. * @copyright 2018 Photon Storm Ltd.
  47315. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47316. */
  47317. /**
  47318. * Internally used method to keep track of the tile indexes that collide within a layer. This
  47319. * updates LayerData.collideIndexes to either contain or not contain the given `tileIndex`.
  47320. *
  47321. * @function Phaser.Tilemaps.Components.SetLayerCollisionIndex
  47322. * @private
  47323. * @since 3.0.0
  47324. *
  47325. * @param {integer} tileIndex - [description]
  47326. * @param {boolean} [collides=true] - [description]
  47327. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  47328. */
  47329. var SetLayerCollisionIndex = function (tileIndex, collides, layer)
  47330. {
  47331. var loc = layer.collideIndexes.indexOf(tileIndex);
  47332. if (collides && loc === -1)
  47333. {
  47334. layer.collideIndexes.push(tileIndex);
  47335. }
  47336. else if (!collides && loc !== -1)
  47337. {
  47338. layer.collideIndexes.splice(loc, 1);
  47339. }
  47340. };
  47341. module.exports = SetLayerCollisionIndex;
  47342. /***/ }),
  47343. /* 224 */
  47344. /***/ (function(module, exports, __webpack_require__) {
  47345. /**
  47346. * @author Richard Davey <rich@photonstorm.com>
  47347. * @copyright 2018 Photon Storm Ltd.
  47348. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47349. */
  47350. var Tile = __webpack_require__(65);
  47351. var IsInLayerBounds = __webpack_require__(105);
  47352. var CalculateFacesAt = __webpack_require__(225);
  47353. var SetTileCollision = __webpack_require__(66);
  47354. /**
  47355. * Puts a tile at the given tile coordinates in the specified layer. You can pass in either an index
  47356. * or a Tile object. If you pass in a Tile, all attributes will be copied over to the specified
  47357. * location. If you pass in an index, only the index at the specified location will be changed.
  47358. * Collision information will be recalculated at the specified location.
  47359. *
  47360. * @function Phaser.Tilemaps.Components.PutTileAt
  47361. * @private
  47362. * @since 3.0.0
  47363. *
  47364. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  47365. * @param {integer} tileX - [description]
  47366. * @param {integer} tileY - [description]
  47367. * @param {boolean} [recalculateFaces=true] - [description]
  47368. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  47369. *
  47370. * @return {Phaser.Tilemaps.Tile} The Tile object that was created or added to this map.
  47371. */
  47372. var PutTileAt = function (tile, tileX, tileY, recalculateFaces, layer)
  47373. {
  47374. if (!IsInLayerBounds(tileX, tileY, layer)) { return null; }
  47375. if (recalculateFaces === undefined) { recalculateFaces = true; }
  47376. var oldTile = layer.data[tileY][tileX];
  47377. var oldTileCollides = oldTile && oldTile.collides;
  47378. if (tile instanceof Tile)
  47379. {
  47380. if (layer.data[tileY][tileX] === null)
  47381. {
  47382. layer.data[tileY][tileX] = new Tile(layer, tile.index, tileX, tileY, tile.width, tile.height);
  47383. }
  47384. layer.data[tileY][tileX].copy(tile);
  47385. }
  47386. else
  47387. {
  47388. var index = tile;
  47389. if (layer.data[tileY][tileX] === null)
  47390. {
  47391. layer.data[tileY][tileX] = new Tile(layer, index, tileX, tileY, layer.tileWidth, layer.tileHeight);
  47392. }
  47393. else
  47394. {
  47395. layer.data[tileY][tileX].index = index;
  47396. }
  47397. }
  47398. // Updating colliding flag on the new tile
  47399. var newTile = layer.data[tileY][tileX];
  47400. var collides = layer.collideIndexes.indexOf(newTile.index) !== -1;
  47401. SetTileCollision(newTile, collides);
  47402. // Recalculate faces only if the colliding flag at (tileX, tileY) has changed
  47403. if (recalculateFaces && (oldTileCollides !== newTile.collides))
  47404. {
  47405. CalculateFacesAt(tileX, tileY, layer);
  47406. }
  47407. return newTile;
  47408. };
  47409. module.exports = PutTileAt;
  47410. /***/ }),
  47411. /* 225 */
  47412. /***/ (function(module, exports, __webpack_require__) {
  47413. /**
  47414. * @author Richard Davey <rich@photonstorm.com>
  47415. * @copyright 2018 Photon Storm Ltd.
  47416. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  47417. */
  47418. var GetTileAt = __webpack_require__(141);
  47419. /**
  47420. * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting
  47421. * faces are used internally for optimizing collisions against tiles. This method is mostly used
  47422. * internally to optimize recalculating faces when only one tile has been changed.
  47423. *
  47424. * @function Phaser.Tilemaps.Components.CalculateFacesAt
  47425. * @private
  47426. * @since 3.0.0
  47427. *
  47428. * @param {integer} tileX - The x coordinate.
  47429. * @param {integer} tileY - The y coordinate.
  47430. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  47431. */
  47432. var CalculateFacesAt = function (tileX, tileY, layer)
  47433. {
  47434. var tile = GetTileAt(tileX, tileY, true, layer);
  47435. var above = GetTileAt(tileX, tileY - 1, true, layer);
  47436. var below = GetTileAt(tileX, tileY + 1, true, layer);
  47437. var left = GetTileAt(tileX - 1, tileY, true, layer);
  47438. var right = GetTileAt(tileX + 1, tileY, true, layer);
  47439. var tileCollides = tile && tile.collides;
  47440. // Assume the changed tile has all interesting edges
  47441. if (tileCollides)
  47442. {
  47443. tile.faceTop = true;
  47444. tile.faceBottom = true;
  47445. tile.faceLeft = true;
  47446. tile.faceRight = true;
  47447. }
  47448. // Reset edges that are shared between tile and its neighbors
  47449. if (above && above.collides)
  47450. {
  47451. if (tileCollides) { tile.faceTop = false; }
  47452. above.faceBottom = !tileCollides;
  47453. }
  47454. if (below && below.collides)
  47455. {
  47456. if (tileCollides) { tile.faceBottom = false; }
  47457. below.faceTop = !tileCollides;
  47458. }
  47459. if (left && left.collides)
  47460. {
  47461. if (tileCollides) { tile.faceLeft = false; }
  47462. left.faceRight = !tileCollides;
  47463. }
  47464. if (right && right.collides)
  47465. {
  47466. if (tileCollides) { tile.faceRight = false; }
  47467. right.faceLeft = !tileCollides;
  47468. }
  47469. if (tile && !tile.collides) { tile.resetFaces(); }
  47470. return tile;
  47471. };
  47472. module.exports = CalculateFacesAt;
  47473. /***/ }),
  47474. /* 226 */
  47475. /***/ (function(module, exports, __webpack_require__) {
  47476. /**
  47477. * The `Matter.Composite` module contains methods for creating and manipulating composite bodies.
  47478. * A composite body is a collection of `Matter.Body`, `Matter.Constraint` and other `Matter.Composite`, therefore composites form a tree structure.
  47479. * It is important to use the functions in this module to modify composites, rather than directly modifying their properties.
  47480. * 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`.
  47481. *
  47482. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  47483. *
  47484. * @class Composite
  47485. */
  47486. var Composite = {};
  47487. module.exports = Composite;
  47488. var Events = __webpack_require__(306);
  47489. var Common = __webpack_require__(42);
  47490. var Body = __webpack_require__(73);
  47491. (function() {
  47492. /**
  47493. * Creates a new composite. The options parameter is an object that specifies any properties you wish to override the defaults.
  47494. * See the properites section below for detailed information on what you can pass via the `options` object.
  47495. * @method create
  47496. * @param {} [options]
  47497. * @return {composite} A new composite
  47498. */
  47499. Composite.create = function(options) {
  47500. return Common.extend({
  47501. id: Common.nextId(),
  47502. type: 'composite',
  47503. parent: null,
  47504. isModified: false,
  47505. bodies: [],
  47506. constraints: [],
  47507. composites: [],
  47508. label: 'Composite',
  47509. plugin: {}
  47510. }, options);
  47511. };
  47512. /**
  47513. * Sets the composite's `isModified` flag.
  47514. * If `updateParents` is true, all parents will be set (default: false).
  47515. * If `updateChildren` is true, all children will be set (default: false).
  47516. * @method setModified
  47517. * @param {composite} composite
  47518. * @param {boolean} isModified
  47519. * @param {boolean} [updateParents=false]
  47520. * @param {boolean} [updateChildren=false]
  47521. */
  47522. Composite.setModified = function(composite, isModified, updateParents, updateChildren) {
  47523. composite.isModified = isModified;
  47524. if (updateParents && composite.parent) {
  47525. Composite.setModified(composite.parent, isModified, updateParents, updateChildren);
  47526. }
  47527. if (updateChildren) {
  47528. for(var i = 0; i < composite.composites.length; i++) {
  47529. var childComposite = composite.composites[i];
  47530. Composite.setModified(childComposite, isModified, updateParents, updateChildren);
  47531. }
  47532. }
  47533. };
  47534. /**
  47535. * Generic add function. Adds one or many body(s), constraint(s) or a composite(s) to the given composite.
  47536. * Triggers `beforeAdd` and `afterAdd` events on the `composite`.
  47537. * @method add
  47538. * @param {composite} composite
  47539. * @param {} object
  47540. * @return {composite} The original composite with the objects added
  47541. */
  47542. Composite.add = function(composite, object) {
  47543. var objects = [].concat(object);
  47544. Events.trigger(composite, 'beforeAdd', { object: object });
  47545. for (var i = 0; i < objects.length; i++) {
  47546. var obj = objects[i];
  47547. switch (obj.type) {
  47548. case 'body':
  47549. // skip adding compound parts
  47550. if (obj.parent !== obj) {
  47551. Common.warn('Composite.add: skipped adding a compound body part (you must add its parent instead)');
  47552. break;
  47553. }
  47554. Composite.addBody(composite, obj);
  47555. break;
  47556. case 'constraint':
  47557. Composite.addConstraint(composite, obj);
  47558. break;
  47559. case 'composite':
  47560. Composite.addComposite(composite, obj);
  47561. break;
  47562. case 'mouseConstraint':
  47563. Composite.addConstraint(composite, obj.constraint);
  47564. break;
  47565. }
  47566. }
  47567. Events.trigger(composite, 'afterAdd', { object: object });
  47568. return composite;
  47569. };
  47570. /**
  47571. * Generic remove function. Removes one or many body(s), constraint(s) or a composite(s) to the given composite.
  47572. * Optionally searching its children recursively.
  47573. * Triggers `beforeRemove` and `afterRemove` events on the `composite`.
  47574. * @method remove
  47575. * @param {composite} composite
  47576. * @param {} object
  47577. * @param {boolean} [deep=false]
  47578. * @return {composite} The original composite with the objects removed
  47579. */
  47580. Composite.remove = function(composite, object, deep) {
  47581. var objects = [].concat(object);
  47582. Events.trigger(composite, 'beforeRemove', { object: object });
  47583. for (var i = 0; i < objects.length; i++) {
  47584. var obj = objects[i];
  47585. switch (obj.type) {
  47586. case 'body':
  47587. Composite.removeBody(composite, obj, deep);
  47588. break;
  47589. case 'constraint':
  47590. Composite.removeConstraint(composite, obj, deep);
  47591. break;
  47592. case 'composite':
  47593. Composite.removeComposite(composite, obj, deep);
  47594. break;
  47595. case 'mouseConstraint':
  47596. Composite.removeConstraint(composite, obj.constraint);
  47597. break;
  47598. }
  47599. }
  47600. Events.trigger(composite, 'afterRemove', { object: object });
  47601. return composite;
  47602. };
  47603. /**
  47604. * Adds a composite to the given composite.
  47605. * @private
  47606. * @method addComposite
  47607. * @param {composite} compositeA
  47608. * @param {composite} compositeB
  47609. * @return {composite} The original compositeA with the objects from compositeB added
  47610. */
  47611. Composite.addComposite = function(compositeA, compositeB) {
  47612. compositeA.composites.push(compositeB);
  47613. compositeB.parent = compositeA;
  47614. Composite.setModified(compositeA, true, true, false);
  47615. return compositeA;
  47616. };
  47617. /**
  47618. * Removes a composite from the given composite, and optionally searching its children recursively.
  47619. * @private
  47620. * @method removeComposite
  47621. * @param {composite} compositeA
  47622. * @param {composite} compositeB
  47623. * @param {boolean} [deep=false]
  47624. * @return {composite} The original compositeA with the composite removed
  47625. */
  47626. Composite.removeComposite = function(compositeA, compositeB, deep) {
  47627. var position = compositeA.composites.indexOf(compositeB);
  47628. if (position !== -1) {
  47629. Composite.removeCompositeAt(compositeA, position);
  47630. Composite.setModified(compositeA, true, true, false);
  47631. }
  47632. if (deep) {
  47633. for (var i = 0; i < compositeA.composites.length; i++){
  47634. Composite.removeComposite(compositeA.composites[i], compositeB, true);
  47635. }
  47636. }
  47637. return compositeA;
  47638. };
  47639. /**
  47640. * Removes a composite from the given composite.
  47641. * @private
  47642. * @method removeCompositeAt
  47643. * @param {composite} composite
  47644. * @param {number} position
  47645. * @return {composite} The original composite with the composite removed
  47646. */
  47647. Composite.removeCompositeAt = function(composite, position) {
  47648. composite.composites.splice(position, 1);
  47649. Composite.setModified(composite, true, true, false);
  47650. return composite;
  47651. };
  47652. /**
  47653. * Adds a body to the given composite.
  47654. * @private
  47655. * @method addBody
  47656. * @param {composite} composite
  47657. * @param {body} body
  47658. * @return {composite} The original composite with the body added
  47659. */
  47660. Composite.addBody = function(composite, body) {
  47661. composite.bodies.push(body);
  47662. Composite.setModified(composite, true, true, false);
  47663. return composite;
  47664. };
  47665. /**
  47666. * Removes a body from the given composite, and optionally searching its children recursively.
  47667. * @private
  47668. * @method removeBody
  47669. * @param {composite} composite
  47670. * @param {body} body
  47671. * @param {boolean} [deep=false]
  47672. * @return {composite} The original composite with the body removed
  47673. */
  47674. Composite.removeBody = function(composite, body, deep) {
  47675. var position = composite.bodies.indexOf(body);
  47676. if (position !== -1) {
  47677. Composite.removeBodyAt(composite, position);
  47678. Composite.setModified(composite, true, true, false);
  47679. }
  47680. if (deep) {
  47681. for (var i = 0; i < composite.composites.length; i++){
  47682. Composite.removeBody(composite.composites[i], body, true);
  47683. }
  47684. }
  47685. return composite;
  47686. };
  47687. /**
  47688. * Removes a body from the given composite.
  47689. * @private
  47690. * @method removeBodyAt
  47691. * @param {composite} composite
  47692. * @param {number} position
  47693. * @return {composite} The original composite with the body removed
  47694. */
  47695. Composite.removeBodyAt = function(composite, position) {
  47696. composite.bodies.splice(position, 1);
  47697. Composite.setModified(composite, true, true, false);
  47698. return composite;
  47699. };
  47700. /**
  47701. * Adds a constraint to the given composite.
  47702. * @private
  47703. * @method addConstraint
  47704. * @param {composite} composite
  47705. * @param {constraint} constraint
  47706. * @return {composite} The original composite with the constraint added
  47707. */
  47708. Composite.addConstraint = function(composite, constraint) {
  47709. composite.constraints.push(constraint);
  47710. Composite.setModified(composite, true, true, false);
  47711. return composite;
  47712. };
  47713. /**
  47714. * Removes a constraint from the given composite, and optionally searching its children recursively.
  47715. * @private
  47716. * @method removeConstraint
  47717. * @param {composite} composite
  47718. * @param {constraint} constraint
  47719. * @param {boolean} [deep=false]
  47720. * @return {composite} The original composite with the constraint removed
  47721. */
  47722. Composite.removeConstraint = function(composite, constraint, deep) {
  47723. var position = composite.constraints.indexOf(constraint);
  47724. if (position !== -1) {
  47725. Composite.removeConstraintAt(composite, position);
  47726. }
  47727. if (deep) {
  47728. for (var i = 0; i < composite.composites.length; i++){
  47729. Composite.removeConstraint(composite.composites[i], constraint, true);
  47730. }
  47731. }
  47732. return composite;
  47733. };
  47734. /**
  47735. * Removes a body from the given composite.
  47736. * @private
  47737. * @method removeConstraintAt
  47738. * @param {composite} composite
  47739. * @param {number} position
  47740. * @return {composite} The original composite with the constraint removed
  47741. */
  47742. Composite.removeConstraintAt = function(composite, position) {
  47743. composite.constraints.splice(position, 1);
  47744. Composite.setModified(composite, true, true, false);
  47745. return composite;
  47746. };
  47747. /**
  47748. * Removes all bodies, constraints and composites from the given composite.
  47749. * Optionally clearing its children recursively.
  47750. * @method clear
  47751. * @param {composite} composite
  47752. * @param {boolean} keepStatic
  47753. * @param {boolean} [deep=false]
  47754. */
  47755. Composite.clear = function(composite, keepStatic, deep) {
  47756. if (deep) {
  47757. for (var i = 0; i < composite.composites.length; i++){
  47758. Composite.clear(composite.composites[i], keepStatic, true);
  47759. }
  47760. }
  47761. if (keepStatic) {
  47762. composite.bodies = composite.bodies.filter(function(body) { return body.isStatic; });
  47763. } else {
  47764. composite.bodies.length = 0;
  47765. }
  47766. composite.constraints.length = 0;
  47767. composite.composites.length = 0;
  47768. Composite.setModified(composite, true, true, false);
  47769. return composite;
  47770. };
  47771. /**
  47772. * Returns all bodies in the given composite, including all bodies in its children, recursively.
  47773. * @method allBodies
  47774. * @param {composite} composite
  47775. * @return {body[]} All the bodies
  47776. */
  47777. Composite.allBodies = function(composite) {
  47778. var bodies = [].concat(composite.bodies);
  47779. for (var i = 0; i < composite.composites.length; i++)
  47780. bodies = bodies.concat(Composite.allBodies(composite.composites[i]));
  47781. return bodies;
  47782. };
  47783. /**
  47784. * Returns all constraints in the given composite, including all constraints in its children, recursively.
  47785. * @method allConstraints
  47786. * @param {composite} composite
  47787. * @return {constraint[]} All the constraints
  47788. */
  47789. Composite.allConstraints = function(composite) {
  47790. var constraints = [].concat(composite.constraints);
  47791. for (var i = 0; i < composite.composites.length; i++)
  47792. constraints = constraints.concat(Composite.allConstraints(composite.composites[i]));
  47793. return constraints;
  47794. };
  47795. /**
  47796. * Returns all composites in the given composite, including all composites in its children, recursively.
  47797. * @method allComposites
  47798. * @param {composite} composite
  47799. * @return {composite[]} All the composites
  47800. */
  47801. Composite.allComposites = function(composite) {
  47802. var composites = [].concat(composite.composites);
  47803. for (var i = 0; i < composite.composites.length; i++)
  47804. composites = composites.concat(Composite.allComposites(composite.composites[i]));
  47805. return composites;
  47806. };
  47807. /**
  47808. * Searches the composite recursively for an object matching the type and id supplied, null if not found.
  47809. * @method get
  47810. * @param {composite} composite
  47811. * @param {number} id
  47812. * @param {string} type
  47813. * @return {object} The requested object, if found
  47814. */
  47815. Composite.get = function(composite, id, type) {
  47816. var objects,
  47817. object;
  47818. switch (type) {
  47819. case 'body':
  47820. objects = Composite.allBodies(composite);
  47821. break;
  47822. case 'constraint':
  47823. objects = Composite.allConstraints(composite);
  47824. break;
  47825. case 'composite':
  47826. objects = Composite.allComposites(composite).concat(composite);
  47827. break;
  47828. }
  47829. if (!objects)
  47830. return null;
  47831. object = objects.filter(function(object) {
  47832. return object.id.toString() === id.toString();
  47833. });
  47834. return object.length === 0 ? null : object[0];
  47835. };
  47836. /**
  47837. * Moves the given object(s) from compositeA to compositeB (equal to a remove followed by an add).
  47838. * @method move
  47839. * @param {compositeA} compositeA
  47840. * @param {object[]} objects
  47841. * @param {compositeB} compositeB
  47842. * @return {composite} Returns compositeA
  47843. */
  47844. Composite.move = function(compositeA, objects, compositeB) {
  47845. Composite.remove(compositeA, objects);
  47846. Composite.add(compositeB, objects);
  47847. return compositeA;
  47848. };
  47849. /**
  47850. * Assigns new ids for all objects in the composite, recursively.
  47851. * @method rebase
  47852. * @param {composite} composite
  47853. * @return {composite} Returns composite
  47854. */
  47855. Composite.rebase = function(composite) {
  47856. var objects = Composite.allBodies(composite)
  47857. .concat(Composite.allConstraints(composite))
  47858. .concat(Composite.allComposites(composite));
  47859. for (var i = 0; i < objects.length; i++) {
  47860. objects[i].id = Common.nextId();
  47861. }
  47862. Composite.setModified(composite, true, true, false);
  47863. return composite;
  47864. };
  47865. /**
  47866. * Translates all children in the composite by a given vector relative to their current positions,
  47867. * without imparting any velocity.
  47868. * @method translate
  47869. * @param {composite} composite
  47870. * @param {vector} translation
  47871. * @param {bool} [recursive=true]
  47872. */
  47873. Composite.translate = function(composite, translation, recursive) {
  47874. var bodies = recursive ? Composite.allBodies(composite) : composite.bodies;
  47875. for (var i = 0; i < bodies.length; i++) {
  47876. Body.translate(bodies[i], translation);
  47877. }
  47878. Composite.setModified(composite, true, true, false);
  47879. return composite;
  47880. };
  47881. /**
  47882. * Rotates all children in the composite by a given angle about the given point, without imparting any angular velocity.
  47883. * @method rotate
  47884. * @param {composite} composite
  47885. * @param {number} rotation
  47886. * @param {vector} point
  47887. * @param {bool} [recursive=true]
  47888. */
  47889. Composite.rotate = function(composite, rotation, point, recursive) {
  47890. var cos = Math.cos(rotation),
  47891. sin = Math.sin(rotation),
  47892. bodies = recursive ? Composite.allBodies(composite) : composite.bodies;
  47893. for (var i = 0; i < bodies.length; i++) {
  47894. var body = bodies[i],
  47895. dx = body.position.x - point.x,
  47896. dy = body.position.y - point.y;
  47897. Body.setPosition(body, {
  47898. x: point.x + (dx * cos - dy * sin),
  47899. y: point.y + (dx * sin + dy * cos)
  47900. });
  47901. Body.rotate(body, rotation);
  47902. }
  47903. Composite.setModified(composite, true, true, false);
  47904. return composite;
  47905. };
  47906. /**
  47907. * Scales all children in the composite, including updating physical properties (mass, area, axes, inertia), from a world-space point.
  47908. * @method scale
  47909. * @param {composite} composite
  47910. * @param {number} scaleX
  47911. * @param {number} scaleY
  47912. * @param {vector} point
  47913. * @param {bool} [recursive=true]
  47914. */
  47915. Composite.scale = function(composite, scaleX, scaleY, point, recursive) {
  47916. var bodies = recursive ? Composite.allBodies(composite) : composite.bodies;
  47917. for (var i = 0; i < bodies.length; i++) {
  47918. var body = bodies[i],
  47919. dx = body.position.x - point.x,
  47920. dy = body.position.y - point.y;
  47921. Body.setPosition(body, {
  47922. x: point.x + dx * scaleX,
  47923. y: point.y + dy * scaleY
  47924. });
  47925. Body.scale(body, scaleX, scaleY);
  47926. }
  47927. Composite.setModified(composite, true, true, false);
  47928. return composite;
  47929. };
  47930. /**
  47931. * Returns the union of the bounds of all of the composite's bodies.
  47932. * @method bounds
  47933. * @param {composite} composite The composite.
  47934. * @returns {bounds} The composite bounds.
  47935. */
  47936. Composite.bounds = function(composite) {
  47937. var bodies = Matter.Composite.allBodies(composite),
  47938. vertices = [];
  47939. for (var i = 0; i < bodies.length; i += 1) {
  47940. var body = bodies[i];
  47941. vertices.push(body.bounds.min, body.bounds.max);
  47942. }
  47943. return Matter.Bounds.create(vertices);
  47944. };
  47945. /*
  47946. *
  47947. * Events Documentation
  47948. *
  47949. */
  47950. /**
  47951. * Fired when a call to `Composite.add` is made, before objects have been added.
  47952. *
  47953. * @event beforeAdd
  47954. * @param {} event An event object
  47955. * @param {} event.object The object(s) to be added (may be a single body, constraint, composite or a mixed array of these)
  47956. * @param {} event.source The source object of the event
  47957. * @param {} event.name The name of the event
  47958. */
  47959. /**
  47960. * Fired when a call to `Composite.add` is made, after objects have been added.
  47961. *
  47962. * @event afterAdd
  47963. * @param {} event An event object
  47964. * @param {} event.object The object(s) that have been added (may be a single body, constraint, composite or a mixed array of these)
  47965. * @param {} event.source The source object of the event
  47966. * @param {} event.name The name of the event
  47967. */
  47968. /**
  47969. * Fired when a call to `Composite.remove` is made, before objects have been removed.
  47970. *
  47971. * @event beforeRemove
  47972. * @param {} event An event object
  47973. * @param {} event.object The object(s) to be removed (may be a single body, constraint, composite or a mixed array of these)
  47974. * @param {} event.source The source object of the event
  47975. * @param {} event.name The name of the event
  47976. */
  47977. /**
  47978. * Fired when a call to `Composite.remove` is made, after objects have been removed.
  47979. *
  47980. * @event afterRemove
  47981. * @param {} event An event object
  47982. * @param {} event.object The object(s) that have been removed (may be a single body, constraint, composite or a mixed array of these)
  47983. * @param {} event.source The source object of the event
  47984. * @param {} event.name The name of the event
  47985. */
  47986. /*
  47987. *
  47988. * Properties Documentation
  47989. *
  47990. */
  47991. /**
  47992. * An integer `Number` uniquely identifying number generated in `Composite.create` by `Common.nextId`.
  47993. *
  47994. * @property id
  47995. * @type number
  47996. */
  47997. /**
  47998. * A `String` denoting the type of object.
  47999. *
  48000. * @property type
  48001. * @type string
  48002. * @default "composite"
  48003. * @readOnly
  48004. */
  48005. /**
  48006. * An arbitrary `String` name to help the user identify and manage composites.
  48007. *
  48008. * @property label
  48009. * @type string
  48010. * @default "Composite"
  48011. */
  48012. /**
  48013. * A flag that specifies whether the composite has been modified during the current step.
  48014. * Most `Matter.Composite` methods will automatically set this flag to `true` to inform the engine of changes to be handled.
  48015. * If you need to change it manually, you should use the `Composite.setModified` method.
  48016. *
  48017. * @property isModified
  48018. * @type boolean
  48019. * @default false
  48020. */
  48021. /**
  48022. * The `Composite` that is the parent of this composite. It is automatically managed by the `Matter.Composite` methods.
  48023. *
  48024. * @property parent
  48025. * @type composite
  48026. * @default null
  48027. */
  48028. /**
  48029. * An array of `Body` that are _direct_ children of this composite.
  48030. * To add or remove bodies you should use `Composite.add` and `Composite.remove` methods rather than directly modifying this property.
  48031. * If you wish to recursively find all descendants, you should use the `Composite.allBodies` method.
  48032. *
  48033. * @property bodies
  48034. * @type body[]
  48035. * @default []
  48036. */
  48037. /**
  48038. * An array of `Constraint` that are _direct_ children of this composite.
  48039. * To add or remove constraints you should use `Composite.add` and `Composite.remove` methods rather than directly modifying this property.
  48040. * If you wish to recursively find all descendants, you should use the `Composite.allConstraints` method.
  48041. *
  48042. * @property constraints
  48043. * @type constraint[]
  48044. * @default []
  48045. */
  48046. /**
  48047. * An array of `Composite` that are _direct_ children of this composite.
  48048. * To add or remove composites you should use `Composite.add` and `Composite.remove` methods rather than directly modifying this property.
  48049. * If you wish to recursively find all descendants, you should use the `Composite.allComposites` method.
  48050. *
  48051. * @property composites
  48052. * @type composite[]
  48053. * @default []
  48054. */
  48055. /**
  48056. * An object reserved for storing plugin-specific properties.
  48057. *
  48058. * @property plugin
  48059. * @type {}
  48060. */
  48061. })();
  48062. /***/ }),
  48063. /* 227 */
  48064. /***/ (function(module, exports, __webpack_require__) {
  48065. /**
  48066. * @author Richard Davey <rich@photonstorm.com>
  48067. * @copyright 2018 Photon Storm Ltd.
  48068. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  48069. */
  48070. var quickselect = __webpack_require__(185);
  48071. /**
  48072. * @classdesc
  48073. * RBush is a high-performance JavaScript library for 2D spatial indexing of points and rectangles.
  48074. * It's based on an optimized R-tree data structure with bulk insertion support.
  48075. *
  48076. * Spatial index is a special data structure for points and rectangles that allows you to perform queries like
  48077. * "all items within this bounding box" very efficiently (e.g. hundreds of times faster than looping over all items).
  48078. *
  48079. * This version of RBush uses a fixed min/max accessor structure of `[ '.left', '.top', '.right', '.bottom' ]`.
  48080. * This is to avoid the eval like function creation that the original library used, which caused CSP policy violations.
  48081. *
  48082. * @class RTree
  48083. * @memberOf Phaser.Structs
  48084. * @constructor
  48085. * @since 3.0.0
  48086. */
  48087. function rbush (maxEntries)
  48088. {
  48089. var format = [ '.left', '.top', '.right', '.bottom' ];
  48090. if (!(this instanceof rbush)) return new rbush(maxEntries, format);
  48091. // max entries in a node is 9 by default; min node fill is 40% for best performance
  48092. this._maxEntries = Math.max(4, maxEntries || 9);
  48093. this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
  48094. this.clear();
  48095. }
  48096. rbush.prototype = {
  48097. all: function ()
  48098. {
  48099. return this._all(this.data, []);
  48100. },
  48101. search: function (bbox)
  48102. {
  48103. var node = this.data,
  48104. result = [],
  48105. toBBox = this.toBBox;
  48106. if (!intersects(bbox, node)) return result;
  48107. var nodesToSearch = [],
  48108. i, len, child, childBBox;
  48109. while (node) {
  48110. for (i = 0, len = node.children.length; i < len; i++) {
  48111. child = node.children[i];
  48112. childBBox = node.leaf ? toBBox(child) : child;
  48113. if (intersects(bbox, childBBox)) {
  48114. if (node.leaf) result.push(child);
  48115. else if (contains(bbox, childBBox)) this._all(child, result);
  48116. else nodesToSearch.push(child);
  48117. }
  48118. }
  48119. node = nodesToSearch.pop();
  48120. }
  48121. return result;
  48122. },
  48123. collides: function (bbox)
  48124. {
  48125. var node = this.data,
  48126. toBBox = this.toBBox;
  48127. if (!intersects(bbox, node)) return false;
  48128. var nodesToSearch = [],
  48129. i, len, child, childBBox;
  48130. while (node) {
  48131. for (i = 0, len = node.children.length; i < len; i++) {
  48132. child = node.children[i];
  48133. childBBox = node.leaf ? toBBox(child) : child;
  48134. if (intersects(bbox, childBBox)) {
  48135. if (node.leaf || contains(bbox, childBBox)) return true;
  48136. nodesToSearch.push(child);
  48137. }
  48138. }
  48139. node = nodesToSearch.pop();
  48140. }
  48141. return false;
  48142. },
  48143. load: function (data)
  48144. {
  48145. if (!(data && data.length)) return this;
  48146. if (data.length < this._minEntries) {
  48147. for (var i = 0, len = data.length; i < len; i++) {
  48148. this.insert(data[i]);
  48149. }
  48150. return this;
  48151. }
  48152. // recursively build the tree with the given data from scratch using OMT algorithm
  48153. var node = this._build(data.slice(), 0, data.length - 1, 0);
  48154. if (!this.data.children.length) {
  48155. // save as is if tree is empty
  48156. this.data = node;
  48157. } else if (this.data.height === node.height) {
  48158. // split root if trees have the same height
  48159. this._splitRoot(this.data, node);
  48160. } else {
  48161. if (this.data.height < node.height) {
  48162. // swap trees if inserted one is bigger
  48163. var tmpNode = this.data;
  48164. this.data = node;
  48165. node = tmpNode;
  48166. }
  48167. // insert the small tree into the large tree at appropriate level
  48168. this._insert(node, this.data.height - node.height - 1, true);
  48169. }
  48170. return this;
  48171. },
  48172. insert: function (item)
  48173. {
  48174. if (item) this._insert(item, this.data.height - 1);
  48175. return this;
  48176. },
  48177. clear: function ()
  48178. {
  48179. this.data = createNode([]);
  48180. return this;
  48181. },
  48182. remove: function (item, equalsFn)
  48183. {
  48184. if (!item) return this;
  48185. var node = this.data,
  48186. bbox = this.toBBox(item),
  48187. path = [],
  48188. indexes = [],
  48189. i, parent, index, goingUp;
  48190. // depth-first iterative tree traversal
  48191. while (node || path.length) {
  48192. if (!node) { // go up
  48193. node = path.pop();
  48194. parent = path[path.length - 1];
  48195. i = indexes.pop();
  48196. goingUp = true;
  48197. }
  48198. if (node.leaf) { // check current node
  48199. index = findItem(item, node.children, equalsFn);
  48200. if (index !== -1) {
  48201. // item found, remove the item and condense tree upwards
  48202. node.children.splice(index, 1);
  48203. path.push(node);
  48204. this._condense(path);
  48205. return this;
  48206. }
  48207. }
  48208. if (!goingUp && !node.leaf && contains(node, bbox)) { // go down
  48209. path.push(node);
  48210. indexes.push(i);
  48211. i = 0;
  48212. parent = node;
  48213. node = node.children[0];
  48214. } else if (parent) { // go right
  48215. i++;
  48216. node = parent.children[i];
  48217. goingUp = false;
  48218. } else node = null; // nothing found
  48219. }
  48220. return this;
  48221. },
  48222. toBBox: function (item) { return item; },
  48223. compareMinX: compareNodeMinX,
  48224. compareMinY: compareNodeMinY,
  48225. toJSON: function () { return this.data; },
  48226. fromJSON: function (data)
  48227. {
  48228. this.data = data;
  48229. return this;
  48230. },
  48231. _all: function (node, result)
  48232. {
  48233. var nodesToSearch = [];
  48234. while (node) {
  48235. if (node.leaf) result.push.apply(result, node.children);
  48236. else nodesToSearch.push.apply(nodesToSearch, node.children);
  48237. node = nodesToSearch.pop();
  48238. }
  48239. return result;
  48240. },
  48241. _build: function (items, left, right, height)
  48242. {
  48243. var N = right - left + 1,
  48244. M = this._maxEntries,
  48245. node;
  48246. if (N <= M) {
  48247. // reached leaf level; return leaf
  48248. node = createNode(items.slice(left, right + 1));
  48249. calcBBox(node, this.toBBox);
  48250. return node;
  48251. }
  48252. if (!height) {
  48253. // target height of the bulk-loaded tree
  48254. height = Math.ceil(Math.log(N) / Math.log(M));
  48255. // target number of root entries to maximize storage utilization
  48256. M = Math.ceil(N / Math.pow(M, height - 1));
  48257. }
  48258. node = createNode([]);
  48259. node.leaf = false;
  48260. node.height = height;
  48261. // split the items into M mostly square tiles
  48262. var N2 = Math.ceil(N / M),
  48263. N1 = N2 * Math.ceil(Math.sqrt(M)),
  48264. i, j, right2, right3;
  48265. multiSelect(items, left, right, N1, this.compareMinX);
  48266. for (i = left; i <= right; i += N1) {
  48267. right2 = Math.min(i + N1 - 1, right);
  48268. multiSelect(items, i, right2, N2, this.compareMinY);
  48269. for (j = i; j <= right2; j += N2) {
  48270. right3 = Math.min(j + N2 - 1, right2);
  48271. // pack each entry recursively
  48272. node.children.push(this._build(items, j, right3, height - 1));
  48273. }
  48274. }
  48275. calcBBox(node, this.toBBox);
  48276. return node;
  48277. },
  48278. _chooseSubtree: function (bbox, node, level, path)
  48279. {
  48280. var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
  48281. while (true) {
  48282. path.push(node);
  48283. if (node.leaf || path.length - 1 === level) break;
  48284. minArea = minEnlargement = Infinity;
  48285. for (i = 0, len = node.children.length; i < len; i++) {
  48286. child = node.children[i];
  48287. area = bboxArea(child);
  48288. enlargement = enlargedArea(bbox, child) - area;
  48289. // choose entry with the least area enlargement
  48290. if (enlargement < minEnlargement) {
  48291. minEnlargement = enlargement;
  48292. minArea = area < minArea ? area : minArea;
  48293. targetNode = child;
  48294. } else if (enlargement === minEnlargement) {
  48295. // otherwise choose one with the smallest area
  48296. if (area < minArea) {
  48297. minArea = area;
  48298. targetNode = child;
  48299. }
  48300. }
  48301. }
  48302. node = targetNode || node.children[0];
  48303. }
  48304. return node;
  48305. },
  48306. _insert: function (item, level, isNode)
  48307. {
  48308. var toBBox = this.toBBox,
  48309. bbox = isNode ? item : toBBox(item),
  48310. insertPath = [];
  48311. // find the best node for accommodating the item, saving all nodes along the path too
  48312. var node = this._chooseSubtree(bbox, this.data, level, insertPath);
  48313. // put the item into the node
  48314. node.children.push(item);
  48315. extend(node, bbox);
  48316. // split on node overflow; propagate upwards if necessary
  48317. while (level >= 0) {
  48318. if (insertPath[level].children.length > this._maxEntries) {
  48319. this._split(insertPath, level);
  48320. level--;
  48321. } else break;
  48322. }
  48323. // adjust bboxes along the insertion path
  48324. this._adjustParentBBoxes(bbox, insertPath, level);
  48325. },
  48326. // split overflowed node into two
  48327. _split: function (insertPath, level)
  48328. {
  48329. var node = insertPath[level],
  48330. M = node.children.length,
  48331. m = this._minEntries;
  48332. this._chooseSplitAxis(node, m, M);
  48333. var splitIndex = this._chooseSplitIndex(node, m, M);
  48334. var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
  48335. newNode.height = node.height;
  48336. newNode.leaf = node.leaf;
  48337. calcBBox(node, this.toBBox);
  48338. calcBBox(newNode, this.toBBox);
  48339. if (level) insertPath[level - 1].children.push(newNode);
  48340. else this._splitRoot(node, newNode);
  48341. },
  48342. _splitRoot: function (node, newNode)
  48343. {
  48344. // split root node
  48345. this.data = createNode([node, newNode]);
  48346. this.data.height = node.height + 1;
  48347. this.data.leaf = false;
  48348. calcBBox(this.data, this.toBBox);
  48349. },
  48350. _chooseSplitIndex: function (node, m, M)
  48351. {
  48352. var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
  48353. minOverlap = minArea = Infinity;
  48354. for (i = m; i <= M - m; i++) {
  48355. bbox1 = distBBox(node, 0, i, this.toBBox);
  48356. bbox2 = distBBox(node, i, M, this.toBBox);
  48357. overlap = intersectionArea(bbox1, bbox2);
  48358. area = bboxArea(bbox1) + bboxArea(bbox2);
  48359. // choose distribution with minimum overlap
  48360. if (overlap < minOverlap) {
  48361. minOverlap = overlap;
  48362. index = i;
  48363. minArea = area < minArea ? area : minArea;
  48364. } else if (overlap === minOverlap) {
  48365. // otherwise choose distribution with minimum area
  48366. if (area < minArea) {
  48367. minArea = area;
  48368. index = i;
  48369. }
  48370. }
  48371. }
  48372. return index;
  48373. },
  48374. // sorts node children by the best axis for split
  48375. _chooseSplitAxis: function (node, m, M)
  48376. {
  48377. var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
  48378. compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
  48379. xMargin = this._allDistMargin(node, m, M, compareMinX),
  48380. yMargin = this._allDistMargin(node, m, M, compareMinY);
  48381. // if total distributions margin value is minimal for x, sort by minX,
  48382. // otherwise it's already sorted by minY
  48383. if (xMargin < yMargin) node.children.sort(compareMinX);
  48384. },
  48385. // total margin of all possible split distributions where each node is at least m full
  48386. _allDistMargin: function (node, m, M, compare)
  48387. {
  48388. node.children.sort(compare);
  48389. var toBBox = this.toBBox,
  48390. leftBBox = distBBox(node, 0, m, toBBox),
  48391. rightBBox = distBBox(node, M - m, M, toBBox),
  48392. margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
  48393. i, child;
  48394. for (i = m; i < M - m; i++) {
  48395. child = node.children[i];
  48396. extend(leftBBox, node.leaf ? toBBox(child) : child);
  48397. margin += bboxMargin(leftBBox);
  48398. }
  48399. for (i = M - m - 1; i >= m; i--) {
  48400. child = node.children[i];
  48401. extend(rightBBox, node.leaf ? toBBox(child) : child);
  48402. margin += bboxMargin(rightBBox);
  48403. }
  48404. return margin;
  48405. },
  48406. _adjustParentBBoxes: function (bbox, path, level)
  48407. {
  48408. // adjust bboxes along the given tree path
  48409. for (var i = level; i >= 0; i--) {
  48410. extend(path[i], bbox);
  48411. }
  48412. },
  48413. _condense: function (path)
  48414. {
  48415. // go through the path, removing empty nodes and updating bboxes
  48416. for (var i = path.length - 1, siblings; i >= 0; i--) {
  48417. if (path[i].children.length === 0) {
  48418. if (i > 0) {
  48419. siblings = path[i - 1].children;
  48420. siblings.splice(siblings.indexOf(path[i]), 1);
  48421. } else this.clear();
  48422. } else calcBBox(path[i], this.toBBox);
  48423. }
  48424. },
  48425. compareMinX: function (a, b)
  48426. {
  48427. return a.left - b.left;
  48428. },
  48429. compareMinY: function (a, b)
  48430. {
  48431. return a.top - b.top;
  48432. },
  48433. toBBox: function (a)
  48434. {
  48435. return {
  48436. minX: a.left,
  48437. minY: a.top,
  48438. maxX: a.right,
  48439. maxY: a.bottom
  48440. };
  48441. }
  48442. };
  48443. function findItem (item, items, equalsFn)
  48444. {
  48445. if (!equalsFn) return items.indexOf(item);
  48446. for (var i = 0; i < items.length; i++) {
  48447. if (equalsFn(item, items[i])) return i;
  48448. }
  48449. return -1;
  48450. }
  48451. // calculate node's bbox from bboxes of its children
  48452. function calcBBox (node, toBBox)
  48453. {
  48454. distBBox(node, 0, node.children.length, toBBox, node);
  48455. }
  48456. // min bounding rectangle of node children from k to p-1
  48457. function distBBox (node, k, p, toBBox, destNode)
  48458. {
  48459. if (!destNode) destNode = createNode(null);
  48460. destNode.minX = Infinity;
  48461. destNode.minY = Infinity;
  48462. destNode.maxX = -Infinity;
  48463. destNode.maxY = -Infinity;
  48464. for (var i = k, child; i < p; i++) {
  48465. child = node.children[i];
  48466. extend(destNode, node.leaf ? toBBox(child) : child);
  48467. }
  48468. return destNode;
  48469. }
  48470. function extend (a, b)
  48471. {
  48472. a.minX = Math.min(a.minX, b.minX);
  48473. a.minY = Math.min(a.minY, b.minY);
  48474. a.maxX = Math.max(a.maxX, b.maxX);
  48475. a.maxY = Math.max(a.maxY, b.maxY);
  48476. return a;
  48477. }
  48478. function compareNodeMinX (a, b) { return a.minX - b.minX; }
  48479. function compareNodeMinY (a, b) { return a.minY - b.minY; }
  48480. function bboxArea (a) { return (a.maxX - a.minX) * (a.maxY - a.minY); }
  48481. function bboxMargin (a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
  48482. function enlargedArea (a, b)
  48483. {
  48484. return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
  48485. (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
  48486. }
  48487. function intersectionArea (a, b)
  48488. {
  48489. var minX = Math.max(a.minX, b.minX),
  48490. minY = Math.max(a.minY, b.minY),
  48491. maxX = Math.min(a.maxX, b.maxX),
  48492. maxY = Math.min(a.maxY, b.maxY);
  48493. return Math.max(0, maxX - minX) *
  48494. Math.max(0, maxY - minY);
  48495. }
  48496. function contains (a, b)
  48497. {
  48498. return a.minX <= b.minX &&
  48499. a.minY <= b.minY &&
  48500. b.maxX <= a.maxX &&
  48501. b.maxY <= a.maxY;
  48502. }
  48503. function intersects (a, b)
  48504. {
  48505. return b.minX <= a.maxX &&
  48506. b.minY <= a.maxY &&
  48507. b.maxX >= a.minX &&
  48508. b.maxY >= a.minY;
  48509. }
  48510. function createNode (children)
  48511. {
  48512. return {
  48513. children: children,
  48514. height: 1,
  48515. leaf: true,
  48516. minX: Infinity,
  48517. minY: Infinity,
  48518. maxX: -Infinity,
  48519. maxY: -Infinity
  48520. };
  48521. }
  48522. // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
  48523. // combines selection algorithm with binary divide & conquer approach
  48524. function multiSelect (arr, left, right, n, compare)
  48525. {
  48526. var stack = [left, right],
  48527. mid;
  48528. while (stack.length)
  48529. {
  48530. right = stack.pop();
  48531. left = stack.pop();
  48532. if (right - left <= n) continue;
  48533. mid = left + Math.ceil((right - left) / n / 2) * n;
  48534. quickselect(arr, mid, left, right, compare);
  48535. stack.push(left, mid, mid, right);
  48536. }
  48537. }
  48538. module.exports = rbush;
  48539. /***/ }),
  48540. /* 228 */
  48541. /***/ (function(module, exports, __webpack_require__) {
  48542. /**
  48543. * @author Richard Davey <rich@photonstorm.com>
  48544. * @copyright 2018 Photon Storm Ltd.
  48545. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  48546. */
  48547. var Class = __webpack_require__(0);
  48548. /**
  48549. * @classdesc
  48550. * [description]
  48551. *
  48552. * @class ProcessQueue
  48553. * @memberOf Phaser.Structs
  48554. * @constructor
  48555. * @since 3.0.0
  48556. *
  48557. * @generic T
  48558. */
  48559. var ProcessQueue = new Class({
  48560. initialize:
  48561. function ProcessQueue ()
  48562. {
  48563. /**
  48564. * [description]
  48565. *
  48566. * @genericUse {T[]} - [$type]
  48567. *
  48568. * @name Phaser.Structs.ProcessQueue#_pending
  48569. * @type {Array.<*>}
  48570. * @private
  48571. * @default []
  48572. * @since 3.0.0
  48573. */
  48574. this._pending = [];
  48575. /**
  48576. * [description]
  48577. *
  48578. * @genericUse {T[]} - [$type]
  48579. *
  48580. * @name Phaser.Structs.ProcessQueue#_active
  48581. * @type {Array.<*>}
  48582. * @private
  48583. * @default []
  48584. * @since 3.0.0
  48585. */
  48586. this._active = [];
  48587. /**
  48588. * [description]
  48589. *
  48590. * @genericUse {T[]} - [$type]
  48591. *
  48592. * @name Phaser.Structs.ProcessQueue#_destroy
  48593. * @type {Array.<*>}
  48594. * @private
  48595. * @default []
  48596. * @since 3.0.0
  48597. */
  48598. this._destroy = [];
  48599. /**
  48600. * [description]
  48601. *
  48602. * @name Phaser.Structs.ProcessQueue#_toProcess
  48603. * @type {integer}
  48604. * @private
  48605. * @default 0
  48606. * @since 3.0.0
  48607. */
  48608. this._toProcess = 0;
  48609. },
  48610. /**
  48611. * [description]
  48612. *
  48613. * @method Phaser.Structs.ProcessQueue#add
  48614. * @since 3.0.0
  48615. *
  48616. * @genericUse {T} - [item]
  48617. * @genericUse {Phaser.Structs.ProcessQueue.<T>} - [$return]
  48618. *
  48619. * @param {*} item - [description]
  48620. *
  48621. * @return {Phaser.Structs.ProcessQueue} This Process Queue object.
  48622. */
  48623. add: function (item)
  48624. {
  48625. this._pending.push(item);
  48626. this._toProcess++;
  48627. return this;
  48628. },
  48629. /**
  48630. * [description]
  48631. *
  48632. * @method Phaser.Structs.ProcessQueue#remove
  48633. * @since 3.0.0
  48634. *
  48635. * @genericUse {T} - [item]
  48636. * @genericUse {Phaser.Structs.ProcessQueue.<T>} - [$return]
  48637. *
  48638. * @param {*} item - [description]
  48639. *
  48640. * @return {Phaser.Structs.ProcessQueue} This Process Queue object.
  48641. */
  48642. remove: function (item)
  48643. {
  48644. this._destroy.push(item);
  48645. this._toProcess++;
  48646. return this;
  48647. },
  48648. /**
  48649. * [description]
  48650. *
  48651. * @method Phaser.Structs.ProcessQueue#update
  48652. * @since 3.0.0
  48653. *
  48654. * @genericUse {T[]} - [$return]
  48655. *
  48656. * @return {Array.<*>} [description]
  48657. */
  48658. update: function ()
  48659. {
  48660. if (this._toProcess === 0)
  48661. {
  48662. // Quick bail
  48663. return this._active;
  48664. }
  48665. var list = this._destroy;
  48666. var active = this._active;
  48667. var i;
  48668. var item;
  48669. // Clear the 'destroy' list
  48670. for (i = 0; i < list.length; i++)
  48671. {
  48672. item = list[i];
  48673. // Remove from the 'active' array
  48674. var idx = active.indexOf(item);
  48675. if (idx !== -1)
  48676. {
  48677. active.splice(idx, 1);
  48678. }
  48679. }
  48680. list.length = 0;
  48681. // Process the pending addition list
  48682. // This stops callbacks and out of sync events from populating the active array mid-way during an update
  48683. list = this._pending;
  48684. for (i = 0; i < list.length; i++)
  48685. {
  48686. item = list[i];
  48687. this._active.push(item);
  48688. }
  48689. list.length = 0;
  48690. this._toProcess = 0;
  48691. // The owner of this queue can now safely do whatever it needs to with the active list
  48692. return this._active;
  48693. },
  48694. /**
  48695. * [description]
  48696. *
  48697. * @method Phaser.Structs.ProcessQueue#getActive
  48698. * @since 3.0.0
  48699. *
  48700. * @genericUse {T[]} - [$return]
  48701. *
  48702. * @return {Array.<*>} [description]
  48703. */
  48704. getActive: function ()
  48705. {
  48706. return this._active;
  48707. },
  48708. /**
  48709. * [description]
  48710. *
  48711. * @method Phaser.Structs.ProcessQueue#destroy
  48712. * @since 3.0.0
  48713. */
  48714. destroy: function ()
  48715. {
  48716. this._pending = [];
  48717. this._active = [];
  48718. this._destroy = [];
  48719. }
  48720. });
  48721. module.exports = ProcessQueue;
  48722. /***/ }),
  48723. /* 229 */
  48724. /***/ (function(module, exports, __webpack_require__) {
  48725. /**
  48726. * @author Richard Davey <rich@photonstorm.com>
  48727. * @copyright 2018 Photon Storm Ltd.
  48728. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  48729. */
  48730. var Class = __webpack_require__(0);
  48731. var CONST = __webpack_require__(18);
  48732. var File = __webpack_require__(20);
  48733. var FileTypesManager = __webpack_require__(7);
  48734. var GetFastValue = __webpack_require__(1);
  48735. var IsPlainObject = __webpack_require__(8);
  48736. /**
  48737. * @typedef {object} Phaser.Loader.FileTypes.TextFileConfig
  48738. *
  48739. * @property {string} key - The key of the file. Must be unique within both the Loader and the Text Cache.
  48740. * @property {string} [url] - The absolute or relative URL to load the file from.
  48741. * @property {string} [extension='txt'] - The default file extension to use if no url is provided.
  48742. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  48743. */
  48744. /**
  48745. * @classdesc
  48746. * A single Text File suitable for loading by the Loader.
  48747. *
  48748. * These are created when you use the Phaser.Loader.LoaderPlugin#text method and are not typically created directly.
  48749. *
  48750. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#text.
  48751. *
  48752. * @class TextFile
  48753. * @extends Phaser.Loader.File
  48754. * @memberOf Phaser.Loader.FileTypes
  48755. * @constructor
  48756. * @since 3.0.0
  48757. *
  48758. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  48759. * @param {(string|Phaser.Loader.FileTypes.TextFileConfig)} key - The key to use for this file, or a file configuration object.
  48760. * @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".
  48761. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  48762. */
  48763. var TextFile = new Class({
  48764. Extends: File,
  48765. initialize:
  48766. function TextFile (loader, key, url, xhrSettings)
  48767. {
  48768. var extension = 'txt';
  48769. if (IsPlainObject(key))
  48770. {
  48771. var config = key;
  48772. key = GetFastValue(config, 'key');
  48773. url = GetFastValue(config, 'url');
  48774. xhrSettings = GetFastValue(config, 'xhrSettings');
  48775. extension = GetFastValue(config, 'extension', extension);
  48776. }
  48777. var fileConfig = {
  48778. type: 'text',
  48779. cache: loader.cacheManager.text,
  48780. extension: extension,
  48781. responseType: 'text',
  48782. key: key,
  48783. url: url,
  48784. xhrSettings: xhrSettings
  48785. };
  48786. File.call(this, loader, fileConfig);
  48787. },
  48788. /**
  48789. * Called automatically by Loader.nextFile.
  48790. * This method controls what extra work this File does with its loaded data.
  48791. *
  48792. * @method Phaser.Loader.FileTypes.TextFile#onProcess
  48793. * @since 3.7.0
  48794. */
  48795. onProcess: function ()
  48796. {
  48797. this.state = CONST.FILE_PROCESSING;
  48798. this.data = this.xhrLoader.responseText;
  48799. this.onProcessComplete();
  48800. }
  48801. });
  48802. /**
  48803. * Adds a Text file, or array of Text files, to the current load queue.
  48804. *
  48805. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  48806. *
  48807. * ```javascript
  48808. * function preload ()
  48809. * {
  48810. * this.load.text('story', files/IntroStory.txt');
  48811. * }
  48812. * ```
  48813. *
  48814. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  48815. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  48816. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  48817. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  48818. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  48819. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  48820. * loaded.
  48821. *
  48822. * The key must be a unique String. It is used to add the file to the global Text Cache upon a successful load.
  48823. * The key should be unique both in terms of files being loaded and files already present in the Text Cache.
  48824. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  48825. * then remove it from the Text Cache first, before loading a new one.
  48826. *
  48827. * Instead of passing arguments you can pass a configuration object, such as:
  48828. *
  48829. * ```javascript
  48830. * this.load.text({
  48831. * key: 'story',
  48832. * url: 'files/IntroStory.txt'
  48833. * });
  48834. * ```
  48835. *
  48836. * See the documentation for `Phaser.Loader.FileTypes.TextFileConfig` for more details.
  48837. *
  48838. * Once the file has finished loading you can access it from its Cache using its key:
  48839. *
  48840. * ```javascript
  48841. * this.load.image('story', 'files/IntroStory.txt');
  48842. * // and later in your game ...
  48843. * var data = this.cache.text.get('story');
  48844. * ```
  48845. *
  48846. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  48847. * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and
  48848. * this is what you would use to retrieve the text from the Text Cache.
  48849. *
  48850. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  48851. *
  48852. * 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"
  48853. * 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
  48854. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  48855. *
  48856. * Note: The ability to load this type of file will only be available if the Text File type has been built into Phaser.
  48857. * It is available in the default build but can be excluded from custom builds.
  48858. *
  48859. * @method Phaser.Loader.LoaderPlugin#text
  48860. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  48861. * @since 3.0.0
  48862. *
  48863. * @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.
  48864. * @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".
  48865. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  48866. *
  48867. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  48868. */
  48869. FileTypesManager.register('text', function (key, url, xhrSettings)
  48870. {
  48871. if (Array.isArray(key))
  48872. {
  48873. for (var i = 0; i < key.length; i++)
  48874. {
  48875. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  48876. this.addFile(new TextFile(this, key[i]));
  48877. }
  48878. }
  48879. else
  48880. {
  48881. this.addFile(new TextFile(this, key, url, xhrSettings));
  48882. }
  48883. return this;
  48884. });
  48885. module.exports = TextFile;
  48886. /***/ }),
  48887. /* 230 */
  48888. /***/ (function(module, exports) {
  48889. /**
  48890. * @author Richard Davey <rich@photonstorm.com>
  48891. * @copyright 2018 Photon Storm Ltd.
  48892. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  48893. */
  48894. /**
  48895. * [description]
  48896. *
  48897. * @function Phaser.Geom.Triangle.RotateAroundXY
  48898. * @since 3.0.0
  48899. *
  48900. * @generic {Phaser.Geom.Triangle} O - [triangle,$return]
  48901. *
  48902. * @param {Phaser.Geom.Triangle} triangle - [description]
  48903. * @param {number} x - [description]
  48904. * @param {number} y - [description]
  48905. * @param {number} angle - [description]
  48906. *
  48907. * @return {Phaser.Geom.Triangle} [description]
  48908. */
  48909. var RotateAroundXY = function (triangle, x, y, angle)
  48910. {
  48911. var c = Math.cos(angle);
  48912. var s = Math.sin(angle);
  48913. var tx = triangle.x1 - x;
  48914. var ty = triangle.y1 - y;
  48915. triangle.x1 = tx * c - ty * s + x;
  48916. triangle.y1 = tx * s + ty * c + y;
  48917. tx = triangle.x2 - x;
  48918. ty = triangle.y2 - y;
  48919. triangle.x2 = tx * c - ty * s + x;
  48920. triangle.y2 = tx * s + ty * c + y;
  48921. tx = triangle.x3 - x;
  48922. ty = triangle.y3 - y;
  48923. triangle.x3 = tx * c - ty * s + x;
  48924. triangle.y3 = tx * s + ty * c + y;
  48925. return triangle;
  48926. };
  48927. module.exports = RotateAroundXY;
  48928. /***/ }),
  48929. /* 231 */
  48930. /***/ (function(module, exports, __webpack_require__) {
  48931. /**
  48932. * @author Richard Davey <rich@photonstorm.com>
  48933. * @copyright 2018 Photon Storm Ltd.
  48934. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  48935. */
  48936. var Length = __webpack_require__(70);
  48937. var Point = __webpack_require__(5);
  48938. /**
  48939. * [description]
  48940. *
  48941. * @function Phaser.Geom.Triangle.GetPoints
  48942. * @since 3.0.0
  48943. *
  48944. * @generic {Phaser.Geom.Point} O - [out,$return]
  48945. *
  48946. * @param {Phaser.Geom.Triangle} triangle - [description]
  48947. * @param {integer} quantity - [description]
  48948. * @param {number} stepRate - [description]
  48949. * @param {(array|Phaser.Geom.Point[])} [out] - [description]
  48950. *
  48951. * @return {(array|Phaser.Geom.Point[])} [description]
  48952. */
  48953. var GetPoints = function (triangle, quantity, stepRate, out)
  48954. {
  48955. if (out === undefined) { out = []; }
  48956. var line1 = triangle.getLineA();
  48957. var line2 = triangle.getLineB();
  48958. var line3 = triangle.getLineC();
  48959. var length1 = Length(line1);
  48960. var length2 = Length(line2);
  48961. var length3 = Length(line3);
  48962. var perimeter = length1 + length2 + length3;
  48963. // If quantity is a falsey value (false, null, 0, undefined, etc) then we calculate it based on the stepRate instead.
  48964. if (!quantity)
  48965. {
  48966. quantity = perimeter / stepRate;
  48967. }
  48968. for (var i = 0; i < quantity; i++)
  48969. {
  48970. var p = perimeter * (i / quantity);
  48971. var localPosition = 0;
  48972. var point = new Point();
  48973. // Which line is it on?
  48974. if (p < length1)
  48975. {
  48976. // Line 1
  48977. localPosition = p / length1;
  48978. point.x = line1.x1 + (line1.x2 - line1.x1) * localPosition;
  48979. point.y = line1.y1 + (line1.y2 - line1.y1) * localPosition;
  48980. }
  48981. else if (p > length1 + length2)
  48982. {
  48983. // Line 3
  48984. p -= length1 + length2;
  48985. localPosition = p / length3;
  48986. point.x = line3.x1 + (line3.x2 - line3.x1) * localPosition;
  48987. point.y = line3.y1 + (line3.y2 - line3.y1) * localPosition;
  48988. }
  48989. else
  48990. {
  48991. // Line 2
  48992. p -= length1;
  48993. localPosition = p / length2;
  48994. point.x = line2.x1 + (line2.x2 - line2.x1) * localPosition;
  48995. point.y = line2.y1 + (line2.y2 - line2.y1) * localPosition;
  48996. }
  48997. out.push(point);
  48998. }
  48999. return out;
  49000. };
  49001. module.exports = GetPoints;
  49002. /***/ }),
  49003. /* 232 */
  49004. /***/ (function(module, exports, __webpack_require__) {
  49005. /**
  49006. * @author Richard Davey <rich@photonstorm.com>
  49007. * @copyright 2018 Photon Storm Ltd.
  49008. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  49009. */
  49010. var Point = __webpack_require__(5);
  49011. var Length = __webpack_require__(70);
  49012. // Position is a value between 0 and 1
  49013. /**
  49014. * [description]
  49015. *
  49016. * @function Phaser.Geom.Triangle.GetPoint
  49017. * @since 3.0.0
  49018. *
  49019. * @generic {Phaser.Geom.Point} O - [out,$return]
  49020. *
  49021. * @param {Phaser.Geom.Triangle} triangle - [description]
  49022. * @param {number} position - [description]
  49023. * @param {(Phaser.Geom.Point|object)} [out] - [description]
  49024. *
  49025. * @return {(Phaser.Geom.Point|object)} [description]
  49026. */
  49027. var GetPoint = function (triangle, position, out)
  49028. {
  49029. if (out === undefined) { out = new Point(); }
  49030. var line1 = triangle.getLineA();
  49031. var line2 = triangle.getLineB();
  49032. var line3 = triangle.getLineC();
  49033. if (position <= 0 || position >= 1)
  49034. {
  49035. out.x = line1.x1;
  49036. out.y = line1.y1;
  49037. return out;
  49038. }
  49039. var length1 = Length(line1);
  49040. var length2 = Length(line2);
  49041. var length3 = Length(line3);
  49042. var perimeter = length1 + length2 + length3;
  49043. var p = perimeter * position;
  49044. var localPosition = 0;
  49045. // Which line is it on?
  49046. if (p < length1)
  49047. {
  49048. // Line 1
  49049. localPosition = p / length1;
  49050. out.x = line1.x1 + (line1.x2 - line1.x1) * localPosition;
  49051. out.y = line1.y1 + (line1.y2 - line1.y1) * localPosition;
  49052. }
  49053. else if (p > length1 + length2)
  49054. {
  49055. // Line 3
  49056. p -= length1 + length2;
  49057. localPosition = p / length3;
  49058. out.x = line3.x1 + (line3.x2 - line3.x1) * localPosition;
  49059. out.y = line3.y1 + (line3.y2 - line3.y1) * localPosition;
  49060. }
  49061. else
  49062. {
  49063. // Line 2
  49064. p -= length1;
  49065. localPosition = p / length2;
  49066. out.x = line2.x1 + (line2.x2 - line2.x1) * localPosition;
  49067. out.y = line2.y1 + (line2.y2 - line2.y1) * localPosition;
  49068. }
  49069. return out;
  49070. };
  49071. module.exports = GetPoint;
  49072. /***/ }),
  49073. /* 233 */
  49074. /***/ (function(module, exports) {
  49075. /**
  49076. * @author Richard Davey <rich@photonstorm.com>
  49077. * @copyright 2018 Photon Storm Ltd.
  49078. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  49079. */
  49080. /**
  49081. * [description]
  49082. *
  49083. * @function Phaser.Geom.Rectangle.GetAspectRatio
  49084. * @since 3.0.0
  49085. *
  49086. * @param {Phaser.Geom.Rectangle} rect - [description]
  49087. *
  49088. * @return {number} [description]
  49089. */
  49090. var GetAspectRatio = function (rect)
  49091. {
  49092. return (rect.height === 0) ? NaN : rect.width / rect.height;
  49093. };
  49094. module.exports = GetAspectRatio;
  49095. /***/ }),
  49096. /* 234 */
  49097. /***/ (function(module, exports) {
  49098. /**
  49099. * @author Richard Davey <rich@photonstorm.com>
  49100. * @copyright 2018 Photon Storm Ltd.
  49101. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  49102. */
  49103. // Checks whether the x and y coordinates are contained within this polygon.
  49104. // Adapted from http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html by Jonas Raoni Soares Silva
  49105. /**
  49106. * [description]
  49107. *
  49108. * @function Phaser.Geom.Polygon.Contains
  49109. * @since 3.0.0
  49110. *
  49111. * @param {Phaser.Geom.Polygon} polygon - [description]
  49112. * @param {number} x - [description]
  49113. * @param {number} y - [description]
  49114. *
  49115. * @return {boolean} [description]
  49116. */
  49117. var Contains = function (polygon, x, y)
  49118. {
  49119. var inside = false;
  49120. for (var i = -1, j = polygon.points.length - 1; ++i < polygon.points.length; j = i)
  49121. {
  49122. var ix = polygon.points[i].x;
  49123. var iy = polygon.points[i].y;
  49124. var jx = polygon.points[j].x;
  49125. var jy = polygon.points[j].y;
  49126. if (((iy <= y && y < jy) || (jy <= y && y < iy)) && (x < (jx - ix) * (y - iy) / (jy - iy) + ix))
  49127. {
  49128. inside = !inside;
  49129. }
  49130. }
  49131. return inside;
  49132. };
  49133. module.exports = Contains;
  49134. /***/ }),
  49135. /* 235 */
  49136. /***/ (function(module, exports) {
  49137. /**
  49138. * @author Richard Davey <rich@photonstorm.com>
  49139. * @copyright 2018 Photon Storm Ltd.
  49140. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  49141. */
  49142. /**
  49143. * Rotate a line around the given coordinates by the given angle in radians.
  49144. *
  49145. * @function Phaser.Geom.Line.RotateAroundXY
  49146. * @since 3.0.0
  49147. *
  49148. * @generic {Phaser.Geom.Line} O - [line,$return]
  49149. *
  49150. * @param {Phaser.Geom.Line} line - The line to rotate.
  49151. * @param {number} x - The horizontal coordinate to rotate the line around.
  49152. * @param {number} y - The vertical coordinate to rotate the line around.
  49153. * @param {number} angle - The angle of rotation in radians.
  49154. *
  49155. * @return {Phaser.Geom.Line} The rotated line.
  49156. */
  49157. var RotateAroundXY = function (line, x, y, angle)
  49158. {
  49159. var c = Math.cos(angle);
  49160. var s = Math.sin(angle);
  49161. var tx = line.x1 - x;
  49162. var ty = line.y1 - y;
  49163. line.x1 = tx * c - ty * s + x;
  49164. line.y1 = tx * s + ty * c + y;
  49165. tx = line.x2 - x;
  49166. ty = line.y2 - y;
  49167. line.x2 = tx * c - ty * s + x;
  49168. line.y2 = tx * s + ty * c + y;
  49169. return line;
  49170. };
  49171. module.exports = RotateAroundXY;
  49172. /***/ }),
  49173. /* 236 */
  49174. /***/ (function(module, exports) {
  49175. /**
  49176. * @author Richard Davey <rich@photonstorm.com>
  49177. * @copyright 2018 Photon Storm Ltd.
  49178. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  49179. */
  49180. // http://www.blackpawn.com/texts/pointinpoly/
  49181. // points is an array of Point-like objects with public x/y properties
  49182. // returns an array containing all points that are within the triangle, or an empty array if none
  49183. // if 'returnFirst' is true it will return after the first point within the triangle is found
  49184. /**
  49185. * [description]
  49186. *
  49187. * @function Phaser.Geom.Triangle.ContainsArray
  49188. * @since 3.0.0
  49189. *
  49190. * @param {Phaser.Geom.Triangle} triangle - [description]
  49191. * @param {Phaser.Geom.Point[]} points - [description]
  49192. * @param {boolean} [returnFirst] - [description]
  49193. * @param {array} [out] - [description]
  49194. *
  49195. * @return {Phaser.Geom.Point[]} [description]
  49196. */
  49197. var ContainsArray = function (triangle, points, returnFirst, out)
  49198. {
  49199. if (returnFirst === undefined) { returnFirst = false; }
  49200. if (out === undefined) { out = []; }
  49201. var v0x = triangle.x3 - triangle.x1;
  49202. var v0y = triangle.y3 - triangle.y1;
  49203. var v1x = triangle.x2 - triangle.x1;
  49204. var v1y = triangle.y2 - triangle.y1;
  49205. var dot00 = (v0x * v0x) + (v0y * v0y);
  49206. var dot01 = (v0x * v1x) + (v0y * v1y);
  49207. var dot11 = (v1x * v1x) + (v1y * v1y);
  49208. // Compute barycentric coordinates
  49209. var b = ((dot00 * dot11) - (dot01 * dot01));
  49210. var inv = (b === 0) ? 0 : (1 / b);
  49211. var u;
  49212. var v;
  49213. var v2x;
  49214. var v2y;
  49215. var dot02;
  49216. var dot12;
  49217. var x1 = triangle.x1;
  49218. var y1 = triangle.y1;
  49219. for (var i = 0; i < points.length; i++)
  49220. {
  49221. v2x = points[i].x - x1;
  49222. v2y = points[i].y - y1;
  49223. dot02 = (v0x * v2x) + (v0y * v2y);
  49224. dot12 = (v1x * v2x) + (v1y * v2y);
  49225. u = ((dot11 * dot02) - (dot01 * dot12)) * inv;
  49226. v = ((dot00 * dot12) - (dot01 * dot02)) * inv;
  49227. if (u >= 0 && v >= 0 && (u + v < 1))
  49228. {
  49229. out.push({ x: points[i].x, y: points[i].y });
  49230. if (returnFirst)
  49231. {
  49232. break;
  49233. }
  49234. }
  49235. }
  49236. return out;
  49237. };
  49238. module.exports = ContainsArray;
  49239. /***/ }),
  49240. /* 237 */
  49241. /***/ (function(module, exports) {
  49242. /**
  49243. * @author Richard Davey <rich@photonstorm.com>
  49244. * @copyright 2018 Photon Storm Ltd.
  49245. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  49246. */
  49247. /**
  49248. * [description]
  49249. *
  49250. * @function Phaser.Geom.Intersects.RectangleToRectangle
  49251. * @since 3.0.0
  49252. *
  49253. * @param {Phaser.Geom.Rectangle} rectA - [description]
  49254. * @param {Phaser.Geom.Rectangle} rectB - [description]
  49255. *
  49256. * @return {boolean} [description]
  49257. */
  49258. var RectangleToRectangle = function (rectA, rectB)
  49259. {
  49260. if (rectA.width <= 0 || rectA.height <= 0 || rectB.width <= 0 || rectB.height <= 0)
  49261. {
  49262. return false;
  49263. }
  49264. return !(rectA.right < rectB.x || rectA.bottom < rectB.y || rectA.x > rectB.right || rectA.y > rectB.bottom);
  49265. };
  49266. module.exports = RectangleToRectangle;
  49267. /***/ }),
  49268. /* 238 */
  49269. /***/ (function(module, exports, __webpack_require__) {
  49270. /**
  49271. * @author Richard Davey <rich@photonstorm.com>
  49272. * @copyright 2018 Photon Storm Ltd.
  49273. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  49274. */
  49275. var Class = __webpack_require__(0);
  49276. var Mesh = __webpack_require__(147);
  49277. /**
  49278. * @classdesc
  49279. * A Quad Game Object.
  49280. *
  49281. * A Quad is a Mesh Game Object pre-configured with two triangles arranged into a rectangle, with a single
  49282. * texture spread across them.
  49283. *
  49284. * You can manipulate the corner points of the quad via the getters and setters such as `topLeftX`, and also
  49285. * change their alpha and color values. The quad itself can be moved by adjusting the `x` and `y` properties.
  49286. *
  49287. * @class Quad
  49288. * @extends Phaser.GameObjects.Mesh
  49289. * @memberOf Phaser.GameObjects
  49290. * @constructor
  49291. * @webglOnly
  49292. * @since 3.0.0
  49293. *
  49294. * @param {Phaser.Scene} scene - The Scene to which this Quad belongs.
  49295. * @param {number} x - The horizontal position of this Game Object in the world.
  49296. * @param {number} y - The vertical position of this Game Object in the world.
  49297. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  49298. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  49299. */
  49300. var Quad = new Class({
  49301. Extends: Mesh,
  49302. initialize:
  49303. function Quad (scene, x, y, texture, frame)
  49304. {
  49305. // 0----3
  49306. // |\ B|
  49307. // | \ |
  49308. // | \ |
  49309. // | A \|
  49310. // | \
  49311. // 1----2
  49312. var vertices = [
  49313. 0, 0, // tl
  49314. 0, 0, // bl
  49315. 0, 0, // br
  49316. 0, 0, // tl
  49317. 0, 0, // br
  49318. 0, 0 // tr
  49319. ];
  49320. var uv = [
  49321. 0, 0, // tl
  49322. 0, 1, // bl
  49323. 1, 1, // br
  49324. 0, 0, // tl
  49325. 1, 1, // br
  49326. 1, 0 // tr
  49327. ];
  49328. var colors = [
  49329. 0xffffff, // tl
  49330. 0xffffff, // bl
  49331. 0xffffff, // br
  49332. 0xffffff, // tl
  49333. 0xffffff, // br
  49334. 0xffffff // tr
  49335. ];
  49336. var alphas = [
  49337. 1, // tl
  49338. 1, // bl
  49339. 1, // br
  49340. 1, // tl
  49341. 1, // br
  49342. 1 // tr
  49343. ];
  49344. Mesh.call(this, scene, x, y, vertices, uv, colors, alphas, texture, frame);
  49345. this.resetPosition();
  49346. },
  49347. /**
  49348. * Sets the frame this Game Object will use to render with.
  49349. *
  49350. * The Frame has to belong to the current Texture being used.
  49351. *
  49352. * It can be either a string or an index.
  49353. *
  49354. * Calling `setFrame` will modify the `width` and `height` properties of your Game Object.
  49355. * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer.
  49356. *
  49357. * @method Phaser.GameObjects.Quad#setFrame
  49358. * @since 3.11.0
  49359. *
  49360. * @param {(string|integer)} frame - The name or index of the frame within the Texture.
  49361. *
  49362. * @return {this} This Game Object instance.
  49363. */
  49364. setFrame: function (frame)
  49365. {
  49366. this.frame = this.texture.get(frame);
  49367. if (!this.frame.cutWidth || !this.frame.cutHeight)
  49368. {
  49369. this.renderFlags &= ~8;
  49370. }
  49371. else
  49372. {
  49373. this.renderFlags |= 8;
  49374. }
  49375. frame = this.frame;
  49376. // TL
  49377. this.uv[0] = frame.u0;
  49378. this.uv[1] = frame.v0;
  49379. // BL
  49380. this.uv[2] = frame.u0;
  49381. this.uv[3] = frame.v1;
  49382. // BR
  49383. this.uv[4] = frame.u1;
  49384. this.uv[5] = frame.v1;
  49385. // TL
  49386. this.uv[6] = frame.u0;
  49387. this.uv[7] = frame.v0;
  49388. // BR
  49389. this.uv[8] = frame.u1;
  49390. this.uv[9] = frame.v1;
  49391. // TR
  49392. this.uv[10] = frame.u1;
  49393. this.uv[11] = frame.v0;
  49394. return this;
  49395. },
  49396. /**
  49397. * The top-left x vertex of this Quad.
  49398. *
  49399. * @name Phaser.GameObjects.Quad#topLeftX
  49400. * @type {number}
  49401. * @since 3.0.0
  49402. */
  49403. topLeftX: {
  49404. get: function ()
  49405. {
  49406. return this.x + this.vertices[0];
  49407. },
  49408. set: function (value)
  49409. {
  49410. this.vertices[0] = value - this.x;
  49411. this.vertices[6] = value - this.x;
  49412. }
  49413. },
  49414. /**
  49415. * The top-left y vertex of this Quad.
  49416. *
  49417. * @name Phaser.GameObjects.Quad#topLeftY
  49418. * @type {number}
  49419. * @since 3.0.0
  49420. */
  49421. topLeftY: {
  49422. get: function ()
  49423. {
  49424. return this.y + this.vertices[1];
  49425. },
  49426. set: function (value)
  49427. {
  49428. this.vertices[1] = value - this.y;
  49429. this.vertices[7] = value - this.y;
  49430. }
  49431. },
  49432. /**
  49433. * The top-right x vertex of this Quad.
  49434. *
  49435. * @name Phaser.GameObjects.Quad#topRightX
  49436. * @type {number}
  49437. * @since 3.0.0
  49438. */
  49439. topRightX: {
  49440. get: function ()
  49441. {
  49442. return this.x + this.vertices[10];
  49443. },
  49444. set: function (value)
  49445. {
  49446. this.vertices[10] = value - this.x;
  49447. }
  49448. },
  49449. /**
  49450. * The top-right y vertex of this Quad.
  49451. *
  49452. * @name Phaser.GameObjects.Quad#topRightY
  49453. * @type {number}
  49454. * @since 3.0.0
  49455. */
  49456. topRightY: {
  49457. get: function ()
  49458. {
  49459. return this.y + this.vertices[11];
  49460. },
  49461. set: function (value)
  49462. {
  49463. this.vertices[11] = value - this.y;
  49464. }
  49465. },
  49466. /**
  49467. * The bottom-left x vertex of this Quad.
  49468. *
  49469. * @name Phaser.GameObjects.Quad#bottomLeftX
  49470. * @type {number}
  49471. * @since 3.0.0
  49472. */
  49473. bottomLeftX: {
  49474. get: function ()
  49475. {
  49476. return this.x + this.vertices[2];
  49477. },
  49478. set: function (value)
  49479. {
  49480. this.vertices[2] = value - this.x;
  49481. }
  49482. },
  49483. /**
  49484. * The bottom-left y vertex of this Quad.
  49485. *
  49486. * @name Phaser.GameObjects.Quad#bottomLeftY
  49487. * @type {number}
  49488. * @since 3.0.0
  49489. */
  49490. bottomLeftY: {
  49491. get: function ()
  49492. {
  49493. return this.y + this.vertices[3];
  49494. },
  49495. set: function (value)
  49496. {
  49497. this.vertices[3] = value - this.y;
  49498. }
  49499. },
  49500. /**
  49501. * The bottom-right x vertex of this Quad.
  49502. *
  49503. * @name Phaser.GameObjects.Quad#bottomRightX
  49504. * @type {number}
  49505. * @since 3.0.0
  49506. */
  49507. bottomRightX: {
  49508. get: function ()
  49509. {
  49510. return this.x + this.vertices[4];
  49511. },
  49512. set: function (value)
  49513. {
  49514. this.vertices[4] = value - this.x;
  49515. this.vertices[8] = value - this.x;
  49516. }
  49517. },
  49518. /**
  49519. * The bottom-right y vertex of this Quad.
  49520. *
  49521. * @name Phaser.GameObjects.Quad#bottomRightY
  49522. * @type {number}
  49523. * @since 3.0.0
  49524. */
  49525. bottomRightY: {
  49526. get: function ()
  49527. {
  49528. return this.y + this.vertices[5];
  49529. },
  49530. set: function (value)
  49531. {
  49532. this.vertices[5] = value - this.y;
  49533. this.vertices[9] = value - this.y;
  49534. }
  49535. },
  49536. /**
  49537. * The top-left alpha value of this Quad.
  49538. *
  49539. * @name Phaser.GameObjects.Quad#topLeftAlpha
  49540. * @type {number}
  49541. * @since 3.0.0
  49542. */
  49543. topLeftAlpha: {
  49544. get: function ()
  49545. {
  49546. return this.alphas[0];
  49547. },
  49548. set: function (value)
  49549. {
  49550. this.alphas[0] = value;
  49551. this.alphas[3] = value;
  49552. }
  49553. },
  49554. /**
  49555. * The top-right alpha value of this Quad.
  49556. *
  49557. * @name Phaser.GameObjects.Quad#topRightAlpha
  49558. * @type {number}
  49559. * @since 3.0.0
  49560. */
  49561. topRightAlpha: {
  49562. get: function ()
  49563. {
  49564. return this.alphas[5];
  49565. },
  49566. set: function (value)
  49567. {
  49568. this.alphas[5] = value;
  49569. }
  49570. },
  49571. /**
  49572. * The bottom-left alpha value of this Quad.
  49573. *
  49574. * @name Phaser.GameObjects.Quad#bottomLeftAlpha
  49575. * @type {number}
  49576. * @since 3.0.0
  49577. */
  49578. bottomLeftAlpha: {
  49579. get: function ()
  49580. {
  49581. return this.alphas[1];
  49582. },
  49583. set: function (value)
  49584. {
  49585. this.alphas[1] = value;
  49586. }
  49587. },
  49588. /**
  49589. * The bottom-right alpha value of this Quad.
  49590. *
  49591. * @name Phaser.GameObjects.Quad#bottomRightAlpha
  49592. * @type {number}
  49593. * @since 3.0.0
  49594. */
  49595. bottomRightAlpha: {
  49596. get: function ()
  49597. {
  49598. return this.alphas[2];
  49599. },
  49600. set: function (value)
  49601. {
  49602. this.alphas[2] = value;
  49603. this.alphas[4] = value;
  49604. }
  49605. },
  49606. /**
  49607. * The top-left color value of this Quad.
  49608. *
  49609. * @name Phaser.GameObjects.Quad#topLeftColor
  49610. * @type {number}
  49611. * @since 3.0.0
  49612. */
  49613. topLeftColor: {
  49614. get: function ()
  49615. {
  49616. return this.colors[0];
  49617. },
  49618. set: function (value)
  49619. {
  49620. this.colors[0] = value;
  49621. this.colors[3] = value;
  49622. }
  49623. },
  49624. /**
  49625. * The top-right color value of this Quad.
  49626. *
  49627. * @name Phaser.GameObjects.Quad#topRightColor
  49628. * @type {number}
  49629. * @since 3.0.0
  49630. */
  49631. topRightColor: {
  49632. get: function ()
  49633. {
  49634. return this.colors[5];
  49635. },
  49636. set: function (value)
  49637. {
  49638. this.colors[5] = value;
  49639. }
  49640. },
  49641. /**
  49642. * The bottom-left color value of this Quad.
  49643. *
  49644. * @name Phaser.GameObjects.Quad#bottomLeftColor
  49645. * @type {number}
  49646. * @since 3.0.0
  49647. */
  49648. bottomLeftColor: {
  49649. get: function ()
  49650. {
  49651. return this.colors[1];
  49652. },
  49653. set: function (value)
  49654. {
  49655. this.colors[1] = value;
  49656. }
  49657. },
  49658. /**
  49659. * The bottom-right color value of this Quad.
  49660. *
  49661. * @name Phaser.GameObjects.Quad#bottomRightColor
  49662. * @type {number}
  49663. * @since 3.0.0
  49664. */
  49665. bottomRightColor: {
  49666. get: function ()
  49667. {
  49668. return this.colors[2];
  49669. },
  49670. set: function (value)
  49671. {
  49672. this.colors[2] = value;
  49673. this.colors[4] = value;
  49674. }
  49675. },
  49676. /**
  49677. * Sets the top-left vertex position of this Quad.
  49678. *
  49679. * @method Phaser.GameObjects.Quad#setTopLeft
  49680. * @since 3.0.0
  49681. *
  49682. * @param {number} x - The horizontal coordinate of the vertex.
  49683. * @param {number} y - The vertical coordinate of the vertex.
  49684. *
  49685. * @return {Phaser.GameObjects.Quad} This Game Object.
  49686. */
  49687. setTopLeft: function (x, y)
  49688. {
  49689. this.topLeftX = x;
  49690. this.topLeftY = y;
  49691. return this;
  49692. },
  49693. /**
  49694. * Sets the top-right vertex position of this Quad.
  49695. *
  49696. * @method Phaser.GameObjects.Quad#setTopRight
  49697. * @since 3.0.0
  49698. *
  49699. * @param {number} x - The horizontal coordinate of the vertex.
  49700. * @param {number} y - The vertical coordinate of the vertex.
  49701. *
  49702. * @return {Phaser.GameObjects.Quad} This Game Object.
  49703. */
  49704. setTopRight: function (x, y)
  49705. {
  49706. this.topRightX = x;
  49707. this.topRightY = y;
  49708. return this;
  49709. },
  49710. /**
  49711. * Sets the bottom-left vertex position of this Quad.
  49712. *
  49713. * @method Phaser.GameObjects.Quad#setBottomLeft
  49714. * @since 3.0.0
  49715. *
  49716. * @param {number} x - The horizontal coordinate of the vertex.
  49717. * @param {number} y - The vertical coordinate of the vertex.
  49718. *
  49719. * @return {Phaser.GameObjects.Quad} This Game Object.
  49720. */
  49721. setBottomLeft: function (x, y)
  49722. {
  49723. this.bottomLeftX = x;
  49724. this.bottomLeftY = y;
  49725. return this;
  49726. },
  49727. /**
  49728. * Sets the bottom-right vertex position of this Quad.
  49729. *
  49730. * @method Phaser.GameObjects.Quad#setBottomRight
  49731. * @since 3.0.0
  49732. *
  49733. * @param {number} x - The horizontal coordinate of the vertex.
  49734. * @param {number} y - The vertical coordinate of the vertex.
  49735. *
  49736. * @return {Phaser.GameObjects.Quad} This Game Object.
  49737. */
  49738. setBottomRight: function (x, y)
  49739. {
  49740. this.bottomRightX = x;
  49741. this.bottomRightY = y;
  49742. return this;
  49743. },
  49744. /**
  49745. * Resets the positions of the four corner vertices of this Quad.
  49746. *
  49747. * @method Phaser.GameObjects.Quad#resetPosition
  49748. * @since 3.0.0
  49749. *
  49750. * @return {Phaser.GameObjects.Quad} This Game Object.
  49751. */
  49752. resetPosition: function ()
  49753. {
  49754. var x = this.x;
  49755. var y = this.y;
  49756. var halfWidth = Math.floor(this.width / 2);
  49757. var halfHeight = Math.floor(this.height / 2);
  49758. this.setTopLeft(x - halfWidth, y - halfHeight);
  49759. this.setTopRight(x + halfWidth, y - halfHeight);
  49760. this.setBottomLeft(x - halfWidth, y + halfHeight);
  49761. this.setBottomRight(x + halfWidth, y + halfHeight);
  49762. return this;
  49763. },
  49764. /**
  49765. * Resets the alpha values used by this Quad back to 1.
  49766. *
  49767. * @method Phaser.GameObjects.Quad#resetAlpha
  49768. * @since 3.0.0
  49769. *
  49770. * @return {Phaser.GameObjects.Quad} This Game Object.
  49771. */
  49772. resetAlpha: function ()
  49773. {
  49774. var alphas = this.alphas;
  49775. alphas[0] = 1;
  49776. alphas[1] = 1;
  49777. alphas[2] = 1;
  49778. alphas[3] = 1;
  49779. alphas[4] = 1;
  49780. alphas[5] = 1;
  49781. return this;
  49782. },
  49783. /**
  49784. * Resets the color values used by this Quad back to 0xffffff.
  49785. *
  49786. * @method Phaser.GameObjects.Quad#resetColors
  49787. * @since 3.0.0
  49788. *
  49789. * @return {Phaser.GameObjects.Quad} This Game Object.
  49790. */
  49791. resetColors: function ()
  49792. {
  49793. var colors = this.colors;
  49794. colors[0] = 0xffffff;
  49795. colors[1] = 0xffffff;
  49796. colors[2] = 0xffffff;
  49797. colors[3] = 0xffffff;
  49798. colors[4] = 0xffffff;
  49799. colors[5] = 0xffffff;
  49800. return this;
  49801. },
  49802. /**
  49803. * Resets the position, alpha and color values used by this Quad.
  49804. *
  49805. * @method Phaser.GameObjects.Quad#reset
  49806. * @since 3.0.0
  49807. *
  49808. * @return {Phaser.GameObjects.Quad} This Game Object.
  49809. */
  49810. reset: function ()
  49811. {
  49812. this.resetPosition();
  49813. this.resetAlpha();
  49814. return this.resetColors();
  49815. }
  49816. });
  49817. module.exports = Quad;
  49818. /***/ }),
  49819. /* 239 */
  49820. /***/ (function(module, exports, __webpack_require__) {
  49821. /**
  49822. * @author Richard Davey <rich@photonstorm.com>
  49823. * @copyright 2018 Photon Storm Ltd.
  49824. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  49825. */
  49826. var CanvasPool = __webpack_require__(24);
  49827. var Class = __webpack_require__(0);
  49828. var Components = __webpack_require__(17);
  49829. var CONST = __webpack_require__(22);
  49830. var GameObject = __webpack_require__(2);
  49831. var GetPowerOfTwo = __webpack_require__(415);
  49832. var TileSpriteRender = __webpack_require__(889);
  49833. /**
  49834. * @classdesc
  49835. * A TileSprite is a Sprite that has a repeating texture.
  49836. *
  49837. * The texture can be scrolled and scaled independently of the TileSprite itself. Textures will automatically wrap and
  49838. * are designed so that you can create game backdrops using seamless textures as a source.
  49839. *
  49840. * You shouldn't ever create a TileSprite any larger than your actual screen size. If you want to create a large repeating background
  49841. * that scrolls across the whole map of your game, then you create a TileSprite that fits the screen size and then use the `tilePosition`
  49842. * property to scroll the texture as the player moves. If you create a TileSprite that is thousands of pixels in size then it will
  49843. * consume huge amounts of memory and cause performance issues. Remember: use `tilePosition` to scroll your texture and `tileScale` to
  49844. * adjust the scale of the texture - don't resize the sprite itself or make it larger than it needs.
  49845. *
  49846. * An important note about Tile Sprites and NPOT textures: Internally, TileSprite textures use GL_REPEAT to provide
  49847. * seamless repeating of the textures. This, combined with the way in which the textures are handled in WebGL, means
  49848. * 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
  49849. * TileSprite it will generate a POT sized canvas and draw your texture to it, scaled up to the POT size. It's then
  49850. * scaled back down again during rendering to the original dimensions. While this works, in that it allows you to use
  49851. * any size texture for a Tile Sprite, it does mean that NPOT textures are going to appear anti-aliased when rendered,
  49852. * due to the interpolation that took place when it was resized into a POT texture. This is especially visible in
  49853. * pixel art graphics. If you notice it and it becomes an issue, the only way to avoid it is to ensure that you
  49854. * provide POT textures for Tile Sprites.
  49855. *
  49856. * @class TileSprite
  49857. * @extends Phaser.GameObjects.GameObject
  49858. * @memberOf Phaser.GameObjects
  49859. * @constructor
  49860. * @since 3.0.0
  49861. *
  49862. * @extends Phaser.GameObjects.Components.Alpha
  49863. * @extends Phaser.GameObjects.Components.BlendMode
  49864. * @extends Phaser.GameObjects.Components.ComputedSize
  49865. * @extends Phaser.GameObjects.Components.Depth
  49866. * @extends Phaser.GameObjects.Components.Flip
  49867. * @extends Phaser.GameObjects.Components.GetBounds
  49868. * @extends Phaser.GameObjects.Components.Mask
  49869. * @extends Phaser.GameObjects.Components.Origin
  49870. * @extends Phaser.GameObjects.Components.Pipeline
  49871. * @extends Phaser.GameObjects.Components.ScaleMode
  49872. * @extends Phaser.GameObjects.Components.ScrollFactor
  49873. * @extends Phaser.GameObjects.Components.Texture
  49874. * @extends Phaser.GameObjects.Components.Tint
  49875. * @extends Phaser.GameObjects.Components.Transform
  49876. * @extends Phaser.GameObjects.Components.Visible
  49877. *
  49878. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  49879. * @param {number} x - The horizontal position of this Game Object in the world.
  49880. * @param {number} y - The vertical position of this Game Object in the world.
  49881. * @param {number} width - The width of the Game Object.
  49882. * @param {number} height - The height of the Game Object.
  49883. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  49884. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  49885. */
  49886. var TileSprite = new Class({
  49887. Extends: GameObject,
  49888. Mixins: [
  49889. Components.Alpha,
  49890. Components.BlendMode,
  49891. Components.ComputedSize,
  49892. Components.Depth,
  49893. Components.Flip,
  49894. Components.GetBounds,
  49895. Components.Mask,
  49896. Components.Origin,
  49897. Components.Pipeline,
  49898. Components.ScaleMode,
  49899. Components.ScrollFactor,
  49900. Components.Texture,
  49901. Components.Tint,
  49902. Components.Transform,
  49903. Components.Visible,
  49904. TileSpriteRender
  49905. ],
  49906. initialize:
  49907. function TileSprite (scene, x, y, width, height, texture, frame)
  49908. {
  49909. var renderer = scene.sys.game.renderer;
  49910. GameObject.call(this, scene, 'TileSprite');
  49911. /**
  49912. * The horizontal scroll position of the Tile Sprite.
  49913. *
  49914. * @name Phaser.GameObjects.TileSprite#tilePositionX
  49915. * @type {number}
  49916. * @default 0
  49917. * @since 3.0.0
  49918. */
  49919. this.tilePositionX = 0;
  49920. /**
  49921. * The vertical scroll position of the Tile Sprite.
  49922. *
  49923. * @name Phaser.GameObjects.TileSprite#tilePositionY
  49924. * @type {number}
  49925. * @default 0
  49926. * @since 3.0.0
  49927. */
  49928. this.tilePositionY = 0;
  49929. /**
  49930. * The horizontal scale of the Tile Sprite texture.
  49931. *
  49932. * @name Phaser.GameObjects.TileSprite#tileScaleX
  49933. * @type {number}
  49934. * @default 1
  49935. * @since 3.11.0
  49936. */
  49937. this.tileScaleX = 1;
  49938. /**
  49939. * The vertical scale of the Tile Sprite texture.
  49940. *
  49941. * @name Phaser.GameObjects.TileSprite#tileScaleY
  49942. * @type {number}
  49943. * @default 1
  49944. * @since 3.11.0
  49945. */
  49946. this.tileScaleY = 1;
  49947. /**
  49948. * Whether the Tile Sprite has changed in some way, requiring an re-render of its tile texture.
  49949. *
  49950. * Such changes include the texture frame and scroll position of the Tile Sprite.
  49951. *
  49952. * @name Phaser.GameObjects.TileSprite#dirty
  49953. * @type {boolean}
  49954. * @default true
  49955. * @since 3.0.0
  49956. */
  49957. this.dirty = true;
  49958. /**
  49959. * The texture that the Tile Sprite is rendered to, which is then rendered to a Scene.
  49960. * In WebGL this is a WebGLTexture. In Canvas it's a Canvas Fill Pattern.
  49961. *
  49962. * @name Phaser.GameObjects.TileSprite#tileTexture
  49963. * @type {?(WebGLTexture|CanvasPattern)}
  49964. * @default null
  49965. * @since 3.0.0
  49966. */
  49967. this.tileTexture = null;
  49968. /**
  49969. * The renderer in use by this Tile Sprite.
  49970. *
  49971. * @name Phaser.GameObjects.TileSprite#renderer
  49972. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  49973. * @since 3.0.0
  49974. */
  49975. this.renderer = renderer;
  49976. this.setTexture(texture, frame);
  49977. this.setPosition(x, y);
  49978. this.setSize(width, height);
  49979. this.setOriginFromFrame();
  49980. this.initPipeline('TextureTintPipeline');
  49981. /**
  49982. * The next power of two value from the width of the Frame.
  49983. *
  49984. * @name Phaser.GameObjects.TileSprite#potWidth
  49985. * @type {integer}
  49986. * @since 3.0.0
  49987. */
  49988. this.potWidth = GetPowerOfTwo(this.frame.width);
  49989. /**
  49990. * The next power of two value from the height of the Frame.
  49991. *
  49992. * @name Phaser.GameObjects.TileSprite#potHeight
  49993. * @type {integer}
  49994. * @since 3.0.0
  49995. */
  49996. this.potHeight = GetPowerOfTwo(this.frame.height);
  49997. /**
  49998. * The Canvas Pattern used to repeat the TileSprite's texture.
  49999. *
  50000. * @name Phaser.GameObjects.TileSprite#canvasPattern
  50001. * @type {?CanvasPattern}
  50002. * @default null
  50003. * @since 3.0.0
  50004. */
  50005. // this.canvasPattern = null;
  50006. /**
  50007. * The Canvas that the TileSprite's texture is rendered to.
  50008. *
  50009. * @name Phaser.GameObjects.TileSprite#canvasBuffer
  50010. * @type {HTMLCanvasElement}
  50011. * @since 3.0.0
  50012. */
  50013. this.canvasBuffer = CanvasPool.create2D(this, this.potWidth, this.potHeight);
  50014. /**
  50015. * The Canvas Context used to render the TileSprite's texture.
  50016. *
  50017. * @name Phaser.GameObjects.TileSprite#canvasBufferCtx
  50018. * @type {CanvasRenderingContext2D}
  50019. * @since 3.0.0
  50020. */
  50021. this.canvasBufferCtx = this.canvasBuffer.getContext('2d');
  50022. /**
  50023. * The previous Texture Frame being used.
  50024. *
  50025. * @name Phaser.GameObjects.Components.Texture#oldFrame
  50026. * @type {Phaser.Textures.Frame}
  50027. * @private
  50028. * @since 3.0.0
  50029. */
  50030. this.oldFrame = null;
  50031. this.updateTileTexture();
  50032. if (scene.sys.game.config.renderType === CONST.WEBGL)
  50033. {
  50034. scene.sys.game.renderer.onContextRestored(function (renderer)
  50035. {
  50036. var gl = renderer.gl;
  50037. this.tileTexture = null;
  50038. this.dirty = true;
  50039. this.tileTexture = renderer.createTexture2D(0, gl.LINEAR, gl.LINEAR, gl.REPEAT, gl.REPEAT, gl.RGBA, this.canvasBuffer, this.potWidth, this.potHeight);
  50040. }, this);
  50041. }
  50042. },
  50043. /**
  50044. * Sets {@link Phaser.GameObjects.TileSprite#tilePositionX} and {@link Phaser.GameObjects.TileSprite#tilePositionY}.
  50045. *
  50046. * @method Phaser.GameObjects.TileSprite#setTilePosition
  50047. * @since 3.3.0
  50048. *
  50049. * @param {number} [x] - The x position of this sprite's tiling texture.
  50050. * @param {number} [y] - The y position of this sprite's tiling texture.
  50051. *
  50052. * @return {Phaser.GameObjects.TileSprite} This Tile Sprite instance.
  50053. */
  50054. setTilePosition: function (x, y)
  50055. {
  50056. if (x !== undefined)
  50057. {
  50058. this.tilePositionX = x;
  50059. }
  50060. if (y !== undefined)
  50061. {
  50062. this.tilePositionY = y;
  50063. }
  50064. return this;
  50065. },
  50066. /**
  50067. * Render the tile texture if it is dirty, or if the frame has changed.
  50068. *
  50069. * @method Phaser.GameObjects.TileSprite#updateTileTexture
  50070. * @since 3.0.0
  50071. */
  50072. updateTileTexture: function ()
  50073. {
  50074. var frame = this.frame;
  50075. if (!this.dirty && this.oldFrame === frame)
  50076. {
  50077. return;
  50078. }
  50079. this.oldFrame = frame;
  50080. var ctx = this.canvasBufferCtx;
  50081. var canvas = this.canvasBuffer;
  50082. var fw = this.potWidth;
  50083. var fh = this.potHeight;
  50084. if (!this.renderer.gl)
  50085. {
  50086. fw = frame.cutWidth;
  50087. fh = frame.cutHeight;
  50088. }
  50089. ctx.clearRect(0, 0, canvas.width, canvas.height);
  50090. canvas.width = fw;
  50091. canvas.height = fh;
  50092. ctx.drawImage(
  50093. frame.source.image,
  50094. frame.cutX, frame.cutY,
  50095. frame.cutWidth, frame.cutHeight,
  50096. 0, 0,
  50097. fw, fh
  50098. );
  50099. this.tileTexture = (this.renderer.gl) ? this.renderer.canvasToTexture(canvas, this.tileTexture) : ctx.createPattern(canvas, 'repeat');
  50100. this.dirty = false;
  50101. },
  50102. /**
  50103. * Internal destroy handler, called as part of the destroy process.
  50104. *
  50105. * @method Phaser.GameObjects.TileSprite#preDestroy
  50106. * @protected
  50107. * @since 3.9.0
  50108. */
  50109. preDestroy: function ()
  50110. {
  50111. if (this.renderer && this.renderer.gl)
  50112. {
  50113. this.renderer.deleteTexture(this.tileTexture);
  50114. }
  50115. CanvasPool.remove(this.canvasBuffer);
  50116. this.tileTexture = null;
  50117. this.canvasBufferCtx = null;
  50118. this.canvasBuffer = null;
  50119. this.renderer = null;
  50120. }
  50121. });
  50122. module.exports = TileSprite;
  50123. /***/ }),
  50124. /* 240 */
  50125. /***/ (function(module, exports, __webpack_require__) {
  50126. /**
  50127. * @author Richard Davey <rich@photonstorm.com>
  50128. * @copyright 2018 Photon Storm Ltd.
  50129. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  50130. */
  50131. var CanvasPool = __webpack_require__(24);
  50132. var Class = __webpack_require__(0);
  50133. var Components = __webpack_require__(17);
  50134. var CONST = __webpack_require__(22);
  50135. var GameObject = __webpack_require__(2);
  50136. var Render = __webpack_require__(897);
  50137. var RenderTextureCanvas = __webpack_require__(894);
  50138. var RenderTextureWebGL = __webpack_require__(893);
  50139. /**
  50140. * @classdesc
  50141. * A Render Texture.
  50142. *
  50143. * @class RenderTexture
  50144. * @extends Phaser.GameObjects.GameObject
  50145. * @memberOf Phaser.GameObjects
  50146. * @constructor
  50147. * @since 3.2.0
  50148. *
  50149. * @extends Phaser.GameObjects.Components.Alpha
  50150. * @extends Phaser.GameObjects.Components.BlendMode
  50151. * @extends Phaser.GameObjects.Components.ComputedSize
  50152. * @extends Phaser.GameObjects.Components.Depth
  50153. * @extends Phaser.GameObjects.Components.Flip
  50154. * @extends Phaser.GameObjects.Components.GetBounds
  50155. * @extends Phaser.GameObjects.Components.Mask
  50156. * @extends Phaser.GameObjects.Components.MatrixStack
  50157. * @extends Phaser.GameObjects.Components.Origin
  50158. * @extends Phaser.GameObjects.Components.Pipeline
  50159. * @extends Phaser.GameObjects.Components.ScaleMode
  50160. * @extends Phaser.GameObjects.Components.ScrollFactor
  50161. * @extends Phaser.GameObjects.Components.Tint
  50162. * @extends Phaser.GameObjects.Components.Transform
  50163. * @extends Phaser.GameObjects.Components.Visible
  50164. *
  50165. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  50166. * @param {number} x - The horizontal position of this Game Object in the world.
  50167. * @param {number} y - The vertical position of this Game Object in the world.
  50168. * @param {integer} [width=32] - The width of the Render Texture.
  50169. * @param {integer} [height=32] - The height of the Render Texture.
  50170. */
  50171. var RenderTexture = new Class({
  50172. Extends: GameObject,
  50173. Mixins: [
  50174. Components.Alpha,
  50175. Components.BlendMode,
  50176. Components.ComputedSize,
  50177. Components.Depth,
  50178. Components.Flip,
  50179. Components.GetBounds,
  50180. Components.Mask,
  50181. Components.MatrixStack,
  50182. Components.Origin,
  50183. Components.Pipeline,
  50184. Components.ScaleMode,
  50185. Components.ScrollFactor,
  50186. Components.Tint,
  50187. Components.Transform,
  50188. Components.Visible,
  50189. Render
  50190. ],
  50191. initialize:
  50192. function RenderTexture (scene, x, y, width, height)
  50193. {
  50194. if (width === undefined) { width = 32; }
  50195. if (height === undefined) { height = 32; }
  50196. GameObject.call(this, scene, 'RenderTexture');
  50197. this.initMatrixStack();
  50198. /**
  50199. * A reference to either the Canvas or WebGL Renderer that the Game instance is using.
  50200. *
  50201. * @name Phaser.GameObjects.RenderTexture#renderer
  50202. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  50203. * @since 3.2.0
  50204. */
  50205. this.renderer = scene.sys.game.renderer;
  50206. /**
  50207. * The tint of the Render Texture when rendered.
  50208. *
  50209. * @name Phaser.GameObjects.RenderTexture#globalTint
  50210. * @type {number}
  50211. * @default 0xffffff
  50212. * @since 3.2.0
  50213. */
  50214. this.globalTint = 0xffffff;
  50215. /**
  50216. * The alpha of the Render Texture when rendered.
  50217. *
  50218. * @name Phaser.GameObjects.RenderTexture#globalAlpha
  50219. * @type {number}
  50220. * @default 1
  50221. * @since 3.2.0
  50222. */
  50223. this.globalAlpha = 1;
  50224. /**
  50225. * The HTML Canvas Element that the Render Texture is drawing to.
  50226. * This is only set if Phaser is running with the Canvas Renderer.
  50227. *
  50228. * @name Phaser.GameObjects.RenderTexture#canvas
  50229. * @type {?HTMLCanvasElement}
  50230. * @since 3.2.0
  50231. */
  50232. this.canvas = null;
  50233. /**
  50234. * A reference to the Rendering Context belonging to the Canvas Element this Render Texture is drawing to.
  50235. * This is only set if Phaser is running with the Canvas Renderer.
  50236. *
  50237. * @name Phaser.GameObjects.RenderTexture#context
  50238. * @type {?CanvasRenderingContext2D}
  50239. * @since 3.2.0
  50240. */
  50241. this.context = null;
  50242. /**
  50243. * A reference to the GL Frame Buffer this Render Texture is drawing to.
  50244. * This is only set if Phaser is running with the WebGL Renderer.
  50245. *
  50246. * @name Phaser.GameObjects.RenderTexture#framebuffer
  50247. * @type {?WebGLFramebuffer}
  50248. * @since 3.2.0
  50249. */
  50250. this.framebuffer = null;
  50251. if (this.renderer.type === CONST.WEBGL)
  50252. {
  50253. var gl = this.renderer.gl;
  50254. this.gl = gl;
  50255. this.fill = RenderTextureWebGL.fill;
  50256. this.clear = RenderTextureWebGL.clear;
  50257. this.draw = RenderTextureWebGL.draw;
  50258. this.drawFrame = RenderTextureWebGL.drawFrame;
  50259. this.texture = this.renderer.createTexture2D(0, gl.NEAREST, gl.NEAREST, gl.CLAMP_TO_EDGE, gl.CLAMP_TO_EDGE, gl.RGBA, null, width, height, false);
  50260. this.framebuffer = this.renderer.createFramebuffer(width, height, this.texture, false);
  50261. }
  50262. else if (this.renderer.type === CONST.CANVAS)
  50263. {
  50264. this.fill = RenderTextureCanvas.fill;
  50265. this.clear = RenderTextureCanvas.clear;
  50266. this.draw = RenderTextureCanvas.draw;
  50267. this.drawFrame = RenderTextureCanvas.drawFrame;
  50268. this.canvas = CanvasPool.create2D(this, width, height);
  50269. this.context = this.canvas.getContext('2d');
  50270. }
  50271. this.setPosition(x, y);
  50272. this.setSize(width, height);
  50273. this.initPipeline('TextureTintPipeline');
  50274. },
  50275. /**
  50276. * Resizes the Render Texture to the new dimensions given.
  50277. *
  50278. * In WebGL it will destroy and then re-create the frame buffer being used by the Render Texture.
  50279. * In Canvas it will resize the underlying canvas element.
  50280. * Both approaches will erase everything currently drawn to the Render Texture.
  50281. *
  50282. * If the dimensions given are the same as those already being used, calling this method will do nothing.
  50283. *
  50284. * @method Phaser.GameObjects.RenderTexture#resize
  50285. * @since 3.10.0
  50286. *
  50287. * @param {number} width - The new width of the Render Texture.
  50288. * @param {number} [height] - The new height of the Render Texture. If not specified, will be set the same as the `width`.
  50289. *
  50290. * @return {this} This Render Texture.
  50291. */
  50292. resize: function (width, height)
  50293. {
  50294. if (height === undefined) { height = width; }
  50295. if (width !== this.width || height !== this.height)
  50296. {
  50297. if (this.canvas)
  50298. {
  50299. this.canvas.width = width;
  50300. this.canvas.height = height;
  50301. }
  50302. else
  50303. {
  50304. this.renderer.deleteTexture(this.texture);
  50305. this.renderer.deleteFramebuffer(this.framebuffer);
  50306. var gl = this.renderer.gl;
  50307. this.texture = this.renderer.createTexture2D(0, gl.NEAREST, gl.NEAREST, gl.CLAMP_TO_EDGE, gl.CLAMP_TO_EDGE, gl.RGBA, null, width, height, false);
  50308. this.framebuffer = this.renderer.createFramebuffer(width, height, this.texture, false);
  50309. }
  50310. this.setSize(width, height);
  50311. }
  50312. return this;
  50313. },
  50314. /**
  50315. * Set the tint to use when rendering this Render Texture.
  50316. *
  50317. * @method Phaser.GameObjects.RenderTexture#setGlobalTint
  50318. * @since 3.2.0
  50319. *
  50320. * @param {integer} tint - The tint value.
  50321. *
  50322. * @return {this} This Render Texture.
  50323. */
  50324. setGlobalTint: function (tint)
  50325. {
  50326. this.globalTint = tint;
  50327. return this;
  50328. },
  50329. /**
  50330. * Set the alpha to use when rendering this Render Texture.
  50331. *
  50332. * @method Phaser.GameObjects.RenderTexture#setGlobalAlpha
  50333. * @since 3.2.0
  50334. *
  50335. * @param {number} alpha - The alpha value.
  50336. *
  50337. * @return {this} This Render Texture.
  50338. */
  50339. setGlobalAlpha: function (alpha)
  50340. {
  50341. this.globalAlpha = alpha;
  50342. return this;
  50343. },
  50344. /**
  50345. * Internal destroy handler, called as part of the destroy process.
  50346. *
  50347. * @method Phaser.GameObjects.RenderTexture#preDestroy
  50348. * @protected
  50349. * @since 3.9.0
  50350. */
  50351. preDestroy: function ()
  50352. {
  50353. if (this.renderer && this.renderer.gl)
  50354. {
  50355. this.renderer.deleteTexture(this.texture);
  50356. this.renderer.deleteFramebuffer(this.framebuffer);
  50357. }
  50358. }
  50359. /**
  50360. * Fills the Render Texture with the given color.
  50361. *
  50362. * @method Phaser.GameObjects.RenderTexture#fill
  50363. * @since 3.2.0
  50364. *
  50365. * @param {number} rgb - The color to fill the Render Texture with.
  50366. *
  50367. * @return {Phaser.GameObjects.RenderTexture} This Game Object.
  50368. */
  50369. /**
  50370. * Clears the Render Texture.
  50371. *
  50372. * @method Phaser.GameObjects.RenderTexture#clear
  50373. * @since 3.2.0
  50374. *
  50375. * @return {Phaser.GameObjects.RenderTexture} This Game Object.
  50376. */
  50377. /**
  50378. * Draws a texture frame to the Render Texture at the given position.
  50379. *
  50380. * @method Phaser.GameObjects.RenderTexture#draw
  50381. * @since 3.2.0
  50382. *
  50383. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  50384. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  50385. * @param {number} x - The x position to draw the frame at.
  50386. * @param {number} y - The y position to draw the frame at.
  50387. *
  50388. * @return {Phaser.GameObjects.RenderTexture} This Game Object.
  50389. */
  50390. });
  50391. module.exports = RenderTexture;
  50392. /***/ }),
  50393. /* 241 */
  50394. /***/ (function(module, exports, __webpack_require__) {
  50395. /**
  50396. * @author Richard Davey <rich@photonstorm.com>
  50397. * @copyright 2018 Photon Storm Ltd.
  50398. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  50399. */
  50400. var Class = __webpack_require__(0);
  50401. var Components = __webpack_require__(17);
  50402. var GameObject = __webpack_require__(2);
  50403. var GravityWell = __webpack_require__(429);
  50404. var List = __webpack_require__(93);
  50405. var ParticleEmitter = __webpack_require__(427);
  50406. var Render = __webpack_require__(901);
  50407. /**
  50408. * @classdesc
  50409. * A Particle Emitter Manager creates and controls {@link Phaser.GameObjects.Particles.ParticleEmitter Particle Emitters} and {@link Phaser.GameObjects.Particles.GravityWell Gravity Wells}.
  50410. *
  50411. * @class ParticleEmitterManager
  50412. * @extends Phaser.GameObjects.GameObject
  50413. * @memberOf Phaser.GameObjects.Particles
  50414. * @constructor
  50415. * @since 3.0.0
  50416. *
  50417. * @extends Phaser.GameObjects.Particles.Components.Depth
  50418. * @extends Phaser.GameObjects.Particles.Components.Pipeline
  50419. * @extends Phaser.GameObjects.Particles.Components.Visible
  50420. *
  50421. * @param {Phaser.Scene} scene - The Scene to which this Emitter Manager belongs.
  50422. * @param {string} texture - The key of the Texture this Emitter Manager will use to render particles, as stored in the Texture Manager.
  50423. * @param {(string|integer)} [frame] - An optional frame from the Texture this Emitter Manager will use to render particles.
  50424. * @param {ParticleEmitterConfig|ParticleEmitterConfig[]} [emitters] - Configuration settings for one or more emitters to create.
  50425. */
  50426. var ParticleEmitterManager = new Class({
  50427. Extends: GameObject,
  50428. Mixins: [
  50429. Components.Depth,
  50430. Components.Pipeline,
  50431. Components.Visible,
  50432. Render
  50433. ],
  50434. initialize:
  50435. // frame is optional and can contain the emitters array or object if skipped
  50436. function ParticleEmitterManager (scene, texture, frame, emitters)
  50437. {
  50438. GameObject.call(this, scene, 'ParticleEmitterManager');
  50439. /**
  50440. * The blend mode applied to all emitters and particles.
  50441. *
  50442. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#blendMode
  50443. * @type {integer}
  50444. * @default -1
  50445. * @private
  50446. * @since 3.0.0
  50447. */
  50448. this.blendMode = -1;
  50449. /**
  50450. * The time scale applied to all emitters and particles, affecting flow rate, lifespan, and movement.
  50451. * Values larger than 1 are faster than normal.
  50452. * This is multiplied with any timeScale set on each individual emitter.
  50453. *
  50454. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#timeScale
  50455. * @type {number}
  50456. * @default 1
  50457. * @since 3.0.0
  50458. */
  50459. this.timeScale = 1;
  50460. /**
  50461. * The texture used to render this Emitter Manager's particles.
  50462. *
  50463. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#texture
  50464. * @type {Phaser.Textures.Texture}
  50465. * @default null
  50466. * @since 3.0.0
  50467. */
  50468. this.texture = null;
  50469. /**
  50470. * The texture frame used to render this Emitter Manager's particles.
  50471. *
  50472. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#frame
  50473. * @type {Phaser.Textures.Frame}
  50474. * @default null
  50475. * @since 3.0.0
  50476. */
  50477. this.frame = null;
  50478. /**
  50479. * Names of this Emitter Manager's texture frames.
  50480. *
  50481. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#frameNames
  50482. * @type {string[]}
  50483. * @since 3.0.0
  50484. */
  50485. this.frameNames = [];
  50486. // frame is optional and can contain the emitters array or object if skipped
  50487. if (frame !== null && (typeof frame === 'object' || Array.isArray(frame)))
  50488. {
  50489. emitters = frame;
  50490. frame = null;
  50491. }
  50492. this.setTexture(texture, frame);
  50493. this.initPipeline('TextureTintPipeline');
  50494. /**
  50495. * A list of Emitters being managed by this Emitter Manager.
  50496. *
  50497. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#emitters
  50498. * @type {Phaser.Structs.List.<Phaser.GameObjects.Particles.ParticleEmitter>}
  50499. * @since 3.0.0
  50500. */
  50501. this.emitters = new List(this);
  50502. /**
  50503. * A list of Gravity Wells being managed by this Emitter Manager.
  50504. *
  50505. * @name Phaser.GameObjects.Particles.ParticleEmitterManager#wells
  50506. * @type {Phaser.Structs.List.<Phaser.GameObjects.Particles.GravityWell>}
  50507. * @since 3.0.0
  50508. */
  50509. this.wells = new List(this);
  50510. if (emitters)
  50511. {
  50512. // An array of emitter configs?
  50513. if (!Array.isArray(emitters))
  50514. {
  50515. emitters = [ emitters ];
  50516. }
  50517. for (var i = 0; i < emitters.length; i++)
  50518. {
  50519. this.createEmitter(emitters[i]);
  50520. }
  50521. }
  50522. },
  50523. /**
  50524. * Sets the texture and frame this Emitter Manager will use to render with.
  50525. *
  50526. * Textures are referenced by their string-based keys, as stored in the Texture Manager.
  50527. *
  50528. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#setTexture
  50529. * @since 3.0.0
  50530. *
  50531. * @param {string} key - The key of the texture to be used, as stored in the Texture Manager.
  50532. * @param {(string|integer)} [frame] - The name or index of the frame within the Texture.
  50533. *
  50534. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  50535. */
  50536. setTexture: function (key, frame)
  50537. {
  50538. this.texture = this.scene.sys.textures.get(key);
  50539. return this.setFrame(frame);
  50540. },
  50541. /**
  50542. * Sets the frame this Emitter Manager will use to render with.
  50543. *
  50544. * The Frame has to belong to the current Texture being used.
  50545. *
  50546. * It can be either a string or an index.
  50547. *
  50548. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#setFrame
  50549. * @since 3.0.0
  50550. *
  50551. * @param {(string|integer)} [frame] - The name or index of the frame within the Texture.
  50552. *
  50553. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  50554. */
  50555. setFrame: function (frame)
  50556. {
  50557. this.frame = this.texture.get(frame);
  50558. this.frameNames = this.texture.getFramesFromTextureSource(this.frame.sourceIndex);
  50559. this.defaultFrame = this.frame;
  50560. return this;
  50561. },
  50562. /**
  50563. * Assigns texture frames to an emitter.
  50564. *
  50565. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#setEmitterFrames
  50566. * @since 3.0.0
  50567. *
  50568. * @param {(Phaser.Textures.Frame|Phaser.Textures.Frame[])} frames - The texture frames.
  50569. * @param {Phaser.GameObjects.Particles.ParticleEmitter} emitter - The particle emitter to modify.
  50570. *
  50571. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  50572. */
  50573. setEmitterFrames: function (frames, emitter)
  50574. {
  50575. if (!Array.isArray(frames))
  50576. {
  50577. frames = [ frames ];
  50578. }
  50579. var out = emitter.frames;
  50580. out.length = 0;
  50581. for (var i = 0; i < frames.length; i++)
  50582. {
  50583. var frame = frames[i];
  50584. if (this.frameNames.indexOf(frame) !== -1)
  50585. {
  50586. out.push(this.texture.get(frame));
  50587. }
  50588. }
  50589. if (out.length > 0)
  50590. {
  50591. emitter.defaultFrame = out[0];
  50592. }
  50593. else
  50594. {
  50595. emitter.defaultFrame = this.defaultFrame;
  50596. }
  50597. return this;
  50598. },
  50599. /**
  50600. * Adds an existing Particle Emitter to this Emitter Manager.
  50601. *
  50602. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#addEmitter
  50603. * @since 3.0.0
  50604. *
  50605. * @param {Phaser.GameObjects.Particles.ParticleEmitter} emitter - The Particle Emitter to add to this Emitter Manager.
  50606. *
  50607. * @return {Phaser.GameObjects.Particles.ParticleEmitter} The Particle Emitter that was added to this Emitter Manager.
  50608. */
  50609. addEmitter: function (emitter)
  50610. {
  50611. return this.emitters.add(emitter);
  50612. },
  50613. /**
  50614. * Creates a new Particle Emitter object, adds it to this Emitter Manager and returns a reference to it.
  50615. *
  50616. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#createEmitter
  50617. * @since 3.0.0
  50618. *
  50619. * @param {ParticleEmitterConfig} config - Configuration settings for the Particle Emitter to create.
  50620. *
  50621. * @return {Phaser.GameObjects.Particles.ParticleEmitter} The Particle Emitter that was created.
  50622. */
  50623. createEmitter: function (config)
  50624. {
  50625. return this.addEmitter(new ParticleEmitter(this, config));
  50626. },
  50627. /**
  50628. * Adds an existing Gravity Well object to this Emitter Manager.
  50629. *
  50630. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#addGravityWell
  50631. * @since 3.0.0
  50632. *
  50633. * @param {Phaser.GameObjects.Particles.GravityWell} well - The Gravity Well to add to this Emitter Manager.
  50634. *
  50635. * @return {Phaser.GameObjects.Particles.GravityWell} The Gravity Well that was added to this Emitter Manager.
  50636. */
  50637. addGravityWell: function (well)
  50638. {
  50639. return this.wells.add(well);
  50640. },
  50641. /**
  50642. * Creates a new Gravity Well, adds it to this Emitter Manager and returns a reference to it.
  50643. *
  50644. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#createGravityWell
  50645. * @since 3.0.0
  50646. *
  50647. * @param {GravityWellConfig} config - Configuration settings for the Gravity Well to create.
  50648. *
  50649. * @return {Phaser.GameObjects.Particles.GravityWell} The Gravity Well that was created.
  50650. */
  50651. createGravityWell: function (config)
  50652. {
  50653. return this.addGravityWell(new GravityWell(config));
  50654. },
  50655. /**
  50656. * Emits particles from each active emitter.
  50657. *
  50658. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#emitParticle
  50659. * @since 3.0.0
  50660. *
  50661. * @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}.
  50662. * @param {number} [x] - The x-coordinate to to emit particles from. The default is the x-coordinate of the emitter's current location.
  50663. * @param {number} [y] - The y-coordinate to to emit particles from. The default is the y-coordinate of the emitter's current location.
  50664. *
  50665. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  50666. */
  50667. emitParticle: function (count, x, y)
  50668. {
  50669. var emitters = this.emitters.list;
  50670. for (var i = 0; i < emitters.length; i++)
  50671. {
  50672. var emitter = emitters[i];
  50673. if (emitter.active)
  50674. {
  50675. emitter.emitParticle(count, x, y);
  50676. }
  50677. }
  50678. return this;
  50679. },
  50680. /**
  50681. * Emits particles from each active emitter.
  50682. *
  50683. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#emitParticleAt
  50684. * @since 3.0.0
  50685. *
  50686. * @param {number} [x] - The x-coordinate to to emit particles from. The default is the x-coordinate of the emitter's current location.
  50687. * @param {number} [y] - The y-coordinate to to emit particles from. The default is the y-coordinate of the emitter's current location.
  50688. * @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}.
  50689. *
  50690. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  50691. */
  50692. emitParticleAt: function (x, y, count)
  50693. {
  50694. return this.emitParticle(count, x, y);
  50695. },
  50696. /**
  50697. * Pauses this Emitter Manager.
  50698. *
  50699. * This has the effect of pausing all emitters, and all particles of those emitters, currently under its control.
  50700. *
  50701. * The particles will still render, but they will not have any of their logic updated.
  50702. *
  50703. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#pause
  50704. * @since 3.0.0
  50705. *
  50706. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  50707. */
  50708. pause: function ()
  50709. {
  50710. this.active = false;
  50711. return this;
  50712. },
  50713. /**
  50714. * Resumes this Emitter Manager, should it have been previously paused.
  50715. *
  50716. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#resume
  50717. * @since 3.0.0
  50718. *
  50719. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} This Emitter Manager.
  50720. */
  50721. resume: function ()
  50722. {
  50723. this.active = true;
  50724. return this;
  50725. },
  50726. /**
  50727. * Gets all active particle processors (gravity wells).
  50728. *
  50729. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#getProcessors
  50730. * @since 3.0.0
  50731. *
  50732. * @return {Phaser.GameObjects.Particles.GravityWell[]} - The active gravity wells.
  50733. */
  50734. getProcessors: function ()
  50735. {
  50736. return this.wells.getAll('active', true);
  50737. },
  50738. /**
  50739. * Updates all active emitters.
  50740. *
  50741. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#preUpdate
  50742. * @since 3.0.0
  50743. *
  50744. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  50745. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  50746. */
  50747. preUpdate: function (time, delta)
  50748. {
  50749. // Scale the delta
  50750. delta *= this.timeScale;
  50751. var emitters = this.emitters.list;
  50752. for (var i = 0; i < emitters.length; i++)
  50753. {
  50754. var emitter = emitters[i];
  50755. if (emitter.active)
  50756. {
  50757. emitter.preUpdate(time, delta);
  50758. }
  50759. }
  50760. },
  50761. /**
  50762. * A NOOP method so you can pass an EmitterManager to a Container.
  50763. * Calling this method will do nothing. It is intentionally empty.
  50764. *
  50765. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#setAlpha
  50766. * @private
  50767. * @since 3.10.0
  50768. */
  50769. setAlpha: function ()
  50770. {
  50771. },
  50772. /**
  50773. * A NOOP method so you can pass an EmitterManager to a Container.
  50774. * Calling this method will do nothing. It is intentionally empty.
  50775. *
  50776. * @method Phaser.GameObjects.Particles.ParticleEmitterManager#setScrollFactor
  50777. * @private
  50778. * @since 3.10.0
  50779. */
  50780. setScrollFactor: function ()
  50781. {
  50782. }
  50783. });
  50784. module.exports = ParticleEmitterManager;
  50785. /***/ }),
  50786. /* 242 */
  50787. /***/ (function(module, exports) {
  50788. /**
  50789. * @author Richard Davey <rich@photonstorm.com>
  50790. * @copyright 2018 Photon Storm Ltd.
  50791. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  50792. */
  50793. /**
  50794. * Generate a random floating point number between the two given bounds, minimum inclusive, maximum exclusive.
  50795. *
  50796. * @function Phaser.Math.FloatBetween
  50797. * @since 3.0.0
  50798. *
  50799. * @param {number} min - The lower bound for the float, inclusive.
  50800. * @param {number} max - The upper bound for the float exclusive.
  50801. *
  50802. * @return {number} A random float within the given range.
  50803. */
  50804. var FloatBetween = function (min, max)
  50805. {
  50806. return Math.random() * (max - min) + min;
  50807. };
  50808. module.exports = FloatBetween;
  50809. /***/ }),
  50810. /* 243 */
  50811. /***/ (function(module, exports, __webpack_require__) {
  50812. /**
  50813. * @author Richard Davey <rich@photonstorm.com>
  50814. * @copyright 2018 Photon Storm Ltd.
  50815. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  50816. */
  50817. var Ellipse = __webpack_require__(114);
  50818. Ellipse.Area = __webpack_require__(443);
  50819. Ellipse.Circumference = __webpack_require__(182);
  50820. Ellipse.CircumferencePoint = __webpack_require__(113);
  50821. Ellipse.Clone = __webpack_require__(442);
  50822. Ellipse.Contains = __webpack_require__(55);
  50823. Ellipse.ContainsPoint = __webpack_require__(441);
  50824. Ellipse.ContainsRect = __webpack_require__(440);
  50825. Ellipse.CopyFrom = __webpack_require__(439);
  50826. Ellipse.Equals = __webpack_require__(438);
  50827. Ellipse.GetBounds = __webpack_require__(437);
  50828. Ellipse.GetPoint = __webpack_require__(184);
  50829. Ellipse.GetPoints = __webpack_require__(183);
  50830. Ellipse.Offset = __webpack_require__(436);
  50831. Ellipse.OffsetPoint = __webpack_require__(435);
  50832. Ellipse.Random = __webpack_require__(135);
  50833. module.exports = Ellipse;
  50834. /***/ }),
  50835. /* 244 */
  50836. /***/ (function(module, exports, __webpack_require__) {
  50837. /**
  50838. * @author Richard Davey <rich@photonstorm.com>
  50839. * @copyright 2018 Photon Storm Ltd.
  50840. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  50841. */
  50842. var BitmapText = __webpack_require__(148);
  50843. var Class = __webpack_require__(0);
  50844. var Render = __webpack_require__(906);
  50845. /**
  50846. * @typedef {object} DisplayCallbackConfig
  50847. *
  50848. * @property {{topLeft:number, topRight:number, bottomLeft:number, bottomRight:number}} tint - The tint of the character being rendered.
  50849. * @property {number} index - The index of the character being rendered.
  50850. * @property {number} charCode - The character code of the character being rendered.
  50851. * @property {number} x - The x position of the character being rendered.
  50852. * @property {number} y - The y position of the character being rendered.
  50853. * @property {number} scale - The scale of the character being rendered.
  50854. * @property {number} rotation - The rotation of the character being rendered.
  50855. * @property {any} data - Custom data stored with the character being rendered.
  50856. */
  50857. /**
  50858. * @callback DisplayCallback
  50859. *
  50860. * @param {DisplayCallbackConfig} display - Settings of the character that is about to be rendered.
  50861. *
  50862. * @return {{x:number, y:number, scale:number, rotation:number}} Altered position, scale and rotation values for the character that is about to be rendered.
  50863. */
  50864. /**
  50865. * @classdesc
  50866. * [description]
  50867. *
  50868. * @class DynamicBitmapText
  50869. * @extends Phaser.GameObjects.BitmapText
  50870. * @memberOf Phaser.GameObjects
  50871. * @constructor
  50872. * @since 3.0.0
  50873. *
  50874. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. It can only belong to one Scene at any given time.
  50875. * @param {number} x - The x coordinate of this Game Object in world space.
  50876. * @param {number} y - The y coordinate of this Game Object in world space.
  50877. * @param {string} font - The key of the font to use from the Bitmap Font cache.
  50878. * @param {(string|string[])} [text] - The string, or array of strings, to be set as the content of this Bitmap Text.
  50879. * @param {number} [size] - The font size of this Bitmap Text.
  50880. * @param {integer} [align=0] - The alignment of the text in a multi-line BitmapText object.
  50881. */
  50882. var DynamicBitmapText = new Class({
  50883. Extends: BitmapText,
  50884. Mixins: [
  50885. Render
  50886. ],
  50887. initialize:
  50888. function DynamicBitmapText (scene, x, y, font, text, size, align)
  50889. {
  50890. BitmapText.call(this, scene, x, y, font, text, size, align);
  50891. this.type = 'DynamicBitmapText';
  50892. /**
  50893. * The horizontal scroll position of the Bitmap Text.
  50894. *
  50895. * @name Phaser.GameObjects.DynamicBitmapText#scrollX
  50896. * @type {number}
  50897. * @default 0
  50898. * @since 3.0.0
  50899. */
  50900. this.scrollX = 0;
  50901. /**
  50902. * The vertical scroll position of the Bitmap Text.
  50903. *
  50904. * @name Phaser.GameObjects.DynamicBitmapText#scrollY
  50905. * @type {number}
  50906. * @default 0
  50907. * @since 3.0.0
  50908. */
  50909. this.scrollY = 0;
  50910. /**
  50911. * The crop width of the Bitmap Text.
  50912. *
  50913. * @name Phaser.GameObjects.DynamicBitmapText#cropWidth
  50914. * @type {number}
  50915. * @default 0
  50916. * @since 3.0.0
  50917. */
  50918. this.cropWidth = 0;
  50919. /**
  50920. * The crop height of the Bitmap Text.
  50921. *
  50922. * @name Phaser.GameObjects.DynamicBitmapText#cropHeight
  50923. * @type {number}
  50924. * @default 0
  50925. * @since 3.0.0
  50926. */
  50927. this.cropHeight = 0;
  50928. /**
  50929. * A callback that alters how each character of the Bitmap Text is rendered.
  50930. *
  50931. * @name Phaser.GameObjects.DynamicBitmapText#displayCallback
  50932. * @type {DisplayCallback}
  50933. * @since 3.0.0
  50934. */
  50935. this.displayCallback;
  50936. /**
  50937. * The data object that is populated during rendering, then passed to the displayCallback.
  50938. * You should modify this object then return it back from the callback. It's updated values
  50939. * will be used to render the specific glyph.
  50940. *
  50941. * Please note that if you need a reference to this object locally in your game code then you
  50942. * should shallow copy it, as it's updated and re-used for every glyph in the text.
  50943. *
  50944. * @name Phaser.GameObjects.DynamicBitmapText#callbackData
  50945. * @type {DisplayCallbackConfig}
  50946. * @since 3.11.0
  50947. */
  50948. this.callbackData = {
  50949. color: 0,
  50950. tint: {
  50951. topLeft: 0,
  50952. topRight: 0,
  50953. bottomLeft: 0,
  50954. bottomRight: 0
  50955. },
  50956. index: 0,
  50957. charCode: 0,
  50958. x: 0,
  50959. y: 0,
  50960. scale: 0,
  50961. rotation: 0,
  50962. data: 0
  50963. };
  50964. },
  50965. /**
  50966. * Set the crop size of this Bitmap Text.
  50967. *
  50968. * @method Phaser.GameObjects.DynamicBitmapText#setSize
  50969. * @since 3.0.0
  50970. *
  50971. * @param {number} width - The width of the crop.
  50972. * @param {number} height - The height of the crop.
  50973. *
  50974. * @return {Phaser.GameObjects.DynamicBitmapText} This Game Object.
  50975. */
  50976. setSize: function (width, height)
  50977. {
  50978. this.cropWidth = width;
  50979. this.cropHeight = height;
  50980. return this;
  50981. },
  50982. /**
  50983. * Set a callback that alters how each character of the Bitmap Text is rendered.
  50984. *
  50985. * The callback receives a {@link DisplayCallbackConfig} object that contains information about the character that's
  50986. * about to be rendered.
  50987. *
  50988. * It should return an object with `x`, `y`, `scale` and `rotation` properties that will be used instead of the
  50989. * usual values when rendering.
  50990. *
  50991. * @method Phaser.GameObjects.DynamicBitmapText#setDisplayCallback
  50992. * @since 3.0.0
  50993. *
  50994. * @param {DisplayCallback} callback - The display callback to set.
  50995. *
  50996. * @return {Phaser.GameObjects.DynamicBitmapText} This Game Object.
  50997. */
  50998. setDisplayCallback: function (callback)
  50999. {
  51000. this.displayCallback = callback;
  51001. return this;
  51002. },
  51003. /**
  51004. * Set the horizontal scroll position of this Bitmap Text.
  51005. *
  51006. * @method Phaser.GameObjects.DynamicBitmapText#setScrollX
  51007. * @since 3.0.0
  51008. *
  51009. * @param {number} value - The horizontal scroll position to set.
  51010. *
  51011. * @return {Phaser.GameObjects.DynamicBitmapText} This Game Object.
  51012. */
  51013. setScrollX: function (value)
  51014. {
  51015. this.scrollX = value;
  51016. return this;
  51017. },
  51018. /**
  51019. * Set the vertical scroll position of this Bitmap Text.
  51020. *
  51021. * @method Phaser.GameObjects.DynamicBitmapText#setScrollY
  51022. * @since 3.0.0
  51023. *
  51024. * @param {number} value - The vertical scroll position to set.
  51025. *
  51026. * @return {Phaser.GameObjects.DynamicBitmapText} This Game Object.
  51027. */
  51028. setScrollY: function (value)
  51029. {
  51030. this.scrollY = value;
  51031. return this;
  51032. }
  51033. });
  51034. module.exports = DynamicBitmapText;
  51035. /***/ }),
  51036. /* 245 */
  51037. /***/ (function(module, exports, __webpack_require__) {
  51038. /**
  51039. * @author Richard Davey <rich@photonstorm.com>
  51040. * @author Felipe Alfonso <@bitnenfer>
  51041. * @copyright 2018 Photon Storm Ltd.
  51042. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  51043. */
  51044. var ArrayUtils = __webpack_require__(150);
  51045. var Class = __webpack_require__(0);
  51046. var Components = __webpack_require__(17);
  51047. var GameObject = __webpack_require__(2);
  51048. var Rectangle = __webpack_require__(13);
  51049. var Render = __webpack_require__(909);
  51050. var Union = __webpack_require__(444);
  51051. var Vector2 = __webpack_require__(6);
  51052. /**
  51053. * @classdesc
  51054. * A Container Game Object.
  51055. *
  51056. * A Container, as the name implies, can 'contain' other types of Game Object.
  51057. * When a Game Object is added to a Container, the Container becomes responsible for the rendering of it.
  51058. * By default it will be removed from the Display List and instead added to the Containers own internal list.
  51059. *
  51060. * The position of the Game Object automatically becomes relative to the position of the Container.
  51061. *
  51062. * When the Container is rendered, all of its children are rendered as well, in the order in which they exist
  51063. * within the Container. Container children can be repositioned using methods such as `MoveUp`, `MoveDown` and `SendToBack`.
  51064. *
  51065. * If you modify a transform property of the Container, such as `Container.x` or `Container.rotation` then it will
  51066. * automatically influence all children as well.
  51067. *
  51068. * Containers can include other Containers for deeply nested transforms.
  51069. *
  51070. * Containers can have masks set on them and can be used as a mask too. However, Container children cannot be masked.
  51071. * The masks do not 'stack up'. Only a Container on the root of the display list will use its mask.
  51072. *
  51073. * Containers can be enabled for input. Because they do not have a texture you need to provide a shape for them
  51074. * to use as their hit area. Container children can also be enabled for input, independent of the Container.
  51075. *
  51076. * Containers can be given a physics body for either Arcade Physics, Impact Physics or Matter Physics. However,
  51077. * if Container _children_ are enabled for physics you may get unexpected results, such as offset bodies,
  51078. * if the Container itself, or any of its ancestors, is positioned anywhere other than at 0 x 0. Container children
  51079. * with physics do not factor in the Container due to the excessive extra calculations needed. Please structure
  51080. * your game to work around this.
  51081. *
  51082. * It's important to understand the impact of using Containers. They add additional processing overhead into
  51083. * every one of their children. The deeper you nest them, the more the cost escalates. This is especially true
  51084. * for input events. You also loose the ability to set the display depth of Container children in the same
  51085. * flexible manner as those not within them. In short, don't use them for the sake of it. You pay a small cost
  51086. * every time you create one, try to structure your game around avoiding that where possible.
  51087. *
  51088. * @class Container
  51089. * @extends Phaser.GameObjects.GameObject
  51090. * @memberOf Phaser.GameObjects
  51091. * @constructor
  51092. * @since 3.4.0
  51093. *
  51094. * @extends Phaser.GameObjects.Components.Alpha
  51095. * @extends Phaser.GameObjects.Components.BlendMode
  51096. * @extends Phaser.GameObjects.Components.ComputedSize
  51097. * @extends Phaser.GameObjects.Components.Depth
  51098. * @extends Phaser.GameObjects.Components.Mask
  51099. * @extends Phaser.GameObjects.Components.ScrollFactor
  51100. * @extends Phaser.GameObjects.Components.Transform
  51101. * @extends Phaser.GameObjects.Components.Visible
  51102. *
  51103. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  51104. * @param {number} [x=0] - The horizontal position of this Game Object in the world.
  51105. * @param {number} [y=0] - The vertical position of this Game Object in the world.
  51106. * @param {Phaser.GameObjects.GameObject[]} [children] - An optional array of Game Objects to add to this Container.
  51107. */
  51108. var Container = new Class({
  51109. Extends: GameObject,
  51110. Mixins: [
  51111. Components.Alpha,
  51112. Components.BlendMode,
  51113. Components.ComputedSize,
  51114. Components.Depth,
  51115. Components.Mask,
  51116. Components.ScrollFactor,
  51117. Components.Transform,
  51118. Components.Visible,
  51119. Render
  51120. ],
  51121. initialize:
  51122. function Container (scene, x, y, children)
  51123. {
  51124. GameObject.call(this, scene, 'Container');
  51125. /**
  51126. * An array holding the children of this Container.
  51127. *
  51128. * @name Phaser.GameObjects.Container#list
  51129. * @type {Phaser.GameObjects.GameObject[]}
  51130. * @since 3.4.0
  51131. */
  51132. this.list = [];
  51133. /**
  51134. * Does this Container exclusively manage its children?
  51135. *
  51136. * The default is `true` which means a child added to this Container cannot
  51137. * belong in another Container, which includes the Scene display list.
  51138. *
  51139. * If you disable this then this Container will no longer exclusively manage its children.
  51140. * This allows you to create all kinds of interesting graphical effects, such as replicating
  51141. * Game Objects without reparenting them all over the Scene.
  51142. * However, doing so will prevent children from receiving any kind of input event or have
  51143. * their physics bodies work by default, as they're no longer a single entity on the
  51144. * display list, but are being replicated where-ever this Container is.
  51145. *
  51146. * @name Phaser.GameObjects.Container#exclusive
  51147. * @type {boolean}
  51148. * @default true
  51149. * @since 3.4.0
  51150. */
  51151. this.exclusive = true;
  51152. /**
  51153. * Containers can have an optional maximum size. If set to anything above 0 it
  51154. * will constrict the addition of new Game Objects into the Container, capping off
  51155. * the maximum limit the Container can grow in size to.
  51156. *
  51157. * @name Phaser.GameObjects.Container#maxSize
  51158. * @type {integer}
  51159. * @default -1
  51160. * @since 3.4.0
  51161. */
  51162. this.maxSize = -1;
  51163. /**
  51164. * The cursor position.
  51165. *
  51166. * @name Phaser.GameObjects.Container#position
  51167. * @type {integer}
  51168. * @since 3.4.0
  51169. */
  51170. this.position = 0;
  51171. /**
  51172. * Internal Transform Matrix used for local space conversion.
  51173. *
  51174. * @name Phaser.GameObjects.Container#localTransform
  51175. * @type {Phaser.GameObjects.Components.TransformMatrix}
  51176. * @since 3.4.0
  51177. */
  51178. this.localTransform = new Components.TransformMatrix();
  51179. /**
  51180. * Internal temporary Transform Matrix used to avoid object creation.
  51181. *
  51182. * @name Phaser.GameObjects.Container#tempTransformMatrix
  51183. * @type {Phaser.GameObjects.Components.TransformMatrix}
  51184. * @private
  51185. * @since 3.4.0
  51186. */
  51187. this.tempTransformMatrix = new Components.TransformMatrix();
  51188. /**
  51189. * A reference to the Scene Display List.
  51190. *
  51191. * @name Phaser.GameObjects.Container#_displayList
  51192. * @type {Phaser.GameObjects.DisplayList}
  51193. * @private
  51194. * @since 3.4.0
  51195. */
  51196. this._displayList = scene.sys.displayList;
  51197. /**
  51198. * The property key to sort by.
  51199. *
  51200. * @name Phaser.GameObjects.Container#_sortKey
  51201. * @type {string}
  51202. * @private
  51203. * @since 3.4.0
  51204. */
  51205. this._sortKey = '';
  51206. /**
  51207. * A reference to the Scene Systems Event Emitter.
  51208. *
  51209. * @name Phaser.GameObjects.Container#_sysEvents
  51210. * @type {Phaser.Events.EventEmitter}
  51211. * @private
  51212. * @since 3.9.0
  51213. */
  51214. this._sysEvents = scene.sys.events;
  51215. this.setPosition(x, y);
  51216. this.clearAlpha();
  51217. if (children)
  51218. {
  51219. this.add(children);
  51220. }
  51221. },
  51222. /**
  51223. * Internal value to allow Containers to be used for input and physics.
  51224. * Do not change this value. It has no effect other than to break things.
  51225. *
  51226. * @name Phaser.GameObjects.Container#originX
  51227. * @type {number}
  51228. * @readOnly
  51229. * @since 3.4.0
  51230. */
  51231. originX: {
  51232. get: function ()
  51233. {
  51234. return 0.5;
  51235. }
  51236. },
  51237. /**
  51238. * Internal value to allow Containers to be used for input and physics.
  51239. * Do not change this value. It has no effect other than to break things.
  51240. *
  51241. * @name Phaser.GameObjects.Container#originY
  51242. * @type {number}
  51243. * @readOnly
  51244. * @since 3.4.0
  51245. */
  51246. originY: {
  51247. get: function ()
  51248. {
  51249. return 0.5;
  51250. }
  51251. },
  51252. /**
  51253. * Internal value to allow Containers to be used for input and physics.
  51254. * Do not change this value. It has no effect other than to break things.
  51255. *
  51256. * @name Phaser.GameObjects.Container#displayOriginX
  51257. * @type {number}
  51258. * @readOnly
  51259. * @since 3.4.0
  51260. */
  51261. displayOriginX: {
  51262. get: function ()
  51263. {
  51264. return this.width * 0.5;
  51265. }
  51266. },
  51267. /**
  51268. * Internal value to allow Containers to be used for input and physics.
  51269. * Do not change this value. It has no effect other than to break things.
  51270. *
  51271. * @name Phaser.GameObjects.Container#displayOriginY
  51272. * @type {number}
  51273. * @readOnly
  51274. * @since 3.4.0
  51275. */
  51276. displayOriginY: {
  51277. get: function ()
  51278. {
  51279. return this.height * 0.5;
  51280. }
  51281. },
  51282. /**
  51283. * Does this Container exclusively manage its children?
  51284. *
  51285. * The default is `true` which means a child added to this Container cannot
  51286. * belong in another Container, which includes the Scene display list.
  51287. *
  51288. * If you disable this then this Container will no longer exclusively manage its children.
  51289. * This allows you to create all kinds of interesting graphical effects, such as replicating
  51290. * Game Objects without reparenting them all over the Scene.
  51291. * However, doing so will prevent children from receiving any kind of input event or have
  51292. * their physics bodies work by default, as they're no longer a single entity on the
  51293. * display list, but are being replicated where-ever this Container is.
  51294. *
  51295. * @method Phaser.GameObjects.Container#setExclusive
  51296. * @since 3.4.0
  51297. *
  51298. * @param {boolean} [value=true] - The exclusive state of this Container.
  51299. *
  51300. * @return {Phaser.GameObjects.Container} This Container.
  51301. */
  51302. setExclusive: function (value)
  51303. {
  51304. if (value === undefined) { value = true; }
  51305. this.exclusive = value;
  51306. return this;
  51307. },
  51308. /**
  51309. * Gets the bounds of this Container. It works by iterating all children of the Container,
  51310. * getting their respective bounds, and then working out a min-max rectangle from that.
  51311. * It does not factor in if the children render or not, all are included.
  51312. *
  51313. * Some children are unable to return their bounds, such as Graphics objects, in which case
  51314. * they are skipped.
  51315. *
  51316. * Depending on the quantity of children in this Container it could be a really expensive call,
  51317. * so cache it and only poll it as needed.
  51318. *
  51319. * The values are stored and returned in a Rectangle object.
  51320. *
  51321. * @method Phaser.GameObjects.Container#getBounds
  51322. * @since 3.4.0
  51323. *
  51324. * @param {Phaser.Geom.Rectangle} [output] - A Geom.Rectangle object to store the values in. If not provided a new Rectangle will be created.
  51325. *
  51326. * @return {Phaser.Geom.Rectangle} The values stored in the output object.
  51327. */
  51328. getBounds: function (output)
  51329. {
  51330. if (output === undefined) { output = new Rectangle(); }
  51331. output.setTo(this.x, this.y, 0, 0);
  51332. if (this.list.length > 0)
  51333. {
  51334. var children = this.list;
  51335. var tempRect = new Rectangle();
  51336. for (var i = 0; i < children.length; i++)
  51337. {
  51338. var entry = children[i];
  51339. if (entry.getBounds)
  51340. {
  51341. entry.getBounds(tempRect);
  51342. Union(tempRect, output, output);
  51343. }
  51344. }
  51345. }
  51346. return output;
  51347. },
  51348. /**
  51349. * Internal add handler.
  51350. *
  51351. * @method Phaser.GameObjects.Container#addHandler
  51352. * @private
  51353. * @since 3.4.0
  51354. *
  51355. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that was just added to this Container.
  51356. */
  51357. addHandler: function (gameObject)
  51358. {
  51359. gameObject.once('destroy', this.remove, this);
  51360. if (this.exclusive)
  51361. {
  51362. this._displayList.remove(gameObject);
  51363. if (gameObject.parentContainer)
  51364. {
  51365. gameObject.parentContainer.remove(gameObject);
  51366. }
  51367. gameObject.parentContainer = this;
  51368. }
  51369. // Game Objects automatically listen to the Scene shutdown event, but
  51370. // we don't need this if they're in a Container
  51371. this._sysEvents.off('shutdown', gameObject.destroy, gameObject);
  51372. },
  51373. /**
  51374. * Internal remove handler.
  51375. *
  51376. * @method Phaser.GameObjects.Container#removeHandler
  51377. * @private
  51378. * @since 3.4.0
  51379. *
  51380. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that was just removed from this Container.
  51381. */
  51382. removeHandler: function (gameObject)
  51383. {
  51384. gameObject.off('destroy', this.remove);
  51385. if (this.exclusive)
  51386. {
  51387. gameObject.parentContainer = null;
  51388. this._sysEvents.once('shutdown', gameObject.destroy, gameObject);
  51389. }
  51390. },
  51391. /**
  51392. * Takes a Point-like object, such as a Vector2, Geom.Point or object with public x and y properties,
  51393. * and transforms it into the space of this Container, then returns it in the output object.
  51394. *
  51395. * @method Phaser.GameObjects.Container#pointToContainer
  51396. * @since 3.4.0
  51397. *
  51398. * @param {(object|Phaser.Geom.Point|Phaser.Math.Vector2)} source - The Source Point to be transformed.
  51399. * @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.
  51400. *
  51401. * @return {(object|Phaser.Geom.Point|Phaser.Math.Vector2)} The transformed point.
  51402. */
  51403. pointToContainer: function (source, output)
  51404. {
  51405. if (output === undefined) { output = new Vector2(); }
  51406. if (this.parentContainer)
  51407. {
  51408. return this.parentContainer.pointToContainer(source, output);
  51409. }
  51410. var tempMatrix = this.tempTransformMatrix;
  51411. // No need to loadIdentity because applyITRS overwrites every value anyway
  51412. tempMatrix.applyITRS(this.x, this.y, this.rotation, this.scaleX, this.scaleY);
  51413. tempMatrix.invert();
  51414. tempMatrix.transformPoint(source.x, source.y, output);
  51415. return output;
  51416. },
  51417. /**
  51418. * Returns the world transform matrix as used for Bounds checks.
  51419. * The returned matrix is temporal and shouldn't be stored.
  51420. *
  51421. * @method Phaser.GameObjects.Container#getBoundsTransformMatrix
  51422. * @since 3.4.0
  51423. *
  51424. * @return {Phaser.GameObjects.Components.TransformMatrix} The world transform matrix.
  51425. */
  51426. getBoundsTransformMatrix: function ()
  51427. {
  51428. return this.getWorldTransformMatrix(this.tempTransformMatrix);
  51429. },
  51430. /**
  51431. * Adds the given Game Object, or array of Game Objects, to this Container.
  51432. *
  51433. * Each Game Object must be unique within the Container.
  51434. *
  51435. * @method Phaser.GameObjects.Container#add
  51436. * @since 3.4.0
  51437. *
  51438. * @param {Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]} child - The Game Object, or array of Game Objects, to add to the Container.
  51439. *
  51440. * @return {Phaser.GameObjects.Container} This Container instance.
  51441. */
  51442. add: function (child)
  51443. {
  51444. ArrayUtils.Add(this.list, child, this.maxSize, this.addHandler, this);
  51445. return this;
  51446. },
  51447. /**
  51448. * Adds the given Game Object, or array of Game Objects, to this Container at the specified position.
  51449. *
  51450. * Existing Game Objects in the Container are shifted up.
  51451. *
  51452. * Each Game Object must be unique within the Container.
  51453. *
  51454. * @method Phaser.GameObjects.Container#addAt
  51455. * @since 3.4.0
  51456. *
  51457. * @param {Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]} child - The Game Object, or array of Game Objects, to add to the Container.
  51458. * @param {integer} [index=0] - The position to insert the Game Object/s at.
  51459. *
  51460. * @return {Phaser.GameObjects.Container} This Container instance.
  51461. */
  51462. addAt: function (child, index)
  51463. {
  51464. ArrayUtils.AddAt(this.list, child, index, this.maxSize, this.addHandler, this);
  51465. return this;
  51466. },
  51467. /**
  51468. * Returns the Game Object at the given position in this Container.
  51469. *
  51470. * @method Phaser.GameObjects.Container#getAt
  51471. * @since 3.4.0
  51472. *
  51473. * @param {integer} index - The position to get the Game Object from.
  51474. *
  51475. * @return {?Phaser.GameObjects.GameObject} The Game Object at the specified index, or `null` if none found.
  51476. */
  51477. getAt: function (index)
  51478. {
  51479. return this.list[index];
  51480. },
  51481. /**
  51482. * Returns the index of the given Game Object in this Container.
  51483. *
  51484. * @method Phaser.GameObjects.Container#getIndex
  51485. * @since 3.4.0
  51486. *
  51487. * @param {Phaser.GameObjects.GameObject} child - The Game Object to search for in this Container.
  51488. *
  51489. * @return {integer} The index of the Game Object in this Container, or -1 if not found.
  51490. */
  51491. getIndex: function (child)
  51492. {
  51493. return this.list.indexOf(child);
  51494. },
  51495. /**
  51496. * Sort the contents of this Container so the items are in order based on the given property.
  51497. * For example: `sort('alpha')` would sort the elements based on the value of their `alpha` property.
  51498. *
  51499. * @method Phaser.GameObjects.Container#sort
  51500. * @since 3.4.0
  51501. *
  51502. * @param {string} property - The property to lexically sort by.
  51503. *
  51504. * @return {Phaser.GameObjects.Container} This Container instance.
  51505. */
  51506. sort: function (property)
  51507. {
  51508. if (property)
  51509. {
  51510. this._sortKey = property;
  51511. ArrayUtils.StableSort.inplace(this.list, this.sortHandler);
  51512. }
  51513. return this;
  51514. },
  51515. /**
  51516. * Internal sort handler method.
  51517. *
  51518. * @method Phaser.GameObjects.Container#sortHandler
  51519. * @private
  51520. * @since 3.4.0
  51521. *
  51522. * @param {Phaser.GameObjects.GameObject} childA - The first child to sort.
  51523. * @param {Phaser.GameObjects.GameObject} childB - The second child to sort.
  51524. *
  51525. * @return {integer} The sort results.
  51526. */
  51527. sortHandler: function (childA, childB)
  51528. {
  51529. return childA[this._sortKey] - childB[this._sortKey];
  51530. },
  51531. /**
  51532. * Searches for the first instance of a child with its `name` property matching the given argument.
  51533. * Should more than one child have the same name only the first is returned.
  51534. *
  51535. * @method Phaser.GameObjects.Container#getByName
  51536. * @since 3.4.0
  51537. *
  51538. * @param {string} name - The name to search for.
  51539. *
  51540. * @return {?Phaser.GameObjects.GameObject} The first child with a matching name, or `null` if none were found.
  51541. */
  51542. getByName: function (name)
  51543. {
  51544. return ArrayUtils.GetFirst(this.list, 'name', name);
  51545. },
  51546. /**
  51547. * Returns a random Game Object from this Container.
  51548. *
  51549. * @method Phaser.GameObjects.Container#getRandom
  51550. * @since 3.4.0
  51551. *
  51552. * @param {integer} [startIndex=0] - An optional start index.
  51553. * @param {integer} [length] - An optional length, the total number of elements (from the startIndex) to choose from.
  51554. *
  51555. * @return {?Phaser.GameObjects.GameObject} A random child from the Container, or `null` if the Container is empty.
  51556. */
  51557. getRandom: function (startIndex, length)
  51558. {
  51559. return ArrayUtils.GetRandom(this.list, startIndex, length);
  51560. },
  51561. /**
  51562. * Gets the first Game Object in this Container.
  51563. *
  51564. * You can also specify a property and value to search for, in which case it will return the first
  51565. * Game Object in this Container with a matching property and / or value.
  51566. *
  51567. * For example: `getFirst('visible', true)` would return the first Game Object that had its `visible` property set.
  51568. *
  51569. * You can limit the search to the `startIndex` - `endIndex` range.
  51570. *
  51571. * @method Phaser.GameObjects.Container#getFirst
  51572. * @since 3.4.0
  51573. *
  51574. * @param {string} [property] - The property to test on each Game Object in the Container.
  51575. * @param {*} [value] - The value to test the property against. Must pass a strict (`===`) comparison check.
  51576. * @param {integer} [startIndex=0] - An optional start index to search from.
  51577. * @param {integer} [endIndex=Container.length] - An optional end index to search up to (but not included)
  51578. *
  51579. * @return {?Phaser.GameObjects.GameObject} The first matching Game Object, or `null` if none was found.
  51580. */
  51581. getFirst: function (property, value, startIndex, endIndex)
  51582. {
  51583. return ArrayUtils.GetFirstElement(this.list, property, value, startIndex, endIndex);
  51584. },
  51585. /**
  51586. * Returns all Game Objects in this Container.
  51587. *
  51588. * You can optionally specify a matching criteria using the `property` and `value` arguments.
  51589. *
  51590. * For example: `getAll('body')` would return only Game Objects that have a body property.
  51591. *
  51592. * You can also specify a value to compare the property to:
  51593. *
  51594. * `getAll('visible', true)` would return only Game Objects that have their visible property set to `true`.
  51595. *
  51596. * Optionally you can specify a start and end index. For example if this Container had 100 Game Objects,
  51597. * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only
  51598. * the first 50 Game Objects.
  51599. *
  51600. * @method Phaser.GameObjects.Container#getAll
  51601. * @since 3.4.0
  51602. *
  51603. * @param {string} [property] - The property to test on each Game Object in the Container.
  51604. * @param {any} [value] - If property is set then the `property` must strictly equal this value to be included in the results.
  51605. * @param {integer} [startIndex=0] - An optional start index to search from.
  51606. * @param {integer} [endIndex=Container.length] - An optional end index to search up to (but not included)
  51607. *
  51608. * @return {Phaser.GameObjects.GameObject[]} An array of matching Game Objects from this Container.
  51609. */
  51610. getAll: function (property, value, startIndex, endIndex)
  51611. {
  51612. return ArrayUtils.GetAll(this.list, property, value, startIndex, endIndex);
  51613. },
  51614. /**
  51615. * Returns the total number of Game Objects in this Container that have a property
  51616. * matching the given value.
  51617. *
  51618. * For example: `count('visible', true)` would count all the elements that have their visible property set.
  51619. *
  51620. * You can optionally limit the operation to the `startIndex` - `endIndex` range.
  51621. *
  51622. * @method Phaser.GameObjects.Container#count
  51623. * @since 3.4.0
  51624. *
  51625. * @param {string} property - The property to check.
  51626. * @param {any} value - The value to check.
  51627. * @param {integer} [startIndex=0] - An optional start index to search from.
  51628. * @param {integer} [endIndex=Container.length] - An optional end index to search up to (but not included)
  51629. *
  51630. * @return {integer} The total number of Game Objects in this Container with a property matching the given value.
  51631. */
  51632. count: function (property, value, startIndex, endIndex)
  51633. {
  51634. return ArrayUtils.CountAllMatching(this.list, property, value, startIndex, endIndex);
  51635. },
  51636. /**
  51637. * Swaps the position of two Game Objects in this Container.
  51638. * Both Game Objects must belong to this Container.
  51639. *
  51640. * @method Phaser.GameObjects.Container#swap
  51641. * @since 3.4.0
  51642. *
  51643. * @param {Phaser.GameObjects.GameObject} child1 - The first Game Object to swap.
  51644. * @param {Phaser.GameObjects.GameObject} child2 - The second Game Object to swap.
  51645. *
  51646. * @return {Phaser.GameObjects.Container} This Container instance.
  51647. */
  51648. swap: function (child1, child2)
  51649. {
  51650. ArrayUtils.Swap(this.list, child1, child2);
  51651. return this;
  51652. },
  51653. /**
  51654. * Moves a Game Object to a new position within this Container.
  51655. *
  51656. * The Game Object must already be a child of this Container.
  51657. *
  51658. * The Game Object is removed from its old position and inserted into the new one.
  51659. * Therefore the Container size does not change. Other children will change position accordingly.
  51660. *
  51661. * @method Phaser.GameObjects.Container#moveTo
  51662. * @since 3.4.0
  51663. *
  51664. * @param {Phaser.GameObjects.GameObject} child - The Game Object to move.
  51665. * @param {integer} index - The new position of the Game Object in this Container.
  51666. *
  51667. * @return {Phaser.GameObjects.Container} This Container instance.
  51668. */
  51669. moveTo: function (child, index)
  51670. {
  51671. ArrayUtils.MoveTo(this.list, child, index);
  51672. return this;
  51673. },
  51674. /**
  51675. * Removes the given Game Object, or array of Game Objects, from this Container.
  51676. *
  51677. * The Game Objects must already be children of this Container.
  51678. *
  51679. * You can also optionally call `destroy` on each Game Object that is removed from the Container.
  51680. *
  51681. * @method Phaser.GameObjects.Container#remove
  51682. * @since 3.4.0
  51683. *
  51684. * @param {Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]} child - The Game Object, or array of Game Objects, to be removed from the Container.
  51685. * @param {boolean} [destroyChild=false] - Optionally call `destroy` on each child successfully removed from this Container.
  51686. *
  51687. * @return {Phaser.GameObjects.Container} This Container instance.
  51688. */
  51689. remove: function (child, destroyChild)
  51690. {
  51691. var removed = ArrayUtils.Remove(this.list, child, this.removeHandler, this);
  51692. if (destroyChild && removed)
  51693. {
  51694. if (!Array.isArray(removed))
  51695. {
  51696. removed = [ removed ];
  51697. }
  51698. for (var i = 0; i < removed.length; i++)
  51699. {
  51700. removed[i].destroy();
  51701. }
  51702. }
  51703. return this;
  51704. },
  51705. /**
  51706. * Removes the Game Object at the given position in this Container.
  51707. *
  51708. * You can also optionally call `destroy` on the Game Object, if one is found.
  51709. *
  51710. * @method Phaser.GameObjects.Container#removeAt
  51711. * @since 3.4.0
  51712. *
  51713. * @param {integer} index - The index of the Game Object to be removed.
  51714. * @param {boolean} [destroyChild=false] - Optionally call `destroy` on the Game Object if successfully removed from this Container.
  51715. *
  51716. * @return {Phaser.GameObjects.Container} This Container instance.
  51717. */
  51718. removeAt: function (index, destroyChild)
  51719. {
  51720. var removed = ArrayUtils.RemoveAt(this.list, index, this.removeHandler, this);
  51721. if (destroyChild && removed)
  51722. {
  51723. removed.destroy();
  51724. }
  51725. return this;
  51726. },
  51727. /**
  51728. * Removes the Game Objects between the given positions in this Container.
  51729. *
  51730. * You can also optionally call `destroy` on each Game Object that is removed from the Container.
  51731. *
  51732. * @method Phaser.GameObjects.Container#removeBetween
  51733. * @since 3.4.0
  51734. *
  51735. * @param {integer} [startIndex=0] - An optional start index to search from.
  51736. * @param {integer} [endIndex=Container.length] - An optional end index to search up to (but not included)
  51737. * @param {boolean} [destroyChild=false] - Optionally call `destroy` on each Game Object successfully removed from this Container.
  51738. *
  51739. * @return {Phaser.GameObjects.Container} This Container instance.
  51740. */
  51741. removeBetween: function (startIndex, endIndex, destroyChild)
  51742. {
  51743. var removed = ArrayUtils.RemoveBetween(this.list, startIndex, endIndex, this.removeHandler, this);
  51744. if (destroyChild)
  51745. {
  51746. for (var i = 0; i < removed.length; i++)
  51747. {
  51748. removed[i].destroy();
  51749. }
  51750. }
  51751. return this;
  51752. },
  51753. /**
  51754. * Removes all Game Objects from this Container.
  51755. *
  51756. * You can also optionally call `destroy` on each Game Object that is removed from the Container.
  51757. *
  51758. * @method Phaser.GameObjects.Container#removeAll
  51759. * @since 3.4.0
  51760. *
  51761. * @param {boolean} [destroyChild=false] - Optionally call `destroy` on each Game Object successfully removed from this Container.
  51762. *
  51763. * @return {Phaser.GameObjects.Container} This Container instance.
  51764. */
  51765. removeAll: function (destroyChild)
  51766. {
  51767. var removed = ArrayUtils.RemoveBetween(this.list, 0, this.list.length, this.removeHandler, this);
  51768. if (destroyChild)
  51769. {
  51770. for (var i = 0; i < removed.length; i++)
  51771. {
  51772. removed[i].destroy();
  51773. }
  51774. }
  51775. return this;
  51776. },
  51777. /**
  51778. * Brings the given Game Object to the top of this Container.
  51779. * This will cause it to render on-top of any other objects in the Container.
  51780. *
  51781. * @method Phaser.GameObjects.Container#bringToTop
  51782. * @since 3.4.0
  51783. *
  51784. * @param {Phaser.GameObjects.GameObject} child - The Game Object to bring to the top of the Container.
  51785. *
  51786. * @return {Phaser.GameObjects.Container} This Container instance.
  51787. */
  51788. bringToTop: function (child)
  51789. {
  51790. ArrayUtils.BringToTop(this.list, child);
  51791. return this;
  51792. },
  51793. /**
  51794. * Sends the given Game Object to the bottom of this Container.
  51795. * This will cause it to render below any other objects in the Container.
  51796. *
  51797. * @method Phaser.GameObjects.Container#sendToBack
  51798. * @since 3.4.0
  51799. *
  51800. * @param {Phaser.GameObjects.GameObject} child - The Game Object to send to the bottom of the Container.
  51801. *
  51802. * @return {Phaser.GameObjects.Container} This Container instance.
  51803. */
  51804. sendToBack: function (child)
  51805. {
  51806. ArrayUtils.SendToBack(this.list, child);
  51807. return this;
  51808. },
  51809. /**
  51810. * Moves the given Game Object up one place in this Container, unless it's already at the top.
  51811. *
  51812. * @method Phaser.GameObjects.Container#moveUp
  51813. * @since 3.4.0
  51814. *
  51815. * @param {Phaser.GameObjects.GameObject} child - The Game Object to be moved in the Container.
  51816. *
  51817. * @return {Phaser.GameObjects.Container} This Container instance.
  51818. */
  51819. moveUp: function (child)
  51820. {
  51821. ArrayUtils.MoveUp(this.list, child);
  51822. return this;
  51823. },
  51824. /**
  51825. * Moves the given Game Object down one place in this Container, unless it's already at the bottom.
  51826. *
  51827. * @method Phaser.GameObjects.Container#moveDown
  51828. * @since 3.4.0
  51829. *
  51830. * @param {Phaser.GameObjects.GameObject} child - The Game Object to be moved in the Container.
  51831. *
  51832. * @return {Phaser.GameObjects.Container} This Container instance.
  51833. */
  51834. moveDown: function (child)
  51835. {
  51836. ArrayUtils.MoveDown(this.list, child);
  51837. return this;
  51838. },
  51839. /**
  51840. * Reverses the order of all Game Objects in this Container.
  51841. *
  51842. * @method Phaser.GameObjects.Container#reverse
  51843. * @since 3.4.0
  51844. *
  51845. * @return {Phaser.GameObjects.Container} This Container instance.
  51846. */
  51847. reverse: function ()
  51848. {
  51849. this.list.reverse();
  51850. return this;
  51851. },
  51852. /**
  51853. * Shuffles the all Game Objects in this Container using the Fisher-Yates implementation.
  51854. *
  51855. * @method Phaser.GameObjects.Container#shuffle
  51856. * @since 3.4.0
  51857. *
  51858. * @return {Phaser.GameObjects.Container} This Container instance.
  51859. */
  51860. shuffle: function ()
  51861. {
  51862. ArrayUtils.Shuffle(this.list);
  51863. return this;
  51864. },
  51865. /**
  51866. * Replaces a Game Object in this Container with the new Game Object.
  51867. * The new Game Object cannot already be a child of this Container.
  51868. *
  51869. * @method Phaser.GameObjects.Container#replace
  51870. * @since 3.4.0
  51871. *
  51872. * @param {Phaser.GameObjects.GameObject} oldChild - The Game Object in this Container that will be replaced.
  51873. * @param {Phaser.GameObjects.GameObject} newChild - The Game Object to be added to this Container.
  51874. * @param {boolean} [destroyChild=false] - Optionally call `destroy` on the Game Object if successfully removed from this Container.
  51875. *
  51876. * @return {Phaser.GameObjects.Container} This Container instance.
  51877. */
  51878. replace: function (oldChild, newChild, destroyChild)
  51879. {
  51880. var moved = ArrayUtils.Replace(this.list, oldChild, newChild);
  51881. if (moved)
  51882. {
  51883. this.addHandler(newChild);
  51884. this.removeHandler(oldChild);
  51885. if (destroyChild)
  51886. {
  51887. oldChild.destroy();
  51888. }
  51889. }
  51890. return this;
  51891. },
  51892. /**
  51893. * Returns `true` if the given Game Object is a direct child of this Container.
  51894. *
  51895. * This check does not scan nested Containers.
  51896. *
  51897. * @method Phaser.GameObjects.Container#exists
  51898. * @since 3.4.0
  51899. *
  51900. * @param {Phaser.GameObjects.GameObject} child - The Game Object to check for within this Container.
  51901. *
  51902. * @return {boolean} True if the Game Object is an immediate child of this Container, otherwise false.
  51903. */
  51904. exists: function (child)
  51905. {
  51906. return (this.list.indexOf(child) > -1);
  51907. },
  51908. /**
  51909. * Sets the property to the given value on all Game Objects in this Container.
  51910. *
  51911. * Optionally you can specify a start and end index. For example if this Container had 100 Game Objects,
  51912. * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only
  51913. * the first 50 Game Objects.
  51914. *
  51915. * @method Phaser.GameObjects.Container#setAll
  51916. * @since 3.4.0
  51917. *
  51918. * @param {string} property - The property that must exist on the Game Object.
  51919. * @param {any} value - The value to get the property to.
  51920. * @param {integer} [startIndex=0] - An optional start index to search from.
  51921. * @param {integer} [endIndex=Container.length] - An optional end index to search up to (but not included)
  51922. *
  51923. * @return {Phaser.GameObjects.Container} This Container instance.
  51924. */
  51925. setAll: function (property, value, startIndex, endIndex)
  51926. {
  51927. ArrayUtils.SetAll(this.list, property, value, startIndex, endIndex);
  51928. return this;
  51929. },
  51930. /**
  51931. * @callback EachContainerCallback
  51932. * @generic I - [item]
  51933. *
  51934. * @param {*} item - The child Game Object of the Container.
  51935. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  51936. */
  51937. /**
  51938. * Passes all Game Objects in this Container to the given callback.
  51939. *
  51940. * A copy of the Container is made before passing each entry to your callback.
  51941. * This protects against the callback itself modifying the Container.
  51942. *
  51943. * If you know for sure that the callback will not change the size of this Container
  51944. * then you can use the more performant `Container.iterate` method instead.
  51945. *
  51946. * @method Phaser.GameObjects.Container#each
  51947. * @since 3.4.0
  51948. *
  51949. * @param {function} callback - The function to call.
  51950. * @param {object} [context] - Value to use as `this` when executing callback.
  51951. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  51952. *
  51953. * @return {Phaser.GameObjects.Container} This Container instance.
  51954. */
  51955. each: function (callback, context)
  51956. {
  51957. var args = [ null ];
  51958. var i;
  51959. var temp = this.list.slice();
  51960. var len = temp.length;
  51961. for (i = 2; i < arguments.length; i++)
  51962. {
  51963. args.push(arguments[i]);
  51964. }
  51965. for (i = 0; i < len; i++)
  51966. {
  51967. args[0] = temp[i];
  51968. callback.apply(context, args);
  51969. }
  51970. return this;
  51971. },
  51972. /**
  51973. * Passes all Game Objects in this Container to the given callback.
  51974. *
  51975. * Only use this method when you absolutely know that the Container will not be modified during
  51976. * the iteration, i.e. by removing or adding to its contents.
  51977. *
  51978. * @method Phaser.GameObjects.Container#iterate
  51979. * @since 3.4.0
  51980. *
  51981. * @param {function} callback - The function to call.
  51982. * @param {object} [context] - Value to use as `this` when executing callback.
  51983. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  51984. *
  51985. * @return {Phaser.GameObjects.Container} This Container instance.
  51986. */
  51987. iterate: function (callback, context)
  51988. {
  51989. var args = [ null ];
  51990. var i;
  51991. for (i = 2; i < arguments.length; i++)
  51992. {
  51993. args.push(arguments[i]);
  51994. }
  51995. for (i = 0; i < this.list.length; i++)
  51996. {
  51997. args[0] = this.list[i];
  51998. callback.apply(context, args);
  51999. }
  52000. return this;
  52001. },
  52002. /**
  52003. * The number of Game Objects inside this Container.
  52004. *
  52005. * @name Phaser.GameObjects.Container#length
  52006. * @type {integer}
  52007. * @readOnly
  52008. * @since 3.4.0
  52009. */
  52010. length: {
  52011. get: function ()
  52012. {
  52013. return this.list.length;
  52014. }
  52015. },
  52016. /**
  52017. * Returns the first Game Object within the Container, or `null` if it is empty.
  52018. *
  52019. * You can move the cursor by calling `Container.next` and `Container.previous`.
  52020. *
  52021. * @name Phaser.GameObjects.Container#first
  52022. * @type {?Phaser.GameObjects.GameObject}
  52023. * @readOnly
  52024. * @since 3.4.0
  52025. */
  52026. first: {
  52027. get: function ()
  52028. {
  52029. this.position = 0;
  52030. if (this.list.length > 0)
  52031. {
  52032. return this.list[0];
  52033. }
  52034. else
  52035. {
  52036. return null;
  52037. }
  52038. }
  52039. },
  52040. /**
  52041. * Returns the last Game Object within the Container, or `null` if it is empty.
  52042. *
  52043. * You can move the cursor by calling `Container.next` and `Container.previous`.
  52044. *
  52045. * @name Phaser.GameObjects.Container#last
  52046. * @type {?Phaser.GameObjects.GameObject}
  52047. * @readOnly
  52048. * @since 3.4.0
  52049. */
  52050. last: {
  52051. get: function ()
  52052. {
  52053. if (this.list.length > 0)
  52054. {
  52055. this.position = this.list.length - 1;
  52056. return this.list[this.position];
  52057. }
  52058. else
  52059. {
  52060. return null;
  52061. }
  52062. }
  52063. },
  52064. /**
  52065. * Returns the next Game Object within the Container, or `null` if it is empty.
  52066. *
  52067. * You can move the cursor by calling `Container.next` and `Container.previous`.
  52068. *
  52069. * @name Phaser.GameObjects.Container#next
  52070. * @type {?Phaser.GameObjects.GameObject}
  52071. * @readOnly
  52072. * @since 3.4.0
  52073. */
  52074. next: {
  52075. get: function ()
  52076. {
  52077. if (this.position < this.list.length)
  52078. {
  52079. this.position++;
  52080. return this.list[this.position];
  52081. }
  52082. else
  52083. {
  52084. return null;
  52085. }
  52086. }
  52087. },
  52088. /**
  52089. * Returns the previous Game Object within the Container, or `null` if it is empty.
  52090. *
  52091. * You can move the cursor by calling `Container.next` and `Container.previous`.
  52092. *
  52093. * @name Phaser.GameObjects.Container#previous
  52094. * @type {?Phaser.GameObjects.GameObject}
  52095. * @readOnly
  52096. * @since 3.4.0
  52097. */
  52098. previous: {
  52099. get: function ()
  52100. {
  52101. if (this.position > 0)
  52102. {
  52103. this.position--;
  52104. return this.list[this.position];
  52105. }
  52106. else
  52107. {
  52108. return null;
  52109. }
  52110. }
  52111. },
  52112. /**
  52113. * Internal destroy handler, called as part of the destroy process.
  52114. *
  52115. * @method Phaser.GameObjects.Container#preDestroy
  52116. * @protected
  52117. * @since 3.9.0
  52118. */
  52119. preDestroy: function ()
  52120. {
  52121. this.removeAll(!!this.exclusive);
  52122. this.localTransform.destroy();
  52123. this.tempTransformMatrix.destroy();
  52124. this.list = [];
  52125. this._displayList = null;
  52126. }
  52127. });
  52128. module.exports = Container;
  52129. /***/ }),
  52130. /* 246 */
  52131. /***/ (function(module, exports, __webpack_require__) {
  52132. /**
  52133. * @author Richard Davey <rich@photonstorm.com>
  52134. * @copyright 2018 Photon Storm Ltd.
  52135. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  52136. */
  52137. var BlitterRender = __webpack_require__(913);
  52138. var Bob = __webpack_require__(910);
  52139. var Class = __webpack_require__(0);
  52140. var Components = __webpack_require__(17);
  52141. var Frame = __webpack_require__(129);
  52142. var GameObject = __webpack_require__(2);
  52143. var List = __webpack_require__(93);
  52144. /**
  52145. * @callback Phaser.GameObjects.Blitter.CreateCallback
  52146. *
  52147. * @param {Phaser.GameObjects.Blitter.Bob} bob - The Bob that was created by the Blitter.
  52148. * @param {integer} index - The position of the Bob within the Blitter display list.
  52149. */
  52150. /**
  52151. * @classdesc
  52152. * A Blitter Game Object.
  52153. *
  52154. * The Blitter Game Object is a special kind of container that creates, updates and manages Bob objects.
  52155. * Bobs are designed for rendering speed rather than flexibility. They consist of a texture, or frame from a texture,
  52156. * a position and an alpha value. You cannot scale or rotate them. They use a batched drawing method for speed
  52157. * during rendering.
  52158. *
  52159. * A Blitter Game Object has one texture bound to it. Bobs created by the Blitter can use any Frame from this
  52160. * Texture to render with, but they cannot use any other Texture. It is this single texture-bind that allows
  52161. * them their speed.
  52162. *
  52163. * If you have a need to blast a large volume of frames around the screen then Blitter objects are well worth
  52164. * investigating. They are especially useful for using as a base for your own special effects systems.
  52165. *
  52166. * @class Blitter
  52167. * @extends Phaser.GameObjects.GameObject
  52168. * @memberOf Phaser.GameObjects
  52169. * @constructor
  52170. * @since 3.0.0
  52171. *
  52172. * @extends Phaser.GameObjects.Components.Alpha
  52173. * @extends Phaser.GameObjects.Components.BlendMode
  52174. * @extends Phaser.GameObjects.Components.Depth
  52175. * @extends Phaser.GameObjects.Components.Mask
  52176. * @extends Phaser.GameObjects.Components.Pipeline
  52177. * @extends Phaser.GameObjects.Components.ScaleMode
  52178. * @extends Phaser.GameObjects.Components.ScrollFactor
  52179. * @extends Phaser.GameObjects.Components.Size
  52180. * @extends Phaser.GameObjects.Components.Texture
  52181. * @extends Phaser.GameObjects.Components.Transform
  52182. * @extends Phaser.GameObjects.Components.Visible
  52183. *
  52184. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. It can only belong to one Scene at any given time.
  52185. * @param {number} [x=0] - The x coordinate of this Game Object in world space.
  52186. * @param {number} [y=0] - The y coordinate of this Game Object in world space.
  52187. * @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.
  52188. * @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.
  52189. */
  52190. var Blitter = new Class({
  52191. Extends: GameObject,
  52192. Mixins: [
  52193. Components.Alpha,
  52194. Components.BlendMode,
  52195. Components.Depth,
  52196. Components.Mask,
  52197. Components.Pipeline,
  52198. Components.ScaleMode,
  52199. Components.ScrollFactor,
  52200. Components.Size,
  52201. Components.Texture,
  52202. Components.Transform,
  52203. Components.Visible,
  52204. BlitterRender
  52205. ],
  52206. initialize:
  52207. function Blitter (scene, x, y, texture, frame)
  52208. {
  52209. GameObject.call(this, scene, 'Blitter');
  52210. this.setTexture(texture, frame);
  52211. this.setPosition(x, y);
  52212. this.initPipeline('TextureTintPipeline');
  52213. /**
  52214. * The children of this Blitter.
  52215. * This List contains all of the Bob objects created by the Blitter.
  52216. *
  52217. * @name Phaser.GameObjects.Blitter#children
  52218. * @type {Phaser.Structs.List.<Phaser.GameObjects.Blitter.Bob>}
  52219. * @since 3.0.0
  52220. */
  52221. this.children = new List();
  52222. /**
  52223. * A transient array that holds all of the Bobs that will be rendered this frame.
  52224. * The array is re-populated whenever the dirty flag is set.
  52225. *
  52226. * @name Phaser.GameObjects.Blitter#renderList
  52227. * @type {Phaser.GameObjects.Blitter.Bob[]}
  52228. * @default []
  52229. * @private
  52230. * @since 3.0.0
  52231. */
  52232. this.renderList = [];
  52233. /**
  52234. * Is the Blitter considered dirty?
  52235. * A 'dirty' Blitter has had its child count changed since the last frame.
  52236. *
  52237. * @name Phaser.GameObjects.Blitter#dirty
  52238. * @type {boolean}
  52239. * @since 3.0.0
  52240. */
  52241. this.dirty = false;
  52242. },
  52243. /**
  52244. * Creates a new Bob in this Blitter.
  52245. *
  52246. * The Bob is created at the given coordinates, relative to the Blitter and uses the given frame.
  52247. * A Bob can use any frame belonging to the texture bound to the Blitter.
  52248. *
  52249. * @method Phaser.GameObjects.Blitter#create
  52250. * @since 3.0.0
  52251. *
  52252. * @param {number} x - The x position of the Bob. Bob coordinate are relative to the position of the Blitter object.
  52253. * @param {number} y - The y position of the Bob. Bob coordinate are relative to the position of the Blitter object.
  52254. * @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.
  52255. * @param {boolean} [visible=true] - Should the created Bob render or not?
  52256. * @param {integer} [index] - The position in the Blitters Display List to add the new Bob at. Defaults to the top of the list.
  52257. *
  52258. * @return {Phaser.GameObjects.Blitter.Bob} The newly created Bob object.
  52259. */
  52260. create: function (x, y, frame, visible, index)
  52261. {
  52262. if (visible === undefined) { visible = true; }
  52263. if (index === undefined) { index = this.children.length; }
  52264. if (frame === undefined)
  52265. {
  52266. frame = this.frame;
  52267. }
  52268. else if (!(frame instanceof Frame))
  52269. {
  52270. frame = this.texture.get(frame);
  52271. }
  52272. var bob = new Bob(this, x, y, frame, visible);
  52273. this.children.addAt(bob, index, false);
  52274. this.dirty = true;
  52275. return bob;
  52276. },
  52277. /**
  52278. * Creates multiple Bob objects within this Blitter and then passes each of them to the specified callback.
  52279. *
  52280. * @method Phaser.GameObjects.Blitter#createFromCallback
  52281. * @since 3.0.0
  52282. *
  52283. * @param {Phaser.GameObjects.Blitter.CreateCallback} callback - The callback to invoke after creating a bob. It will be sent two arguments: The Bob and the index of the Bob.
  52284. * @param {integer} quantity - The quantity of Bob objects to create.
  52285. * @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.
  52286. * @param {boolean} [visible=true] - Should the created Bob render or not?
  52287. *
  52288. * @return {Phaser.GameObjects.Blitter.Bob[]} An array of Bob objects that were created.
  52289. */
  52290. createFromCallback: function (callback, quantity, frame, visible)
  52291. {
  52292. var bobs = this.createMultiple(quantity, frame, visible);
  52293. for (var i = 0; i < bobs.length; i++)
  52294. {
  52295. var bob = bobs[i];
  52296. callback.call(this, bob, i);
  52297. }
  52298. return bobs;
  52299. },
  52300. /**
  52301. * Creates multiple Bobs in one call.
  52302. *
  52303. * The amount created is controlled by a combination of the `quantity` argument and the number of frames provided.
  52304. *
  52305. * If the quantity is set to 10 and you provide 2 frames, then 20 Bobs will be created. 10 with the first
  52306. * frame and 10 with the second.
  52307. *
  52308. * @method Phaser.GameObjects.Blitter#createMultiple
  52309. * @since 3.0.0
  52310. *
  52311. * @param {integer} quantity - The quantity of Bob objects to create.
  52312. * @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.
  52313. * @param {boolean} [visible=true] - Should the created Bob render or not?
  52314. *
  52315. * @return {Phaser.GameObjects.Blitter.Bob[]} An array of Bob objects that were created.
  52316. */
  52317. createMultiple: function (quantity, frame, visible)
  52318. {
  52319. if (frame === undefined) { frame = this.frame.name; }
  52320. if (visible === undefined) { visible = true; }
  52321. if (!Array.isArray(frame))
  52322. {
  52323. frame = [ frame ];
  52324. }
  52325. var bobs = [];
  52326. var _this = this;
  52327. frame.forEach(function (singleFrame)
  52328. {
  52329. for (var i = 0; i < quantity; i++)
  52330. {
  52331. bobs.push(_this.create(0, 0, singleFrame, visible));
  52332. }
  52333. });
  52334. return bobs;
  52335. },
  52336. /**
  52337. * Checks if the given child can render or not, by checking its `visible` and `alpha` values.
  52338. *
  52339. * @method Phaser.GameObjects.Blitter#childCanRender
  52340. * @since 3.0.0
  52341. *
  52342. * @param {Phaser.GameObjects.Blitter.Bob} child - The Bob to check for rendering.
  52343. *
  52344. * @return {boolean} Returns `true` if the given child can render, otherwise `false`.
  52345. */
  52346. childCanRender: function (child)
  52347. {
  52348. return (child.visible && child.alpha > 0);
  52349. },
  52350. /**
  52351. * Returns an array of Bobs to be rendered.
  52352. * If the Blitter is dirty then a new list is generated and stored in `renderList`.
  52353. *
  52354. * @method Phaser.GameObjects.Blitter#getRenderList
  52355. * @since 3.0.0
  52356. *
  52357. * @return {Phaser.GameObjects.Blitter.Bob[]} An array of Bob objects that will be rendered this frame.
  52358. */
  52359. getRenderList: function ()
  52360. {
  52361. if (this.dirty)
  52362. {
  52363. this.renderList = this.children.list.filter(this.childCanRender, this);
  52364. this.dirty = false;
  52365. }
  52366. return this.renderList;
  52367. },
  52368. /**
  52369. * Removes all Bobs from the children List and clears the dirty flag.
  52370. *
  52371. * @method Phaser.GameObjects.Blitter#clear
  52372. * @since 3.0.0
  52373. */
  52374. clear: function ()
  52375. {
  52376. this.children.removeAll();
  52377. this.dirty = true;
  52378. },
  52379. /**
  52380. * Internal destroy handler, called as part of the destroy process.
  52381. *
  52382. * @method Phaser.GameObjects.Blitter#preDestroy
  52383. * @protected
  52384. * @since 3.9.0
  52385. */
  52386. preDestroy: function ()
  52387. {
  52388. this.children.destroy();
  52389. this.renderList = [];
  52390. }
  52391. });
  52392. module.exports = Blitter;
  52393. /***/ }),
  52394. /* 247 */
  52395. /***/ (function(module, exports, __webpack_require__) {
  52396. /**
  52397. * @author Richard Davey <rich@photonstorm.com>
  52398. * @copyright 2018 Photon Storm Ltd.
  52399. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  52400. */
  52401. var GetValue = __webpack_require__(4);
  52402. var Shuffle = __webpack_require__(95);
  52403. var BuildChunk = function (a, b, qty)
  52404. {
  52405. var out = [];
  52406. for (var aIndex = 0; aIndex < a.length; aIndex++)
  52407. {
  52408. for (var bIndex = 0; bIndex < b.length; bIndex++)
  52409. {
  52410. for (var i = 0; i < qty; i++)
  52411. {
  52412. out.push({ a: a[aIndex], b: b[bIndex] });
  52413. }
  52414. }
  52415. }
  52416. return out;
  52417. };
  52418. // options = repeat, random, randomB, yoyo, max, qty
  52419. // Range ([a,b,c], [1,2,3]) =
  52420. // a1, a2, a3, b1, b2, b3, c1, c2, c3
  52421. // Range ([a,b], [1,2,3], qty = 3) =
  52422. // a1, a1, a1, a2, a2, a2, a3, a3, a3, b1, b1, b1, b2, b2, b2, b3, b3, b3
  52423. // Range ([a,b,c], [1,2,3], repeat x1) =
  52424. // a1, a2, a3, b1, b2, b3, c1, c2, c3, a1, a2, a3, b1, b2, b3, c1, c2, c3
  52425. // Range ([a,b], [1,2], repeat -1 = endless, max = 14) =
  52426. // Maybe if max is set then repeat goes to -1 automatically?
  52427. // a1, a2, b1, b2, a1, a2, b1, b2, a1, a2, b1, b2, a1, a2 (capped at 14 elements)
  52428. // Range ([a], [1,2,3,4,5], random = true) =
  52429. // a4, a1, a5, a2, a3
  52430. // Range ([a, b], [1,2,3], random = true) =
  52431. // b3, a2, a1, b1, a3, b2
  52432. // Range ([a, b, c], [1,2,3], randomB = true) =
  52433. // a3, a1, a2, b2, b3, b1, c1, c3, c2
  52434. // Range ([a], [1,2,3,4,5], yoyo = true) =
  52435. // a1, a2, a3, a4, a5, a5, a4, a3, a2, a1
  52436. // Range ([a, b], [1,2,3], yoyo = true) =
  52437. // a1, a2, a3, b1, b2, b3, b3, b2, b1, a3, a2, a1
  52438. /**
  52439. * [description]
  52440. *
  52441. * @function Phaser.Utils.Array.Range
  52442. * @since 3.0.0
  52443. *
  52444. * @param {array} a - [description]
  52445. * @param {array} b - [description]
  52446. * @param {object} options - [description]
  52447. *
  52448. * @return {array} [description]
  52449. */
  52450. var Range = function (a, b, options)
  52451. {
  52452. var max = GetValue(options, 'max', 0);
  52453. var qty = GetValue(options, 'qty', 1);
  52454. var random = GetValue(options, 'random', false);
  52455. var randomB = GetValue(options, 'randomB', false);
  52456. var repeat = GetValue(options, 'repeat', 0);
  52457. var yoyo = GetValue(options, 'yoyo', false);
  52458. var out = [];
  52459. if (randomB)
  52460. {
  52461. Shuffle(b);
  52462. }
  52463. // Endless repeat, so limit by max
  52464. if (repeat === -1)
  52465. {
  52466. if (max === 0)
  52467. {
  52468. repeat = 0;
  52469. }
  52470. else
  52471. {
  52472. // Work out how many repeats we need
  52473. var total = (a.length * b.length) * qty;
  52474. if (yoyo)
  52475. {
  52476. total *= 2;
  52477. }
  52478. repeat = Math.ceil(max / total);
  52479. }
  52480. }
  52481. for (var i = 0; i <= repeat; i++)
  52482. {
  52483. var chunk = BuildChunk(a, b, qty);
  52484. if (random)
  52485. {
  52486. Shuffle(chunk);
  52487. }
  52488. out = out.concat(chunk);
  52489. if (yoyo)
  52490. {
  52491. chunk.reverse();
  52492. out = out.concat(chunk);
  52493. }
  52494. }
  52495. if (max)
  52496. {
  52497. out.splice(max);
  52498. }
  52499. return out;
  52500. };
  52501. module.exports = Range;
  52502. /***/ }),
  52503. /* 248 */
  52504. /***/ (function(module, exports) {
  52505. /**
  52506. * @author Richard Davey <rich@photonstorm.com>
  52507. * @copyright 2018 Photon Storm Ltd.
  52508. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  52509. */
  52510. /**
  52511. * Round a given number so it is further away from zero. That is, positive numbers are rounded up, and negative numbers are rounded down.
  52512. *
  52513. * @function Phaser.Math.RoundAwayFromZero
  52514. * @since 3.0.0
  52515. *
  52516. * @param {number} value - The number to round.
  52517. *
  52518. * @return {number} The rounded number, rounded away from zero.
  52519. */
  52520. var RoundAwayFromZero = function (value)
  52521. {
  52522. // "Opposite" of truncate.
  52523. return (value > 0) ? Math.ceil(value) : Math.floor(value);
  52524. };
  52525. module.exports = RoundAwayFromZero;
  52526. /***/ }),
  52527. /* 249 */
  52528. /***/ (function(module, exports) {
  52529. /**
  52530. * @author Richard Davey <rich@photonstorm.com>
  52531. * @copyright 2018 Photon Storm Ltd.
  52532. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  52533. */
  52534. /**
  52535. * Capitalizes the first letter of a string if there is one.
  52536. * @example
  52537. * UppercaseFirst('abc');
  52538. * // returns 'Abc'
  52539. * @example
  52540. * UppercaseFirst('the happy family');
  52541. * // returns 'The happy family'
  52542. * @example
  52543. * UppercaseFirst('');
  52544. * // returns ''
  52545. *
  52546. * @function Phaser.Utils.String.UppercaseFirst
  52547. * @since 3.0.0
  52548. *
  52549. * @param {string} str - The string to capitalize.
  52550. *
  52551. * @return {string} A new string, same as the first, but with the first letter capitalized.
  52552. */
  52553. var UppercaseFirst = function (str)
  52554. {
  52555. return str && str[0].toUpperCase() + str.slice(1);
  52556. };
  52557. module.exports = UppercaseFirst;
  52558. /***/ }),
  52559. /* 250 */
  52560. /***/ (function(module, exports, __webpack_require__) {
  52561. /**
  52562. * @author Richard Davey <rich@photonstorm.com>
  52563. * @copyright 2018 Photon Storm Ltd.
  52564. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  52565. */
  52566. var Vector2 = __webpack_require__(6);
  52567. /**
  52568. * Takes the `x` and `y` coordinates and transforms them into the same space as
  52569. * defined by the position, rotation and scale values.
  52570. *
  52571. * @function Phaser.Math.TransformXY
  52572. * @since 3.0.0
  52573. *
  52574. * @param {number} x - The x coordinate to be transformed.
  52575. * @param {number} y - The y coordinate to be transformed.
  52576. * @param {number} positionX - Horizontal position of the transform point.
  52577. * @param {number} positionY - Vertical position of the transform point.
  52578. * @param {number} rotation - Rotation of the transform point, in radians.
  52579. * @param {number} scaleX - Horizontal scale of the transform point.
  52580. * @param {number} scaleY - Vertical scale of the transform point.
  52581. * @param {(Phaser.Math.Vector2|Phaser.Geom.Point|object)} [output] - The output vector, point or object for the translated coordinates.
  52582. *
  52583. * @return {(Phaser.Math.Vector2|Phaser.Geom.Point|object)} The translated point.
  52584. */
  52585. var TransformXY = function (x, y, positionX, positionY, rotation, scaleX, scaleY, output)
  52586. {
  52587. if (output === undefined) { output = new Vector2(); }
  52588. // ITRS
  52589. var sr = Math.sin(-rotation);
  52590. var cr = Math.cos(-rotation);
  52591. var a = cr * scaleX;
  52592. var b = -sr * scaleX;
  52593. var c = sr * scaleY;
  52594. var d = cr * scaleY;
  52595. // Invert
  52596. var n = a * d - b * c;
  52597. var m0 = d / n;
  52598. var m1 = -b / n;
  52599. var m2 = -c / n;
  52600. var m3 = a / n;
  52601. var m4 = (c * positionY - d * positionX) / n;
  52602. var m5 = -(a * positionY - b * positionX) / n;
  52603. // Transform
  52604. output.x = x * m0 + y * m2 + m4;
  52605. output.y = x * m1 + y * m3 + m5;
  52606. return output;
  52607. };
  52608. module.exports = TransformXY;
  52609. /***/ }),
  52610. /* 251 */
  52611. /***/ (function(module, exports, __webpack_require__) {
  52612. /**
  52613. * @author Richard Davey <rich@photonstorm.com>
  52614. * @copyright 2018 Photon Storm Ltd.
  52615. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  52616. */
  52617. var SmoothStep = __webpack_require__(157);
  52618. /**
  52619. * A Smooth Step interpolation method.
  52620. *
  52621. * @function Phaser.Math.Interpolation.SmoothStep
  52622. * @since 3.9.0
  52623. * @see {@link https://en.wikipedia.org/wiki/Smoothstep}
  52624. *
  52625. * @param {number} t - The percentage of interpolation, between 0 and 1.
  52626. * @param {number} min - The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'.
  52627. * @param {number} max - The maximum value, also known as the 'right edge', assumed greater than the 'left edge'.
  52628. *
  52629. * @return {number} The interpolated value.
  52630. */
  52631. var SmoothStepInterpolation = function (t, min, max)
  52632. {
  52633. return min + (max - min) * SmoothStep(t, 0, 1);
  52634. };
  52635. module.exports = SmoothStepInterpolation;
  52636. /***/ }),
  52637. /* 252 */
  52638. /***/ (function(module, exports, __webpack_require__) {
  52639. "use strict";
  52640. /**
  52641. * @author Richard Davey <rich@photonstorm.com>
  52642. * @copyright 2018 Photon Storm Ltd.
  52643. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  52644. */
  52645. // 2.1.1 (Mar 17, 2016)
  52646. /*
  52647. ISC License
  52648. Copyright (c) 2016, Mapbox
  52649. Permission to use, copy, modify, and/or distribute this software for any purpose
  52650. with or without fee is hereby granted, provided that the above copyright notice
  52651. and this permission notice appear in all copies.
  52652. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
  52653. REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  52654. FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
  52655. INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
  52656. OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  52657. TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
  52658. THIS SOFTWARE.
  52659. */
  52660. module.exports = earcut;
  52661. /*
  52662. vertices is a flat array of vertice coordinates like [x0,y0, x1,y1, x2,y2, ...].
  52663. holes is 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).
  52664. dimensions is the number of coordinates per vertice in the input array (2 by default).
  52665. Each group of three vertice indices in the resulting array forms a triangle.
  52666. */
  52667. function earcut(data, holeIndices, dim) {
  52668. dim = dim || 2;
  52669. var hasHoles = holeIndices && holeIndices.length,
  52670. outerLen = hasHoles ? holeIndices[0] * dim : data.length,
  52671. outerNode = linkedList(data, 0, outerLen, dim, true),
  52672. triangles = [];
  52673. if (!outerNode) return triangles;
  52674. var minX, minY, maxX, maxY, x, y, size;
  52675. if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
  52676. // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
  52677. if (data.length > 80 * dim) {
  52678. minX = maxX = data[0];
  52679. minY = maxY = data[1];
  52680. for (var i = dim; i < outerLen; i += dim) {
  52681. x = data[i];
  52682. y = data[i + 1];
  52683. if (x < minX) minX = x;
  52684. if (y < minY) minY = y;
  52685. if (x > maxX) maxX = x;
  52686. if (y > maxY) maxY = y;
  52687. }
  52688. // minX, minY and size are later used to transform coords into integers for z-order calculation
  52689. size = Math.max(maxX - minX, maxY - minY);
  52690. }
  52691. earcutLinked(outerNode, triangles, dim, minX, minY, size);
  52692. return triangles;
  52693. }
  52694. // create a circular doubly linked list from polygon points in the specified winding order
  52695. function linkedList(data, start, end, dim, clockwise) {
  52696. var i, last;
  52697. if (clockwise === (signedArea(data, start, end, dim) > 0)) {
  52698. for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);
  52699. } else {
  52700. for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);
  52701. }
  52702. if (last && equals(last, last.next)) {
  52703. removeNode(last);
  52704. last = last.next;
  52705. }
  52706. return last;
  52707. }
  52708. // eliminate colinear or duplicate points
  52709. function filterPoints(start, end) {
  52710. if (!start) return start;
  52711. if (!end) end = start;
  52712. var p = start,
  52713. again;
  52714. do {
  52715. again = false;
  52716. if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
  52717. removeNode(p);
  52718. p = end = p.prev;
  52719. if (p === p.next) return null;
  52720. again = true;
  52721. } else {
  52722. p = p.next;
  52723. }
  52724. } while (again || p !== end);
  52725. return end;
  52726. }
  52727. // main ear slicing loop which triangulates a polygon (given as a linked list)
  52728. function earcutLinked(ear, triangles, dim, minX, minY, size, pass) {
  52729. if (!ear) return;
  52730. // interlink polygon nodes in z-order
  52731. if (!pass && size) indexCurve(ear, minX, minY, size);
  52732. var stop = ear,
  52733. prev, next;
  52734. // iterate through ears, slicing them one by one
  52735. while (ear.prev !== ear.next) {
  52736. prev = ear.prev;
  52737. next = ear.next;
  52738. if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {
  52739. // cut off the triangle
  52740. triangles.push(prev.i / dim);
  52741. triangles.push(ear.i / dim);
  52742. triangles.push(next.i / dim);
  52743. removeNode(ear);
  52744. // skipping the next vertice leads to less sliver triangles
  52745. ear = next.next;
  52746. stop = next.next;
  52747. continue;
  52748. }
  52749. ear = next;
  52750. // if we looped through the whole remaining polygon and can't find any more ears
  52751. if (ear === stop) {
  52752. // try filtering points and slicing again
  52753. if (!pass) {
  52754. earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);
  52755. // if this didn't work, try curing all small self-intersections locally
  52756. } else if (pass === 1) {
  52757. ear = cureLocalIntersections(ear, triangles, dim);
  52758. earcutLinked(ear, triangles, dim, minX, minY, size, 2);
  52759. // as a last resort, try splitting the remaining polygon into two
  52760. } else if (pass === 2) {
  52761. splitEarcut(ear, triangles, dim, minX, minY, size);
  52762. }
  52763. break;
  52764. }
  52765. }
  52766. }
  52767. // check whether a polygon node forms a valid ear with adjacent nodes
  52768. function isEar(ear) {
  52769. var a = ear.prev,
  52770. b = ear,
  52771. c = ear.next;
  52772. if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
  52773. // now make sure we don't have other points inside the potential ear
  52774. var p = ear.next.next;
  52775. while (p !== ear.prev) {
  52776. if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
  52777. area(p.prev, p, p.next) >= 0) return false;
  52778. p = p.next;
  52779. }
  52780. return true;
  52781. }
  52782. function isEarHashed(ear, minX, minY, size) {
  52783. var a = ear.prev,
  52784. b = ear,
  52785. c = ear.next;
  52786. if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
  52787. // triangle bbox; min & max are calculated like this for speed
  52788. var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),
  52789. minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),
  52790. maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),
  52791. maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
  52792. // z-order range for the current triangle bbox;
  52793. var minZ = zOrder(minTX, minTY, minX, minY, size),
  52794. maxZ = zOrder(maxTX, maxTY, minX, minY, size);
  52795. // first look for points inside the triangle in increasing z-order
  52796. var p = ear.nextZ;
  52797. while (p && p.z <= maxZ) {
  52798. if (p !== ear.prev && p !== ear.next &&
  52799. pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
  52800. area(p.prev, p, p.next) >= 0) return false;
  52801. p = p.nextZ;
  52802. }
  52803. // then look for points in decreasing z-order
  52804. p = ear.prevZ;
  52805. while (p && p.z >= minZ) {
  52806. if (p !== ear.prev && p !== ear.next &&
  52807. pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
  52808. area(p.prev, p, p.next) >= 0) return false;
  52809. p = p.prevZ;
  52810. }
  52811. return true;
  52812. }
  52813. // go through all polygon nodes and cure small local self-intersections
  52814. function cureLocalIntersections(start, triangles, dim) {
  52815. var p = start;
  52816. do {
  52817. var a = p.prev,
  52818. b = p.next.next;
  52819. if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
  52820. triangles.push(a.i / dim);
  52821. triangles.push(p.i / dim);
  52822. triangles.push(b.i / dim);
  52823. // remove two nodes involved
  52824. removeNode(p);
  52825. removeNode(p.next);
  52826. p = start = b;
  52827. }
  52828. p = p.next;
  52829. } while (p !== start);
  52830. return p;
  52831. }
  52832. // try splitting polygon into two and triangulate them independently
  52833. function splitEarcut(start, triangles, dim, minX, minY, size) {
  52834. // look for a valid diagonal that divides the polygon into two
  52835. var a = start;
  52836. do {
  52837. var b = a.next.next;
  52838. while (b !== a.prev) {
  52839. if (a.i !== b.i && isValidDiagonal(a, b)) {
  52840. // split the polygon in two by the diagonal
  52841. var c = splitPolygon(a, b);
  52842. // filter colinear points around the cuts
  52843. a = filterPoints(a, a.next);
  52844. c = filterPoints(c, c.next);
  52845. // run earcut on each half
  52846. earcutLinked(a, triangles, dim, minX, minY, size);
  52847. earcutLinked(c, triangles, dim, minX, minY, size);
  52848. return;
  52849. }
  52850. b = b.next;
  52851. }
  52852. a = a.next;
  52853. } while (a !== start);
  52854. }
  52855. // link every hole into the outer loop, producing a single-ring polygon without holes
  52856. function eliminateHoles(data, holeIndices, outerNode, dim) {
  52857. var queue = [],
  52858. i, len, start, end, list;
  52859. for (i = 0, len = holeIndices.length; i < len; i++) {
  52860. start = holeIndices[i] * dim;
  52861. end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
  52862. list = linkedList(data, start, end, dim, false);
  52863. if (list === list.next) list.steiner = true;
  52864. queue.push(getLeftmost(list));
  52865. }
  52866. queue.sort(compareX);
  52867. // process holes from left to right
  52868. for (i = 0; i < queue.length; i++) {
  52869. eliminateHole(queue[i], outerNode);
  52870. outerNode = filterPoints(outerNode, outerNode.next);
  52871. }
  52872. return outerNode;
  52873. }
  52874. function compareX(a, b) {
  52875. return a.x - b.x;
  52876. }
  52877. // find a bridge between vertices that connects hole with an outer ring and and link it
  52878. function eliminateHole(hole, outerNode) {
  52879. outerNode = findHoleBridge(hole, outerNode);
  52880. if (outerNode) {
  52881. var b = splitPolygon(outerNode, hole);
  52882. filterPoints(b, b.next);
  52883. }
  52884. }
  52885. // David Eberly's algorithm for finding a bridge between hole and outer polygon
  52886. function findHoleBridge(hole, outerNode) {
  52887. var p = outerNode,
  52888. hx = hole.x,
  52889. hy = hole.y,
  52890. qx = -Infinity,
  52891. m;
  52892. // find a segment intersected by a ray from the hole's leftmost point to the left;
  52893. // segment's endpoint with lesser x will be potential connection point
  52894. do {
  52895. if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
  52896. var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
  52897. if (x <= hx && x > qx) {
  52898. qx = x;
  52899. if (x === hx) {
  52900. if (hy === p.y) return p;
  52901. if (hy === p.next.y) return p.next;
  52902. }
  52903. m = p.x < p.next.x ? p : p.next;
  52904. }
  52905. }
  52906. p = p.next;
  52907. } while (p !== outerNode);
  52908. if (!m) return null;
  52909. if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint
  52910. // look for points inside the triangle of hole point, segment intersection and endpoint;
  52911. // if there are no points found, we have a valid connection;
  52912. // otherwise choose the point of the minimum angle with the ray as connection point
  52913. var stop = m,
  52914. mx = m.x,
  52915. my = m.y,
  52916. tanMin = Infinity,
  52917. tan;
  52918. p = m.next;
  52919. while (p !== stop) {
  52920. if (hx >= p.x && p.x >= mx && hx !== p.x &&
  52921. pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
  52922. tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
  52923. if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {
  52924. m = p;
  52925. tanMin = tan;
  52926. }
  52927. }
  52928. p = p.next;
  52929. }
  52930. return m;
  52931. }
  52932. // interlink polygon nodes in z-order
  52933. function indexCurve(start, minX, minY, size) {
  52934. var p = start;
  52935. do {
  52936. if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);
  52937. p.prevZ = p.prev;
  52938. p.nextZ = p.next;
  52939. p = p.next;
  52940. } while (p !== start);
  52941. p.prevZ.nextZ = null;
  52942. p.prevZ = null;
  52943. sortLinked(p);
  52944. }
  52945. // Simon Tatham's linked list merge sort algorithm
  52946. // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
  52947. function sortLinked(list) {
  52948. var i, p, q, e, tail, numMerges, pSize, qSize,
  52949. inSize = 1;
  52950. do {
  52951. p = list;
  52952. list = null;
  52953. tail = null;
  52954. numMerges = 0;
  52955. while (p) {
  52956. numMerges++;
  52957. q = p;
  52958. pSize = 0;
  52959. for (i = 0; i < inSize; i++) {
  52960. pSize++;
  52961. q = q.nextZ;
  52962. if (!q) break;
  52963. }
  52964. qSize = inSize;
  52965. while (pSize > 0 || (qSize > 0 && q)) {
  52966. if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
  52967. e = p;
  52968. p = p.nextZ;
  52969. pSize--;
  52970. } else {
  52971. e = q;
  52972. q = q.nextZ;
  52973. qSize--;
  52974. }
  52975. if (tail) tail.nextZ = e;
  52976. else list = e;
  52977. e.prevZ = tail;
  52978. tail = e;
  52979. }
  52980. p = q;
  52981. }
  52982. tail.nextZ = null;
  52983. inSize *= 2;
  52984. } while (numMerges > 1);
  52985. return list;
  52986. }
  52987. // z-order of a point given coords and size of the data bounding box
  52988. function zOrder(x, y, minX, minY, size) {
  52989. // coords are transformed into non-negative 15-bit integer range
  52990. x = 32767 * (x - minX) / size;
  52991. y = 32767 * (y - minY) / size;
  52992. x = (x | (x << 8)) & 0x00FF00FF;
  52993. x = (x | (x << 4)) & 0x0F0F0F0F;
  52994. x = (x | (x << 2)) & 0x33333333;
  52995. x = (x | (x << 1)) & 0x55555555;
  52996. y = (y | (y << 8)) & 0x00FF00FF;
  52997. y = (y | (y << 4)) & 0x0F0F0F0F;
  52998. y = (y | (y << 2)) & 0x33333333;
  52999. y = (y | (y << 1)) & 0x55555555;
  53000. return x | (y << 1);
  53001. }
  53002. // find the leftmost node of a polygon ring
  53003. function getLeftmost(start) {
  53004. var p = start,
  53005. leftmost = start;
  53006. do {
  53007. if (p.x < leftmost.x) leftmost = p;
  53008. p = p.next;
  53009. } while (p !== start);
  53010. return leftmost;
  53011. }
  53012. // check if a point lies within a convex triangle
  53013. function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
  53014. return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&
  53015. (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&
  53016. (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;
  53017. }
  53018. // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
  53019. function isValidDiagonal(a, b) {
  53020. return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&
  53021. locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);
  53022. }
  53023. // signed area of a triangle
  53024. function area(p, q, r) {
  53025. return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
  53026. }
  53027. // check if two points are equal
  53028. function equals(p1, p2) {
  53029. return p1.x === p2.x && p1.y === p2.y;
  53030. }
  53031. // check if two segments intersect
  53032. function intersects(p1, q1, p2, q2) {
  53033. if ((equals(p1, q1) && equals(p2, q2)) ||
  53034. (equals(p1, q2) && equals(p2, q1))) return true;
  53035. return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&
  53036. area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;
  53037. }
  53038. // check if a polygon diagonal intersects any polygon segments
  53039. function intersectsPolygon(a, b) {
  53040. var p = a;
  53041. do {
  53042. if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
  53043. intersects(p, p.next, a, b)) return true;
  53044. p = p.next;
  53045. } while (p !== a);
  53046. return false;
  53047. }
  53048. // check if a polygon diagonal is locally inside the polygon
  53049. function locallyInside(a, b) {
  53050. return area(a.prev, a, a.next) < 0 ?
  53051. area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :
  53052. area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
  53053. }
  53054. // check if the middle point of a polygon diagonal is inside the polygon
  53055. function middleInside(a, b) {
  53056. var p = a,
  53057. inside = false,
  53058. px = (a.x + b.x) / 2,
  53059. py = (a.y + b.y) / 2;
  53060. do {
  53061. if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
  53062. (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
  53063. inside = !inside;
  53064. p = p.next;
  53065. } while (p !== a);
  53066. return inside;
  53067. }
  53068. // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
  53069. // if one belongs to the outer ring and another to a hole, it merges it into a single ring
  53070. function splitPolygon(a, b) {
  53071. var a2 = new Node(a.i, a.x, a.y),
  53072. b2 = new Node(b.i, b.x, b.y),
  53073. an = a.next,
  53074. bp = b.prev;
  53075. a.next = b;
  53076. b.prev = a;
  53077. a2.next = an;
  53078. an.prev = a2;
  53079. b2.next = a2;
  53080. a2.prev = b2;
  53081. bp.next = b2;
  53082. b2.prev = bp;
  53083. return b2;
  53084. }
  53085. // create a node and optionally link it with previous one (in a circular doubly linked list)
  53086. function insertNode(i, x, y, last) {
  53087. var p = new Node(i, x, y);
  53088. if (!last) {
  53089. p.prev = p;
  53090. p.next = p;
  53091. } else {
  53092. p.next = last.next;
  53093. p.prev = last;
  53094. last.next.prev = p;
  53095. last.next = p;
  53096. }
  53097. return p;
  53098. }
  53099. function removeNode(p) {
  53100. p.next.prev = p.prev;
  53101. p.prev.next = p.next;
  53102. if (p.prevZ) p.prevZ.nextZ = p.nextZ;
  53103. if (p.nextZ) p.nextZ.prevZ = p.prevZ;
  53104. }
  53105. function Node(i, x, y) {
  53106. // vertice index in coordinates array
  53107. this.i = i;
  53108. // vertex coordinates
  53109. this.x = x;
  53110. this.y = y;
  53111. // previous and next vertice nodes in a polygon ring
  53112. this.prev = null;
  53113. this.next = null;
  53114. // z-order curve value
  53115. this.z = null;
  53116. // previous and next nodes in z-order
  53117. this.prevZ = null;
  53118. this.nextZ = null;
  53119. // indicates whether this is a steiner point
  53120. this.steiner = false;
  53121. }
  53122. // return a percentage difference between the polygon area and its triangulation area;
  53123. // used to verify correctness of triangulation
  53124. earcut.deviation = function (data, holeIndices, dim, triangles) {
  53125. var hasHoles = holeIndices && holeIndices.length;
  53126. var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
  53127. var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));
  53128. if (hasHoles) {
  53129. for (var i = 0, len = holeIndices.length; i < len; i++) {
  53130. var start = holeIndices[i] * dim;
  53131. var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
  53132. polygonArea -= Math.abs(signedArea(data, start, end, dim));
  53133. }
  53134. }
  53135. var trianglesArea = 0;
  53136. for (i = 0; i < triangles.length; i += 3) {
  53137. var a = triangles[i] * dim;
  53138. var b = triangles[i + 1] * dim;
  53139. var c = triangles[i + 2] * dim;
  53140. trianglesArea += Math.abs(
  53141. (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -
  53142. (data[a] - data[b]) * (data[c + 1] - data[a + 1]));
  53143. }
  53144. return polygonArea === 0 && trianglesArea === 0 ? 0 :
  53145. Math.abs((trianglesArea - polygonArea) / polygonArea);
  53146. };
  53147. function signedArea(data, start, end, dim) {
  53148. var sum = 0;
  53149. for (var i = start, j = end - dim; i < end; i += dim) {
  53150. sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
  53151. j = i;
  53152. }
  53153. return sum;
  53154. }
  53155. // turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts
  53156. earcut.flatten = function (data) {
  53157. var dim = data[0][0].length,
  53158. result = {vertices: [], holes: [], dimensions: dim},
  53159. holeIndex = 0;
  53160. for (var i = 0; i < data.length; i++) {
  53161. for (var j = 0; j < data[i].length; j++) {
  53162. for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);
  53163. }
  53164. if (i > 0) {
  53165. holeIndex += data[i - 1].length;
  53166. result.holes.push(holeIndex);
  53167. }
  53168. }
  53169. return result;
  53170. };
  53171. /***/ }),
  53172. /* 253 */
  53173. /***/ (function(module, exports, __webpack_require__) {
  53174. /**
  53175. * @author Richard Davey <rich@photonstorm.com>
  53176. * @author Felipe Alfonso <@bitnenfer>
  53177. * @copyright 2018 Photon Storm Ltd.
  53178. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  53179. */
  53180. var Class = __webpack_require__(0);
  53181. var Commands = __webpack_require__(119);
  53182. var Earcut = __webpack_require__(252);
  53183. var ModelViewProjection = __webpack_require__(207);
  53184. var ShaderSourceFS = __webpack_require__(499);
  53185. var ShaderSourceVS = __webpack_require__(498);
  53186. var Utils = __webpack_require__(21);
  53187. var WebGLPipeline = __webpack_require__(84);
  53188. var Point = function (x, y, width, rgb, alpha)
  53189. {
  53190. this.x = x;
  53191. this.y = y;
  53192. this.width = width;
  53193. this.rgb = rgb;
  53194. this.alpha = alpha;
  53195. };
  53196. var Path = function (x, y, width, rgb, alpha)
  53197. {
  53198. this.points = [];
  53199. this.pointsLength = 1;
  53200. this.points[0] = new Point(x, y, width, rgb, alpha);
  53201. };
  53202. var currentMatrix = new Float32Array([ 1, 0, 0, 1, 0, 0 ]);
  53203. var matrixStack = new Float32Array(6 * 1000);
  53204. var matrixStackLength = 0;
  53205. var pathArray = [];
  53206. /**
  53207. * @classdesc
  53208. * The FlatTintPipeline is used for rendering flat colored shapes.
  53209. * Mostly used by the Graphics game object.
  53210. * The config properties are:
  53211. * - game: Current game instance.
  53212. * - renderer: Current WebGL renderer.
  53213. * - topology: This indicates how the primitives are rendered. The default value is GL_TRIANGLES.
  53214. * Here is the full list of rendering primitives (https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants).
  53215. * - vertShader: Source for vertex shader as a string.
  53216. * - fragShader: Source for fragment shader as a string.
  53217. * - vertexCapacity: The amount of vertices that shall be allocated
  53218. * - vertexSize: The size of a single vertex in bytes.
  53219. *
  53220. * @class FlatTintPipeline
  53221. * @extends Phaser.Renderer.WebGL.WebGLPipeline
  53222. * @memberOf Phaser.Renderer.WebGL.Pipelines
  53223. * @constructor
  53224. * @since 3.0.0
  53225. *
  53226. * @param {object} config - Used for overriding shader an pipeline properties if extending this pipeline.
  53227. */
  53228. var FlatTintPipeline = new Class({
  53229. Extends: WebGLPipeline,
  53230. Mixins: [
  53231. ModelViewProjection
  53232. ],
  53233. initialize:
  53234. function FlatTintPipeline (config)
  53235. {
  53236. WebGLPipeline.call(this, {
  53237. game: config.game,
  53238. renderer: config.renderer,
  53239. gl: config.renderer.gl,
  53240. topology: (config.topology ? config.topology : config.renderer.gl.TRIANGLES),
  53241. vertShader: (config.vertShader ? config.vertShader : ShaderSourceVS),
  53242. fragShader: (config.fragShader ? config.fragShader : ShaderSourceFS),
  53243. vertexCapacity: (config.vertexCapcity ? config.vertexCapacity : 12000),
  53244. vertexSize: (config.vertexSize ? config.vertexSize :
  53245. Float32Array.BYTES_PER_ELEMENT * 2 +
  53246. Uint8Array.BYTES_PER_ELEMENT * 4),
  53247. attributes: [
  53248. {
  53249. name: 'inPosition',
  53250. size: 2,
  53251. type: config.renderer.gl.FLOAT,
  53252. normalized: false,
  53253. offset: 0
  53254. },
  53255. {
  53256. name: 'inTint',
  53257. size: 4,
  53258. type: config.renderer.gl.UNSIGNED_BYTE,
  53259. normalized: true,
  53260. offset: Float32Array.BYTES_PER_ELEMENT * 2
  53261. }
  53262. ]
  53263. });
  53264. /**
  53265. * Float32 view of the array buffer containing the pipeline's vertices.
  53266. *
  53267. * @name Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#vertexViewF32
  53268. * @type {Float32Array}
  53269. * @since 3.0.0
  53270. */
  53271. this.vertexViewF32 = new Float32Array(this.vertexData);
  53272. /**
  53273. * Uint32 view of the array buffer containing the pipeline's vertices.
  53274. *
  53275. * @name Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#vertexViewU32
  53276. * @type {Uint32Array}
  53277. * @since 3.0.0
  53278. */
  53279. this.vertexViewU32 = new Uint32Array(this.vertexData);
  53280. /**
  53281. * Used internally to draw triangles
  53282. *
  53283. * @name Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#tempTriangle
  53284. * @type {array}
  53285. * @since 3.0.0
  53286. */
  53287. this.tempTriangle = [
  53288. {x: 0, y: 0, width: 0, rgb: 0xFFFFFF, alpha: 1.0},
  53289. {x: 0, y: 0, width: 0, rgb: 0xFFFFFF, alpha: 1.0},
  53290. {x: 0, y: 0, width: 0, rgb: 0xFFFFFF, alpha: 1.0},
  53291. {x: 0, y: 0, width: 0, rgb: 0xFFFFFF, alpha: 1.0}
  53292. ];
  53293. /**
  53294. * Used internally for triangulating a polygon
  53295. *
  53296. * @name Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#polygonCache
  53297. * @type {array}
  53298. * @default []
  53299. * @since 3.0.0
  53300. */
  53301. this.polygonCache = [];
  53302. this.mvpInit();
  53303. },
  53304. /**
  53305. * [description]
  53306. *
  53307. * @method Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#onBind
  53308. * @since 3.0.0
  53309. *
  53310. * @return {Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline} [description]
  53311. */
  53312. onBind: function ()
  53313. {
  53314. WebGLPipeline.prototype.onBind.call(this);
  53315. this.mvpUpdate();
  53316. return this;
  53317. },
  53318. /**
  53319. * [description]
  53320. *
  53321. * @method Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#resize
  53322. * @since 3.0.0
  53323. *
  53324. * @param {number} width - [description]
  53325. * @param {number} height - [description]
  53326. * @param {number} resolution - [description]
  53327. *
  53328. * @return {Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline} [description]
  53329. */
  53330. resize: function (width, height, resolution)
  53331. {
  53332. WebGLPipeline.prototype.resize.call(this, width, height, resolution);
  53333. this.projOrtho(0, this.width, this.height, 0, -1000.0, 1000.0);
  53334. return this;
  53335. },
  53336. /**
  53337. * Pushes a rectangle into the vertex batch
  53338. *
  53339. * @method Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#batchFillRect
  53340. * @since 3.0.0
  53341. *
  53342. * @param {number} srcX - Graphics horizontal component for translation
  53343. * @param {number} srcY - Graphics vertical component for translation
  53344. * @param {number} srcScaleX - Graphics horizontal component for scale
  53345. * @param {number} srcScaleY - Graphics vertical component for scale
  53346. * @param {number} srcRotation - Graphics rotation
  53347. * @param {number} x - Horizontal top left coordinate of the rectangle
  53348. * @param {number} y - Vertical top left coordinate of the rectangle
  53349. * @param {number} width - Width of the rectangle
  53350. * @param {number} height - Height of the rectangle
  53351. * @param {integer} fillColor - RGB color packed as a uint
  53352. * @param {number} fillAlpha - Alpha represented as float
  53353. * @param {number} a1 - Matrix stack top a component
  53354. * @param {number} b1 - Matrix stack top b component
  53355. * @param {number} c1 - Matrix stack top c component
  53356. * @param {number} d1 - Matrix stack top d component
  53357. * @param {number} e1 - Matrix stack top e component
  53358. * @param {number} f1 - Matrix stack top f component
  53359. * @param {Float32Array} currentMatrix - Parent matrix, generally used by containers
  53360. */
  53361. batchFillRect: function (srcX, srcY, srcScaleX, srcScaleY, srcRotation, x, y, width, height, fillColor, fillAlpha, a1, b1, c1, d1, e1, f1, currentMatrix)
  53362. {
  53363. this.renderer.setPipeline(this);
  53364. if (this.vertexCount + 6 > this.vertexCapacity)
  53365. {
  53366. this.flush();
  53367. }
  53368. var vertexViewF32 = this.vertexViewF32;
  53369. var vertexViewU32 = this.vertexViewU32;
  53370. var vertexOffset = this.vertexCount * this.vertexComponentCount;
  53371. var xw = x + width;
  53372. var yh = y + height;
  53373. var a0 = currentMatrix[0];
  53374. var b0 = currentMatrix[1];
  53375. var c0 = currentMatrix[2];
  53376. var d0 = currentMatrix[3];
  53377. var e0 = currentMatrix[4];
  53378. var f0 = currentMatrix[5];
  53379. var a = a1 * a0 + b1 * c0;
  53380. var b = a1 * b0 + b1 * d0;
  53381. var c = c1 * a0 + d1 * c0;
  53382. var d = c1 * b0 + d1 * d0;
  53383. var e = e1 * a0 + f1 * c0 + e0;
  53384. var f = e1 * b0 + f1 * d0 + f0;
  53385. var tx0 = x * a + y * c + e;
  53386. var ty0 = x * b + y * d + f;
  53387. var tx1 = x * a + yh * c + e;
  53388. var ty1 = x * b + yh * d + f;
  53389. var tx2 = xw * a + yh * c + e;
  53390. var ty2 = xw * b + yh * d + f;
  53391. var tx3 = xw * a + y * c + e;
  53392. var ty3 = xw * b + y * d + f;
  53393. var tint = Utils.getTintAppendFloatAlphaAndSwap(fillColor, fillAlpha);
  53394. vertexViewF32[vertexOffset + 0] = tx0;
  53395. vertexViewF32[vertexOffset + 1] = ty0;
  53396. vertexViewU32[vertexOffset + 2] = tint;
  53397. vertexViewF32[vertexOffset + 3] = tx1;
  53398. vertexViewF32[vertexOffset + 4] = ty1;
  53399. vertexViewU32[vertexOffset + 5] = tint;
  53400. vertexViewF32[vertexOffset + 6] = tx2;
  53401. vertexViewF32[vertexOffset + 7] = ty2;
  53402. vertexViewU32[vertexOffset + 8] = tint;
  53403. vertexViewF32[vertexOffset + 9] = tx0;
  53404. vertexViewF32[vertexOffset + 10] = ty0;
  53405. vertexViewU32[vertexOffset + 11] = tint;
  53406. vertexViewF32[vertexOffset + 12] = tx2;
  53407. vertexViewF32[vertexOffset + 13] = ty2;
  53408. vertexViewU32[vertexOffset + 14] = tint;
  53409. vertexViewF32[vertexOffset + 15] = tx3;
  53410. vertexViewF32[vertexOffset + 16] = ty3;
  53411. vertexViewU32[vertexOffset + 17] = tint;
  53412. this.vertexCount += 6;
  53413. },
  53414. /**
  53415. * [description]
  53416. *
  53417. * @method Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#batchFillTriangle
  53418. * @since 3.0.0
  53419. *
  53420. * @param {number} srcX - Graphics horizontal component for translation
  53421. * @param {number} srcY - Graphics vertical component for translation
  53422. * @param {number} srcScaleX - Graphics horizontal component for scale
  53423. * @param {number} srcScaleY - Graphics vertical component for scale
  53424. * @param {number} srcRotation - Graphics rotation
  53425. * @param {number} x0 - Point 0 x coordinate
  53426. * @param {number} y0 - Point 0 y coordinate
  53427. * @param {number} x1 - Point 1 x coordinate
  53428. * @param {number} y1 - Point 1 y coordinate
  53429. * @param {number} x2 - Point 2 x coordinate
  53430. * @param {number} y2 - Point 2 y coordinate
  53431. * @param {integer} fillColor - RGB color packed as a uint
  53432. * @param {number} fillAlpha - Alpha represented as float
  53433. * @param {number} a1 - Matrix stack top a component
  53434. * @param {number} b1 - Matrix stack top b component
  53435. * @param {number} c1 - Matrix stack top c component
  53436. * @param {number} d1 - Matrix stack top d component
  53437. * @param {number} e1 - Matrix stack top e component
  53438. * @param {number} f1 - Matrix stack top f component
  53439. * @param {Float32Array} currentMatrix - Parent matrix, generally used by containers
  53440. */
  53441. batchFillTriangle: function (srcX, srcY, srcScaleX, srcScaleY, srcRotation, x0, y0, x1, y1, x2, y2, fillColor, fillAlpha, a1, b1, c1, d1, e1, f1, currentMatrix)
  53442. {
  53443. this.renderer.setPipeline(this);
  53444. if (this.vertexCount + 3 > this.vertexCapacity)
  53445. {
  53446. this.flush();
  53447. }
  53448. var vertexViewF32 = this.vertexViewF32;
  53449. var vertexViewU32 = this.vertexViewU32;
  53450. var vertexOffset = this.vertexCount * this.vertexComponentCount;
  53451. var a0 = currentMatrix[0];
  53452. var b0 = currentMatrix[1];
  53453. var c0 = currentMatrix[2];
  53454. var d0 = currentMatrix[3];
  53455. var e0 = currentMatrix[4];
  53456. var f0 = currentMatrix[5];
  53457. var a = a1 * a0 + b1 * c0;
  53458. var b = a1 * b0 + b1 * d0;
  53459. var c = c1 * a0 + d1 * c0;
  53460. var d = c1 * b0 + d1 * d0;
  53461. var e = e1 * a0 + f1 * c0 + e0;
  53462. var f = e1 * b0 + f1 * d0 + f0;
  53463. var tx0 = x0 * a + y0 * c + e;
  53464. var ty0 = x0 * b + y0 * d + f;
  53465. var tx1 = x1 * a + y1 * c + e;
  53466. var ty1 = x1 * b + y1 * d + f;
  53467. var tx2 = x2 * a + y2 * c + e;
  53468. var ty2 = x2 * b + y2 * d + f;
  53469. var tint = Utils.getTintAppendFloatAlphaAndSwap(fillColor, fillAlpha);
  53470. vertexViewF32[vertexOffset + 0] = tx0;
  53471. vertexViewF32[vertexOffset + 1] = ty0;
  53472. vertexViewU32[vertexOffset + 2] = tint;
  53473. vertexViewF32[vertexOffset + 3] = tx1;
  53474. vertexViewF32[vertexOffset + 4] = ty1;
  53475. vertexViewU32[vertexOffset + 5] = tint;
  53476. vertexViewF32[vertexOffset + 6] = tx2;
  53477. vertexViewF32[vertexOffset + 7] = ty2;
  53478. vertexViewU32[vertexOffset + 8] = tint;
  53479. this.vertexCount += 3;
  53480. },
  53481. /**
  53482. * [description]
  53483. *
  53484. * @method Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#batchStrokeTriangle
  53485. * @since 3.0.0
  53486. *
  53487. * @param {number} srcX - Graphics horizontal component for translation
  53488. * @param {number} srcY - Graphics vertical component for translation
  53489. * @param {number} srcScaleX - Graphics horizontal component for scale
  53490. * @param {number} srcScaleY - Graphics vertical component for scale
  53491. * @param {number} srcRotation - Graphics rotation
  53492. * @param {number} x0 - [description]
  53493. * @param {number} y0 - [description]
  53494. * @param {number} x1 - [description]
  53495. * @param {number} y1 - [description]
  53496. * @param {number} x2 - [description]
  53497. * @param {number} y2 - [description]
  53498. * @param {number} lineWidth - Size of the line as a float value
  53499. * @param {integer} lineColor - RGB color packed as a uint
  53500. * @param {number} lineAlpha - Alpha represented as float
  53501. * @param {number} a - Matrix stack top a component
  53502. * @param {number} b - Matrix stack top b component
  53503. * @param {number} c - Matrix stack top c component
  53504. * @param {number} d - Matrix stack top d component
  53505. * @param {number} e - Matrix stack top e component
  53506. * @param {number} f - Matrix stack top f component
  53507. * @param {Float32Array} currentMatrix - Parent matrix, generally used by containers
  53508. */
  53509. batchStrokeTriangle: function (srcX, srcY, srcScaleX, srcScaleY, srcRotation, x0, y0, x1, y1, x2, y2, lineWidth, lineColor, lineAlpha, a, b, c, d, e, f, currentMatrix)
  53510. {
  53511. var tempTriangle = this.tempTriangle;
  53512. tempTriangle[0].x = x0;
  53513. tempTriangle[0].y = y0;
  53514. tempTriangle[0].width = lineWidth;
  53515. tempTriangle[0].rgb = lineColor;
  53516. tempTriangle[0].alpha = lineAlpha;
  53517. tempTriangle[1].x = x1;
  53518. tempTriangle[1].y = y1;
  53519. tempTriangle[1].width = lineWidth;
  53520. tempTriangle[1].rgb = lineColor;
  53521. tempTriangle[1].alpha = lineAlpha;
  53522. tempTriangle[2].x = x2;
  53523. tempTriangle[2].y = y2;
  53524. tempTriangle[2].width = lineWidth;
  53525. tempTriangle[2].rgb = lineColor;
  53526. tempTriangle[2].alpha = lineAlpha;
  53527. tempTriangle[3].x = x0;
  53528. tempTriangle[3].y = y0;
  53529. tempTriangle[3].width = lineWidth;
  53530. tempTriangle[3].rgb = lineColor;
  53531. tempTriangle[3].alpha = lineAlpha;
  53532. this.batchStrokePath(
  53533. srcX, srcY, srcScaleX, srcScaleY, srcRotation,
  53534. tempTriangle, lineWidth, lineColor, lineAlpha,
  53535. a, b, c, d, e, f,
  53536. false,
  53537. currentMatrix
  53538. );
  53539. },
  53540. /**
  53541. * [description]
  53542. *
  53543. * @method Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#batchFillPath
  53544. * @since 3.0.0
  53545. *
  53546. * @param {number} srcX - Graphics horizontal component for translation
  53547. * @param {number} srcY - Graphics vertical component for translation
  53548. * @param {number} srcScaleX - Graphics horizontal component for scale
  53549. * @param {number} srcScaleY - Graphics vertical component for scale
  53550. * @param {number} srcRotation - Graphics rotation
  53551. * @param {number} path - Collection of points that represent the path
  53552. * @param {integer} fillColor - RGB color packed as a uint
  53553. * @param {number} fillAlpha - Alpha represented as float
  53554. * @param {number} a1 - Matrix stack top a component
  53555. * @param {number} b1 - Matrix stack top b component
  53556. * @param {number} c1 - Matrix stack top c component
  53557. * @param {number} d1 - Matrix stack top d component
  53558. * @param {number} e1 - Matrix stack top e component
  53559. * @param {number} f1 - Matrix stack top f component
  53560. * @param {Float32Array} currentMatrix - Parent matrix, generally used by containers
  53561. */
  53562. batchFillPath: function (srcX, srcY, srcScaleX, srcScaleY, srcRotation, path, fillColor, fillAlpha, a1, b1, c1, d1, e1, f1, currentMatrix)
  53563. {
  53564. this.renderer.setPipeline(this);
  53565. var length = path.length;
  53566. var polygonCache = this.polygonCache;
  53567. var polygonIndexArray;
  53568. var point;
  53569. var v0, v1, v2;
  53570. var vertexViewF32 = this.vertexViewF32;
  53571. var vertexViewU32 = this.vertexViewU32;
  53572. var vertexOffset = 0;
  53573. var x0, y0, x1, y1, x2, y2;
  53574. var tx0, ty0, tx1, ty1, tx2, ty2;
  53575. var a0 = currentMatrix[0];
  53576. var b0 = currentMatrix[1];
  53577. var c0 = currentMatrix[2];
  53578. var d0 = currentMatrix[3];
  53579. var e0 = currentMatrix[4];
  53580. var f0 = currentMatrix[5];
  53581. var a = a1 * a0 + b1 * c0;
  53582. var b = a1 * b0 + b1 * d0;
  53583. var c = c1 * a0 + d1 * c0;
  53584. var d = c1 * b0 + d1 * d0;
  53585. var e = e1 * a0 + f1 * c0 + e0;
  53586. var f = e1 * b0 + f1 * d0 + f0;
  53587. var tint = Utils.getTintAppendFloatAlphaAndSwap(fillColor, fillAlpha);
  53588. for (var pathIndex = 0; pathIndex < length; ++pathIndex)
  53589. {
  53590. point = path[pathIndex];
  53591. polygonCache.push(point.x, point.y);
  53592. }
  53593. polygonIndexArray = Earcut(polygonCache);
  53594. length = polygonIndexArray.length;
  53595. for (var index = 0; index < length; index += 3)
  53596. {
  53597. v0 = polygonIndexArray[index + 0] * 2;
  53598. v1 = polygonIndexArray[index + 1] * 2;
  53599. v2 = polygonIndexArray[index + 2] * 2;
  53600. if (this.vertexCount + 3 > this.vertexCapacity)
  53601. {
  53602. this.flush();
  53603. }
  53604. vertexOffset = this.vertexCount * this.vertexComponentCount;
  53605. x0 = polygonCache[v0 + 0];
  53606. y0 = polygonCache[v0 + 1];
  53607. x1 = polygonCache[v1 + 0];
  53608. y1 = polygonCache[v1 + 1];
  53609. x2 = polygonCache[v2 + 0];
  53610. y2 = polygonCache[v2 + 1];
  53611. tx0 = x0 * a + y0 * c + e;
  53612. ty0 = x0 * b + y0 * d + f;
  53613. tx1 = x1 * a + y1 * c + e;
  53614. ty1 = x1 * b + y1 * d + f;
  53615. tx2 = x2 * a + y2 * c + e;
  53616. ty2 = x2 * b + y2 * d + f;
  53617. vertexViewF32[vertexOffset + 0] = tx0;
  53618. vertexViewF32[vertexOffset + 1] = ty0;
  53619. vertexViewU32[vertexOffset + 2] = tint;
  53620. vertexViewF32[vertexOffset + 3] = tx1;
  53621. vertexViewF32[vertexOffset + 4] = ty1;
  53622. vertexViewU32[vertexOffset + 5] = tint;
  53623. vertexViewF32[vertexOffset + 6] = tx2;
  53624. vertexViewF32[vertexOffset + 7] = ty2;
  53625. vertexViewU32[vertexOffset + 8] = tint;
  53626. this.vertexCount += 3;
  53627. }
  53628. polygonCache.length = 0;
  53629. },
  53630. /**
  53631. * [description]
  53632. *
  53633. * @method Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#batchStrokePath
  53634. * @since 3.0.0
  53635. *
  53636. * @param {number} srcX - Graphics horizontal component for translation
  53637. * @param {number} srcY - Graphics vertical component for translation
  53638. * @param {number} srcScaleX - Graphics horizontal component for scale
  53639. * @param {number} srcScaleY - Graphics vertical component for scale
  53640. * @param {number} srcRotation - Graphics rotation
  53641. * @param {array} path - [description]
  53642. * @param {number} lineWidth - [description]
  53643. * @param {integer} lineColor - RGB color packed as a uint
  53644. * @param {number} lineAlpha - Alpha represented as float
  53645. * @param {number} a - Matrix stack top a component
  53646. * @param {number} b - Matrix stack top b component
  53647. * @param {number} c - Matrix stack top c component
  53648. * @param {number} d - Matrix stack top d component
  53649. * @param {number} e - Matrix stack top e component
  53650. * @param {number} f - Matrix stack top f component
  53651. * @param {boolean} isLastPath - Indicates if the path should be closed
  53652. * @param {Float32Array} currentMatrix - Parent matrix, generally used by containers
  53653. */
  53654. batchStrokePath: function (srcX, srcY, srcScaleX, srcScaleY, srcRotation, path, lineWidth, lineColor, lineAlpha, a, b, c, d, e, f, isLastPath, currentMatrix)
  53655. {
  53656. this.renderer.setPipeline(this);
  53657. var point0, point1;
  53658. var pathLength = path.length;
  53659. var polylines = this.polygonCache;
  53660. var last, curr;
  53661. var vertexViewF32 = this.vertexViewF32;
  53662. var vertexViewU32 = this.vertexViewU32;
  53663. var vertexOffset;
  53664. var line;
  53665. var getTint = Utils.getTintAppendFloatAlphaAndSwap;
  53666. for (var pathIndex = 0; pathIndex + 1 < pathLength; pathIndex += 1)
  53667. {
  53668. point0 = path[pathIndex];
  53669. point1 = path[pathIndex + 1];
  53670. line = this.batchLine(
  53671. srcX, srcY, srcScaleX, srcScaleY, srcRotation,
  53672. point0.x, point0.y,
  53673. point1.x, point1.y,
  53674. point0.width / 2, point1.width / 2,
  53675. point0.rgb, point1.rgb, lineAlpha,
  53676. a, b, c, d, e, f,
  53677. currentMatrix
  53678. );
  53679. polylines.push(line);
  53680. }
  53681. /* Render joints */
  53682. for (var index = 1, polylinesLength = polylines.length; index < polylinesLength; ++index)
  53683. {
  53684. if (this.vertexCount + 6 > this.vertexCapacity)
  53685. {
  53686. this.flush();
  53687. }
  53688. last = polylines[index - 1] || polylines[polylinesLength - 1];
  53689. curr = polylines[index];
  53690. vertexOffset = this.vertexCount * this.vertexComponentCount;
  53691. vertexViewF32[vertexOffset + 0] = last[3 * 2 + 0];
  53692. vertexViewF32[vertexOffset + 1] = last[3 * 2 + 1];
  53693. vertexViewU32[vertexOffset + 2] = getTint(last[3 * 2 + 2], lineAlpha);
  53694. vertexViewF32[vertexOffset + 3] = last[3 * 0 + 0];
  53695. vertexViewF32[vertexOffset + 4] = last[3 * 0 + 1];
  53696. vertexViewU32[vertexOffset + 5] = getTint(last[3 * 0 + 2], lineAlpha);
  53697. vertexViewF32[vertexOffset + 6] = curr[3 * 3 + 0];
  53698. vertexViewF32[vertexOffset + 7] = curr[3 * 3 + 1];
  53699. vertexViewU32[vertexOffset + 8] = getTint(curr[3 * 3 + 2], lineAlpha);
  53700. vertexViewF32[vertexOffset + 9] = last[3 * 0 + 0];
  53701. vertexViewF32[vertexOffset + 10] = last[3 * 0 + 1];
  53702. vertexViewU32[vertexOffset + 11] = getTint(last[3 * 0 + 2], lineAlpha);
  53703. vertexViewF32[vertexOffset + 12] = last[3 * 2 + 0];
  53704. vertexViewF32[vertexOffset + 13] = last[3 * 2 + 1];
  53705. vertexViewU32[vertexOffset + 14] = getTint(last[3 * 2 + 2], lineAlpha);
  53706. vertexViewF32[vertexOffset + 15] = curr[3 * 1 + 0];
  53707. vertexViewF32[vertexOffset + 16] = curr[3 * 1 + 1];
  53708. vertexViewU32[vertexOffset + 17] = getTint(curr[3 * 1 + 2], lineAlpha);
  53709. this.vertexCount += 6;
  53710. }
  53711. polylines.length = 0;
  53712. },
  53713. /**
  53714. * [description]
  53715. *
  53716. * @method Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#batchLine
  53717. * @since 3.0.0
  53718. *
  53719. * @param {number} srcX - Graphics horizontal component for translation
  53720. * @param {number} srcY - Graphics vertical component for translation
  53721. * @param {number} srcScaleX - Graphics horizontal component for scale
  53722. * @param {number} srcScaleY - Graphics vertical component for scale
  53723. * @param {number} srcRotation - Graphics rotation
  53724. * @param {number} ax - X coordinate to the start of the line
  53725. * @param {number} ay - Y coordinate to the start of the line
  53726. * @param {number} bx - X coordinate to the end of the line
  53727. * @param {number} by - Y coordinate to the end of the line
  53728. * @param {number} aLineWidth - Width of the start of the line
  53729. * @param {number} bLineWidth - Width of the end of the line
  53730. * @param {integer} aLineColor - RGB color packed as a uint
  53731. * @param {integer} bLineColor - RGB color packed as a uint
  53732. * @param {number} lineAlpha - Alpha represented as float
  53733. * @param {number} a1 - Matrix stack top a component
  53734. * @param {number} b1 - Matrix stack top b component
  53735. * @param {number} c1 - Matrix stack top c component
  53736. * @param {number} d1 - Matrix stack top d component
  53737. * @param {number} e1 - Matrix stack top e component
  53738. * @param {number} f1 - Matrix stack top f component
  53739. * @param {Float32Array} currentMatrix - Parent matrix, generally used by containers
  53740. */
  53741. batchLine: function (srcX, srcY, srcScaleX, srcScaleY, srcRotation, ax, ay, bx, by, aLineWidth, bLineWidth, aLineColor, bLineColor, lineAlpha, a1, b1, c1, d1, e1, f1, currentMatrix)
  53742. {
  53743. this.renderer.setPipeline(this);
  53744. if (this.vertexCount + 6 > this.vertexCapacity)
  53745. {
  53746. this.flush();
  53747. }
  53748. var a0 = currentMatrix[0];
  53749. var b0 = currentMatrix[1];
  53750. var c0 = currentMatrix[2];
  53751. var d0 = currentMatrix[3];
  53752. var e0 = currentMatrix[4];
  53753. var f0 = currentMatrix[5];
  53754. var a = a1 * a0 + b1 * c0;
  53755. var b = a1 * b0 + b1 * d0;
  53756. var c = c1 * a0 + d1 * c0;
  53757. var d = c1 * b0 + d1 * d0;
  53758. var e = e1 * a0 + f1 * c0 + e0;
  53759. var f = e1 * b0 + f1 * d0 + f0;
  53760. var vertexViewF32 = this.vertexViewF32;
  53761. var vertexViewU32 = this.vertexViewU32;
  53762. var dx = bx - ax;
  53763. var dy = by - ay;
  53764. var len = Math.sqrt(dx * dx + dy * dy);
  53765. var al0 = aLineWidth * (by - ay) / len;
  53766. var al1 = aLineWidth * (ax - bx) / len;
  53767. var bl0 = bLineWidth * (by - ay) / len;
  53768. var bl1 = bLineWidth * (ax - bx) / len;
  53769. var lx0 = bx - bl0;
  53770. var ly0 = by - bl1;
  53771. var lx1 = ax - al0;
  53772. var ly1 = ay - al1;
  53773. var lx2 = bx + bl0;
  53774. var ly2 = by + bl1;
  53775. var lx3 = ax + al0;
  53776. var ly3 = ay + al1;
  53777. var x0 = lx0 * a + ly0 * c + e;
  53778. var y0 = lx0 * b + ly0 * d + f;
  53779. var x1 = lx1 * a + ly1 * c + e;
  53780. var y1 = lx1 * b + ly1 * d + f;
  53781. var x2 = lx2 * a + ly2 * c + e;
  53782. var y2 = lx2 * b + ly2 * d + f;
  53783. var x3 = lx3 * a + ly3 * c + e;
  53784. var y3 = lx3 * b + ly3 * d + f;
  53785. var getTint = Utils.getTintAppendFloatAlphaAndSwap;
  53786. var aTint = getTint(aLineColor, lineAlpha);
  53787. var bTint = getTint(bLineColor, lineAlpha);
  53788. var vertexOffset = this.vertexCount * this.vertexComponentCount;
  53789. vertexViewF32[vertexOffset + 0] = x0;
  53790. vertexViewF32[vertexOffset + 1] = y0;
  53791. vertexViewU32[vertexOffset + 2] = bTint;
  53792. vertexViewF32[vertexOffset + 3] = x1;
  53793. vertexViewF32[vertexOffset + 4] = y1;
  53794. vertexViewU32[vertexOffset + 5] = aTint;
  53795. vertexViewF32[vertexOffset + 6] = x2;
  53796. vertexViewF32[vertexOffset + 7] = y2;
  53797. vertexViewU32[vertexOffset + 8] = bTint;
  53798. vertexViewF32[vertexOffset + 9] = x1;
  53799. vertexViewF32[vertexOffset + 10] = y1;
  53800. vertexViewU32[vertexOffset + 11] = aTint;
  53801. vertexViewF32[vertexOffset + 12] = x3;
  53802. vertexViewF32[vertexOffset + 13] = y3;
  53803. vertexViewU32[vertexOffset + 14] = aTint;
  53804. vertexViewF32[vertexOffset + 15] = x2;
  53805. vertexViewF32[vertexOffset + 16] = y2;
  53806. vertexViewU32[vertexOffset + 17] = bTint;
  53807. this.vertexCount += 6;
  53808. return [
  53809. x0, y0, bLineColor,
  53810. x1, y1, aLineColor,
  53811. x2, y2, bLineColor,
  53812. x3, y3, aLineColor
  53813. ];
  53814. },
  53815. /**
  53816. * [description]
  53817. *
  53818. * @method Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline#batchGraphics
  53819. * @since 3.0.0
  53820. *
  53821. * @param {Phaser.GameObjects.Graphics} graphics - [description]
  53822. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  53823. * @param {Phaser.GameObjects.Components.TransformMatrix} parentTransformMatrix - [description]
  53824. */
  53825. batchGraphics: function (graphics, camera, parentTransformMatrix)
  53826. {
  53827. if (graphics.commandBuffer.length <= 0) { return; }
  53828. var parentMatrix = null;
  53829. if (parentTransformMatrix)
  53830. {
  53831. parentMatrix = parentTransformMatrix.matrix;
  53832. }
  53833. this.renderer.setPipeline(this);
  53834. var cameraScrollX = camera.scrollX * graphics.scrollFactorX;
  53835. var cameraScrollY = camera.scrollY * graphics.scrollFactorY;
  53836. var srcX = graphics.x;
  53837. var srcY = graphics.y;
  53838. var srcScaleX = graphics.scaleX;
  53839. var srcScaleY = graphics.scaleY;
  53840. var srcRotation = graphics.rotation;
  53841. var commands = graphics.commandBuffer;
  53842. var alpha = camera.alpha * graphics.alpha;
  53843. var lineAlpha = 1.0;
  53844. var fillAlpha = 1.0;
  53845. var lineColor = 0;
  53846. var fillColor = 0;
  53847. var lineWidth = 1.0;
  53848. var cameraMatrix = camera.matrix.matrix;
  53849. var lastPath = null;
  53850. var iteration = 0;
  53851. var iterStep = 0.01;
  53852. var tx = 0;
  53853. var ty = 0;
  53854. var ta = 0;
  53855. var x = 0;
  53856. var y = 0;
  53857. var radius = 0;
  53858. var startAngle = 0;
  53859. var endAngle = 0;
  53860. var path = null;
  53861. var sin = Math.sin;
  53862. var cos = Math.cos;
  53863. var sr = sin(srcRotation);
  53864. var cr = cos(srcRotation);
  53865. var sra = cr * srcScaleX;
  53866. var srb = sr * srcScaleX;
  53867. var src = -sr * srcScaleY;
  53868. var srd = cr * srcScaleY;
  53869. var sre = srcX;
  53870. var srf = srcY;
  53871. var cma = cameraMatrix[0];
  53872. var cmb = cameraMatrix[1];
  53873. var cmc = cameraMatrix[2];
  53874. var cmd = cameraMatrix[3];
  53875. var cme = cameraMatrix[4];
  53876. var cmf = cameraMatrix[5];
  53877. var mva, mvb, mvc, mvd, mve, mvf;
  53878. if (parentMatrix)
  53879. {
  53880. var pma = parentMatrix[0];
  53881. var pmb = parentMatrix[1];
  53882. var pmc = parentMatrix[2];
  53883. var pmd = parentMatrix[3];
  53884. var pme = parentMatrix[4];
  53885. var pmf = parentMatrix[5];
  53886. var cse = -cameraScrollX;
  53887. var csf = -cameraScrollY;
  53888. var pse = cse * cma + csf * cmc + cme;
  53889. var psf = cse * cmb + csf * cmd + cmf;
  53890. var pca = pma * cma + pmb * cmc;
  53891. var pcb = pma * cmb + pmb * cmd;
  53892. var pcc = pmc * cma + pmd * cmc;
  53893. var pcd = pmc * cmb + pmd * cmd;
  53894. var pce = pme * cma + pmf * cmc + pse;
  53895. var pcf = pme * cmb + pmf * cmd + psf;
  53896. mva = sra * pca + srb * pcc;
  53897. mvb = sra * pcb + srb * pcd;
  53898. mvc = src * pca + srd * pcc;
  53899. mvd = src * pcb + srd * pcd;
  53900. mve = sre * pca + srf * pcc + pce;
  53901. mvf = sre * pcb + srf * pcd + pcf;
  53902. }
  53903. else
  53904. {
  53905. sre -= cameraScrollX;
  53906. srf -= cameraScrollY;
  53907. mva = sra * cma + srb * cmc;
  53908. mvb = sra * cmb + srb * cmd;
  53909. mvc = src * cma + srd * cmc;
  53910. mvd = src * cmb + srd * cmd;
  53911. mve = sre * cma + srf * cmc + cme;
  53912. mvf = sre * cmb + srf * cmd + cmf;
  53913. }
  53914. var pathArrayIndex;
  53915. var pathArrayLength;
  53916. pathArray.length = 0;
  53917. for (var cmdIndex = 0, cmdLength = commands.length; cmdIndex < cmdLength; ++cmdIndex)
  53918. {
  53919. cmd = commands[cmdIndex];
  53920. switch (cmd)
  53921. {
  53922. case Commands.ARC:
  53923. iteration = 0;
  53924. x = commands[cmdIndex + 1];
  53925. y = commands[cmdIndex + 2];
  53926. radius = commands[cmdIndex + 3];
  53927. startAngle = commands[cmdIndex + 4];
  53928. endAngle = commands[cmdIndex + 5];
  53929. if (lastPath === null)
  53930. {
  53931. lastPath = new Path(x + cos(startAngle) * radius, y + sin(startAngle) * radius, lineWidth, lineColor, lineAlpha * alpha);
  53932. pathArray.push(lastPath);
  53933. iteration += iterStep;
  53934. }
  53935. while (iteration < 1)
  53936. {
  53937. ta = endAngle * iteration + startAngle;
  53938. tx = x + cos(ta) * radius;
  53939. ty = y + sin(ta) * radius;
  53940. lastPath.points.push(new Point(tx, ty, lineWidth, lineColor, lineAlpha * alpha));
  53941. iteration += iterStep;
  53942. }
  53943. ta = endAngle + startAngle;
  53944. tx = x + cos(ta) * radius;
  53945. ty = y + sin(ta) * radius;
  53946. lastPath.points.push(new Point(tx, ty, lineWidth, lineColor, lineAlpha * alpha));
  53947. cmdIndex += 6;
  53948. break;
  53949. case Commands.LINE_STYLE:
  53950. lineWidth = commands[cmdIndex + 1];
  53951. lineColor = commands[cmdIndex + 2];
  53952. lineAlpha = commands[cmdIndex + 3];
  53953. cmdIndex += 3;
  53954. break;
  53955. case Commands.FILL_STYLE:
  53956. fillColor = commands[cmdIndex + 1];
  53957. fillAlpha = commands[cmdIndex + 2];
  53958. cmdIndex += 2;
  53959. break;
  53960. case Commands.BEGIN_PATH:
  53961. pathArray.length = 0;
  53962. lastPath = null;
  53963. break;
  53964. case Commands.CLOSE_PATH:
  53965. if (lastPath && lastPath.points.length)
  53966. {
  53967. lastPath.points.push(lastPath.points[0]);
  53968. }
  53969. break;
  53970. case Commands.FILL_PATH:
  53971. for (pathArrayIndex = 0, pathArrayLength = pathArray.length;
  53972. pathArrayIndex < pathArrayLength;
  53973. ++pathArrayIndex)
  53974. {
  53975. this.batchFillPath(
  53976. /* Graphics Game Object Properties */
  53977. srcX, srcY, srcScaleX, srcScaleY, srcRotation,
  53978. /* Rectangle properties */
  53979. pathArray[pathArrayIndex].points,
  53980. fillColor,
  53981. fillAlpha * alpha,
  53982. /* Transform */
  53983. mva, mvb, mvc, mvd, mve, mvf,
  53984. currentMatrix
  53985. );
  53986. }
  53987. break;
  53988. case Commands.STROKE_PATH:
  53989. for (pathArrayIndex = 0, pathArrayLength = pathArray.length;
  53990. pathArrayIndex < pathArrayLength;
  53991. ++pathArrayIndex)
  53992. {
  53993. path = pathArray[pathArrayIndex];
  53994. this.batchStrokePath(
  53995. /* Graphics Game Object Properties */
  53996. srcX, srcY, srcScaleX, srcScaleY, srcRotation,
  53997. /* Rectangle properties */
  53998. path.points,
  53999. lineWidth,
  54000. lineColor,
  54001. lineAlpha * alpha,
  54002. /* Transform */
  54003. mva, mvb, mvc, mvd, mve, mvf,
  54004. path === this._lastPath,
  54005. currentMatrix
  54006. );
  54007. }
  54008. break;
  54009. case Commands.FILL_RECT:
  54010. this.batchFillRect(
  54011. /* Graphics Game Object Properties */
  54012. srcX, srcY, srcScaleX, srcScaleY, srcRotation,
  54013. /* Rectangle properties */
  54014. commands[cmdIndex + 1],
  54015. commands[cmdIndex + 2],
  54016. commands[cmdIndex + 3],
  54017. commands[cmdIndex + 4],
  54018. fillColor,
  54019. fillAlpha * alpha,
  54020. /* Transform */
  54021. mva, mvb, mvc, mvd, mve, mvf,
  54022. currentMatrix
  54023. );
  54024. cmdIndex += 4;
  54025. break;
  54026. case Commands.FILL_TRIANGLE:
  54027. this.batchFillTriangle(
  54028. /* Graphics Game Object Properties */
  54029. srcX, srcY, srcScaleX, srcScaleY, srcRotation,
  54030. /* Triangle properties */
  54031. commands[cmdIndex + 1],
  54032. commands[cmdIndex + 2],
  54033. commands[cmdIndex + 3],
  54034. commands[cmdIndex + 4],
  54035. commands[cmdIndex + 5],
  54036. commands[cmdIndex + 6],
  54037. fillColor,
  54038. fillAlpha * alpha,
  54039. /* Transform */
  54040. mva, mvb, mvc, mvd, mve, mvf,
  54041. currentMatrix
  54042. );
  54043. cmdIndex += 6;
  54044. break;
  54045. case Commands.STROKE_TRIANGLE:
  54046. this.batchStrokeTriangle(
  54047. /* Graphics Game Object Properties */
  54048. srcX, srcY, srcScaleX, srcScaleY, srcRotation,
  54049. /* Triangle properties */
  54050. commands[cmdIndex + 1],
  54051. commands[cmdIndex + 2],
  54052. commands[cmdIndex + 3],
  54053. commands[cmdIndex + 4],
  54054. commands[cmdIndex + 5],
  54055. commands[cmdIndex + 6],
  54056. lineWidth,
  54057. lineColor,
  54058. lineAlpha * alpha,
  54059. /* Transform */
  54060. mva, mvb, mvc, mvd, mve, mvf,
  54061. currentMatrix
  54062. );
  54063. cmdIndex += 6;
  54064. break;
  54065. case Commands.LINE_TO:
  54066. if (lastPath !== null)
  54067. {
  54068. lastPath.points.push(new Point(commands[cmdIndex + 1], commands[cmdIndex + 2], lineWidth, lineColor, lineAlpha * alpha));
  54069. }
  54070. else
  54071. {
  54072. lastPath = new Path(commands[cmdIndex + 1], commands[cmdIndex + 2], lineWidth, lineColor, lineAlpha * alpha);
  54073. pathArray.push(lastPath);
  54074. }
  54075. cmdIndex += 2;
  54076. break;
  54077. case Commands.MOVE_TO:
  54078. lastPath = new Path(commands[cmdIndex + 1], commands[cmdIndex + 2], lineWidth, lineColor, lineAlpha * alpha);
  54079. pathArray.push(lastPath);
  54080. cmdIndex += 2;
  54081. break;
  54082. case Commands.LINE_FX_TO:
  54083. if (lastPath !== null)
  54084. {
  54085. lastPath.points.push(new Point(
  54086. commands[cmdIndex + 1],
  54087. commands[cmdIndex + 2],
  54088. commands[cmdIndex + 3],
  54089. commands[cmdIndex + 4],
  54090. commands[cmdIndex + 5] * alpha
  54091. ));
  54092. }
  54093. else
  54094. {
  54095. lastPath = new Path(
  54096. commands[cmdIndex + 1],
  54097. commands[cmdIndex + 2],
  54098. commands[cmdIndex + 3],
  54099. commands[cmdIndex + 4],
  54100. commands[cmdIndex + 5] * alpha
  54101. );
  54102. pathArray.push(lastPath);
  54103. }
  54104. cmdIndex += 5;
  54105. break;
  54106. case Commands.MOVE_FX_TO:
  54107. lastPath = new Path(
  54108. commands[cmdIndex + 1],
  54109. commands[cmdIndex + 2],
  54110. commands[cmdIndex + 3],
  54111. commands[cmdIndex + 4],
  54112. commands[cmdIndex + 5] * alpha
  54113. );
  54114. pathArray.push(lastPath);
  54115. cmdIndex += 5;
  54116. break;
  54117. case Commands.SAVE:
  54118. matrixStack[matrixStackLength + 0] = currentMatrix[0];
  54119. matrixStack[matrixStackLength + 1] = currentMatrix[1];
  54120. matrixStack[matrixStackLength + 2] = currentMatrix[2];
  54121. matrixStack[matrixStackLength + 3] = currentMatrix[3];
  54122. matrixStack[matrixStackLength + 4] = currentMatrix[4];
  54123. matrixStack[matrixStackLength + 5] = currentMatrix[5];
  54124. matrixStackLength += 6;
  54125. break;
  54126. case Commands.RESTORE:
  54127. matrixStackLength -= 6;
  54128. currentMatrix[0] = matrixStack[matrixStackLength + 0];
  54129. currentMatrix[1] = matrixStack[matrixStackLength + 1];
  54130. currentMatrix[2] = matrixStack[matrixStackLength + 2];
  54131. currentMatrix[3] = matrixStack[matrixStackLength + 3];
  54132. currentMatrix[4] = matrixStack[matrixStackLength + 4];
  54133. currentMatrix[5] = matrixStack[matrixStackLength + 5];
  54134. break;
  54135. case Commands.TRANSLATE:
  54136. x = commands[cmdIndex + 1];
  54137. y = commands[cmdIndex + 2];
  54138. currentMatrix[4] = currentMatrix[0] * x + currentMatrix[2] * y + currentMatrix[4];
  54139. currentMatrix[5] = currentMatrix[1] * x + currentMatrix[3] * y + currentMatrix[5];
  54140. cmdIndex += 2;
  54141. break;
  54142. case Commands.SCALE:
  54143. x = commands[cmdIndex + 1];
  54144. y = commands[cmdIndex + 2];
  54145. currentMatrix[0] *= x;
  54146. currentMatrix[1] *= x;
  54147. currentMatrix[2] *= y;
  54148. currentMatrix[3] *= y;
  54149. cmdIndex += 2;
  54150. break;
  54151. case Commands.ROTATE:
  54152. y = commands[cmdIndex + 1];
  54153. x = sin(y);
  54154. y = cos(y);
  54155. sra = currentMatrix[0];
  54156. srb = currentMatrix[1];
  54157. src = currentMatrix[2];
  54158. srd = currentMatrix[3];
  54159. currentMatrix[0] = y * sra + x * src;
  54160. currentMatrix[1] = y * srb + x * srd;
  54161. currentMatrix[2] = -x * sra + y * src;
  54162. currentMatrix[3] = -x * srb + y * srd;
  54163. cmdIndex += 1;
  54164. break;
  54165. default:
  54166. // eslint-disable-next-line no-console
  54167. console.error('Phaser: Invalid Graphics Command ID ' + cmd);
  54168. break;
  54169. }
  54170. }
  54171. }
  54172. });
  54173. module.exports = FlatTintPipeline;
  54174. /***/ }),
  54175. /* 254 */
  54176. /***/ (function(module, exports, __webpack_require__) {
  54177. /**
  54178. * @author Richard Davey <rich@photonstorm.com>
  54179. * @author Felipe Alfonso <@bitnenfer>
  54180. * @copyright 2018 Photon Storm Ltd.
  54181. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  54182. */
  54183. var Class = __webpack_require__(0);
  54184. var ShaderSourceFS = __webpack_require__(501);
  54185. var ShaderSourceVS = __webpack_require__(500);
  54186. var WebGLPipeline = __webpack_require__(84);
  54187. /**
  54188. * @classdesc
  54189. * BitmapMaskPipeline handles all bitmap masking rendering in WebGL. It works by using
  54190. * sampling two texture on the fragment shader and using the fragment's alpha to clip the region.
  54191. * The config properties are:
  54192. * - game: Current game instance.
  54193. * - renderer: Current WebGL renderer.
  54194. * - topology: This indicates how the primitives are rendered. The default value is GL_TRIANGLES.
  54195. * Here is the full list of rendering primitives (https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Constants).
  54196. * - vertShader: Source for vertex shader as a string.
  54197. * - fragShader: Source for fragment shader as a string.
  54198. * - vertexCapacity: The amount of vertices that shall be allocated
  54199. * - vertexSize: The size of a single vertex in bytes.
  54200. *
  54201. * @class BitmapMaskPipeline
  54202. * @extends Phaser.Renderer.WebGL.WebGLPipeline
  54203. * @memberOf Phaser.Renderer.WebGL.Pipelines
  54204. * @constructor
  54205. * @since 3.0.0
  54206. *
  54207. * @param {object} config - Used for overriding shader an pipeline properties if extending this pipeline.
  54208. */
  54209. var BitmapMaskPipeline = new Class({
  54210. Extends: WebGLPipeline,
  54211. initialize:
  54212. function BitmapMaskPipeline (config)
  54213. {
  54214. WebGLPipeline.call(this, {
  54215. game: config.game,
  54216. renderer: config.renderer,
  54217. gl: config.renderer.gl,
  54218. topology: (config.topology ? config.topology : config.renderer.gl.TRIANGLES),
  54219. vertShader: (config.vertShader ? config.vertShader : ShaderSourceVS),
  54220. fragShader: (config.fragShader ? config.fragShader : ShaderSourceFS),
  54221. vertexCapacity: (config.vertexCapacity ? config.vertexCapacity : 3),
  54222. vertexSize: (config.vertexSize ? config.vertexSize :
  54223. Float32Array.BYTES_PER_ELEMENT * 2),
  54224. vertices: new Float32Array([
  54225. -1, +1, -1, -7, +7, +1
  54226. ]).buffer,
  54227. attributes: [
  54228. {
  54229. name: 'inPosition',
  54230. size: 2,
  54231. type: config.renderer.gl.FLOAT,
  54232. normalized: false,
  54233. offset: 0
  54234. }
  54235. ]
  54236. });
  54237. /**
  54238. * Float32 view of the array buffer containing the pipeline's vertices.
  54239. *
  54240. * @name Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#vertexViewF32
  54241. * @type {Float32Array}
  54242. * @since 3.0.0
  54243. */
  54244. this.vertexViewF32 = new Float32Array(this.vertexData);
  54245. /**
  54246. * Size of the batch.
  54247. *
  54248. * @name Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#maxQuads
  54249. * @type {number}
  54250. * @default 1
  54251. * @since 3.0.0
  54252. */
  54253. this.maxQuads = 1;
  54254. /**
  54255. * Dirty flag to check if resolution properties need to be updated on the
  54256. * masking shader.
  54257. *
  54258. * @name Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#resolutionDirty
  54259. * @type {boolean}
  54260. * @default true
  54261. * @since 3.0.0
  54262. */
  54263. this.resolutionDirty = true;
  54264. },
  54265. /**
  54266. * Called every time the pipeline needs to be used.
  54267. * It binds all necessary resources.
  54268. *
  54269. * @method Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#onBind
  54270. * @since 3.0.0
  54271. *
  54272. * @return {Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline} [description]
  54273. */
  54274. onBind: function ()
  54275. {
  54276. WebGLPipeline.prototype.onBind.call(this);
  54277. var renderer = this.renderer;
  54278. var program = this.program;
  54279. if (this.resolutionDirty)
  54280. {
  54281. renderer.setFloat2(program, 'uResolution', this.width, this.height);
  54282. renderer.setInt1(program, 'uMainSampler', 0);
  54283. renderer.setInt1(program, 'uMaskSampler', 1);
  54284. this.resolutionDirty = false;
  54285. }
  54286. return this;
  54287. },
  54288. /**
  54289. * [description]
  54290. *
  54291. * @method Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#resize
  54292. * @since 3.0.0
  54293. *
  54294. * @param {number} width - [description]
  54295. * @param {number} height - [description]
  54296. * @param {number} resolution - [description]
  54297. *
  54298. * @return {Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline} [description]
  54299. */
  54300. resize: function (width, height, resolution)
  54301. {
  54302. WebGLPipeline.prototype.resize.call(this, width, height, resolution);
  54303. this.resolutionDirty = true;
  54304. return this;
  54305. },
  54306. /**
  54307. * Binds necessary resources and renders the mask to a separated framebuffer.
  54308. * The framebuffer for the masked object is also bound for further use.
  54309. *
  54310. * @method Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#beginMask
  54311. * @since 3.0.0
  54312. *
  54313. * @param {Phaser.GameObjects.GameObject} mask - GameObject used as mask.
  54314. * @param {Phaser.GameObjects.GameObject} maskedObject - GameObject masked by the mask GameObject.
  54315. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  54316. */
  54317. beginMask: function (mask, maskedObject, camera)
  54318. {
  54319. var bitmapMask = mask.bitmapMask;
  54320. var renderer = this.renderer;
  54321. var gl = this.gl;
  54322. var visible = bitmapMask.visible;
  54323. if (bitmapMask && gl)
  54324. {
  54325. // First we clear the mask framebuffer
  54326. renderer.setFramebuffer(mask.maskFramebuffer);
  54327. gl.clearColor(0, 0, 0, 0);
  54328. gl.clear(gl.COLOR_BUFFER_BIT);
  54329. // We render our mask source
  54330. bitmapMask.visible = true;
  54331. bitmapMask.renderWebGL(renderer, bitmapMask, 0.0, camera);
  54332. bitmapMask.visible = visible;
  54333. renderer.flush();
  54334. // Bind and clear our main source (masked object)
  54335. renderer.setFramebuffer(mask.mainFramebuffer);
  54336. gl.clearColor(0, 0, 0, 0);
  54337. gl.clear(gl.COLOR_BUFFER_BIT);
  54338. }
  54339. },
  54340. /**
  54341. * The masked game object's framebuffer is unbound and it's texture
  54342. * is bound together with the mask texture and the mask shader and
  54343. * a draw call with a single quad is processed. Here is where the
  54344. * masking effect is applied.
  54345. *
  54346. * @method Phaser.Renderer.WebGL.Pipelines.BitmapMaskPipeline#endMask
  54347. * @since 3.0.0
  54348. *
  54349. * @param {Phaser.GameObjects.GameObject} mask - GameObject used as a mask.
  54350. */
  54351. endMask: function (mask)
  54352. {
  54353. var bitmapMask = mask.bitmapMask;
  54354. var renderer = this.renderer;
  54355. var gl = this.gl;
  54356. if (bitmapMask)
  54357. {
  54358. // Return to default framebuffer
  54359. renderer.setFramebuffer(null);
  54360. // Bind bitmap mask pipeline and draw
  54361. renderer.setPipeline(this);
  54362. renderer.setTexture2D(mask.maskTexture, 1);
  54363. renderer.setTexture2D(mask.mainTexture, 0);
  54364. renderer.setInt1(this.program, 'uInvertMaskAlpha', mask.invertAlpha);
  54365. // Finally draw a triangle filling the whole screen
  54366. gl.drawArrays(this.topology, 0, 3);
  54367. }
  54368. }
  54369. });
  54370. module.exports = BitmapMaskPipeline;
  54371. /***/ }),
  54372. /* 255 */
  54373. /***/ (function(module, exports) {
  54374. /**
  54375. * @author Richard Davey <rich@photonstorm.com>
  54376. * @copyright 2018 Photon Storm Ltd.
  54377. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  54378. */
  54379. /**
  54380. * [description]
  54381. *
  54382. * @function Phaser.Renderer.Snapshot.WebGL
  54383. * @since 3.0.0
  54384. *
  54385. * @param {HTMLCanvasElement} sourceCanvas - [description]
  54386. * @param {string} [type='image/png'] - [description]
  54387. * @param {number} [encoderOptions=0.92] - [description]
  54388. *
  54389. * @return {HTMLImageElement} [description]
  54390. */
  54391. var WebGLSnapshot = function (sourceCanvas, type, encoderOptions)
  54392. {
  54393. if (!type) { type = 'image/png'; }
  54394. if (!encoderOptions) { encoderOptions = 0.92; }
  54395. var gl = sourceCanvas.getContext('experimental-webgl');
  54396. var pixels = new Uint8Array(gl.drawingBufferWidth * gl.drawingBufferHeight * 4);
  54397. gl.readPixels(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
  54398. // CanvasPool?
  54399. var canvas = document.createElement('canvas');
  54400. var ctx = canvas.getContext('2d');
  54401. var imageData;
  54402. canvas.width = gl.drawingBufferWidth;
  54403. canvas.height = gl.drawingBufferHeight;
  54404. imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  54405. var data = imageData.data;
  54406. for (var y = 0; y < canvas.height; y += 1)
  54407. {
  54408. for (var x = 0; x < canvas.width; x += 1)
  54409. {
  54410. var si = ((canvas.height - y) * canvas.width + x) * 4;
  54411. var di = (y * canvas.width + x) * 4;
  54412. data[di + 0] = pixels[si + 0];
  54413. data[di + 1] = pixels[si + 1];
  54414. data[di + 2] = pixels[si + 2];
  54415. data[di + 3] = pixels[si + 3];
  54416. }
  54417. }
  54418. ctx.putImageData(imageData, 0, 0);
  54419. var src = canvas.toDataURL(type, encoderOptions);
  54420. var image = new Image();
  54421. image.src = src;
  54422. return image;
  54423. };
  54424. module.exports = WebGLSnapshot;
  54425. /***/ }),
  54426. /* 256 */
  54427. /***/ (function(module, exports, __webpack_require__) {
  54428. /**
  54429. * @author Richard Davey <rich@photonstorm.com>
  54430. * @author Felipe Alfonso <@bitnenfer>
  54431. * @copyright 2018 Photon Storm Ltd.
  54432. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  54433. */
  54434. var Class = __webpack_require__(0);
  54435. var CONST = __webpack_require__(22);
  54436. var IsSizePowerOfTwo = __webpack_require__(85);
  54437. var SpliceOne = __webpack_require__(56);
  54438. var Utils = __webpack_require__(21);
  54439. var WebGLSnapshot = __webpack_require__(255);
  54440. // Default Pipelines
  54441. var BitmapMaskPipeline = __webpack_require__(254);
  54442. var FlatTintPipeline = __webpack_require__(253);
  54443. var ForwardDiffuseLightPipeline = __webpack_require__(151);
  54444. var TextureTintPipeline = __webpack_require__(130);
  54445. /**
  54446. * @callback WebGLContextCallback
  54447. *
  54448. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - [description]
  54449. */
  54450. /**
  54451. * @typedef {object} SnapshotState
  54452. *
  54453. * @property {SnapshotCallback} callback - [description]
  54454. * @property {string} type - [description]
  54455. * @property {number} encoder - [description]
  54456. */
  54457. /**
  54458. * @classdesc
  54459. * WebGLRenderer is a class that contains the needed functionality to keep the
  54460. * WebGLRenderingContext state clean. The main idea of the WebGLRenderer is to keep track of
  54461. * any context change that happens for WebGL rendering inside of Phaser. This means
  54462. * if raw webgl functions are called outside the WebGLRenderer of the Phaser WebGL
  54463. * rendering ecosystem they might pollute the current WebGLRenderingContext state producing
  54464. * unexpected behavior. It's recommended that WebGL interaction is done through
  54465. * WebGLRenderer and/or WebGLPipeline.
  54466. *
  54467. * @class WebGLRenderer
  54468. * @memberOf Phaser.Renderer.WebGL
  54469. * @constructor
  54470. * @since 3.0.0
  54471. *
  54472. * @param {Phaser.Game} game - [description]
  54473. */
  54474. var WebGLRenderer = new Class({
  54475. initialize:
  54476. function WebGLRenderer (game)
  54477. {
  54478. // eslint-disable-next-line consistent-this
  54479. var renderer = this;
  54480. var gameConfig = game.config;
  54481. var contextCreationConfig = {
  54482. alpha: gameConfig.transparent,
  54483. depth: false, // enable when 3D is added in the future
  54484. antialias: gameConfig.antialias,
  54485. premultipliedAlpha: gameConfig.premultipliedAlpha,
  54486. stencil: true,
  54487. preserveDrawingBuffer: gameConfig.preserveDrawingBuffer,
  54488. failIfMajorPerformanceCaveat: gameConfig.failIfMajorPerformanceCaveat,
  54489. powerPreference: gameConfig.powerPreference
  54490. };
  54491. /**
  54492. * [description]
  54493. *
  54494. * @name Phaser.Renderer.WebGL.WebGLRenderer#config
  54495. * @type {RendererConfig}
  54496. * @since 3.0.0
  54497. */
  54498. this.config = {
  54499. clearBeforeRender: gameConfig.clearBeforeRender,
  54500. antialias: gameConfig.antialias,
  54501. backgroundColor: gameConfig.backgroundColor,
  54502. contextCreation: contextCreationConfig,
  54503. resolution: gameConfig.resolution,
  54504. autoResize: gameConfig.autoResize,
  54505. roundPixels: gameConfig.roundPixels,
  54506. maxTextures: gameConfig.maxTextures,
  54507. maxTextureSize: gameConfig.maxTextureSize,
  54508. batchSize: gameConfig.batchSize
  54509. };
  54510. /**
  54511. * [description]
  54512. *
  54513. * @name Phaser.Renderer.WebGL.WebGLRenderer#game
  54514. * @type {Phaser.Game}
  54515. * @since 3.0.0
  54516. */
  54517. this.game = game;
  54518. /**
  54519. * [description]
  54520. *
  54521. * @name Phaser.Renderer.WebGL.WebGLRenderer#type
  54522. * @type {integer}
  54523. * @since 3.0.0
  54524. */
  54525. this.type = CONST.WEBGL;
  54526. /**
  54527. * [description]
  54528. *
  54529. * @name Phaser.Renderer.WebGL.WebGLRenderer#width
  54530. * @type {number}
  54531. * @since 3.0.0
  54532. */
  54533. this.width = game.config.width;
  54534. /**
  54535. * [description]
  54536. *
  54537. * @name Phaser.Renderer.WebGL.WebGLRenderer#height
  54538. * @type {number}
  54539. * @since 3.0.0
  54540. */
  54541. this.height = game.config.height;
  54542. /**
  54543. * [description]
  54544. *
  54545. * @name Phaser.Renderer.WebGL.WebGLRenderer#canvas
  54546. * @type {HTMLCanvasElement}
  54547. * @since 3.0.0
  54548. */
  54549. this.canvas = game.canvas;
  54550. /**
  54551. * [description]
  54552. *
  54553. * @name Phaser.Renderer.WebGL.WebGLRenderer#lostContextCallbacks
  54554. * @type {WebGLContextCallback[]}
  54555. * @since 3.0.0
  54556. */
  54557. this.lostContextCallbacks = [];
  54558. /**
  54559. * [description]
  54560. *
  54561. * @name Phaser.Renderer.WebGL.WebGLRenderer#restoredContextCallbacks
  54562. * @type {WebGLContextCallback[]}
  54563. * @since 3.0.0
  54564. */
  54565. this.restoredContextCallbacks = [];
  54566. /**
  54567. * [description]
  54568. *
  54569. * @name Phaser.Renderer.WebGL.WebGLRenderer#blendModes
  54570. * @type {array}
  54571. * @default []
  54572. * @since 3.0.0
  54573. */
  54574. this.blendModes = [];
  54575. /**
  54576. * Keeps track of any WebGLTexture created with the current WebGLRenderingContext
  54577. *
  54578. * @name Phaser.Renderer.WebGL.WebGLRenderer#nativeTextures
  54579. * @type {array}
  54580. * @default []
  54581. * @since 3.0.0
  54582. */
  54583. this.nativeTextures = [];
  54584. /**
  54585. * [description]
  54586. *
  54587. * @name Phaser.Renderer.WebGL.WebGLRenderer#contextLost
  54588. * @type {boolean}
  54589. * @default false
  54590. * @since 3.0.0
  54591. */
  54592. this.contextLost = false;
  54593. /**
  54594. * This object will store all pipelines created through addPipeline
  54595. *
  54596. * @name Phaser.Renderer.WebGL.WebGLRenderer#pipelines
  54597. * @type {object}
  54598. * @default null
  54599. * @since 3.0.0
  54600. */
  54601. this.pipelines = null;
  54602. /**
  54603. * [description]
  54604. *
  54605. * @name Phaser.Renderer.WebGL.WebGLRenderer#snapshotState
  54606. * @type {SnapshotState}
  54607. * @since 3.0.0
  54608. */
  54609. this.snapshotState = {
  54610. callback: null,
  54611. type: null,
  54612. encoder: null
  54613. };
  54614. // Internal Renderer State (Textures, Framebuffers, Pipelines, Buffers, etc)
  54615. /**
  54616. * Cached value for the last texture unit that was used
  54617. *
  54618. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentActiveTextureUnit
  54619. * @type {integer}
  54620. * @since 3.1.0
  54621. */
  54622. this.currentActiveTextureUnit = 0;
  54623. /**
  54624. * An array of the last texture handles that were bound to the WebGLRenderingContext
  54625. *
  54626. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentTextures
  54627. * @type {array}
  54628. * @since 3.0.0
  54629. */
  54630. this.currentTextures = new Array(16);
  54631. /**
  54632. * Current framebuffer in use
  54633. *
  54634. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentFramebuffer
  54635. * @type {WebGLFramebuffer}
  54636. * @default null
  54637. * @since 3.0.0
  54638. */
  54639. this.currentFramebuffer = null;
  54640. /**
  54641. * Current WebGLPipeline in use
  54642. *
  54643. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentPipeline
  54644. * @type {Phaser.Renderer.WebGL.WebGLPipeline}
  54645. * @default null
  54646. * @since 3.0.0
  54647. */
  54648. this.currentPipeline = null;
  54649. /**
  54650. * Current WebGLProgram in use
  54651. *
  54652. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentProgram
  54653. * @type {WebGLProgram}
  54654. * @default null
  54655. * @since 3.0.0
  54656. */
  54657. this.currentProgram = null;
  54658. /**
  54659. * Current WebGLBuffer (Vertex buffer) in use
  54660. *
  54661. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentVertexBuffer
  54662. * @type {WebGLBuffer}
  54663. * @default null
  54664. * @since 3.0.0
  54665. */
  54666. this.currentVertexBuffer = null;
  54667. /**
  54668. * Current WebGLBuffer (Index buffer) in use
  54669. *
  54670. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentIndexBuffer
  54671. * @type {WebGLBuffer}
  54672. * @default null
  54673. * @since 3.0.0
  54674. */
  54675. this.currentIndexBuffer = null;
  54676. /**
  54677. * Current blend mode in use
  54678. *
  54679. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentBlendMode
  54680. * @type {integer}
  54681. * @since 3.0.0
  54682. */
  54683. this.currentBlendMode = Infinity;
  54684. /**
  54685. * Indicates if the the scissor state is enabled in WebGLRenderingContext
  54686. *
  54687. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentScissorEnabled
  54688. * @type {boolean}
  54689. * @default false
  54690. * @since 3.0.0
  54691. */
  54692. this.currentScissorEnabled = false;
  54693. /**
  54694. * Stores the current scissor data
  54695. *
  54696. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentScissor
  54697. * @type {Uint32Array}
  54698. * @since 3.0.0
  54699. */
  54700. this.currentScissor = new Uint32Array([ 0, 0, this.width, this.height ]);
  54701. /**
  54702. * Index to the scissor stack top
  54703. *
  54704. * @name Phaser.Renderer.WebGL.WebGLRenderer#currentScissorIdx
  54705. * @type {number}
  54706. * @default 0
  54707. * @since 3.0.0
  54708. */
  54709. this.currentScissorIdx = 0;
  54710. /**
  54711. * Stack of scissor data
  54712. *
  54713. * @name Phaser.Renderer.WebGL.WebGLRenderer#scissorStack
  54714. * @type {Uint32Array}
  54715. * @since 3.0.0
  54716. */
  54717. this.scissorStack = new Uint32Array(4 * 1000);
  54718. // Setup context lost and restore event listeners
  54719. this.canvas.addEventListener('webglcontextlost', function (event)
  54720. {
  54721. renderer.contextLost = true;
  54722. event.preventDefault();
  54723. for (var index = 0; index < renderer.lostContextCallbacks.length; ++index)
  54724. {
  54725. var callback = renderer.lostContextCallbacks[index];
  54726. callback[0].call(callback[1], renderer);
  54727. }
  54728. }, false);
  54729. this.canvas.addEventListener('webglcontextrestored', function ()
  54730. {
  54731. renderer.contextLost = false;
  54732. renderer.init(renderer.config);
  54733. for (var index = 0; index < renderer.restoredContextCallbacks.length; ++index)
  54734. {
  54735. var callback = renderer.restoredContextCallbacks[index];
  54736. callback[0].call(callback[1], renderer);
  54737. }
  54738. }, false);
  54739. // These are initialized post context creation
  54740. /**
  54741. * [description]
  54742. *
  54743. * @name Phaser.Renderer.WebGL.WebGLRenderer#gl
  54744. * @type {WebGLRenderingContext}
  54745. * @default null
  54746. * @since 3.0.0
  54747. */
  54748. this.gl = null;
  54749. /**
  54750. * Array of strings that indicate which WebGL extensions are supported by the browser
  54751. *
  54752. * @name Phaser.Renderer.WebGL.WebGLRenderer#supportedExtensions
  54753. * @type {object}
  54754. * @default null
  54755. * @since 3.0.0
  54756. */
  54757. this.supportedExtensions = null;
  54758. /**
  54759. * Extensions loaded into the current context
  54760. *
  54761. * @name Phaser.Renderer.WebGL.WebGLRenderer#extensions
  54762. * @type {object}
  54763. * @default {}
  54764. * @since 3.0.0
  54765. */
  54766. this.extensions = {};
  54767. /**
  54768. * Stores the current WebGL component formats for further use
  54769. *
  54770. * @name Phaser.Renderer.WebGL.WebGLRenderer#glFormats
  54771. * @type {array}
  54772. * @default []
  54773. * @since 3.2.0
  54774. */
  54775. this.glFormats = [];
  54776. /**
  54777. * Stores the supported WebGL texture compression formats.
  54778. *
  54779. * @name Phaser.Renderer.WebGL.WebGLRenderer#compression
  54780. * @type {array}
  54781. * @since 3.8.0
  54782. */
  54783. this.compression = {
  54784. ETC1: false,
  54785. PVRTC: false,
  54786. S3TC: false
  54787. };
  54788. /**
  54789. * Cached drawing buffer height to reduce gl calls.
  54790. *
  54791. * @name Phaser.Renderer.WebGL.WebGLRenderer#drawingBufferHeight
  54792. * @type {number}
  54793. * @readOnly
  54794. * @since 3.11.0
  54795. */
  54796. this.drawingBufferHeight = 0;
  54797. this.init(this.config);
  54798. },
  54799. /**
  54800. * Creates a new WebGLRenderingContext and initializes all internal
  54801. * state.
  54802. *
  54803. * @method Phaser.Renderer.WebGL.WebGLRenderer#init
  54804. * @since 3.0.0
  54805. *
  54806. * @param {object} config - [description]
  54807. *
  54808. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  54809. */
  54810. init: function (config)
  54811. {
  54812. var gl;
  54813. var canvas = this.canvas;
  54814. var clearColor = config.backgroundColor;
  54815. // Did they provide their own context?
  54816. if (this.game.config.context)
  54817. {
  54818. gl = this.game.config.context;
  54819. }
  54820. else
  54821. {
  54822. gl = canvas.getContext('webgl', config.contextCreation) || canvas.getContext('experimental-webgl', config.contextCreation);
  54823. }
  54824. if (!gl || gl.isContextLost())
  54825. {
  54826. this.contextLost = true;
  54827. throw new Error('This browser does not support WebGL. Try using the Canvas pipeline.');
  54828. }
  54829. this.gl = gl;
  54830. // Set it back into the Game, so developers can access it from there too
  54831. this.game.context = gl;
  54832. for (var i = 0; i <= 16; i++)
  54833. {
  54834. this.blendModes.push({ func: [ gl.ONE, gl.ONE_MINUS_SRC_ALPHA ], equation: gl.FUNC_ADD });
  54835. }
  54836. this.blendModes[1].func = [ gl.ONE, gl.DST_ALPHA ];
  54837. this.blendModes[2].func = [ gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA ];
  54838. this.blendModes[3].func = [ gl.ONE, gl.ONE_MINUS_SRC_COLOR ];
  54839. this.glFormats[0] = gl.BYTE;
  54840. this.glFormats[1] = gl.SHORT;
  54841. this.glFormats[2] = gl.UNSIGNED_BYTE;
  54842. this.glFormats[3] = gl.UNSIGNED_SHORT;
  54843. this.glFormats[4] = gl.FLOAT;
  54844. // Load supported extensions
  54845. var exts = gl.getSupportedExtensions();
  54846. if (!config.maxTextures)
  54847. {
  54848. config.maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
  54849. }
  54850. if (!config.maxTextureSize)
  54851. {
  54852. config.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
  54853. }
  54854. var extString = 'WEBGL_compressed_texture_';
  54855. var wkExtString = 'WEBKIT_' + extString;
  54856. this.compression.ETC1 = gl.getExtension(extString + 'etc1') || gl.getExtension(wkExtString + 'etc1');
  54857. this.compression.PVRTC = gl.getExtension(extString + 'pvrtc') || gl.getExtension(wkExtString + 'pvrtc');
  54858. this.compression.S3TC = gl.getExtension(extString + 's3tc') || gl.getExtension(wkExtString + 's3tc');
  54859. this.supportedExtensions = exts;
  54860. // Setup initial WebGL state
  54861. gl.disable(gl.DEPTH_TEST);
  54862. gl.disable(gl.CULL_FACE);
  54863. // gl.disable(gl.SCISSOR_TEST);
  54864. gl.enable(gl.BLEND);
  54865. gl.clearColor(clearColor.redGL, clearColor.greenGL, clearColor.blueGL, 1.0);
  54866. // Initialize all textures to null
  54867. for (var index = 0; index < this.currentTextures.length; ++index)
  54868. {
  54869. this.currentTextures[index] = null;
  54870. }
  54871. // Clear previous pipelines and reload default ones
  54872. this.pipelines = {};
  54873. this.addPipeline('TextureTintPipeline', new TextureTintPipeline({ game: this.game, renderer: this }));
  54874. this.addPipeline('FlatTintPipeline', new FlatTintPipeline({ game: this.game, renderer: this }));
  54875. this.addPipeline('BitmapMaskPipeline', new BitmapMaskPipeline({ game: this.game, renderer: this }));
  54876. this.addPipeline('Light2D', new ForwardDiffuseLightPipeline({ game: this.game, renderer: this }));
  54877. this.setBlendMode(CONST.BlendModes.NORMAL);
  54878. this.resize(this.width, this.height);
  54879. this.game.events.once('ready', this.boot, this);
  54880. return this;
  54881. },
  54882. /**
  54883. * Internal boot handler. Calls 'boot' on each pipeline.
  54884. *
  54885. * @method Phaser.Renderer.WebGL.WebGLRenderer#boot
  54886. * @private
  54887. * @since 3.11.0
  54888. */
  54889. boot: function ()
  54890. {
  54891. for (var pipelineName in this.pipelines)
  54892. {
  54893. this.pipelines[pipelineName].boot();
  54894. }
  54895. },
  54896. /**
  54897. * [description]
  54898. *
  54899. * @method Phaser.Renderer.WebGL.WebGLRenderer#resize
  54900. * @since 3.0.0
  54901. *
  54902. * @param {number} width - [description]
  54903. * @param {number} height - [description]
  54904. *
  54905. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  54906. */
  54907. resize: function (width, height)
  54908. {
  54909. var gl = this.gl;
  54910. var pipelines = this.pipelines;
  54911. var resolution = this.config.resolution;
  54912. this.width = Math.floor(width * resolution);
  54913. this.height = Math.floor(height * resolution);
  54914. this.canvas.width = this.width;
  54915. this.canvas.height = this.height;
  54916. if (this.config.autoResize)
  54917. {
  54918. this.canvas.style.width = (this.width / resolution) + 'px';
  54919. this.canvas.style.height = (this.height / resolution) + 'px';
  54920. }
  54921. gl.viewport(0, 0, this.width, this.height);
  54922. // Update all registered pipelines
  54923. for (var pipelineName in pipelines)
  54924. {
  54925. pipelines[pipelineName].resize(width, height, resolution);
  54926. }
  54927. this.currentScissor.set([ 0, 0, this.width, this.height ]);
  54928. this.drawingBufferHeight = gl.drawingBufferHeight;
  54929. return this;
  54930. },
  54931. /**
  54932. * [description]
  54933. *
  54934. * @method Phaser.Renderer.WebGL.WebGLRenderer#onContextRestored
  54935. * @since 3.0.0
  54936. *
  54937. * @param {WebGLContextCallback} callback - [description]
  54938. * @param {object} target - [description]
  54939. *
  54940. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  54941. */
  54942. onContextRestored: function (callback, target)
  54943. {
  54944. this.restoredContextCallbacks.push([ callback, target ]);
  54945. return this;
  54946. },
  54947. /**
  54948. * [description]
  54949. *
  54950. * @method Phaser.Renderer.WebGL.WebGLRenderer#onContextLost
  54951. * @since 3.0.0
  54952. *
  54953. * @param {WebGLContextCallback} callback - [description]
  54954. * @param {object} target - [description]
  54955. *
  54956. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  54957. */
  54958. onContextLost: function (callback, target)
  54959. {
  54960. this.lostContextCallbacks.push([ callback, target ]);
  54961. return this;
  54962. },
  54963. /**
  54964. * Checks if a WebGL extension is supported
  54965. *
  54966. * @method Phaser.Renderer.WebGL.WebGLRenderer#hasExtension
  54967. * @since 3.0.0
  54968. *
  54969. * @param {string} extensionName - Name of the WebGL extension
  54970. *
  54971. * @return {boolean} [description]
  54972. */
  54973. hasExtension: function (extensionName)
  54974. {
  54975. return this.supportedExtensions ? this.supportedExtensions.indexOf(extensionName) : false;
  54976. },
  54977. /**
  54978. * Loads a WebGL extension
  54979. *
  54980. * @method Phaser.Renderer.WebGL.WebGLRenderer#getExtension
  54981. * @since 3.0.0
  54982. *
  54983. * @param {string} extensionName - [description]
  54984. *
  54985. * @return {object} WebGL extension if the extension is supported
  54986. */
  54987. getExtension: function (extensionName)
  54988. {
  54989. if (!this.hasExtension(extensionName)) { return null; }
  54990. if (!(extensionName in this.extensions))
  54991. {
  54992. this.extensions[extensionName] = this.gl.getExtension(extensionName);
  54993. }
  54994. return this.extensions[extensionName];
  54995. },
  54996. /**
  54997. * Flushes the current pipeline if the pipeline is bound
  54998. *
  54999. * @method Phaser.Renderer.WebGL.WebGLRenderer#flush
  55000. * @since 3.0.0
  55001. */
  55002. flush: function ()
  55003. {
  55004. if (this.currentPipeline)
  55005. {
  55006. this.currentPipeline.flush();
  55007. }
  55008. },
  55009. /* Renderer State Manipulation Functions */
  55010. /**
  55011. * Checks if a pipeline is present in the current WebGLRenderer
  55012. *
  55013. * @method Phaser.Renderer.WebGL.WebGLRenderer#hasPipeline
  55014. * @since 3.0.0
  55015. *
  55016. * @param {string} pipelineName - Name of the pipeline
  55017. *
  55018. * @return {boolean} [description]
  55019. */
  55020. hasPipeline: function (pipelineName)
  55021. {
  55022. return (pipelineName in this.pipelines);
  55023. },
  55024. /**
  55025. * Returns the pipeline by name if the pipeline exists
  55026. *
  55027. * @method Phaser.Renderer.WebGL.WebGLRenderer#getPipeline
  55028. * @since 3.0.0
  55029. *
  55030. * @param {string} pipelineName - [description]
  55031. *
  55032. * @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
  55033. */
  55034. getPipeline: function (pipelineName)
  55035. {
  55036. return (this.hasPipeline(pipelineName)) ? this.pipelines[pipelineName] : null;
  55037. },
  55038. /**
  55039. * Removes a pipeline by name
  55040. *
  55041. * @method Phaser.Renderer.WebGL.WebGLRenderer#removePipeline
  55042. * @since 3.0.0
  55043. *
  55044. * @param {string} pipelineName - [description]
  55045. *
  55046. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  55047. */
  55048. removePipeline: function (pipelineName)
  55049. {
  55050. delete this.pipelines[pipelineName];
  55051. return this;
  55052. },
  55053. /**
  55054. * Adds a pipeline instance into the collection of pipelines
  55055. *
  55056. * @method Phaser.Renderer.WebGL.WebGLRenderer#addPipeline
  55057. * @since 3.0.0
  55058. *
  55059. * @param {string} pipelineName - [description]
  55060. * @param {Phaser.Renderer.WebGL.WebGLPipeline} pipelineInstance - Pipeline instance must extend WebGLPipeline
  55061. *
  55062. * @return {Phaser.Renderer.WebGL.WebGLPipeline} The instance that was passed.
  55063. */
  55064. addPipeline: function (pipelineName, pipelineInstance)
  55065. {
  55066. if (!this.hasPipeline(pipelineName))
  55067. {
  55068. this.pipelines[pipelineName] = pipelineInstance;
  55069. }
  55070. else
  55071. {
  55072. console.warn('Pipeline', pipelineName, ' already exists.');
  55073. }
  55074. pipelineInstance.name = pipelineName;
  55075. this.pipelines[pipelineName].resize(this.width, this.height, this.config.resolution);
  55076. return pipelineInstance;
  55077. },
  55078. /**
  55079. * Sets the current scissor state
  55080. *
  55081. * @method Phaser.Renderer.WebGL.WebGLRenderer#setScissor
  55082. * @since 3.0.0
  55083. *
  55084. * @param {integer} x - [description]
  55085. * @param {integer} y - [description]
  55086. * @param {integer} w - [description]
  55087. * @param {integer} h - [description]
  55088. *
  55089. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  55090. */
  55091. setScissor: function (x, y, w, h)
  55092. {
  55093. var gl = this.gl;
  55094. var currentScissor = this.currentScissor;
  55095. var enabled = (x === 0 && y === 0 && w === this.width && h === this.height && w >= 0 && h >= 0);
  55096. // TODO: If new scissor is same as old scissor, skip setting it again
  55097. // TODO: If scissor is viewport size, skip setting altogether
  55098. if (currentScissor[0] !== x ||
  55099. currentScissor[1] !== y ||
  55100. currentScissor[2] !== w ||
  55101. currentScissor[3] !== h)
  55102. {
  55103. this.flush();
  55104. }
  55105. currentScissor[0] = x;
  55106. currentScissor[1] = y;
  55107. currentScissor[2] = w;
  55108. currentScissor[3] = h;
  55109. this.currentScissorEnabled = enabled;
  55110. if (enabled)
  55111. {
  55112. gl.disable(gl.SCISSOR_TEST);
  55113. return this;
  55114. }
  55115. gl.enable(gl.SCISSOR_TEST);
  55116. gl.scissor(x, (this.drawingBufferHeight - y - h), w, h);
  55117. return this;
  55118. },
  55119. /**
  55120. * Pushes a new scissor state. This is used to set nested scissor states.
  55121. *
  55122. * @method Phaser.Renderer.WebGL.WebGLRenderer#pushScissor
  55123. * @since 3.0.0
  55124. *
  55125. * @param {integer} x - [description]
  55126. * @param {integer} y - [description]
  55127. * @param {integer} w - [description]
  55128. * @param {integer} h - [description]
  55129. *
  55130. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  55131. */
  55132. pushScissor: function (x, y, w, h)
  55133. {
  55134. var scissorStack = this.scissorStack;
  55135. var stackIndex = this.currentScissorIdx;
  55136. var currentScissor = this.currentScissor;
  55137. scissorStack[stackIndex + 0] = currentScissor[0];
  55138. scissorStack[stackIndex + 1] = currentScissor[1];
  55139. scissorStack[stackIndex + 2] = currentScissor[2];
  55140. scissorStack[stackIndex + 3] = currentScissor[3];
  55141. this.currentScissorIdx += 4;
  55142. this.setScissor(x, y, w, h);
  55143. return this;
  55144. },
  55145. /**
  55146. * Pops the last scissor state and sets it.
  55147. *
  55148. * @method Phaser.Renderer.WebGL.WebGLRenderer#popScissor
  55149. * @since 3.0.0
  55150. *
  55151. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  55152. */
  55153. popScissor: function ()
  55154. {
  55155. var scissorStack = this.scissorStack;
  55156. var stackIndex = this.currentScissorIdx - 4;
  55157. var x = scissorStack[stackIndex + 0];
  55158. var y = scissorStack[stackIndex + 1];
  55159. var w = scissorStack[stackIndex + 2];
  55160. var h = scissorStack[stackIndex + 3];
  55161. this.currentScissorIdx = stackIndex;
  55162. this.setScissor(x, y, w, h);
  55163. return this;
  55164. },
  55165. /**
  55166. * Binds a WebGLPipeline and sets it as the current pipeline to be used.
  55167. *
  55168. * @method Phaser.Renderer.WebGL.WebGLRenderer#setPipeline
  55169. * @since 3.0.0
  55170. *
  55171. * @param {Phaser.Renderer.WebGL.WebGLPipeline} pipelineInstance - The pipeline instance to be activated.
  55172. * @param {Phaser.GameObjects.GameObject} [gameObject] - The Game Object that invoked this pipeline, if any.
  55173. *
  55174. * @return {Phaser.Renderer.WebGL.WebGLPipeline} The pipeline that was activated.
  55175. */
  55176. setPipeline: function (pipelineInstance, gameObject)
  55177. {
  55178. if (this.currentPipeline !== pipelineInstance ||
  55179. this.currentPipeline.vertexBuffer !== this.currentVertexBuffer ||
  55180. this.currentPipeline.program !== this.currentProgram)
  55181. {
  55182. this.flush();
  55183. this.currentPipeline = pipelineInstance;
  55184. this.currentPipeline.bind();
  55185. }
  55186. this.currentPipeline.onBind(gameObject);
  55187. return this.currentPipeline;
  55188. },
  55189. /**
  55190. * [description]
  55191. *
  55192. * @method Phaser.Renderer.WebGL.WebGLRenderer#setBlendMode
  55193. * @since 3.0.0
  55194. *
  55195. * @param {integer} blendModeId - [description]
  55196. *
  55197. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  55198. */
  55199. setBlendMode: function (blendModeId)
  55200. {
  55201. var gl = this.gl;
  55202. var blendMode = this.blendModes[blendModeId];
  55203. if (blendModeId !== CONST.BlendModes.SKIP_CHECK &&
  55204. this.currentBlendMode !== blendModeId)
  55205. {
  55206. this.flush();
  55207. gl.enable(gl.BLEND);
  55208. gl.blendEquation(blendMode.equation);
  55209. if (blendMode.func.length > 2)
  55210. {
  55211. gl.blendFuncSeparate(blendMode.func[0], blendMode.func[1], blendMode.func[2], blendMode.func[3]);
  55212. }
  55213. else
  55214. {
  55215. gl.blendFunc(blendMode.func[0], blendMode.func[1]);
  55216. }
  55217. this.currentBlendMode = blendModeId;
  55218. }
  55219. return this;
  55220. },
  55221. /**
  55222. * [description]
  55223. *
  55224. * @method Phaser.Renderer.WebGL.WebGLRenderer#addBlendMode
  55225. * @since 3.0.0
  55226. *
  55227. * @param {function} func - [description]
  55228. * @param {function} equation - [description]
  55229. *
  55230. * @return {integer} [description]
  55231. */
  55232. addBlendMode: function (func, equation)
  55233. {
  55234. var index = this.blendModes.push({ func: func, equation: equation });
  55235. return index - 1;
  55236. },
  55237. /**
  55238. * [description]
  55239. *
  55240. * @method Phaser.Renderer.WebGL.WebGLRenderer#updateBlendMode
  55241. * @since 3.0.0
  55242. *
  55243. * @param {integer} index - [description]
  55244. * @param {function} func - [description]
  55245. * @param {function} equation - [description]
  55246. *
  55247. * @return {Phaser.Renderer.WebGL.WebGLRenderer} This WebGL Renderer.
  55248. */
  55249. updateBlendMode: function (index, func, equation)
  55250. {
  55251. if (this.blendModes[index])
  55252. {
  55253. this.blendModes[index].func = func;
  55254. if (equation)
  55255. {
  55256. this.blendModes[index].equation = equation;
  55257. }
  55258. }
  55259. return this;
  55260. },
  55261. /**
  55262. * [description]
  55263. *
  55264. * @method Phaser.Renderer.WebGL.WebGLRenderer#removeBlendMode
  55265. * @since 3.0.0
  55266. *
  55267. * @param {integer} index - [description]
  55268. *
  55269. * @return {Phaser.Renderer.WebGL.WebGLRenderer} This WebGL Renderer.
  55270. */
  55271. removeBlendMode: function (index)
  55272. {
  55273. if (index > 16 && this.blendModes[index])
  55274. {
  55275. this.blendModes.splice(index, 1);
  55276. }
  55277. return this;
  55278. },
  55279. /**
  55280. * Binds a texture at a texture unit. If a texture is already
  55281. * bound to that unit it will force a flush on the current pipeline.
  55282. *
  55283. * @method Phaser.Renderer.WebGL.WebGLRenderer#setTexture2D
  55284. * @since 3.0.0
  55285. *
  55286. * @param {WebGLTexture} texture - The WebGL texture that needs to be bound
  55287. * @param {integer} textureUnit - The texture unit to which the texture will be bound
  55288. *
  55289. * @return {Phaser.Renderer.WebGL.WebGLRenderer} This WebGL Renderer.
  55290. */
  55291. setTexture2D: function (texture, textureUnit)
  55292. {
  55293. var gl = this.gl;
  55294. if (texture !== this.currentTextures[textureUnit])
  55295. {
  55296. this.flush();
  55297. if (this.currentActiveTextureUnit !== textureUnit)
  55298. {
  55299. gl.activeTexture(gl.TEXTURE0 + textureUnit);
  55300. this.currentActiveTextureUnit = textureUnit;
  55301. }
  55302. gl.bindTexture(gl.TEXTURE_2D, texture);
  55303. this.currentTextures[textureUnit] = texture;
  55304. }
  55305. return this;
  55306. },
  55307. /**
  55308. * Binds a framebuffer. If there was another framebuffer already bound
  55309. * it will force a pipeline flush.
  55310. *
  55311. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFramebuffer
  55312. * @since 3.0.0
  55313. *
  55314. * @param {WebGLFramebuffer} framebuffer - The framebuffer that needs to be bound
  55315. *
  55316. * @return {Phaser.Renderer.WebGL.WebGLRenderer} This WebGL Renderer.
  55317. */
  55318. setFramebuffer: function (framebuffer)
  55319. {
  55320. var gl = this.gl;
  55321. if (framebuffer !== this.currentFramebuffer)
  55322. {
  55323. this.flush();
  55324. gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
  55325. this.currentFramebuffer = framebuffer;
  55326. }
  55327. return this;
  55328. },
  55329. /**
  55330. * Binds a program. If there was another program already bound
  55331. * it will force a pipeline flush
  55332. *
  55333. * @method Phaser.Renderer.WebGL.WebGLRenderer#setProgram
  55334. * @since 3.0.0
  55335. *
  55336. * @param {WebGLProgram} program - The program that needs to be bound
  55337. *
  55338. * @return {Phaser.Renderer.WebGL.WebGLRenderer} This WebGL Renderer.
  55339. */
  55340. setProgram: function (program)
  55341. {
  55342. var gl = this.gl;
  55343. if (program !== this.currentProgram)
  55344. {
  55345. this.flush();
  55346. gl.useProgram(program);
  55347. this.currentProgram = program;
  55348. }
  55349. return this;
  55350. },
  55351. /**
  55352. * Bounds a vertex buffer. If there is a vertex buffer already bound
  55353. * it'll force a pipeline flush.
  55354. *
  55355. * @method Phaser.Renderer.WebGL.WebGLRenderer#setVertexBuffer
  55356. * @since 3.0.0
  55357. *
  55358. * @param {WebGLBuffer} vertexBuffer - The buffer that needs to be bound
  55359. *
  55360. * @return {Phaser.Renderer.WebGL.WebGLRenderer} This WebGL Renderer.
  55361. */
  55362. setVertexBuffer: function (vertexBuffer)
  55363. {
  55364. var gl = this.gl;
  55365. if (vertexBuffer !== this.currentVertexBuffer)
  55366. {
  55367. this.flush();
  55368. gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
  55369. this.currentVertexBuffer = vertexBuffer;
  55370. }
  55371. return this;
  55372. },
  55373. /**
  55374. * Bounds a index buffer. If there is a index buffer already bound
  55375. * it'll force a pipeline flush.
  55376. *
  55377. * @method Phaser.Renderer.WebGL.WebGLRenderer#setIndexBuffer
  55378. * @since 3.0.0
  55379. *
  55380. * @param {WebGLBuffer} indexBuffer - The buffer the needs to be bound
  55381. *
  55382. * @return {Phaser.Renderer.WebGL.WebGLRenderer} This WebGL Renderer.
  55383. */
  55384. setIndexBuffer: function (indexBuffer)
  55385. {
  55386. var gl = this.gl;
  55387. if (indexBuffer !== this.currentIndexBuffer)
  55388. {
  55389. this.flush();
  55390. gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
  55391. this.currentIndexBuffer = indexBuffer;
  55392. }
  55393. return this;
  55394. },
  55395. /* Renderer Resource Creation Functions */
  55396. /**
  55397. * Creates a texture from an image source. If the source is not valid
  55398. * it creates an empty texture
  55399. *
  55400. * @method Phaser.Renderer.WebGL.WebGLRenderer#createTextureFromSource
  55401. * @since 3.0.0
  55402. *
  55403. * @param {object} source - [description]
  55404. * @param {integer} width - [description]
  55405. * @param {integer} height - [description]
  55406. * @param {integer} scaleMode - [description]
  55407. *
  55408. * @return {WebGLTexture} [description]
  55409. */
  55410. createTextureFromSource: function (source, width, height, scaleMode)
  55411. {
  55412. var gl = this.gl;
  55413. var filter = gl.NEAREST;
  55414. var wrap = gl.CLAMP_TO_EDGE;
  55415. var texture = null;
  55416. width = source ? source.width : width;
  55417. height = source ? source.height : height;
  55418. if (IsSizePowerOfTwo(width, height))
  55419. {
  55420. wrap = gl.REPEAT;
  55421. }
  55422. if (scaleMode === CONST.ScaleModes.LINEAR && this.config.antialias)
  55423. {
  55424. filter = gl.LINEAR;
  55425. }
  55426. if (!source && typeof width === 'number' && typeof height === 'number')
  55427. {
  55428. texture = this.createTexture2D(0, filter, filter, wrap, wrap, gl.RGBA, null, width, height);
  55429. }
  55430. else
  55431. {
  55432. texture = this.createTexture2D(0, filter, filter, wrap, wrap, gl.RGBA, source);
  55433. }
  55434. return texture;
  55435. },
  55436. /**
  55437. * A wrapper for creating a WebGLTexture. If not pixel data is passed
  55438. * it will create an empty texture.
  55439. *
  55440. * @method Phaser.Renderer.WebGL.WebGLRenderer#createTexture2D
  55441. * @since 3.0.0
  55442. *
  55443. * @param {integer} mipLevel - Mip level of the texture
  55444. * @param {integer} minFilter - Filtering of the texture
  55445. * @param {integer} magFilter - Filtering of the texture
  55446. * @param {integer} wrapT - Wrapping mode of the texture
  55447. * @param {integer} wrapS - Wrapping mode of the texture
  55448. * @param {integer} format - Which format does the texture use
  55449. * @param {object} pixels - pixel data
  55450. * @param {integer} width - Width of the texture in pixels
  55451. * @param {integer} height - Height of the texture in pixels
  55452. * @param {boolean} pma - Does the texture have premultiplied alpha?
  55453. *
  55454. * @return {WebGLTexture} Raw WebGLTexture
  55455. */
  55456. createTexture2D: function (mipLevel, minFilter, magFilter, wrapT, wrapS, format, pixels, width, height, pma)
  55457. {
  55458. var gl = this.gl;
  55459. var texture = gl.createTexture();
  55460. pma = (pma === undefined || pma === null) ? true : pma;
  55461. this.setTexture2D(texture, 0);
  55462. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter);
  55463. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magFilter);
  55464. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrapS);
  55465. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrapT);
  55466. gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, pma);
  55467. if (pixels === null || pixels === undefined)
  55468. {
  55469. gl.texImage2D(gl.TEXTURE_2D, mipLevel, format, width, height, 0, format, gl.UNSIGNED_BYTE, null);
  55470. }
  55471. else
  55472. {
  55473. gl.texImage2D(gl.TEXTURE_2D, mipLevel, format, format, gl.UNSIGNED_BYTE, pixels);
  55474. width = pixels.width;
  55475. height = pixels.height;
  55476. }
  55477. this.setTexture2D(null, 0);
  55478. texture.isAlphaPremultiplied = pma;
  55479. texture.isRenderTexture = false;
  55480. texture.width = width;
  55481. texture.height = height;
  55482. this.nativeTextures.push(texture);
  55483. return texture;
  55484. },
  55485. /**
  55486. * Wrapper for creating WebGLFramebuffer.
  55487. *
  55488. * @method Phaser.Renderer.WebGL.WebGLRenderer#createFramebuffer
  55489. * @since 3.0.0
  55490. *
  55491. * @param {integer} width - Width in pixels of the framebuffer
  55492. * @param {integer} height - Height in pixels of the framebuffer
  55493. * @param {WebGLTexture} renderTexture - The color texture to where the color pixels are written
  55494. * @param {boolean} addDepthStencilBuffer - Indicates if the current framebuffer support depth and stencil buffers
  55495. *
  55496. * @return {WebGLFramebuffer} Raw WebGLFramebuffer
  55497. */
  55498. createFramebuffer: function (width, height, renderTexture, addDepthStencilBuffer)
  55499. {
  55500. var gl = this.gl;
  55501. var framebuffer = gl.createFramebuffer();
  55502. var complete = 0;
  55503. this.setFramebuffer(framebuffer);
  55504. if (addDepthStencilBuffer)
  55505. {
  55506. var depthStencilBuffer = gl.createRenderbuffer();
  55507. gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer);
  55508. gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height);
  55509. gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, depthStencilBuffer);
  55510. }
  55511. renderTexture.isRenderTexture = true;
  55512. renderTexture.isAlphaPremultiplied = false;
  55513. gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, renderTexture, 0);
  55514. complete = gl.checkFramebufferStatus(gl.FRAMEBUFFER);
  55515. if (complete !== gl.FRAMEBUFFER_COMPLETE)
  55516. {
  55517. var errors = {
  55518. 36054: 'Incomplete Attachment',
  55519. 36055: 'Missing Attachment',
  55520. 36057: 'Incomplete Dimensions',
  55521. 36061: 'Framebuffer Unsupported'
  55522. };
  55523. throw new Error('Framebuffer incomplete. Framebuffer status: ' + errors[complete]);
  55524. }
  55525. framebuffer.renderTexture = renderTexture;
  55526. this.setFramebuffer(null);
  55527. return framebuffer;
  55528. },
  55529. /**
  55530. * Wrapper for creating a WebGLProgram
  55531. *
  55532. * @method Phaser.Renderer.WebGL.WebGLRenderer#createProgram
  55533. * @since 3.0.0
  55534. *
  55535. * @param {string} vertexShader - Source to the vertex shader
  55536. * @param {string} fragmentShader - Source to the fragment shader
  55537. *
  55538. * @return {WebGLProgram} Raw WebGLProgram
  55539. */
  55540. createProgram: function (vertexShader, fragmentShader)
  55541. {
  55542. var gl = this.gl;
  55543. var program = gl.createProgram();
  55544. var vs = gl.createShader(gl.VERTEX_SHADER);
  55545. var fs = gl.createShader(gl.FRAGMENT_SHADER);
  55546. gl.shaderSource(vs, vertexShader);
  55547. gl.shaderSource(fs, fragmentShader);
  55548. gl.compileShader(vs);
  55549. gl.compileShader(fs);
  55550. if (!gl.getShaderParameter(vs, gl.COMPILE_STATUS))
  55551. {
  55552. throw new Error('Failed to compile Vertex Shader:\n' + gl.getShaderInfoLog(vs));
  55553. }
  55554. if (!gl.getShaderParameter(fs, gl.COMPILE_STATUS))
  55555. {
  55556. throw new Error('Failed to compile Fragment Shader:\n' + gl.getShaderInfoLog(fs));
  55557. }
  55558. gl.attachShader(program, vs);
  55559. gl.attachShader(program, fs);
  55560. gl.linkProgram(program);
  55561. if (!gl.getProgramParameter(program, gl.LINK_STATUS))
  55562. {
  55563. throw new Error('Failed to link program:\n' + gl.getProgramInfoLog(program));
  55564. }
  55565. return program;
  55566. },
  55567. /**
  55568. * Wrapper for creating a vertex buffer.
  55569. *
  55570. * @method Phaser.Renderer.WebGL.WebGLRenderer#createVertexBuffer
  55571. * @since 3.0.0
  55572. *
  55573. * @param {ArrayBuffer} initialDataOrSize - It's either ArrayBuffer or an integer indicating the size of the vbo
  55574. * @param {integer} bufferUsage - How the buffer is used. gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW
  55575. *
  55576. * @return {WebGLBuffer} Raw vertex buffer
  55577. */
  55578. createVertexBuffer: function (initialDataOrSize, bufferUsage)
  55579. {
  55580. var gl = this.gl;
  55581. var vertexBuffer = gl.createBuffer();
  55582. this.setVertexBuffer(vertexBuffer);
  55583. gl.bufferData(gl.ARRAY_BUFFER, initialDataOrSize, bufferUsage);
  55584. this.setVertexBuffer(null);
  55585. return vertexBuffer;
  55586. },
  55587. /**
  55588. * Wrapper for creating a vertex buffer.
  55589. *
  55590. * @method Phaser.Renderer.WebGL.WebGLRenderer#createIndexBuffer
  55591. * @since 3.0.0
  55592. *
  55593. * @param {ArrayBuffer} initialDataOrSize - It's either ArrayBuffer or an integer indicating the size of the vbo
  55594. * @param {integer} bufferUsage - How the buffer is used. gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW
  55595. *
  55596. * @return {WebGLBuffer} Raw index buffer
  55597. */
  55598. createIndexBuffer: function (initialDataOrSize, bufferUsage)
  55599. {
  55600. var gl = this.gl;
  55601. var indexBuffer = gl.createBuffer();
  55602. this.setIndexBuffer(indexBuffer);
  55603. gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, initialDataOrSize, bufferUsage);
  55604. this.setIndexBuffer(null);
  55605. return indexBuffer;
  55606. },
  55607. /**
  55608. * [description]
  55609. *
  55610. * @method Phaser.Renderer.WebGL.WebGLRenderer#deleteTexture
  55611. * @since 3.0.0
  55612. *
  55613. * @param {WebGLTexture} texture - [description]
  55614. *
  55615. * @return {Phaser.Renderer.WebGL.WebGLRenderer} This WebGL Renderer.
  55616. */
  55617. deleteTexture: function (texture)
  55618. {
  55619. var index = this.nativeTextures.indexOf(texture);
  55620. if (index !== -1)
  55621. {
  55622. SpliceOne(this.nativeTextures, index);
  55623. }
  55624. this.gl.deleteTexture(texture);
  55625. return this;
  55626. },
  55627. /**
  55628. * Wrapper for deleting a raw WebGLFramebuffer
  55629. *
  55630. * @method Phaser.Renderer.WebGL.WebGLRenderer#deleteFramebuffer
  55631. * @since 3.0.0
  55632. *
  55633. * @param {WebGLFramebuffer} framebuffer - [description]
  55634. *
  55635. * @return {Phaser.Renderer.WebGL.WebGLRenderer} This WebGL Renderer.
  55636. */
  55637. deleteFramebuffer: function (framebuffer)
  55638. {
  55639. this.gl.deleteFramebuffer(framebuffer);
  55640. return this;
  55641. },
  55642. /**
  55643. * [description]
  55644. *
  55645. * @method Phaser.Renderer.WebGL.WebGLRenderer#deleteProgram
  55646. * @since 3.0.0
  55647. *
  55648. * @param {WebGLProgram} program - [description]
  55649. *
  55650. * @return {Phaser.Renderer.WebGL.WebGLRenderer} This WebGL Renderer.
  55651. */
  55652. deleteProgram: function (program)
  55653. {
  55654. this.gl.deleteProgram(program);
  55655. return this;
  55656. },
  55657. /**
  55658. * Wrapper for deleting a vertex or index buffer
  55659. *
  55660. * @method Phaser.Renderer.WebGL.WebGLRenderer#deleteBuffer
  55661. * @since 3.0.0
  55662. *
  55663. * @param {WebGLBuffer} vertexBuffer - [description]
  55664. *
  55665. * @return {Phaser.Renderer.WebGL.WebGLRenderer} This WebGL Renderer.
  55666. */
  55667. deleteBuffer: function (buffer)
  55668. {
  55669. this.gl.deleteBuffer(buffer);
  55670. return this;
  55671. },
  55672. /* Rendering Functions */
  55673. /**
  55674. * Handles any clipping needed by the camera and renders the background
  55675. * color if a color is visible.
  55676. *
  55677. * @method Phaser.Renderer.WebGL.WebGLRenderer#preRenderCamera
  55678. * @since 3.0.0
  55679. *
  55680. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  55681. */
  55682. preRenderCamera: function (camera)
  55683. {
  55684. var resolution = this.config.resolution;
  55685. var cx = Math.floor(camera.x * resolution);
  55686. var cy = Math.floor(camera.y * resolution);
  55687. var cw = Math.floor(camera.width * resolution);
  55688. var ch = Math.floor(camera.height * resolution);
  55689. this.pushScissor(cx, cy, cw, ch);
  55690. if (camera.backgroundColor.alphaGL > 0)
  55691. {
  55692. var color = camera.backgroundColor;
  55693. var FlatTintPipeline = this.pipelines.FlatTintPipeline;
  55694. FlatTintPipeline.batchFillRect(
  55695. 0, 0, 1, 1, 0,
  55696. camera.x, camera.y, camera.width, camera.height,
  55697. Utils.getTintFromFloats(color.redGL, color.greenGL, color.blueGL, 1.0),
  55698. color.alphaGL,
  55699. 1, 0, 0, 1, 0, 0,
  55700. [ 1, 0, 0, 1, 0, 0 ]
  55701. );
  55702. FlatTintPipeline.flush();
  55703. }
  55704. },
  55705. /**
  55706. * Renders the foreground camera effects like flash and fading.
  55707. * It resets the current scissor state.
  55708. *
  55709. * @method Phaser.Renderer.WebGL.WebGLRenderer#postRenderCamera
  55710. * @since 3.0.0
  55711. *
  55712. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  55713. */
  55714. postRenderCamera: function (camera)
  55715. {
  55716. var FlatTintPipeline = this.pipelines.FlatTintPipeline;
  55717. var isFlashing = camera.flashEffect.postRenderWebGL(FlatTintPipeline, Utils.getTintFromFloats);
  55718. var isFading = camera.fadeEffect.postRenderWebGL(FlatTintPipeline, Utils.getTintFromFloats);
  55719. if (isFading || isFlashing)
  55720. {
  55721. FlatTintPipeline.flush();
  55722. }
  55723. camera.dirty = false;
  55724. this.popScissor();
  55725. },
  55726. /**
  55727. * Clears the current vertex buffer and updates pipelines.
  55728. *
  55729. * @method Phaser.Renderer.WebGL.WebGLRenderer#preRender
  55730. * @since 3.0.0
  55731. */
  55732. preRender: function ()
  55733. {
  55734. if (this.contextLost) { return; }
  55735. var gl = this.gl;
  55736. var color = this.config.backgroundColor;
  55737. var pipelines = this.pipelines;
  55738. // Bind custom framebuffer here
  55739. gl.clearColor(color.redGL, color.greenGL, color.blueGL, color.alphaGL);
  55740. if (this.config.clearBeforeRender)
  55741. {
  55742. gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
  55743. }
  55744. for (var key in pipelines)
  55745. {
  55746. pipelines[key].onPreRender();
  55747. }
  55748. },
  55749. /**
  55750. * [description]
  55751. *
  55752. * @method Phaser.Renderer.WebGL.WebGLRenderer#render
  55753. * @since 3.0.0
  55754. *
  55755. * @param {Phaser.Scene} scene - [description]
  55756. * @param {Phaser.GameObjects.GameObject} children - [description]
  55757. * @param {number} interpolationPercentage - [description]
  55758. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  55759. */
  55760. render: function (scene, children, interpolationPercentage, camera)
  55761. {
  55762. if (this.contextLost) { return; }
  55763. var list = children.list;
  55764. var childCount = list.length;
  55765. var pipelines = this.pipelines;
  55766. for (var key in pipelines)
  55767. {
  55768. pipelines[key].onRender(scene, camera);
  55769. }
  55770. // Apply scissor for cam region + render background color, if not transparent
  55771. this.preRenderCamera(camera);
  55772. for (var index = 0; index < childCount; ++index)
  55773. {
  55774. var child = list[index];
  55775. if (!child.willRender())
  55776. {
  55777. continue;
  55778. }
  55779. if (child.blendMode !== this.currentBlendMode)
  55780. {
  55781. this.setBlendMode(child.blendMode);
  55782. }
  55783. if (child.mask)
  55784. {
  55785. child.mask.preRenderWebGL(this, child, camera);
  55786. }
  55787. child.renderWebGL(this, child, interpolationPercentage, camera);
  55788. if (child.mask)
  55789. {
  55790. child.mask.postRenderWebGL(this, child);
  55791. }
  55792. }
  55793. this.flush();
  55794. this.setBlendMode(CONST.BlendModes.NORMAL);
  55795. // Applies camera effects and pops the scissor, if set
  55796. this.postRenderCamera(camera);
  55797. },
  55798. /**
  55799. * [description]
  55800. *
  55801. * @method Phaser.Renderer.WebGL.WebGLRenderer#postRender
  55802. * @since 3.0.0
  55803. */
  55804. postRender: function ()
  55805. {
  55806. if (this.contextLost) { return; }
  55807. // Unbind custom framebuffer here
  55808. if (this.snapshotState.callback)
  55809. {
  55810. this.snapshotState.callback(WebGLSnapshot(this.canvas, this.snapshotState.type, this.snapshotState.encoder));
  55811. this.snapshotState.callback = null;
  55812. }
  55813. var pipelines = this.pipelines;
  55814. for (var key in pipelines)
  55815. {
  55816. pipelines[key].onPostRender();
  55817. }
  55818. },
  55819. /**
  55820. * [description]
  55821. *
  55822. * @method Phaser.Renderer.WebGL.WebGLRenderer#snapshot
  55823. * @since 3.0.0
  55824. *
  55825. * @param {SnapshotCallback} callback - [description]
  55826. * @param {string} type - [description]
  55827. * @param {number} encoderOptions - [description]
  55828. *
  55829. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  55830. */
  55831. snapshot: function (callback, type, encoderOptions)
  55832. {
  55833. this.snapshotState.callback = callback;
  55834. this.snapshotState.type = type;
  55835. this.snapshotState.encoder = encoderOptions;
  55836. return this;
  55837. },
  55838. /**
  55839. * [description]
  55840. *
  55841. * @method Phaser.Renderer.WebGL.WebGLRenderer#canvasToTexture
  55842. * @since 3.0.0
  55843. *
  55844. * @param {HTMLCanvasElement} srcCanvas - [description]
  55845. * @param {WebGLTexture} [dstTexture] - [description]
  55846. *
  55847. * @return {WebGLTexture} [description]
  55848. */
  55849. canvasToTexture: function (srcCanvas, dstTexture)
  55850. {
  55851. var gl = this.gl;
  55852. if (!dstTexture)
  55853. {
  55854. var wrapping = gl.CLAMP_TO_EDGE;
  55855. if (IsSizePowerOfTwo(srcCanvas.width, srcCanvas.height))
  55856. {
  55857. wrapping = gl.REPEAT;
  55858. }
  55859. dstTexture = this.createTexture2D(0, gl.NEAREST, gl.NEAREST, wrapping, wrapping, gl.RGBA, srcCanvas, srcCanvas.width, srcCanvas.height, true);
  55860. }
  55861. else
  55862. {
  55863. this.setTexture2D(dstTexture, 0);
  55864. gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, srcCanvas);
  55865. dstTexture.width = srcCanvas.width;
  55866. dstTexture.height = srcCanvas.height;
  55867. this.setTexture2D(null, 0);
  55868. }
  55869. return dstTexture;
  55870. },
  55871. /**
  55872. * [description]
  55873. *
  55874. * @method Phaser.Renderer.WebGL.WebGLRenderer#setTextureFilter
  55875. * @since 3.0.0
  55876. *
  55877. * @param {integer} texture - [description]
  55878. * @param {integer} filter - [description]
  55879. *
  55880. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  55881. */
  55882. setTextureFilter: function (texture, filter)
  55883. {
  55884. var gl = this.gl;
  55885. var glFilter = [ gl.LINEAR, gl.NEAREST ][filter];
  55886. this.setTexture2D(texture, 0);
  55887. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, glFilter);
  55888. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, glFilter);
  55889. this.setTexture2D(null, 0);
  55890. return this;
  55891. },
  55892. /**
  55893. * [description]
  55894. *
  55895. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFloat1
  55896. * @since 3.0.0
  55897. *
  55898. * @param {WebGLProgram} program - [description]
  55899. * @param {string} name - [description]
  55900. * @param {number} x - [description]
  55901. *
  55902. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  55903. */
  55904. setFloat1: function (program, name, x)
  55905. {
  55906. this.setProgram(program);
  55907. this.gl.uniform1f(this.gl.getUniformLocation(program, name), x);
  55908. return this;
  55909. },
  55910. /**
  55911. * [description]
  55912. *
  55913. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFloat2
  55914. * @since 3.0.0
  55915. *
  55916. * @param {WebGLProgram} program - [description]
  55917. * @param {string} name - [description]
  55918. * @param {number} x - [description]
  55919. * @param {number} y - [description]
  55920. *
  55921. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  55922. */
  55923. setFloat2: function (program, name, x, y)
  55924. {
  55925. this.setProgram(program);
  55926. this.gl.uniform2f(this.gl.getUniformLocation(program, name), x, y);
  55927. return this;
  55928. },
  55929. /**
  55930. * [description]
  55931. *
  55932. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFloat3
  55933. * @since 3.0.0
  55934. *
  55935. * @param {WebGLProgram} program - [description]
  55936. * @param {string} name - [description]
  55937. * @param {number} x - [description]
  55938. * @param {number} y - [description]
  55939. * @param {number} z - [description]
  55940. *
  55941. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  55942. */
  55943. setFloat3: function (program, name, x, y, z)
  55944. {
  55945. this.setProgram(program);
  55946. this.gl.uniform3f(this.gl.getUniformLocation(program, name), x, y, z);
  55947. return this;
  55948. },
  55949. /**
  55950. * Sets uniform of a WebGLProgram
  55951. *
  55952. * @method Phaser.Renderer.WebGL.WebGLRenderer#setFloat4
  55953. * @since 3.0.0
  55954. *
  55955. * @param {WebGLProgram} program - Target program
  55956. * @param {string} name - Name of the uniform
  55957. * @param {number} x - X component
  55958. * @param {number} y - Y component
  55959. * @param {number} z - Z component
  55960. * @param {number} w - W component
  55961. *
  55962. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  55963. */
  55964. setFloat4: function (program, name, x, y, z, w)
  55965. {
  55966. this.setProgram(program);
  55967. this.gl.uniform4f(this.gl.getUniformLocation(program, name), x, y, z, w);
  55968. return this;
  55969. },
  55970. /**
  55971. * [description]
  55972. *
  55973. * @method Phaser.Renderer.WebGL.WebGLRenderer#setInt1
  55974. * @since 3.0.0
  55975. *
  55976. * @param {WebGLProgram} program - [description]
  55977. * @param {string} name - [description]
  55978. * @param {integer} x - [description]
  55979. *
  55980. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  55981. */
  55982. setInt1: function (program, name, x)
  55983. {
  55984. this.setProgram(program);
  55985. this.gl.uniform1i(this.gl.getUniformLocation(program, name), x);
  55986. return this;
  55987. },
  55988. /**
  55989. * [description]
  55990. *
  55991. * @method Phaser.Renderer.WebGL.WebGLRenderer#setInt2
  55992. * @since 3.0.0
  55993. *
  55994. * @param {WebGLProgram} program - [description]
  55995. * @param {string} name - [description]
  55996. * @param {integer} x - [description]
  55997. * @param {integer} y - [description]
  55998. *
  55999. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  56000. */
  56001. setInt2: function (program, name, x, y)
  56002. {
  56003. this.setProgram(program);
  56004. this.gl.uniform2i(this.gl.getUniformLocation(program, name), x, y);
  56005. return this;
  56006. },
  56007. /**
  56008. * [description]
  56009. *
  56010. * @method Phaser.Renderer.WebGL.WebGLRenderer#setInt3
  56011. * @since 3.0.0
  56012. *
  56013. * @param {WebGLProgram} program - [description]
  56014. * @param {string} name - [description]
  56015. * @param {integer} x - [description]
  56016. * @param {integer} y - [description]
  56017. * @param {integer} z - [description]
  56018. *
  56019. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  56020. */
  56021. setInt3: function (program, name, x, y, z)
  56022. {
  56023. this.setProgram(program);
  56024. this.gl.uniform3i(this.gl.getUniformLocation(program, name), x, y, z);
  56025. return this;
  56026. },
  56027. /**
  56028. * Sets uniform of a WebGLProgram
  56029. *
  56030. * @method Phaser.Renderer.WebGL.WebGLRenderer#setInt4
  56031. * @since 3.0.0
  56032. *
  56033. * @param {WebGLProgram} program - Target Program
  56034. * @param {string} name - Name of the uniform
  56035. * @param {integer} x - X component
  56036. * @param {integer} y - Y component
  56037. * @param {integer} z - Z component
  56038. * @param {integer} w - W component
  56039. *
  56040. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  56041. */
  56042. setInt4: function (program, name, x, y, z, w)
  56043. {
  56044. this.setProgram(program);
  56045. this.gl.uniform4i(this.gl.getUniformLocation(program, name), x, y, z, w);
  56046. return this;
  56047. },
  56048. /**
  56049. * [description]
  56050. *
  56051. * @method Phaser.Renderer.WebGL.WebGLRenderer#setMatrix2
  56052. * @since 3.0.0
  56053. *
  56054. * @param {WebGLProgram} program - [description]
  56055. * @param {string} name - [description]
  56056. * @param {boolean} transpose - [description]
  56057. * @param {Float32Array} matrix - [description]
  56058. *
  56059. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  56060. */
  56061. setMatrix2: function (program, name, transpose, matrix)
  56062. {
  56063. this.setProgram(program);
  56064. this.gl.uniformMatrix2fv(this.gl.getUniformLocation(program, name), transpose, matrix);
  56065. return this;
  56066. },
  56067. /**
  56068. * [description]
  56069. *
  56070. * @method Phaser.Renderer.WebGL.WebGLRenderer#setMatrix3
  56071. * @since 3.0.0
  56072. *
  56073. * @param {WebGLProgram} program - [description]
  56074. * @param {string} name - [description]
  56075. * @param {boolean} transpose - [description]
  56076. * @param {Float32Array} matrix - [description]
  56077. *
  56078. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  56079. */
  56080. setMatrix3: function (program, name, transpose, matrix)
  56081. {
  56082. this.setProgram(program);
  56083. this.gl.uniformMatrix3fv(this.gl.getUniformLocation(program, name), transpose, matrix);
  56084. return this;
  56085. },
  56086. /**
  56087. * Sets uniform of a WebGLProgram
  56088. *
  56089. * @method Phaser.Renderer.WebGL.WebGLRenderer#setMatrix4
  56090. * @since 3.0.0
  56091. *
  56092. * @param {WebGLProgram} program - Target program
  56093. * @param {string} name - Name of the uniform
  56094. * @param {boolean} transpose - Is the matrix transposed
  56095. * @param {Float32Array} matrix - Matrix data
  56096. *
  56097. * @return {Phaser.Renderer.WebGL.WebGLRenderer} [description]
  56098. */
  56099. setMatrix4: function (program, name, transpose, matrix)
  56100. {
  56101. this.setProgram(program);
  56102. this.gl.uniformMatrix4fv(this.gl.getUniformLocation(program, name), transpose, matrix);
  56103. return this;
  56104. },
  56105. /**
  56106. * Returns the maximum number of texture units that can be used in a fragment shader.
  56107. *
  56108. * @method Phaser.Renderer.WebGL.WebGLRenderer#getMaxTextures
  56109. * @since 3.8.0
  56110. *
  56111. * @return {integer} The maximum number of textures WebGL supports.
  56112. */
  56113. getMaxTextures: function ()
  56114. {
  56115. return this.config.maxTextures;
  56116. },
  56117. /**
  56118. * Returns the largest texture size (either width or height) that can be created.
  56119. * Note that VRAM may not allow a texture of any given size, it just expresses
  56120. * hardware / driver support for a given size.
  56121. *
  56122. * @method Phaser.Renderer.WebGL.WebGLRenderer#getMaxTextureSize
  56123. * @since 3.8.0
  56124. *
  56125. * @return {integer} ...
  56126. */
  56127. getMaxTextureSize: function ()
  56128. {
  56129. return this.config.maxTextureSize;
  56130. },
  56131. /**
  56132. * [description]
  56133. *
  56134. * @method Phaser.Renderer.WebGL.WebGLRenderer#destroy
  56135. * @since 3.0.0
  56136. */
  56137. destroy: function ()
  56138. {
  56139. // Clear-up anything that should be cleared :)
  56140. for (var key in this.pipelines)
  56141. {
  56142. this.pipelines[key].destroy();
  56143. delete this.pipelines[key];
  56144. }
  56145. for (var index = 0; index < this.nativeTextures.length; ++index)
  56146. {
  56147. this.deleteTexture(this.nativeTextures[index]);
  56148. delete this.nativeTextures[index];
  56149. }
  56150. delete this.gl;
  56151. delete this.game;
  56152. this.contextLost = true;
  56153. this.extensions = {};
  56154. this.nativeTextures.length = 0;
  56155. }
  56156. });
  56157. module.exports = WebGLRenderer;
  56158. /***/ }),
  56159. /* 257 */
  56160. /***/ (function(module, exports, __webpack_require__) {
  56161. /**
  56162. * @author Richard Davey <rich@photonstorm.com>
  56163. * @copyright 2018 Photon Storm Ltd.
  56164. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  56165. */
  56166. var modes = __webpack_require__(52);
  56167. var CanvasFeatures = __webpack_require__(208);
  56168. /**
  56169. * [description]
  56170. *
  56171. * @function Phaser.Renderer.Canvas.GetBlendModes
  56172. * @since 3.0.0
  56173. *
  56174. * @return {array} [description]
  56175. */
  56176. var GetBlendModes = function ()
  56177. {
  56178. var output = [];
  56179. var useNew = CanvasFeatures.supportNewBlendModes;
  56180. output[modes.NORMAL] = 'source-over';
  56181. output[modes.ADD] = 'lighter';
  56182. output[modes.MULTIPLY] = (useNew) ? 'multiply' : 'source-over';
  56183. output[modes.SCREEN] = (useNew) ? 'screen' : 'source-over';
  56184. output[modes.OVERLAY] = (useNew) ? 'overlay' : 'source-over';
  56185. output[modes.DARKEN] = (useNew) ? 'darken' : 'source-over';
  56186. output[modes.LIGHTEN] = (useNew) ? 'lighten' : 'source-over';
  56187. output[modes.COLOR_DODGE] = (useNew) ? 'color-dodge' : 'source-over';
  56188. output[modes.COLOR_BURN] = (useNew) ? 'color-burn' : 'source-over';
  56189. output[modes.HARD_LIGHT] = (useNew) ? 'hard-light' : 'source-over';
  56190. output[modes.SOFT_LIGHT] = (useNew) ? 'soft-light' : 'source-over';
  56191. output[modes.DIFFERENCE] = (useNew) ? 'difference' : 'source-over';
  56192. output[modes.EXCLUSION] = (useNew) ? 'exclusion' : 'source-over';
  56193. output[modes.HUE] = (useNew) ? 'hue' : 'source-over';
  56194. output[modes.SATURATION] = (useNew) ? 'saturation' : 'source-over';
  56195. output[modes.COLOR] = (useNew) ? 'color' : 'source-over';
  56196. output[modes.LUMINOSITY] = (useNew) ? 'luminosity' : 'source-over';
  56197. return output;
  56198. };
  56199. module.exports = GetBlendModes;
  56200. /***/ }),
  56201. /* 258 */
  56202. /***/ (function(module, exports, __webpack_require__) {
  56203. /**
  56204. * @author Richard Davey <rich@photonstorm.com>
  56205. * @copyright 2018 Photon Storm Ltd.
  56206. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  56207. */
  56208. var TransformMatrix = __webpack_require__(32);
  56209. var _tempCameraMatrix = new TransformMatrix();
  56210. var _tempSpriteMatrix = new TransformMatrix();
  56211. /**
  56212. * [description]
  56213. *
  56214. * @function Phaser.Renderer.Canvas.DrawImage
  56215. * @since 3.0.0
  56216. *
  56217. * @param {Phaser.GameObjects.GameObject} src - [description]
  56218. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  56219. * @param {Phaser.GameObjects.Components.TransformMatrix} parentTransformMatrix - [description]
  56220. */
  56221. var DrawImage = function (src, camera, parentTransformMatrix)
  56222. {
  56223. var ctx = this.currentContext;
  56224. // Alpha
  56225. var alpha = camera.alpha * src.alpha;
  56226. if (alpha === 0)
  56227. {
  56228. // Nothing to see, so abort early
  56229. return;
  56230. }
  56231. ctx.globalAlpha = alpha;
  56232. // Blend Mode
  56233. if (this.currentBlendMode !== src.blendMode)
  56234. {
  56235. this.currentBlendMode = src.blendMode;
  56236. ctx.globalCompositeOperation = this.blendModes[src.blendMode];
  56237. }
  56238. var camMatrix = _tempCameraMatrix;
  56239. var spriteMatrix = _tempSpriteMatrix;
  56240. spriteMatrix.applyITRS(src.x - camera.scrollX * src.scrollFactorX, src.y - camera.scrollY * src.scrollFactorY, src.rotation, src.scaleX, src.scaleY);
  56241. var frame = src.frame;
  56242. var cd = frame.canvasData;
  56243. var frameX = cd.x;
  56244. var frameY = cd.y;
  56245. var frameWidth = frame.width;
  56246. var frameHeight = frame.height;
  56247. var x = -src.displayOriginX + frame.x;
  56248. var y = -src.displayOriginY + frame.y;
  56249. var fx = (src.flipX) ? -1 : 1;
  56250. var fy = (src.flipY) ? -1 : 1;
  56251. if (src.isCropped)
  56252. {
  56253. var crop = src._crop;
  56254. if (crop.flipX !== src.flipX || crop.flipY !== src.flipY)
  56255. {
  56256. frame.updateCropUVs(crop, src.flipX, src.flipY);
  56257. }
  56258. frameWidth = crop.cw;
  56259. frameHeight = crop.ch;
  56260. frameX = crop.cx;
  56261. frameY = crop.cy;
  56262. x = -src.displayOriginX + crop.x;
  56263. y = -src.displayOriginY + crop.y;
  56264. if (fx === -1)
  56265. {
  56266. if (x >= 0)
  56267. {
  56268. x = -(x + frameWidth);
  56269. }
  56270. else if (x < 0)
  56271. {
  56272. x = (Math.abs(x) - frameWidth);
  56273. }
  56274. }
  56275. if (fy === -1)
  56276. {
  56277. if (y >= 0)
  56278. {
  56279. y = -(y + frameHeight);
  56280. }
  56281. else if (y < 0)
  56282. {
  56283. y = (Math.abs(y) - frameHeight);
  56284. }
  56285. }
  56286. }
  56287. camMatrix.copyFrom(camera.matrix);
  56288. var calcMatrix;
  56289. if (parentTransformMatrix)
  56290. {
  56291. // Multiply the camera by the parent matrix
  56292. camMatrix.multiplyWithOffset(parentTransformMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  56293. // Undo the camera scroll
  56294. spriteMatrix.e = src.x;
  56295. spriteMatrix.f = src.y;
  56296. // Multiply by the Sprite matrix
  56297. calcMatrix = camMatrix.multiply(spriteMatrix);
  56298. }
  56299. else
  56300. {
  56301. calcMatrix = spriteMatrix.multiply(camMatrix);
  56302. }
  56303. ctx.save();
  56304. ctx.transform(calcMatrix.a, calcMatrix.b, calcMatrix.c, calcMatrix.d, calcMatrix.e, calcMatrix.f);
  56305. ctx.scale(fx, fy);
  56306. ctx.drawImage(frame.source.image, frameX, frameY, frameWidth, frameHeight, x, y, frameWidth, frameHeight);
  56307. ctx.restore();
  56308. };
  56309. module.exports = DrawImage;
  56310. /***/ }),
  56311. /* 259 */
  56312. /***/ (function(module, exports) {
  56313. /**
  56314. * @author Richard Davey <rich@photonstorm.com>
  56315. * @copyright 2018 Photon Storm Ltd.
  56316. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  56317. */
  56318. /**
  56319. * [description]
  56320. *
  56321. * @function Phaser.Renderer.Snapshot.Canvas
  56322. * @since 3.0.0
  56323. *
  56324. * @param {HTMLCanvasElement} canvas - [description]
  56325. * @param {string} [type='image/png'] - [description]
  56326. * @param {number} [encoderOptions=0.92] - [description]
  56327. *
  56328. * @return {HTMLImageElement} [description]
  56329. */
  56330. var CanvasSnapshot = function (canvas, type, encoderOptions)
  56331. {
  56332. if (type === undefined) { type = 'image/png'; }
  56333. if (encoderOptions === undefined) { encoderOptions = 0.92; }
  56334. var src = canvas.toDataURL(type, encoderOptions);
  56335. var image = new Image();
  56336. image.src = src;
  56337. return image;
  56338. };
  56339. module.exports = CanvasSnapshot;
  56340. /***/ }),
  56341. /* 260 */
  56342. /***/ (function(module, exports) {
  56343. /**
  56344. * @author Richard Davey <rich@photonstorm.com>
  56345. * @copyright 2018 Photon Storm Ltd.
  56346. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  56347. */
  56348. var roundPixels = false;
  56349. /**
  56350. * No scaling, anchor, rotation or effects, literally draws the frame directly to the canvas.
  56351. *
  56352. * @function Phaser.Renderer.Canvas.BlitImage
  56353. * @since 3.0.0
  56354. *
  56355. * @param {number} dx - The x coordinate to render the Frame to.
  56356. * @param {number} dy - The y coordinate to render the Frame to.
  56357. * @param {Phaser.Textures.Frame} frame - The Frame to render.
  56358. */
  56359. var BlitImage = function (dx, dy, frame)
  56360. {
  56361. var ctx = this.currentContext;
  56362. var cd = frame.canvasData;
  56363. if (roundPixels)
  56364. {
  56365. dx |= 0;
  56366. dy |= 0;
  56367. }
  56368. ctx.drawImage(
  56369. frame.source.image,
  56370. cd.x,
  56371. cd.y,
  56372. cd.width,
  56373. cd.height,
  56374. dx,
  56375. dy,
  56376. cd.width,
  56377. cd.height
  56378. );
  56379. };
  56380. // Special return so we can store the config value locally
  56381. module.exports = function (configRoundPixels)
  56382. {
  56383. roundPixels = configRoundPixels;
  56384. return BlitImage;
  56385. };
  56386. /***/ }),
  56387. /* 261 */
  56388. /***/ (function(module, exports, __webpack_require__) {
  56389. /**
  56390. * @author Richard Davey <rich@photonstorm.com>
  56391. * @author Felipe Alfonso <@bitnenfer>
  56392. * @copyright 2018 Photon Storm Ltd.
  56393. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  56394. */
  56395. var BlitImage = __webpack_require__(260);
  56396. var CanvasSnapshot = __webpack_require__(259);
  56397. var Class = __webpack_require__(0);
  56398. var CONST = __webpack_require__(22);
  56399. var DrawImage = __webpack_require__(258);
  56400. var GetBlendModes = __webpack_require__(257);
  56401. var ScaleModes = __webpack_require__(59);
  56402. var Smoothing = __webpack_require__(132);
  56403. /**
  56404. * @classdesc
  56405. * [description]
  56406. *
  56407. * @class CanvasRenderer
  56408. * @memberOf Phaser.Renderer.Canvas
  56409. * @constructor
  56410. * @since 3.0.0
  56411. *
  56412. * @param {Phaser.Game} game - The Phaser Game instance that owns this renderer.
  56413. */
  56414. var CanvasRenderer = new Class({
  56415. initialize:
  56416. function CanvasRenderer (game)
  56417. {
  56418. /**
  56419. * The Phaser Game instance that owns this renderer.
  56420. *
  56421. * @name Phaser.Renderer.Canvas.CanvasRenderer#game
  56422. * @type {Phaser.Game}
  56423. * @since 3.0.0
  56424. */
  56425. this.game = game;
  56426. /**
  56427. * [description]
  56428. *
  56429. * @name Phaser.Renderer.Canvas.CanvasRenderer#type
  56430. * @type {integer}
  56431. * @since 3.0.0
  56432. */
  56433. this.type = CONST.CANVAS;
  56434. /**
  56435. * [description]
  56436. *
  56437. * @name Phaser.Renderer.Canvas.CanvasRenderer#drawCount
  56438. * @type {number}
  56439. * @default 0
  56440. * @since 3.0.0
  56441. */
  56442. this.drawCount = 0;
  56443. /**
  56444. * [description]
  56445. *
  56446. * @name Phaser.Renderer.Canvas.CanvasRenderer#width
  56447. * @type {number}
  56448. * @since 3.0.0
  56449. */
  56450. this.width = game.config.width;
  56451. /**
  56452. * [description]
  56453. *
  56454. * @name Phaser.Renderer.Canvas.CanvasRenderer#height
  56455. * @type {number}
  56456. * @since 3.0.0
  56457. */
  56458. this.height = game.config.height;
  56459. /**
  56460. * [description]
  56461. *
  56462. * @name Phaser.Renderer.Canvas.CanvasRenderer#config
  56463. * @type {RendererConfig}
  56464. * @since 3.0.0
  56465. */
  56466. this.config = {
  56467. clearBeforeRender: game.config.clearBeforeRender,
  56468. backgroundColor: game.config.backgroundColor,
  56469. resolution: game.config.resolution,
  56470. autoResize: game.config.autoResize,
  56471. antialias: game.config.antialias,
  56472. roundPixels: game.config.roundPixels
  56473. };
  56474. /**
  56475. * [description]
  56476. *
  56477. * @name Phaser.Renderer.Canvas.CanvasRenderer#scaleMode
  56478. * @type {integer}
  56479. * @since 3.0.0
  56480. */
  56481. this.scaleMode = (game.config.antialias) ? ScaleModes.LINEAR : ScaleModes.NEAREST;
  56482. /**
  56483. * [description]
  56484. *
  56485. * @name Phaser.Renderer.Canvas.CanvasRenderer#gameCanvas
  56486. * @type {HTMLCanvasElement}
  56487. * @since 3.0.0
  56488. */
  56489. this.gameCanvas = game.canvas;
  56490. /**
  56491. * [description]
  56492. *
  56493. * @name Phaser.Renderer.Canvas.CanvasRenderer#gameContext
  56494. * @type {CanvasRenderingContext2D}
  56495. * @since 3.0.0
  56496. */
  56497. this.gameContext = (this.game.config.context) ? this.game.config.context : this.gameCanvas.getContext('2d');
  56498. /**
  56499. * [description]
  56500. *
  56501. * @name Phaser.Renderer.Canvas.CanvasRenderer#currentContext
  56502. * @type {CanvasRenderingContext2D}
  56503. * @since 3.0.0
  56504. */
  56505. this.currentContext = this.gameContext;
  56506. /**
  56507. * Map to the required function.
  56508. *
  56509. * @name Phaser.Renderer.Canvas.CanvasRenderer#drawImage
  56510. * @type {function}
  56511. * @since 3.0.0
  56512. */
  56513. this.drawImage = DrawImage;
  56514. /**
  56515. * [description]
  56516. *
  56517. * @name Phaser.Renderer.Canvas.CanvasRenderer#blitImage
  56518. * @type {function}
  56519. * @since 3.0.0
  56520. */
  56521. this.blitImage = BlitImage(this.config.roundPixels);
  56522. /**
  56523. * [description]
  56524. *
  56525. * @name Phaser.Renderer.Canvas.CanvasRenderer#blendModes
  56526. * @type {array}
  56527. * @since 3.0.0
  56528. */
  56529. this.blendModes = GetBlendModes();
  56530. /**
  56531. * [description]
  56532. *
  56533. * @name Phaser.Renderer.Canvas.CanvasRenderer#currentAlpha
  56534. * @type {number}
  56535. * @default 1
  56536. * @since 3.0.0
  56537. */
  56538. this.currentAlpha = 1;
  56539. /**
  56540. * [description]
  56541. *
  56542. * @name Phaser.Renderer.Canvas.CanvasRenderer#currentBlendMode
  56543. * @type {number}
  56544. * @default 0
  56545. * @since 3.0.0
  56546. */
  56547. this.currentBlendMode = 0;
  56548. /**
  56549. * [description]
  56550. *
  56551. * @name Phaser.Renderer.Canvas.CanvasRenderer#currentScaleMode
  56552. * @type {number}
  56553. * @default 0
  56554. * @since 3.0.0
  56555. */
  56556. this.currentScaleMode = 0;
  56557. /**
  56558. * [description]
  56559. *
  56560. * @name Phaser.Renderer.Canvas.CanvasRenderer#snapshotCallback
  56561. * @type {?SnapshotCallback}
  56562. * @default null
  56563. * @since 3.0.0
  56564. */
  56565. this.snapshotCallback = null;
  56566. /**
  56567. * [description]
  56568. *
  56569. * @name Phaser.Renderer.Canvas.CanvasRenderer#snapshotType
  56570. * @type {?string}
  56571. * @default null
  56572. * @since 3.0.0
  56573. */
  56574. this.snapshotType = null;
  56575. /**
  56576. * [description]
  56577. *
  56578. * @name Phaser.Renderer.Canvas.CanvasRenderer#snapshotEncoder
  56579. * @type {?number}
  56580. * @default null
  56581. * @since 3.0.0
  56582. */
  56583. this.snapshotEncoder = null;
  56584. this.init();
  56585. },
  56586. /**
  56587. * [description]
  56588. *
  56589. * @method Phaser.Renderer.Canvas.CanvasRenderer#init
  56590. * @since 3.0.0
  56591. */
  56592. init: function ()
  56593. {
  56594. this.resize(this.width, this.height);
  56595. },
  56596. /**
  56597. * Resize the main game canvas.
  56598. *
  56599. * @method Phaser.Renderer.Canvas.CanvasRenderer#resize
  56600. * @since 3.0.0
  56601. *
  56602. * @param {integer} width - [description]
  56603. * @param {integer} height - [description]
  56604. */
  56605. resize: function (width, height)
  56606. {
  56607. var resolution = this.config.resolution;
  56608. this.width = width * resolution;
  56609. this.height = height * resolution;
  56610. this.gameCanvas.width = this.width;
  56611. this.gameCanvas.height = this.height;
  56612. if (this.config.autoResize)
  56613. {
  56614. this.gameCanvas.style.width = (this.width / resolution) + 'px';
  56615. this.gameCanvas.style.height = (this.height / resolution) + 'px';
  56616. }
  56617. // Resizing a canvas will reset imageSmoothingEnabled (and probably other properties)
  56618. if (this.scaleMode === ScaleModes.NEAREST)
  56619. {
  56620. Smoothing.disable(this.gameContext);
  56621. }
  56622. },
  56623. /**
  56624. * [description]
  56625. *
  56626. * @method Phaser.Renderer.Canvas.CanvasRenderer#onContextLost
  56627. * @since 3.0.0
  56628. *
  56629. * @param {function} callback - [description]
  56630. */
  56631. onContextLost: function ()
  56632. {
  56633. },
  56634. /**
  56635. * [description]
  56636. *
  56637. * @method Phaser.Renderer.Canvas.CanvasRenderer#onContextRestored
  56638. * @since 3.0.0
  56639. *
  56640. * @param {function} callback - [description]
  56641. */
  56642. onContextRestored: function ()
  56643. {
  56644. },
  56645. /**
  56646. * [description]
  56647. *
  56648. * @method Phaser.Renderer.Canvas.CanvasRenderer#resetTransform
  56649. * @since 3.0.0
  56650. */
  56651. resetTransform: function ()
  56652. {
  56653. this.currentContext.setTransform(1, 0, 0, 1, 0, 0);
  56654. },
  56655. /**
  56656. * [description]
  56657. *
  56658. * @method Phaser.Renderer.Canvas.CanvasRenderer#setBlendMode
  56659. * @since 3.0.0
  56660. *
  56661. * @param {number} blendMode - [description]
  56662. *
  56663. * @return {number} [description]
  56664. */
  56665. setBlendMode: function (blendMode)
  56666. {
  56667. if (this.currentBlendMode !== blendMode)
  56668. {
  56669. this.currentContext.globalCompositeOperation = blendMode;
  56670. this.currentBlendMode = blendMode;
  56671. }
  56672. return this.currentBlendMode;
  56673. },
  56674. /**
  56675. * [description]
  56676. *
  56677. * @method Phaser.Renderer.Canvas.CanvasRenderer#setAlpha
  56678. * @since 3.0.0
  56679. *
  56680. * @param {number} alpha - [description]
  56681. *
  56682. * @return {number} [description]
  56683. */
  56684. setAlpha: function (alpha)
  56685. {
  56686. if (this.currentAlpha !== alpha)
  56687. {
  56688. this.currentContext.globalAlpha = alpha;
  56689. this.currentAlpha = alpha;
  56690. }
  56691. return this.currentAlpha;
  56692. },
  56693. /**
  56694. * Called at the start of the render loop.
  56695. *
  56696. * @method Phaser.Renderer.Canvas.CanvasRenderer#preRender
  56697. * @since 3.0.0
  56698. */
  56699. preRender: function ()
  56700. {
  56701. var ctx = this.gameContext;
  56702. var config = this.config;
  56703. var width = this.width;
  56704. var height = this.height;
  56705. if (config.clearBeforeRender)
  56706. {
  56707. ctx.clearRect(0, 0, width, height);
  56708. }
  56709. if (!config.transparent)
  56710. {
  56711. ctx.fillStyle = config.backgroundColor.rgba;
  56712. ctx.fillRect(0, 0, width, height);
  56713. }
  56714. this.drawCount = 0;
  56715. },
  56716. /**
  56717. * Renders the Scene to the given Camera.
  56718. *
  56719. * @method Phaser.Renderer.Canvas.CanvasRenderer#render
  56720. * @since 3.0.0
  56721. *
  56722. * @param {Phaser.Scene} scene - [description]
  56723. * @param {Phaser.GameObjects.DisplayList} children - [description]
  56724. * @param {number} interpolationPercentage - [description]
  56725. * @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
  56726. */
  56727. render: function (scene, children, interpolationPercentage, camera)
  56728. {
  56729. var ctx = scene.sys.context;
  56730. var scissor = (camera.x !== 0 || camera.y !== 0 || camera.width !== ctx.canvas.width || camera.height !== ctx.canvas.height);
  56731. var list = children.list;
  56732. var resolution = this.config.resolution;
  56733. this.currentContext = ctx;
  56734. // If the alpha or blend mode didn't change since the last render, then don't set them again (saves 2 ops)
  56735. if (!camera.transparent)
  56736. {
  56737. ctx.fillStyle = camera.backgroundColor.rgba;
  56738. ctx.fillRect(camera.x, camera.y, camera.width, camera.height);
  56739. }
  56740. ctx.globalAlpha = camera.alpha;
  56741. this.currentAlpha = camera.alpha;
  56742. if (this.currentBlendMode !== 0)
  56743. {
  56744. ctx.globalCompositeOperation = 'source-over';
  56745. this.currentBlendMode = 0;
  56746. }
  56747. this.currentScaleMode = 0;
  56748. this.drawCount += list.length;
  56749. if (scissor)
  56750. {
  56751. ctx.save();
  56752. ctx.beginPath();
  56753. ctx.rect(camera.x * resolution, camera.y * resolution, camera.width * resolution, camera.height * resolution);
  56754. ctx.clip();
  56755. }
  56756. var matrix = camera.matrix.matrix;
  56757. ctx.setTransform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  56758. for (var c = 0; c < list.length; c++)
  56759. {
  56760. var child = list[c];
  56761. if (child.mask)
  56762. {
  56763. child.mask.preRenderCanvas(this, child, camera);
  56764. }
  56765. child.renderCanvas(this, child, interpolationPercentage, camera);
  56766. if (child.mask)
  56767. {
  56768. child.mask.postRenderCanvas(this, child, camera);
  56769. }
  56770. }
  56771. ctx.setTransform(1, 0, 0, 1, 0, 0);
  56772. ctx.globalCompositeOperation = 'source-over';
  56773. ctx.globalAlpha = 1;
  56774. camera.flashEffect.postRenderCanvas(ctx);
  56775. camera.fadeEffect.postRenderCanvas(ctx);
  56776. camera.dirty = false;
  56777. // Reset the camera scissor
  56778. if (scissor)
  56779. {
  56780. ctx.restore();
  56781. }
  56782. },
  56783. /**
  56784. * [description]
  56785. *
  56786. * @method Phaser.Renderer.Canvas.CanvasRenderer#postRender
  56787. * @since 3.0.0
  56788. */
  56789. postRender: function ()
  56790. {
  56791. var ctx = this.gameContext;
  56792. ctx.globalAlpha = 1;
  56793. ctx.globalCompositeOperation = 'source-over';
  56794. this.currentAlpha = 1;
  56795. this.currentBlendMode = 0;
  56796. if (this.snapshotCallback)
  56797. {
  56798. this.snapshotCallback(CanvasSnapshot(this.gameCanvas, this.snapshotType, this.snapshotEncoder));
  56799. this.snapshotCallback = null;
  56800. }
  56801. },
  56802. /**
  56803. * [description]
  56804. *
  56805. * @method Phaser.Renderer.Canvas.CanvasRenderer#snapshot
  56806. * @since 3.0.0
  56807. *
  56808. * @param {SnapshotCallback} callback - [description]
  56809. * @param {string} type - [description]
  56810. * @param {number} encoderOptions - [description]
  56811. */
  56812. snapshot: function (callback, type, encoderOptions)
  56813. {
  56814. this.snapshotCallback = callback;
  56815. this.snapshotType = type;
  56816. this.snapshotEncoder = encoderOptions;
  56817. },
  56818. /**
  56819. * [description]
  56820. *
  56821. * @method Phaser.Renderer.Canvas.CanvasRenderer#destroy
  56822. * @since 3.0.0
  56823. */
  56824. destroy: function ()
  56825. {
  56826. this.gameCanvas = null;
  56827. this.gameContext = null;
  56828. this.game = null;
  56829. }
  56830. });
  56831. module.exports = CanvasRenderer;
  56832. /***/ }),
  56833. /* 262 */
  56834. /***/ (function(module, exports, __webpack_require__) {
  56835. /**
  56836. * @author Richard Davey <rich@photonstorm.com>
  56837. * @copyright 2018 Photon Storm Ltd.
  56838. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  56839. */
  56840. var Class = __webpack_require__(0);
  56841. var NOOP = __webpack_require__(3);
  56842. /**
  56843. * @classdesc
  56844. * Abstracts away the use of RAF or setTimeOut for the core game update loop.
  56845. * This is invoked automatically by the Phaser.Game instance.
  56846. *
  56847. * @class RequestAnimationFrame
  56848. * @memberOf Phaser.DOM
  56849. * @constructor
  56850. * @since 3.0.0
  56851. */
  56852. var RequestAnimationFrame = new Class({
  56853. initialize:
  56854. function RequestAnimationFrame ()
  56855. {
  56856. /**
  56857. * True if RequestAnimationFrame is running, otherwise false.
  56858. *
  56859. * @name Phaser.DOM.RequestAnimationFrame#isRunning
  56860. * @type {boolean}
  56861. * @default false
  56862. * @since 3.0.0
  56863. */
  56864. this.isRunning = false;
  56865. /**
  56866. * The callback to be invoked each step.
  56867. *
  56868. * @name Phaser.DOM.RequestAnimationFrame#callback
  56869. * @type {FrameRequestCallback}
  56870. * @since 3.0.0
  56871. */
  56872. this.callback = NOOP;
  56873. /**
  56874. * The most recent timestamp. Either a DOMHighResTimeStamp under RAF or `Date.now` under SetTimeout.
  56875. *
  56876. * @name Phaser.DOM.RequestAnimationFrame#tick
  56877. * @type {number}
  56878. * @default 0
  56879. * @since 3.0.0
  56880. */
  56881. this.tick = 0;
  56882. /**
  56883. * True if the step is using setTimeout instead of RAF.
  56884. *
  56885. * @name Phaser.DOM.RequestAnimationFrame#isSetTimeOut
  56886. * @type {boolean}
  56887. * @default false
  56888. * @since 3.0.0
  56889. */
  56890. this.isSetTimeOut = false;
  56891. /**
  56892. * The setTimeout or RAF callback ID used when canceling them.
  56893. *
  56894. * @name Phaser.DOM.RequestAnimationFrame#timeOutID
  56895. * @type {?number}
  56896. * @default null
  56897. * @since 3.0.0
  56898. */
  56899. this.timeOutID = null;
  56900. /**
  56901. * The previous time the step was called.
  56902. *
  56903. * @name Phaser.DOM.RequestAnimationFrame#lastTime
  56904. * @type {number}
  56905. * @default 0
  56906. * @since 3.0.0
  56907. */
  56908. this.lastTime = 0;
  56909. var _this = this;
  56910. /**
  56911. * The RAF step function.
  56912. * Updates the local tick value, invokes the callback and schedules another call to requestAnimationFrame.
  56913. *
  56914. * @name Phaser.DOM.RequestAnimationFrame#step
  56915. * @type {FrameRequestCallback}
  56916. * @since 3.0.0
  56917. */
  56918. this.step = function step (timestamp)
  56919. {
  56920. // DOMHighResTimeStamp
  56921. _this.lastTime = _this.tick;
  56922. _this.tick = timestamp;
  56923. _this.callback(timestamp);
  56924. _this.timeOutID = window.requestAnimationFrame(step);
  56925. };
  56926. /**
  56927. * The SetTimeout step function.
  56928. * Updates the local tick value, invokes the callback and schedules another call to setTimeout.
  56929. *
  56930. * @name Phaser.DOM.RequestAnimationFrame#stepTimeout
  56931. * @type {function}
  56932. * @since 3.0.0
  56933. */
  56934. this.stepTimeout = function stepTimeout ()
  56935. {
  56936. var d = Date.now();
  56937. var delay = Math.max(16 + _this.lastTime - d, 0);
  56938. _this.lastTime = _this.tick;
  56939. _this.tick = d;
  56940. _this.callback(d);
  56941. _this.timeOutID = window.setTimeout(stepTimeout, delay);
  56942. };
  56943. },
  56944. /**
  56945. * Starts the requestAnimationFrame or setTimeout process running.
  56946. *
  56947. * @method Phaser.DOM.RequestAnimationFrame#start
  56948. * @since 3.0.0
  56949. *
  56950. * @param {FrameRequestCallback} callback - The callback to invoke each step.
  56951. * @param {boolean} forceSetTimeOut - Should it use SetTimeout, even if RAF is available?
  56952. */
  56953. start: function (callback, forceSetTimeOut)
  56954. {
  56955. if (this.isRunning)
  56956. {
  56957. return;
  56958. }
  56959. this.callback = callback;
  56960. this.isSetTimeOut = forceSetTimeOut;
  56961. this.isRunning = true;
  56962. this.timeOutID = (forceSetTimeOut) ? window.setTimeout(this.stepTimeout, 0) : window.requestAnimationFrame(this.step);
  56963. },
  56964. /**
  56965. * Stops the requestAnimationFrame or setTimeout from running.
  56966. *
  56967. * @method Phaser.DOM.RequestAnimationFrame#stop
  56968. * @since 3.0.0
  56969. */
  56970. stop: function ()
  56971. {
  56972. this.isRunning = false;
  56973. if (this.isSetTimeOut)
  56974. {
  56975. clearTimeout(this.timeOutID);
  56976. }
  56977. else
  56978. {
  56979. window.cancelAnimationFrame(this.timeOutID);
  56980. }
  56981. },
  56982. /**
  56983. * Stops the step from running and clears the callback reference.
  56984. *
  56985. * @method Phaser.DOM.RequestAnimationFrame#destroy
  56986. * @since 3.0.0
  56987. */
  56988. destroy: function ()
  56989. {
  56990. this.stop();
  56991. this.callback = NOOP;
  56992. }
  56993. });
  56994. module.exports = RequestAnimationFrame;
  56995. /***/ }),
  56996. /* 263 */
  56997. /***/ (function(module, exports) {
  56998. /**
  56999. * @author Richard Davey <rich@photonstorm.com>
  57000. * @copyright 2018 Photon Storm Ltd.
  57001. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57002. */
  57003. /**
  57004. * Attempts to remove the element from its parentNode in the DOM.
  57005. *
  57006. * @function Phaser.DOM.RemoveFromDOM
  57007. * @since 3.0.0
  57008. *
  57009. * @param {HTMLElement} element - The DOM element to remove from its parent node.
  57010. */
  57011. var RemoveFromDOM = function (element)
  57012. {
  57013. if (element.parentNode)
  57014. {
  57015. element.parentNode.removeChild(element);
  57016. }
  57017. };
  57018. module.exports = RemoveFromDOM;
  57019. /***/ }),
  57020. /* 264 */
  57021. /***/ (function(module, exports) {
  57022. /**
  57023. * @author Richard Davey <rich@photonstorm.com>
  57024. * @copyright 2018 Photon Storm Ltd.
  57025. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57026. */
  57027. /**
  57028. * Takes the given data string and parses it as XML.
  57029. * First tries to use the window.DOMParser and reverts to the Microsoft.XMLDOM if that fails.
  57030. * The parsed XML object is returned, or `null` if there was an error while parsing the data.
  57031. *
  57032. * @function Phaser.DOM.ParseXML
  57033. * @since 3.0.0
  57034. *
  57035. * @param {string} data - The XML source stored in a string.
  57036. *
  57037. * @return {?(DOMParser|ActiveXObject)} The parsed XML data, or `null` if the data could not be parsed.
  57038. */
  57039. var ParseXML = function (data)
  57040. {
  57041. var xml = '';
  57042. try
  57043. {
  57044. if (window['DOMParser'])
  57045. {
  57046. var domparser = new DOMParser();
  57047. xml = domparser.parseFromString(data, 'text/xml');
  57048. }
  57049. else
  57050. {
  57051. xml = new ActiveXObject('Microsoft.XMLDOM');
  57052. xml.loadXML(data);
  57053. }
  57054. }
  57055. catch (e)
  57056. {
  57057. xml = null;
  57058. }
  57059. if (!xml || !xml.documentElement || xml.getElementsByTagName('parsererror').length)
  57060. {
  57061. return null;
  57062. }
  57063. else
  57064. {
  57065. return xml;
  57066. }
  57067. };
  57068. module.exports = ParseXML;
  57069. /***/ }),
  57070. /* 265 */
  57071. /***/ (function(module, exports, __webpack_require__) {
  57072. /**
  57073. * @author Richard Davey <rich@photonstorm.com>
  57074. * @copyright 2018 Photon Storm Ltd.
  57075. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57076. */
  57077. var OS = __webpack_require__(57);
  57078. /**
  57079. * @callback ContentLoadedCallback
  57080. */
  57081. /**
  57082. * Inspects the readyState of the document. If the document is already complete then it invokes the given callback.
  57083. * If not complete it sets up several event listeners such as `deviceready`, and once those fire, it invokes the callback.
  57084. * Called automatically by the Phaser.Game instance. Should not usually be accessed directly.
  57085. *
  57086. * @function Phaser.DOM.DOMContentLoaded
  57087. * @since 3.0.0
  57088. *
  57089. * @param {ContentLoadedCallback} callback - The callback to be invoked when the device is ready and the DOM content is loaded.
  57090. */
  57091. var DOMContentLoaded = function (callback)
  57092. {
  57093. if (document.readyState === 'complete' || document.readyState === 'interactive')
  57094. {
  57095. callback();
  57096. return;
  57097. }
  57098. var check = function ()
  57099. {
  57100. document.removeEventListener('deviceready', check, true);
  57101. document.removeEventListener('DOMContentLoaded', check, true);
  57102. window.removeEventListener('load', check, true);
  57103. callback();
  57104. };
  57105. if (!document.body)
  57106. {
  57107. window.setTimeout(check, 20);
  57108. }
  57109. else if (OS.cordova && !OS.cocoonJS)
  57110. {
  57111. // Ref. http://docs.phonegap.com/en/3.5.0/cordova_events_events.md.html#deviceready
  57112. document.addEventListener('deviceready', check, false);
  57113. }
  57114. else
  57115. {
  57116. document.addEventListener('DOMContentLoaded', check, true);
  57117. window.addEventListener('load', check, true);
  57118. }
  57119. };
  57120. module.exports = DOMContentLoaded;
  57121. /***/ }),
  57122. /* 266 */
  57123. /***/ (function(module, exports) {
  57124. /**
  57125. * @author Richard Davey <rich@photonstorm.com>
  57126. * @copyright 2018 Photon Storm Ltd.
  57127. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57128. */
  57129. /**
  57130. * @namespace Phaser.Display.Canvas.CanvasInterpolation
  57131. * @since 3.0.0
  57132. */
  57133. var CanvasInterpolation = {
  57134. /**
  57135. * Sets the CSS image-rendering property on the given canvas to be 'crisp' (aka 'optimize contrast' on webkit).
  57136. *
  57137. * @function Phaser.Display.Canvas.CanvasInterpolation.setCrisp
  57138. * @since 3.0.0
  57139. *
  57140. * @param {HTMLCanvasElement} canvas - The canvas object to have the style set on.
  57141. *
  57142. * @return {HTMLCanvasElement} The canvas.
  57143. */
  57144. setCrisp: function (canvas)
  57145. {
  57146. var types = [ 'optimizeSpeed', 'crisp-edges', '-moz-crisp-edges', '-webkit-optimize-contrast', 'optimize-contrast', 'pixelated' ];
  57147. types.forEach(function (type)
  57148. {
  57149. canvas.style['image-rendering'] = type;
  57150. });
  57151. canvas.style.msInterpolationMode = 'nearest-neighbor';
  57152. return canvas;
  57153. },
  57154. /**
  57155. * Sets the CSS image-rendering property on the given canvas to be 'bicubic' (aka 'auto').
  57156. *
  57157. * @function Phaser.Display.Canvas.CanvasInterpolation.setBicubic
  57158. * @since 3.0.0
  57159. *
  57160. * @param {HTMLCanvasElement} canvas - The canvas object to have the style set on.
  57161. *
  57162. * @return {HTMLCanvasElement} The canvas.
  57163. */
  57164. setBicubic: function (canvas)
  57165. {
  57166. canvas.style['image-rendering'] = 'auto';
  57167. canvas.style.msInterpolationMode = 'bicubic';
  57168. return canvas;
  57169. }
  57170. };
  57171. module.exports = CanvasInterpolation;
  57172. /***/ }),
  57173. /* 267 */
  57174. /***/ (function(module, exports) {
  57175. /**
  57176. * @author Richard Davey <rich@photonstorm.com>
  57177. * @copyright 2018 Photon Storm Ltd.
  57178. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57179. */
  57180. /**
  57181. * Calculates a Catmull-Rom value.
  57182. *
  57183. * @function Phaser.Math.CatmullRom
  57184. * @since 3.0.0
  57185. *
  57186. * @param {number} t - [description]
  57187. * @param {number} p0 - [description]
  57188. * @param {number} p1 - [description]
  57189. * @param {number} p2 - [description]
  57190. * @param {number} p3 - [description]
  57191. *
  57192. * @return {number} The Catmull-Rom value.
  57193. */
  57194. var CatmullRom = function (t, p0, p1, p2, p3)
  57195. {
  57196. var v0 = (p2 - p0) * 0.5;
  57197. var v1 = (p3 - p1) * 0.5;
  57198. var t2 = t * t;
  57199. var t3 = t * t2;
  57200. return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;
  57201. };
  57202. module.exports = CatmullRom;
  57203. /***/ }),
  57204. /* 268 */
  57205. /***/ (function(module, exports, __webpack_require__) {
  57206. /**
  57207. * @author Richard Davey <rich@photonstorm.com>
  57208. * @copyright 2018 Photon Storm Ltd.
  57209. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57210. */
  57211. var Rectangle = __webpack_require__(13);
  57212. // points is an array of Point-like objects,
  57213. // either 2 dimensional arrays, or objects with public x/y properties:
  57214. // var points = [
  57215. // [100, 200],
  57216. // [200, 400],
  57217. // { x: 30, y: 60 }
  57218. // ]
  57219. /**
  57220. * [description]
  57221. *
  57222. * @function Phaser.Geom.Rectangle.FromPoints
  57223. * @since 3.0.0
  57224. *
  57225. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  57226. *
  57227. * @param {array} points - [description]
  57228. * @param {Phaser.Geom.Rectangle} [out] - [description]
  57229. *
  57230. * @return {Phaser.Geom.Rectangle} [description]
  57231. */
  57232. var FromPoints = function (points, out)
  57233. {
  57234. if (out === undefined) { out = new Rectangle(); }
  57235. if (points.length === 0)
  57236. {
  57237. return out;
  57238. }
  57239. var minX = Number.MAX_VALUE;
  57240. var minY = Number.MAX_VALUE;
  57241. var maxX = Number.MIN_SAFE_INTEGER;
  57242. var maxY = Number.MIN_SAFE_INTEGER;
  57243. var p;
  57244. var px;
  57245. var py;
  57246. for (var i = 0; i < points.length; i++)
  57247. {
  57248. p = points[i];
  57249. if (Array.isArray(p))
  57250. {
  57251. px = p[0];
  57252. py = p[1];
  57253. }
  57254. else
  57255. {
  57256. px = p.x;
  57257. py = p.y;
  57258. }
  57259. minX = Math.min(minX, px);
  57260. minY = Math.min(minY, py);
  57261. maxX = Math.max(maxX, px);
  57262. maxY = Math.max(maxY, py);
  57263. }
  57264. out.x = minX;
  57265. out.y = minY;
  57266. out.width = maxX - minX;
  57267. out.height = maxY - minY;
  57268. return out;
  57269. };
  57270. module.exports = FromPoints;
  57271. /***/ }),
  57272. /* 269 */
  57273. /***/ (function(module, exports) {
  57274. /**
  57275. * @author Richard Davey <rich@photonstorm.com>
  57276. * @copyright 2018 Photon Storm Ltd.
  57277. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57278. */
  57279. /**
  57280. * A 16 color palette by [Arne](http://androidarts.com/palette/16pal.htm)
  57281. *
  57282. * @name Phaser.Create.Palettes.ARNE16
  57283. * @since 3.0.0
  57284. *
  57285. * @type {Palette}
  57286. */
  57287. module.exports = {
  57288. 0: '#000',
  57289. 1: '#9D9D9D',
  57290. 2: '#FFF',
  57291. 3: '#BE2633',
  57292. 4: '#E06F8B',
  57293. 5: '#493C2B',
  57294. 6: '#A46422',
  57295. 7: '#EB8931',
  57296. 8: '#F7E26B',
  57297. 9: '#2F484E',
  57298. A: '#44891A',
  57299. B: '#A3CE27',
  57300. C: '#1B2632',
  57301. D: '#005784',
  57302. E: '#31A2F2',
  57303. F: '#B2DCEF'
  57304. };
  57305. /***/ }),
  57306. /* 270 */
  57307. /***/ (function(module, exports, __webpack_require__) {
  57308. /**
  57309. * @author Richard Davey <rich@photonstorm.com>
  57310. * @copyright 2018 Photon Storm Ltd.
  57311. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57312. */
  57313. var Arne16 = __webpack_require__(269);
  57314. var CanvasPool = __webpack_require__(24);
  57315. var GetValue = __webpack_require__(4);
  57316. /**
  57317. * @callback GenerateTextureRendererCallback
  57318. *
  57319. * @param {HTMLCanvasElement} canvas - [description]
  57320. * @param {CanvasRenderingContext2D} context - [description]
  57321. */
  57322. /**
  57323. * @typedef {object} GenerateTextureConfig
  57324. *
  57325. * @property {array} [data=[]] - [description]
  57326. * @property {HTMLCanvasElement} [canvas=null] - [description]
  57327. * @property {Palette} [palette=Arne16] - [description]
  57328. * @property {number} [pixelWidth=1] - [description]
  57329. * @property {number} [pixelHeight=1] - [description]
  57330. * @property {boolean} [resizeCanvas=true] - [description]
  57331. * @property {boolean} [clearCanvas=true] - [description]
  57332. * @property {GenerateTextureRendererCallback} [preRender] - [description]
  57333. * @property {GenerateTextureRendererCallback} [postRender] - [description]
  57334. */
  57335. /**
  57336. * [description]
  57337. *
  57338. * @function Phaser.Create.GenerateTexture
  57339. * @since 3.0.0
  57340. *
  57341. * @param {GenerateTextureConfig} config - [description]
  57342. *
  57343. * @return {HTMLCanvasElement} [description]
  57344. */
  57345. var GenerateTexture = function (config)
  57346. {
  57347. var data = GetValue(config, 'data', []);
  57348. var canvas = GetValue(config, 'canvas', null);
  57349. var palette = GetValue(config, 'palette', Arne16);
  57350. var pixelWidth = GetValue(config, 'pixelWidth', 1);
  57351. var pixelHeight = GetValue(config, 'pixelHeight', pixelWidth);
  57352. var resizeCanvas = GetValue(config, 'resizeCanvas', true);
  57353. var clearCanvas = GetValue(config, 'clearCanvas', true);
  57354. var preRender = GetValue(config, 'preRender', null);
  57355. var postRender = GetValue(config, 'postRender', null);
  57356. var width = Math.floor(Math.abs(data[0].length * pixelWidth));
  57357. var height = Math.floor(Math.abs(data.length * pixelHeight));
  57358. if (!canvas)
  57359. {
  57360. canvas = CanvasPool.create2D(this, width, height);
  57361. resizeCanvas = false;
  57362. clearCanvas = false;
  57363. }
  57364. if (resizeCanvas)
  57365. {
  57366. canvas.width = width;
  57367. canvas.height = height;
  57368. }
  57369. var ctx = canvas.getContext('2d');
  57370. if (clearCanvas)
  57371. {
  57372. ctx.clearRect(0, 0, width, height);
  57373. }
  57374. // preRender Callback?
  57375. if (preRender)
  57376. {
  57377. preRender(canvas, ctx);
  57378. }
  57379. // Draw it
  57380. for (var y = 0; y < data.length; y++)
  57381. {
  57382. var row = data[y];
  57383. for (var x = 0; x < row.length; x++)
  57384. {
  57385. var d = row[x];
  57386. if (d !== '.' && d !== ' ')
  57387. {
  57388. ctx.fillStyle = palette[d];
  57389. ctx.fillRect(x * pixelWidth, y * pixelHeight, pixelWidth, pixelHeight);
  57390. }
  57391. }
  57392. }
  57393. // postRender Callback?
  57394. if (postRender)
  57395. {
  57396. postRender(canvas, ctx);
  57397. }
  57398. return canvas;
  57399. };
  57400. module.exports = GenerateTexture;
  57401. /***/ }),
  57402. /* 271 */
  57403. /***/ (function(module, exports, __webpack_require__) {
  57404. /**
  57405. * @author Richard Davey <rich@photonstorm.com>
  57406. * @copyright 2018 Photon Storm Ltd.
  57407. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57408. */
  57409. // Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji
  57410. // and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl
  57411. var Class = __webpack_require__(0);
  57412. /**
  57413. * @classdesc
  57414. * A representation of a vector in 4D space.
  57415. *
  57416. * A four-component vector.
  57417. *
  57418. * @class Vector4
  57419. * @memberOf Phaser.Math
  57420. * @constructor
  57421. * @since 3.0.0
  57422. *
  57423. * @param {number} [x] - The x component.
  57424. * @param {number} [y] - The y component.
  57425. * @param {number} [z] - The z component.
  57426. * @param {number} [w] - The w component.
  57427. */
  57428. var Vector4 = new Class({
  57429. initialize:
  57430. function Vector4 (x, y, z, w)
  57431. {
  57432. /**
  57433. * The x component of this Vector.
  57434. *
  57435. * @name Phaser.Math.Vector4#x
  57436. * @type {number}
  57437. * @default 0
  57438. * @since 3.0.0
  57439. */
  57440. this.x = 0;
  57441. /**
  57442. * The y component of this Vector.
  57443. *
  57444. * @name Phaser.Math.Vector4#y
  57445. * @type {number}
  57446. * @default 0
  57447. * @since 3.0.0
  57448. */
  57449. this.y = 0;
  57450. /**
  57451. * The z component of this Vector.
  57452. *
  57453. * @name Phaser.Math.Vector4#z
  57454. * @type {number}
  57455. * @default 0
  57456. * @since 3.0.0
  57457. */
  57458. this.z = 0;
  57459. /**
  57460. * The w component of this Vector.
  57461. *
  57462. * @name Phaser.Math.Vector4#w
  57463. * @type {number}
  57464. * @default 0
  57465. * @since 3.0.0
  57466. */
  57467. this.w = 0;
  57468. if (typeof x === 'object')
  57469. {
  57470. this.x = x.x || 0;
  57471. this.y = x.y || 0;
  57472. this.z = x.z || 0;
  57473. this.w = x.w || 0;
  57474. }
  57475. else
  57476. {
  57477. this.x = x || 0;
  57478. this.y = y || 0;
  57479. this.z = z || 0;
  57480. this.w = w || 0;
  57481. }
  57482. },
  57483. /**
  57484. * Make a clone of this Vector4.
  57485. *
  57486. * @method Phaser.Math.Vector4#clone
  57487. * @since 3.0.0
  57488. *
  57489. * @return {Phaser.Math.Vector4} A clone of this Vector4.
  57490. */
  57491. clone: function ()
  57492. {
  57493. return new Vector4(this.x, this.y, this.z, this.w);
  57494. },
  57495. /**
  57496. * Copy the components of a given Vector into this Vector.
  57497. *
  57498. * @method Phaser.Math.Vector4#copy
  57499. * @since 3.0.0
  57500. *
  57501. * @param {Phaser.Math.Vector4} src - The Vector to copy the components from.
  57502. *
  57503. * @return {Phaser.Math.Vector4} This Vector4.
  57504. */
  57505. copy: function (src)
  57506. {
  57507. this.x = src.x;
  57508. this.y = src.y;
  57509. this.z = src.z || 0;
  57510. this.w = src.w || 0;
  57511. return this;
  57512. },
  57513. /**
  57514. * Check whether this Vector is equal to a given Vector.
  57515. *
  57516. * Performs a strict quality check against each Vector's components.
  57517. *
  57518. * @method Phaser.Math.Vector4#equals
  57519. * @since 3.0.0
  57520. *
  57521. * @param {Phaser.Math.Vector4} v - [description]
  57522. *
  57523. * @return {boolean} [description]
  57524. */
  57525. equals: function (v)
  57526. {
  57527. return ((this.x === v.x) && (this.y === v.y) && (this.z === v.z) && (this.w === v.w));
  57528. },
  57529. /**
  57530. * Set the `x`, `y`, `z` and `w` components of the this Vector to the given `x`, `y`, `z` and `w` values.
  57531. *
  57532. * @method Phaser.Math.Vector4#set
  57533. * @since 3.0.0
  57534. *
  57535. * @param {(number|object)} x - The x value to set for this Vector, or an object containing x, y, z and w components.
  57536. * @param {number} y - The y value to set for this Vector.
  57537. * @param {number} z - The z value to set for this Vector.
  57538. * @param {number} w - The z value to set for this Vector.
  57539. *
  57540. * @return {Phaser.Math.Vector4} This Vector4.
  57541. */
  57542. set: function (x, y, z, w)
  57543. {
  57544. if (typeof x === 'object')
  57545. {
  57546. this.x = x.x || 0;
  57547. this.y = x.y || 0;
  57548. this.z = x.z || 0;
  57549. this.w = x.w || 0;
  57550. }
  57551. else
  57552. {
  57553. this.x = x || 0;
  57554. this.y = y || 0;
  57555. this.z = z || 0;
  57556. this.w = w || 0;
  57557. }
  57558. return this;
  57559. },
  57560. /**
  57561. * Add a given Vector to this Vector. Addition is component-wise.
  57562. *
  57563. * @method Phaser.Math.Vector4#add
  57564. * @since 3.0.0
  57565. *
  57566. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to add to this Vector.
  57567. *
  57568. * @return {Phaser.Math.Vector4} This Vector4.
  57569. */
  57570. add: function (v)
  57571. {
  57572. this.x += v.x;
  57573. this.y += v.y;
  57574. this.z += v.z || 0;
  57575. this.w += v.w || 0;
  57576. return this;
  57577. },
  57578. /**
  57579. * Subtract the given Vector from this Vector. Subtraction is component-wise.
  57580. *
  57581. * @method Phaser.Math.Vector4#subtract
  57582. * @since 3.0.0
  57583. *
  57584. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to subtract from this Vector.
  57585. *
  57586. * @return {Phaser.Math.Vector4} This Vector4.
  57587. */
  57588. subtract: function (v)
  57589. {
  57590. this.x -= v.x;
  57591. this.y -= v.y;
  57592. this.z -= v.z || 0;
  57593. this.w -= v.w || 0;
  57594. return this;
  57595. },
  57596. /**
  57597. * Scale this Vector by the given value.
  57598. *
  57599. * @method Phaser.Math.Vector4#scale
  57600. * @since 3.0.0
  57601. *
  57602. * @param {number} scale - The value to scale this Vector by.
  57603. *
  57604. * @return {Phaser.Math.Vector4} This Vector4.
  57605. */
  57606. scale: function (scale)
  57607. {
  57608. this.x *= scale;
  57609. this.y *= scale;
  57610. this.z *= scale;
  57611. this.w *= scale;
  57612. return this;
  57613. },
  57614. /**
  57615. * Calculate the length (or magnitude) of this Vector.
  57616. *
  57617. * @method Phaser.Math.Vector4#length
  57618. * @since 3.0.0
  57619. *
  57620. * @return {number} The length of this Vector.
  57621. */
  57622. length: function ()
  57623. {
  57624. var x = this.x;
  57625. var y = this.y;
  57626. var z = this.z;
  57627. var w = this.w;
  57628. return Math.sqrt(x * x + y * y + z * z + w * w);
  57629. },
  57630. /**
  57631. * Calculate the length of this Vector squared.
  57632. *
  57633. * @method Phaser.Math.Vector4#lengthSq
  57634. * @since 3.0.0
  57635. *
  57636. * @return {number} The length of this Vector, squared.
  57637. */
  57638. lengthSq: function ()
  57639. {
  57640. var x = this.x;
  57641. var y = this.y;
  57642. var z = this.z;
  57643. var w = this.w;
  57644. return x * x + y * y + z * z + w * w;
  57645. },
  57646. /**
  57647. * Normalize this Vector.
  57648. *
  57649. * Makes the vector a unit length vector (magnitude of 1) in the same direction.
  57650. *
  57651. * @method Phaser.Math.Vector4#normalize
  57652. * @since 3.0.0
  57653. *
  57654. * @return {Phaser.Math.Vector4} This Vector4.
  57655. */
  57656. normalize: function ()
  57657. {
  57658. var x = this.x;
  57659. var y = this.y;
  57660. var z = this.z;
  57661. var w = this.w;
  57662. var len = x * x + y * y + z * z + w * w;
  57663. if (len > 0)
  57664. {
  57665. len = 1 / Math.sqrt(len);
  57666. this.x = x * len;
  57667. this.y = y * len;
  57668. this.z = z * len;
  57669. this.w = w * len;
  57670. }
  57671. return this;
  57672. },
  57673. /**
  57674. * Calculate the dot product of this Vector and the given Vector.
  57675. *
  57676. * @method Phaser.Math.Vector4#dot
  57677. * @since 3.0.0
  57678. *
  57679. * @param {Phaser.Math.Vector4} v - The Vector4 to dot product with this Vector4.
  57680. *
  57681. * @return {number} The dot product of this Vector and the given Vector.
  57682. */
  57683. dot: function (v)
  57684. {
  57685. return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
  57686. },
  57687. /**
  57688. * Linearly interpolate between this Vector and the given Vector.
  57689. *
  57690. * Interpolates this Vector towards the given Vector.
  57691. *
  57692. * @method Phaser.Math.Vector4#lerp
  57693. * @since 3.0.0
  57694. *
  57695. * @param {Phaser.Math.Vector4} v - The Vector4 to interpolate towards.
  57696. * @param {number} [t=0] - The interpolation percentage, between 0 and 1.
  57697. *
  57698. * @return {Phaser.Math.Vector4} This Vector4.
  57699. */
  57700. lerp: function (v, t)
  57701. {
  57702. if (t === undefined) { t = 0; }
  57703. var ax = this.x;
  57704. var ay = this.y;
  57705. var az = this.z;
  57706. var aw = this.w;
  57707. this.x = ax + t * (v.x - ax);
  57708. this.y = ay + t * (v.y - ay);
  57709. this.z = az + t * (v.z - az);
  57710. this.w = aw + t * (v.w - aw);
  57711. return this;
  57712. },
  57713. /**
  57714. * Perform a component-wise multiplication between this Vector and the given Vector.
  57715. *
  57716. * Multiplies this Vector by the given Vector.
  57717. *
  57718. * @method Phaser.Math.Vector4#multiply
  57719. * @since 3.0.0
  57720. *
  57721. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to multiply this Vector by.
  57722. *
  57723. * @return {Phaser.Math.Vector4} This Vector4.
  57724. */
  57725. multiply: function (v)
  57726. {
  57727. this.x *= v.x;
  57728. this.y *= v.y;
  57729. this.z *= v.z || 1;
  57730. this.w *= v.w || 1;
  57731. return this;
  57732. },
  57733. /**
  57734. * Perform a component-wise division between this Vector and the given Vector.
  57735. *
  57736. * Divides this Vector by the given Vector.
  57737. *
  57738. * @method Phaser.Math.Vector4#divide
  57739. * @since 3.0.0
  57740. *
  57741. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to divide this Vector by.
  57742. *
  57743. * @return {Phaser.Math.Vector4} This Vector4.
  57744. */
  57745. divide: function (v)
  57746. {
  57747. this.x /= v.x;
  57748. this.y /= v.y;
  57749. this.z /= v.z || 1;
  57750. this.w /= v.w || 1;
  57751. return this;
  57752. },
  57753. /**
  57754. * Calculate the distance between this Vector and the given Vector.
  57755. *
  57756. * @method Phaser.Math.Vector4#distance
  57757. * @since 3.0.0
  57758. *
  57759. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - [description]
  57760. *
  57761. * @return {number} The distance from this Vector to the given Vector.
  57762. */
  57763. distance: function (v)
  57764. {
  57765. var dx = v.x - this.x;
  57766. var dy = v.y - this.y;
  57767. var dz = v.z - this.z || 0;
  57768. var dw = v.w - this.w || 0;
  57769. return Math.sqrt(dx * dx + dy * dy + dz * dz + dw * dw);
  57770. },
  57771. /**
  57772. * Calculate the distance between this Vector and the given Vector, squared.
  57773. *
  57774. * @method Phaser.Math.Vector4#distanceSq
  57775. * @since 3.0.0
  57776. *
  57777. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to calculate the distance to.
  57778. *
  57779. * @return {number} The distance from this Vector to the given Vector, squared.
  57780. */
  57781. distanceSq: function (v)
  57782. {
  57783. var dx = v.x - this.x;
  57784. var dy = v.y - this.y;
  57785. var dz = v.z - this.z || 0;
  57786. var dw = v.w - this.w || 0;
  57787. return dx * dx + dy * dy + dz * dz + dw * dw;
  57788. },
  57789. /**
  57790. * Negate the `x`, `y`, `z` and `w` components of this Vector.
  57791. *
  57792. * @method Phaser.Math.Vector4#negate
  57793. * @since 3.0.0
  57794. *
  57795. * @return {Phaser.Math.Vector4} This Vector4.
  57796. */
  57797. negate: function ()
  57798. {
  57799. this.x = -this.x;
  57800. this.y = -this.y;
  57801. this.z = -this.z;
  57802. this.w = -this.w;
  57803. return this;
  57804. },
  57805. /**
  57806. * Transform this Vector with the given Matrix.
  57807. *
  57808. * @method Phaser.Math.Vector4#transformMat4
  57809. * @since 3.0.0
  57810. *
  57811. * @param {Phaser.Math.Matrix4} mat - The Matrix4 to transform this Vector4 with.
  57812. *
  57813. * @return {Phaser.Math.Vector4} This Vector4.
  57814. */
  57815. transformMat4: function (mat)
  57816. {
  57817. var x = this.x;
  57818. var y = this.y;
  57819. var z = this.z;
  57820. var w = this.w;
  57821. var m = mat.val;
  57822. this.x = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
  57823. this.y = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
  57824. this.z = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
  57825. this.w = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
  57826. return this;
  57827. },
  57828. /**
  57829. * Transform this Vector with the given Quaternion.
  57830. *
  57831. * @method Phaser.Math.Vector4#transformQuat
  57832. * @since 3.0.0
  57833. *
  57834. * @param {Phaser.Math.Quaternion} q - The Quaternion to transform this Vector with.
  57835. *
  57836. * @return {Phaser.Math.Vector4} This Vector4.
  57837. */
  57838. transformQuat: function (q)
  57839. {
  57840. // TODO: is this really the same as Vector3?
  57841. // Also, what about this: http://molecularmusings.wordpress.com/2013/05/24/a-faster-quaternion-vector-multiplication/
  57842. // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations
  57843. var x = this.x;
  57844. var y = this.y;
  57845. var z = this.z;
  57846. var qx = q.x;
  57847. var qy = q.y;
  57848. var qz = q.z;
  57849. var qw = q.w;
  57850. // calculate quat * vec
  57851. var ix = qw * x + qy * z - qz * y;
  57852. var iy = qw * y + qz * x - qx * z;
  57853. var iz = qw * z + qx * y - qy * x;
  57854. var iw = -qx * x - qy * y - qz * z;
  57855. // calculate result * inverse quat
  57856. this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
  57857. this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
  57858. this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
  57859. return this;
  57860. },
  57861. /**
  57862. * Make this Vector the zero vector (0, 0, 0, 0).
  57863. *
  57864. * @method Phaser.Math.Vector4#reset
  57865. * @since 3.0.0
  57866. *
  57867. * @return {Phaser.Math.Vector4} This Vector4.
  57868. */
  57869. reset: function ()
  57870. {
  57871. this.x = 0;
  57872. this.y = 0;
  57873. this.z = 0;
  57874. this.w = 0;
  57875. return this;
  57876. }
  57877. });
  57878. // TODO: Check if these are required internally, if not, remove.
  57879. Vector4.prototype.sub = Vector4.prototype.subtract;
  57880. Vector4.prototype.mul = Vector4.prototype.multiply;
  57881. Vector4.prototype.div = Vector4.prototype.divide;
  57882. Vector4.prototype.dist = Vector4.prototype.distance;
  57883. Vector4.prototype.distSq = Vector4.prototype.distanceSq;
  57884. Vector4.prototype.len = Vector4.prototype.length;
  57885. Vector4.prototype.lenSq = Vector4.prototype.lengthSq;
  57886. module.exports = Vector4;
  57887. /***/ }),
  57888. /* 272 */
  57889. /***/ (function(module, exports, __webpack_require__) {
  57890. /**
  57891. * @author Richard Davey <rich@photonstorm.com>
  57892. * @copyright 2018 Photon Storm Ltd.
  57893. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  57894. */
  57895. // Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji
  57896. // and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl
  57897. var Class = __webpack_require__(0);
  57898. var EPSILON = 0.000001;
  57899. /**
  57900. * @classdesc
  57901. * A four-dimensional matrix.
  57902. *
  57903. * @class Matrix4
  57904. * @memberOf Phaser.Math
  57905. * @constructor
  57906. * @since 3.0.0
  57907. *
  57908. * @param {Phaser.Math.Matrix4} [m] - Optional Matrix4 to copy values from.
  57909. */
  57910. var Matrix4 = new Class({
  57911. initialize:
  57912. function Matrix4 (m)
  57913. {
  57914. /**
  57915. * The matrix values.
  57916. *
  57917. * @name Phaser.Math.Matrix4#val
  57918. * @type {Float32Array}
  57919. * @since 3.0.0
  57920. */
  57921. this.val = new Float32Array(16);
  57922. if (m)
  57923. {
  57924. // Assume Matrix4 with val:
  57925. this.copy(m);
  57926. }
  57927. else
  57928. {
  57929. // Default to identity
  57930. this.identity();
  57931. }
  57932. },
  57933. /**
  57934. * Make a clone of this Matrix4.
  57935. *
  57936. * @method Phaser.Math.Matrix4#clone
  57937. * @since 3.0.0
  57938. *
  57939. * @return {Phaser.Math.Matrix4} A clone of this Matrix4.
  57940. */
  57941. clone: function ()
  57942. {
  57943. return new Matrix4(this);
  57944. },
  57945. // TODO - Should work with basic values
  57946. /**
  57947. * This method is an alias for `Matrix4.copy`.
  57948. *
  57949. * @method Phaser.Math.Matrix4#set
  57950. * @since 3.0.0
  57951. *
  57952. * @param {Phaser.Math.Matrix4} src - The Matrix to set the values of this Matrix's from.
  57953. *
  57954. * @return {Phaser.Math.Matrix4} This Matrix4.
  57955. */
  57956. set: function (src)
  57957. {
  57958. return this.copy(src);
  57959. },
  57960. /**
  57961. * Copy the values of a given Matrix into this Matrix.
  57962. *
  57963. * @method Phaser.Math.Matrix4#copy
  57964. * @since 3.0.0
  57965. *
  57966. * @param {Phaser.Math.Matrix4} src - The Matrix to copy the values from.
  57967. *
  57968. * @return {Phaser.Math.Matrix4} This Matrix4.
  57969. */
  57970. copy: function (src)
  57971. {
  57972. var out = this.val;
  57973. var a = src.val;
  57974. out[0] = a[0];
  57975. out[1] = a[1];
  57976. out[2] = a[2];
  57977. out[3] = a[3];
  57978. out[4] = a[4];
  57979. out[5] = a[5];
  57980. out[6] = a[6];
  57981. out[7] = a[7];
  57982. out[8] = a[8];
  57983. out[9] = a[9];
  57984. out[10] = a[10];
  57985. out[11] = a[11];
  57986. out[12] = a[12];
  57987. out[13] = a[13];
  57988. out[14] = a[14];
  57989. out[15] = a[15];
  57990. return this;
  57991. },
  57992. /**
  57993. * Set the values of this Matrix from the given array.
  57994. *
  57995. * @method Phaser.Math.Matrix4#fromArray
  57996. * @since 3.0.0
  57997. *
  57998. * @param {array} a - The array to copy the values from.
  57999. *
  58000. * @return {Phaser.Math.Matrix4} This Matrix4.
  58001. */
  58002. fromArray: function (a)
  58003. {
  58004. var out = this.val;
  58005. out[0] = a[0];
  58006. out[1] = a[1];
  58007. out[2] = a[2];
  58008. out[3] = a[3];
  58009. out[4] = a[4];
  58010. out[5] = a[5];
  58011. out[6] = a[6];
  58012. out[7] = a[7];
  58013. out[8] = a[8];
  58014. out[9] = a[9];
  58015. out[10] = a[10];
  58016. out[11] = a[11];
  58017. out[12] = a[12];
  58018. out[13] = a[13];
  58019. out[14] = a[14];
  58020. out[15] = a[15];
  58021. return this;
  58022. },
  58023. /**
  58024. * Reset this Matrix.
  58025. *
  58026. * Sets all values to `0`.
  58027. *
  58028. * @method Phaser.Math.Matrix4#zero
  58029. * @since 3.0.0
  58030. *
  58031. * @return {Phaser.Math.Matrix4} This Matrix4.
  58032. */
  58033. zero: function ()
  58034. {
  58035. var out = this.val;
  58036. out[0] = 0;
  58037. out[1] = 0;
  58038. out[2] = 0;
  58039. out[3] = 0;
  58040. out[4] = 0;
  58041. out[5] = 0;
  58042. out[6] = 0;
  58043. out[7] = 0;
  58044. out[8] = 0;
  58045. out[9] = 0;
  58046. out[10] = 0;
  58047. out[11] = 0;
  58048. out[12] = 0;
  58049. out[13] = 0;
  58050. out[14] = 0;
  58051. out[15] = 0;
  58052. return this;
  58053. },
  58054. /**
  58055. * Set the `x`, `y` and `z` values of this Matrix.
  58056. *
  58057. * @method Phaser.Math.Matrix4#xyz
  58058. * @since 3.0.0
  58059. *
  58060. * @param {number} x - The x value.
  58061. * @param {number} y - The y value.
  58062. * @param {number} z - The z value.
  58063. *
  58064. * @return {Phaser.Math.Matrix4} This Matrix4.
  58065. */
  58066. xyz: function (x, y, z)
  58067. {
  58068. this.identity();
  58069. var out = this.val;
  58070. out[12] = x;
  58071. out[13] = y;
  58072. out[14] = z;
  58073. return this;
  58074. },
  58075. /**
  58076. * Set the scaling values of this Matrix.
  58077. *
  58078. * @method Phaser.Math.Matrix4#scaling
  58079. * @since 3.0.0
  58080. *
  58081. * @param {number} x - The x scaling value.
  58082. * @param {number} y - The y scaling value.
  58083. * @param {number} z - The z scaling value.
  58084. *
  58085. * @return {Phaser.Math.Matrix4} This Matrix4.
  58086. */
  58087. scaling: function (x, y, z)
  58088. {
  58089. this.zero();
  58090. var out = this.val;
  58091. out[0] = x;
  58092. out[5] = y;
  58093. out[10] = z;
  58094. out[15] = 1;
  58095. return this;
  58096. },
  58097. /**
  58098. * Reset this Matrix to an identity (default) matrix.
  58099. *
  58100. * @method Phaser.Math.Matrix4#identity
  58101. * @since 3.0.0
  58102. *
  58103. * @return {Phaser.Math.Matrix4} This Matrix4.
  58104. */
  58105. identity: function ()
  58106. {
  58107. var out = this.val;
  58108. out[0] = 1;
  58109. out[1] = 0;
  58110. out[2] = 0;
  58111. out[3] = 0;
  58112. out[4] = 0;
  58113. out[5] = 1;
  58114. out[6] = 0;
  58115. out[7] = 0;
  58116. out[8] = 0;
  58117. out[9] = 0;
  58118. out[10] = 1;
  58119. out[11] = 0;
  58120. out[12] = 0;
  58121. out[13] = 0;
  58122. out[14] = 0;
  58123. out[15] = 1;
  58124. return this;
  58125. },
  58126. /**
  58127. * Transpose this Matrix.
  58128. *
  58129. * @method Phaser.Math.Matrix4#transpose
  58130. * @since 3.0.0
  58131. *
  58132. * @return {Phaser.Math.Matrix4} This Matrix4.
  58133. */
  58134. transpose: function ()
  58135. {
  58136. var a = this.val;
  58137. var a01 = a[1];
  58138. var a02 = a[2];
  58139. var a03 = a[3];
  58140. var a12 = a[6];
  58141. var a13 = a[7];
  58142. var a23 = a[11];
  58143. a[1] = a[4];
  58144. a[2] = a[8];
  58145. a[3] = a[12];
  58146. a[4] = a01;
  58147. a[6] = a[9];
  58148. a[7] = a[13];
  58149. a[8] = a02;
  58150. a[9] = a12;
  58151. a[11] = a[14];
  58152. a[12] = a03;
  58153. a[13] = a13;
  58154. a[14] = a23;
  58155. return this;
  58156. },
  58157. /**
  58158. * Invert this Matrix.
  58159. *
  58160. * @method Phaser.Math.Matrix4#invert
  58161. * @since 3.0.0
  58162. *
  58163. * @return {Phaser.Math.Matrix4} This Matrix4.
  58164. */
  58165. invert: function ()
  58166. {
  58167. var a = this.val;
  58168. var a00 = a[0];
  58169. var a01 = a[1];
  58170. var a02 = a[2];
  58171. var a03 = a[3];
  58172. var a10 = a[4];
  58173. var a11 = a[5];
  58174. var a12 = a[6];
  58175. var a13 = a[7];
  58176. var a20 = a[8];
  58177. var a21 = a[9];
  58178. var a22 = a[10];
  58179. var a23 = a[11];
  58180. var a30 = a[12];
  58181. var a31 = a[13];
  58182. var a32 = a[14];
  58183. var a33 = a[15];
  58184. var b00 = a00 * a11 - a01 * a10;
  58185. var b01 = a00 * a12 - a02 * a10;
  58186. var b02 = a00 * a13 - a03 * a10;
  58187. var b03 = a01 * a12 - a02 * a11;
  58188. var b04 = a01 * a13 - a03 * a11;
  58189. var b05 = a02 * a13 - a03 * a12;
  58190. var b06 = a20 * a31 - a21 * a30;
  58191. var b07 = a20 * a32 - a22 * a30;
  58192. var b08 = a20 * a33 - a23 * a30;
  58193. var b09 = a21 * a32 - a22 * a31;
  58194. var b10 = a21 * a33 - a23 * a31;
  58195. var b11 = a22 * a33 - a23 * a32;
  58196. // Calculate the determinant
  58197. var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
  58198. if (!det)
  58199. {
  58200. return null;
  58201. }
  58202. det = 1 / det;
  58203. a[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
  58204. a[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
  58205. a[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
  58206. a[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;
  58207. a[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
  58208. a[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
  58209. a[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
  58210. a[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;
  58211. a[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
  58212. a[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
  58213. a[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
  58214. a[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;
  58215. a[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;
  58216. a[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;
  58217. a[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;
  58218. a[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;
  58219. return this;
  58220. },
  58221. /**
  58222. * Calculate the adjoint, or adjugate, of this Matrix.
  58223. *
  58224. * @method Phaser.Math.Matrix4#adjoint
  58225. * @since 3.0.0
  58226. *
  58227. * @return {Phaser.Math.Matrix4} This Matrix4.
  58228. */
  58229. adjoint: function ()
  58230. {
  58231. var a = this.val;
  58232. var a00 = a[0];
  58233. var a01 = a[1];
  58234. var a02 = a[2];
  58235. var a03 = a[3];
  58236. var a10 = a[4];
  58237. var a11 = a[5];
  58238. var a12 = a[6];
  58239. var a13 = a[7];
  58240. var a20 = a[8];
  58241. var a21 = a[9];
  58242. var a22 = a[10];
  58243. var a23 = a[11];
  58244. var a30 = a[12];
  58245. var a31 = a[13];
  58246. var a32 = a[14];
  58247. var a33 = a[15];
  58248. a[0] = (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22));
  58249. a[1] = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));
  58250. a[2] = (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12));
  58251. a[3] = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));
  58252. a[4] = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));
  58253. a[5] = (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22));
  58254. a[6] = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));
  58255. a[7] = (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12));
  58256. a[8] = (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21));
  58257. a[9] = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));
  58258. a[10] = (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11));
  58259. a[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));
  58260. a[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));
  58261. a[13] = (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21));
  58262. a[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));
  58263. a[15] = (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11));
  58264. return this;
  58265. },
  58266. /**
  58267. * Calculate the determinant of this Matrix.
  58268. *
  58269. * @method Phaser.Math.Matrix4#determinant
  58270. * @since 3.0.0
  58271. *
  58272. * @return {number} The determinant of this Matrix.
  58273. */
  58274. determinant: function ()
  58275. {
  58276. var a = this.val;
  58277. var a00 = a[0];
  58278. var a01 = a[1];
  58279. var a02 = a[2];
  58280. var a03 = a[3];
  58281. var a10 = a[4];
  58282. var a11 = a[5];
  58283. var a12 = a[6];
  58284. var a13 = a[7];
  58285. var a20 = a[8];
  58286. var a21 = a[9];
  58287. var a22 = a[10];
  58288. var a23 = a[11];
  58289. var a30 = a[12];
  58290. var a31 = a[13];
  58291. var a32 = a[14];
  58292. var a33 = a[15];
  58293. var b00 = a00 * a11 - a01 * a10;
  58294. var b01 = a00 * a12 - a02 * a10;
  58295. var b02 = a00 * a13 - a03 * a10;
  58296. var b03 = a01 * a12 - a02 * a11;
  58297. var b04 = a01 * a13 - a03 * a11;
  58298. var b05 = a02 * a13 - a03 * a12;
  58299. var b06 = a20 * a31 - a21 * a30;
  58300. var b07 = a20 * a32 - a22 * a30;
  58301. var b08 = a20 * a33 - a23 * a30;
  58302. var b09 = a21 * a32 - a22 * a31;
  58303. var b10 = a21 * a33 - a23 * a31;
  58304. var b11 = a22 * a33 - a23 * a32;
  58305. // Calculate the determinant
  58306. return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
  58307. },
  58308. /**
  58309. * Multiply this Matrix by the given Matrix.
  58310. *
  58311. * @method Phaser.Math.Matrix4#multiply
  58312. * @since 3.0.0
  58313. *
  58314. * @param {Phaser.Math.Matrix4} src - The Matrix to multiply this Matrix by.
  58315. *
  58316. * @return {Phaser.Math.Matrix4} This Matrix4.
  58317. */
  58318. multiply: function (src)
  58319. {
  58320. var a = this.val;
  58321. var a00 = a[0];
  58322. var a01 = a[1];
  58323. var a02 = a[2];
  58324. var a03 = a[3];
  58325. var a10 = a[4];
  58326. var a11 = a[5];
  58327. var a12 = a[6];
  58328. var a13 = a[7];
  58329. var a20 = a[8];
  58330. var a21 = a[9];
  58331. var a22 = a[10];
  58332. var a23 = a[11];
  58333. var a30 = a[12];
  58334. var a31 = a[13];
  58335. var a32 = a[14];
  58336. var a33 = a[15];
  58337. var b = src.val;
  58338. // Cache only the current line of the second matrix
  58339. var b0 = b[0];
  58340. var b1 = b[1];
  58341. var b2 = b[2];
  58342. var b3 = b[3];
  58343. a[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
  58344. a[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
  58345. a[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
  58346. a[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
  58347. b0 = b[4];
  58348. b1 = b[5];
  58349. b2 = b[6];
  58350. b3 = b[7];
  58351. a[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
  58352. a[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
  58353. a[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
  58354. a[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
  58355. b0 = b[8];
  58356. b1 = b[9];
  58357. b2 = b[10];
  58358. b3 = b[11];
  58359. a[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
  58360. a[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
  58361. a[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
  58362. a[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
  58363. b0 = b[12];
  58364. b1 = b[13];
  58365. b2 = b[14];
  58366. b3 = b[15];
  58367. a[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;
  58368. a[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;
  58369. a[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;
  58370. a[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;
  58371. return this;
  58372. },
  58373. /**
  58374. * [description]
  58375. *
  58376. * @method Phaser.Math.Matrix4#multiplyLocal
  58377. * @since 3.0.0
  58378. *
  58379. * @param {Phaser.Math.Matrix4} src - [description]
  58380. *
  58381. * @return {Phaser.Math.Matrix4} This Matrix4.
  58382. */
  58383. multiplyLocal: function (src)
  58384. {
  58385. var a = [];
  58386. var m1 = this.val;
  58387. var m2 = src.val;
  58388. a[0] = m1[0] * m2[0] + m1[1] * m2[4] + m1[2] * m2[8] + m1[3] * m2[12];
  58389. a[1] = m1[0] * m2[1] + m1[1] * m2[5] + m1[2] * m2[9] + m1[3] * m2[13];
  58390. a[2] = m1[0] * m2[2] + m1[1] * m2[6] + m1[2] * m2[10] + m1[3] * m2[14];
  58391. a[3] = m1[0] * m2[3] + m1[1] * m2[7] + m1[2] * m2[11] + m1[3] * m2[15];
  58392. a[4] = m1[4] * m2[0] + m1[5] * m2[4] + m1[6] * m2[8] + m1[7] * m2[12];
  58393. a[5] = m1[4] * m2[1] + m1[5] * m2[5] + m1[6] * m2[9] + m1[7] * m2[13];
  58394. a[6] = m1[4] * m2[2] + m1[5] * m2[6] + m1[6] * m2[10] + m1[7] * m2[14];
  58395. a[7] = m1[4] * m2[3] + m1[5] * m2[7] + m1[6] * m2[11] + m1[7] * m2[15];
  58396. a[8] = m1[8] * m2[0] + m1[9] * m2[4] + m1[10] * m2[8] + m1[11] * m2[12];
  58397. a[9] = m1[8] * m2[1] + m1[9] * m2[5] + m1[10] * m2[9] + m1[11] * m2[13];
  58398. a[10] = m1[8] * m2[2] + m1[9] * m2[6] + m1[10] * m2[10] + m1[11] * m2[14];
  58399. a[11] = m1[8] * m2[3] + m1[9] * m2[7] + m1[10] * m2[11] + m1[11] * m2[15];
  58400. a[12] = m1[12] * m2[0] + m1[13] * m2[4] + m1[14] * m2[8] + m1[15] * m2[12];
  58401. a[13] = m1[12] * m2[1] + m1[13] * m2[5] + m1[14] * m2[9] + m1[15] * m2[13];
  58402. a[14] = m1[12] * m2[2] + m1[13] * m2[6] + m1[14] * m2[10] + m1[15] * m2[14];
  58403. a[15] = m1[12] * m2[3] + m1[13] * m2[7] + m1[14] * m2[11] + m1[15] * m2[15];
  58404. return this.fromArray(a);
  58405. },
  58406. /**
  58407. * Translate this Matrix using the given Vector.
  58408. *
  58409. * @method Phaser.Math.Matrix4#translate
  58410. * @since 3.0.0
  58411. *
  58412. * @param {(Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to translate this Matrix with.
  58413. *
  58414. * @return {Phaser.Math.Matrix4} This Matrix4.
  58415. */
  58416. translate: function (v)
  58417. {
  58418. var x = v.x;
  58419. var y = v.y;
  58420. var z = v.z;
  58421. var a = this.val;
  58422. a[12] = a[0] * x + a[4] * y + a[8] * z + a[12];
  58423. a[13] = a[1] * x + a[5] * y + a[9] * z + a[13];
  58424. a[14] = a[2] * x + a[6] * y + a[10] * z + a[14];
  58425. a[15] = a[3] * x + a[7] * y + a[11] * z + a[15];
  58426. return this;
  58427. },
  58428. /**
  58429. * Apply a scale transformation to this Matrix.
  58430. *
  58431. * Uses the `x`, `y` and `z` components of the given Vector to scale the Matrix.
  58432. *
  58433. * @method Phaser.Math.Matrix4#scale
  58434. * @since 3.0.0
  58435. *
  58436. * @param {(Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to scale this Matrix with.
  58437. *
  58438. * @return {Phaser.Math.Matrix4} This Matrix4.
  58439. */
  58440. scale: function (v)
  58441. {
  58442. var x = v.x;
  58443. var y = v.y;
  58444. var z = v.z;
  58445. var a = this.val;
  58446. a[0] = a[0] * x;
  58447. a[1] = a[1] * x;
  58448. a[2] = a[2] * x;
  58449. a[3] = a[3] * x;
  58450. a[4] = a[4] * y;
  58451. a[5] = a[5] * y;
  58452. a[6] = a[6] * y;
  58453. a[7] = a[7] * y;
  58454. a[8] = a[8] * z;
  58455. a[9] = a[9] * z;
  58456. a[10] = a[10] * z;
  58457. a[11] = a[11] * z;
  58458. return this;
  58459. },
  58460. /**
  58461. * Derive a rotation matrix around the given axis.
  58462. *
  58463. * @method Phaser.Math.Matrix4#makeRotationAxis
  58464. * @since 3.0.0
  58465. *
  58466. * @param {(Phaser.Math.Vector3|Phaser.Math.Vector4)} axis - The rotation axis.
  58467. * @param {number} angle - The rotation angle in radians.
  58468. *
  58469. * @return {Phaser.Math.Matrix4} This Matrix4.
  58470. */
  58471. makeRotationAxis: function (axis, angle)
  58472. {
  58473. // Based on http://www.gamedev.net/reference/articles/article1199.asp
  58474. var c = Math.cos(angle);
  58475. var s = Math.sin(angle);
  58476. var t = 1 - c;
  58477. var x = axis.x;
  58478. var y = axis.y;
  58479. var z = axis.z;
  58480. var tx = t * x;
  58481. var ty = t * y;
  58482. this.fromArray([
  58483. tx * x + c, tx * y - s * z, tx * z + s * y, 0,
  58484. tx * y + s * z, ty * y + c, ty * z - s * x, 0,
  58485. tx * z - s * y, ty * z + s * x, t * z * z + c, 0,
  58486. 0, 0, 0, 1
  58487. ]);
  58488. return this;
  58489. },
  58490. /**
  58491. * Apply a rotation transformation to this Matrix.
  58492. *
  58493. * @method Phaser.Math.Matrix4#rotate
  58494. * @since 3.0.0
  58495. *
  58496. * @param {number} rad - The angle in radians to rotate by.
  58497. * @param {Phaser.Math.Vector3} axis - The axis to rotate upon.
  58498. *
  58499. * @return {Phaser.Math.Matrix4} This Matrix4.
  58500. */
  58501. rotate: function (rad, axis)
  58502. {
  58503. var a = this.val;
  58504. var x = axis.x;
  58505. var y = axis.y;
  58506. var z = axis.z;
  58507. var len = Math.sqrt(x * x + y * y + z * z);
  58508. if (Math.abs(len) < EPSILON)
  58509. {
  58510. return null;
  58511. }
  58512. len = 1 / len;
  58513. x *= len;
  58514. y *= len;
  58515. z *= len;
  58516. var s = Math.sin(rad);
  58517. var c = Math.cos(rad);
  58518. var t = 1 - c;
  58519. var a00 = a[0];
  58520. var a01 = a[1];
  58521. var a02 = a[2];
  58522. var a03 = a[3];
  58523. var a10 = a[4];
  58524. var a11 = a[5];
  58525. var a12 = a[6];
  58526. var a13 = a[7];
  58527. var a20 = a[8];
  58528. var a21 = a[9];
  58529. var a22 = a[10];
  58530. var a23 = a[11];
  58531. // Construct the elements of the rotation matrix
  58532. var b00 = x * x * t + c;
  58533. var b01 = y * x * t + z * s;
  58534. var b02 = z * x * t - y * s;
  58535. var b10 = x * y * t - z * s;
  58536. var b11 = y * y * t + c;
  58537. var b12 = z * y * t + x * s;
  58538. var b20 = x * z * t + y * s;
  58539. var b21 = y * z * t - x * s;
  58540. var b22 = z * z * t + c;
  58541. // Perform rotation-specific matrix multiplication
  58542. a[0] = a00 * b00 + a10 * b01 + a20 * b02;
  58543. a[1] = a01 * b00 + a11 * b01 + a21 * b02;
  58544. a[2] = a02 * b00 + a12 * b01 + a22 * b02;
  58545. a[3] = a03 * b00 + a13 * b01 + a23 * b02;
  58546. a[4] = a00 * b10 + a10 * b11 + a20 * b12;
  58547. a[5] = a01 * b10 + a11 * b11 + a21 * b12;
  58548. a[6] = a02 * b10 + a12 * b11 + a22 * b12;
  58549. a[7] = a03 * b10 + a13 * b11 + a23 * b12;
  58550. a[8] = a00 * b20 + a10 * b21 + a20 * b22;
  58551. a[9] = a01 * b20 + a11 * b21 + a21 * b22;
  58552. a[10] = a02 * b20 + a12 * b21 + a22 * b22;
  58553. a[11] = a03 * b20 + a13 * b21 + a23 * b22;
  58554. return this;
  58555. },
  58556. /**
  58557. * Rotate this matrix on its X axis.
  58558. *
  58559. * @method Phaser.Math.Matrix4#rotateX
  58560. * @since 3.0.0
  58561. *
  58562. * @param {number} rad - The angle in radians to rotate by.
  58563. *
  58564. * @return {Phaser.Math.Matrix4} This Matrix4.
  58565. */
  58566. rotateX: function (rad)
  58567. {
  58568. var a = this.val;
  58569. var s = Math.sin(rad);
  58570. var c = Math.cos(rad);
  58571. var a10 = a[4];
  58572. var a11 = a[5];
  58573. var a12 = a[6];
  58574. var a13 = a[7];
  58575. var a20 = a[8];
  58576. var a21 = a[9];
  58577. var a22 = a[10];
  58578. var a23 = a[11];
  58579. // Perform axis-specific matrix multiplication
  58580. a[4] = a10 * c + a20 * s;
  58581. a[5] = a11 * c + a21 * s;
  58582. a[6] = a12 * c + a22 * s;
  58583. a[7] = a13 * c + a23 * s;
  58584. a[8] = a20 * c - a10 * s;
  58585. a[9] = a21 * c - a11 * s;
  58586. a[10] = a22 * c - a12 * s;
  58587. a[11] = a23 * c - a13 * s;
  58588. return this;
  58589. },
  58590. /**
  58591. * Rotate this matrix on its Y axis.
  58592. *
  58593. * @method Phaser.Math.Matrix4#rotateY
  58594. * @since 3.0.0
  58595. *
  58596. * @param {number} rad - The angle to rotate by, in radians.
  58597. *
  58598. * @return {Phaser.Math.Matrix4} This Matrix4.
  58599. */
  58600. rotateY: function (rad)
  58601. {
  58602. var a = this.val;
  58603. var s = Math.sin(rad);
  58604. var c = Math.cos(rad);
  58605. var a00 = a[0];
  58606. var a01 = a[1];
  58607. var a02 = a[2];
  58608. var a03 = a[3];
  58609. var a20 = a[8];
  58610. var a21 = a[9];
  58611. var a22 = a[10];
  58612. var a23 = a[11];
  58613. // Perform axis-specific matrix multiplication
  58614. a[0] = a00 * c - a20 * s;
  58615. a[1] = a01 * c - a21 * s;
  58616. a[2] = a02 * c - a22 * s;
  58617. a[3] = a03 * c - a23 * s;
  58618. a[8] = a00 * s + a20 * c;
  58619. a[9] = a01 * s + a21 * c;
  58620. a[10] = a02 * s + a22 * c;
  58621. a[11] = a03 * s + a23 * c;
  58622. return this;
  58623. },
  58624. /**
  58625. * Rotate this matrix on its Z axis.
  58626. *
  58627. * @method Phaser.Math.Matrix4#rotateZ
  58628. * @since 3.0.0
  58629. *
  58630. * @param {number} rad - The angle to rotate by, in radians.
  58631. *
  58632. * @return {Phaser.Math.Matrix4} This Matrix4.
  58633. */
  58634. rotateZ: function (rad)
  58635. {
  58636. var a = this.val;
  58637. var s = Math.sin(rad);
  58638. var c = Math.cos(rad);
  58639. var a00 = a[0];
  58640. var a01 = a[1];
  58641. var a02 = a[2];
  58642. var a03 = a[3];
  58643. var a10 = a[4];
  58644. var a11 = a[5];
  58645. var a12 = a[6];
  58646. var a13 = a[7];
  58647. // Perform axis-specific matrix multiplication
  58648. a[0] = a00 * c + a10 * s;
  58649. a[1] = a01 * c + a11 * s;
  58650. a[2] = a02 * c + a12 * s;
  58651. a[3] = a03 * c + a13 * s;
  58652. a[4] = a10 * c - a00 * s;
  58653. a[5] = a11 * c - a01 * s;
  58654. a[6] = a12 * c - a02 * s;
  58655. a[7] = a13 * c - a03 * s;
  58656. return this;
  58657. },
  58658. /**
  58659. * Set the values of this Matrix from the given rotation Quaternion and translation Vector.
  58660. *
  58661. * @method Phaser.Math.Matrix4#fromRotationTranslation
  58662. * @since 3.0.0
  58663. *
  58664. * @param {Phaser.Math.Quaternion} q - The Quaternion to set rotation from.
  58665. * @param {Phaser.Math.Vector3} v - The Vector to set translation from.
  58666. *
  58667. * @return {Phaser.Math.Matrix4} This Matrix4.
  58668. */
  58669. fromRotationTranslation: function (q, v)
  58670. {
  58671. // Quaternion math
  58672. var out = this.val;
  58673. var x = q.x;
  58674. var y = q.y;
  58675. var z = q.z;
  58676. var w = q.w;
  58677. var x2 = x + x;
  58678. var y2 = y + y;
  58679. var z2 = z + z;
  58680. var xx = x * x2;
  58681. var xy = x * y2;
  58682. var xz = x * z2;
  58683. var yy = y * y2;
  58684. var yz = y * z2;
  58685. var zz = z * z2;
  58686. var wx = w * x2;
  58687. var wy = w * y2;
  58688. var wz = w * z2;
  58689. out[0] = 1 - (yy + zz);
  58690. out[1] = xy + wz;
  58691. out[2] = xz - wy;
  58692. out[3] = 0;
  58693. out[4] = xy - wz;
  58694. out[5] = 1 - (xx + zz);
  58695. out[6] = yz + wx;
  58696. out[7] = 0;
  58697. out[8] = xz + wy;
  58698. out[9] = yz - wx;
  58699. out[10] = 1 - (xx + yy);
  58700. out[11] = 0;
  58701. out[12] = v.x;
  58702. out[13] = v.y;
  58703. out[14] = v.z;
  58704. out[15] = 1;
  58705. return this;
  58706. },
  58707. /**
  58708. * Set the values of this Matrix from the given Quaternion.
  58709. *
  58710. * @method Phaser.Math.Matrix4#fromQuat
  58711. * @since 3.0.0
  58712. *
  58713. * @param {Phaser.Math.Quaternion} q - The Quaternion to set the values of this Matrix from.
  58714. *
  58715. * @return {Phaser.Math.Matrix4} This Matrix4.
  58716. */
  58717. fromQuat: function (q)
  58718. {
  58719. var out = this.val;
  58720. var x = q.x;
  58721. var y = q.y;
  58722. var z = q.z;
  58723. var w = q.w;
  58724. var x2 = x + x;
  58725. var y2 = y + y;
  58726. var z2 = z + z;
  58727. var xx = x * x2;
  58728. var xy = x * y2;
  58729. var xz = x * z2;
  58730. var yy = y * y2;
  58731. var yz = y * z2;
  58732. var zz = z * z2;
  58733. var wx = w * x2;
  58734. var wy = w * y2;
  58735. var wz = w * z2;
  58736. out[0] = 1 - (yy + zz);
  58737. out[1] = xy + wz;
  58738. out[2] = xz - wy;
  58739. out[3] = 0;
  58740. out[4] = xy - wz;
  58741. out[5] = 1 - (xx + zz);
  58742. out[6] = yz + wx;
  58743. out[7] = 0;
  58744. out[8] = xz + wy;
  58745. out[9] = yz - wx;
  58746. out[10] = 1 - (xx + yy);
  58747. out[11] = 0;
  58748. out[12] = 0;
  58749. out[13] = 0;
  58750. out[14] = 0;
  58751. out[15] = 1;
  58752. return this;
  58753. },
  58754. /**
  58755. * Generate a frustum matrix with the given bounds.
  58756. *
  58757. * @method Phaser.Math.Matrix4#frustum
  58758. * @since 3.0.0
  58759. *
  58760. * @param {number} left - The left bound of the frustum.
  58761. * @param {number} right - The right bound of the frustum.
  58762. * @param {number} bottom - The bottom bound of the frustum.
  58763. * @param {number} top - The top bound of the frustum.
  58764. * @param {number} near - The near bound of the frustum.
  58765. * @param {number} far - The far bound of the frustum.
  58766. *
  58767. * @return {Phaser.Math.Matrix4} This Matrix4.
  58768. */
  58769. frustum: function (left, right, bottom, top, near, far)
  58770. {
  58771. var out = this.val;
  58772. var rl = 1 / (right - left);
  58773. var tb = 1 / (top - bottom);
  58774. var nf = 1 / (near - far);
  58775. out[0] = (near * 2) * rl;
  58776. out[1] = 0;
  58777. out[2] = 0;
  58778. out[3] = 0;
  58779. out[4] = 0;
  58780. out[5] = (near * 2) * tb;
  58781. out[6] = 0;
  58782. out[7] = 0;
  58783. out[8] = (right + left) * rl;
  58784. out[9] = (top + bottom) * tb;
  58785. out[10] = (far + near) * nf;
  58786. out[11] = -1;
  58787. out[12] = 0;
  58788. out[13] = 0;
  58789. out[14] = (far * near * 2) * nf;
  58790. out[15] = 0;
  58791. return this;
  58792. },
  58793. /**
  58794. * Generate a perspective projection matrix with the given bounds.
  58795. *
  58796. * @method Phaser.Math.Matrix4#perspective
  58797. * @since 3.0.0
  58798. *
  58799. * @param {number} fovy - Vertical field of view in radians
  58800. * @param {number} aspect - Aspect ratio. Typically viewport width /height.
  58801. * @param {number} near - Near bound of the frustum.
  58802. * @param {number} far - Far bound of the frustum.
  58803. *
  58804. * @return {Phaser.Math.Matrix4} This Matrix4.
  58805. */
  58806. perspective: function (fovy, aspect, near, far)
  58807. {
  58808. var out = this.val;
  58809. var f = 1.0 / Math.tan(fovy / 2);
  58810. var nf = 1 / (near - far);
  58811. out[0] = f / aspect;
  58812. out[1] = 0;
  58813. out[2] = 0;
  58814. out[3] = 0;
  58815. out[4] = 0;
  58816. out[5] = f;
  58817. out[6] = 0;
  58818. out[7] = 0;
  58819. out[8] = 0;
  58820. out[9] = 0;
  58821. out[10] = (far + near) * nf;
  58822. out[11] = -1;
  58823. out[12] = 0;
  58824. out[13] = 0;
  58825. out[14] = (2 * far * near) * nf;
  58826. out[15] = 0;
  58827. return this;
  58828. },
  58829. /**
  58830. * Generate a perspective projection matrix with the given bounds.
  58831. *
  58832. * @method Phaser.Math.Matrix4#perspectiveLH
  58833. * @since 3.0.0
  58834. *
  58835. * @param {number} width - The width of the frustum.
  58836. * @param {number} height - The height of the frustum.
  58837. * @param {number} near - Near bound of the frustum.
  58838. * @param {number} far - Far bound of the frustum.
  58839. *
  58840. * @return {Phaser.Math.Matrix4} This Matrix4.
  58841. */
  58842. perspectiveLH: function (width, height, near, far)
  58843. {
  58844. var out = this.val;
  58845. out[0] = (2 * near) / width;
  58846. out[1] = 0;
  58847. out[2] = 0;
  58848. out[3] = 0;
  58849. out[4] = 0;
  58850. out[5] = (2 * near) / height;
  58851. out[6] = 0;
  58852. out[7] = 0;
  58853. out[8] = 0;
  58854. out[9] = 0;
  58855. out[10] = -far / (near - far);
  58856. out[11] = 1;
  58857. out[12] = 0;
  58858. out[13] = 0;
  58859. out[14] = (near * far) / (near - far);
  58860. out[15] = 0;
  58861. return this;
  58862. },
  58863. /**
  58864. * Generate an orthogonal projection matrix with the given bounds.
  58865. *
  58866. * @method Phaser.Math.Matrix4#ortho
  58867. * @since 3.0.0
  58868. *
  58869. * @param {number} left - The left bound of the frustum.
  58870. * @param {number} right - The right bound of the frustum.
  58871. * @param {number} bottom - The bottom bound of the frustum.
  58872. * @param {number} top - The top bound of the frustum.
  58873. * @param {number} near - The near bound of the frustum.
  58874. * @param {number} far - The far bound of the frustum.
  58875. *
  58876. * @return {Phaser.Math.Matrix4} This Matrix4.
  58877. */
  58878. ortho: function (left, right, bottom, top, near, far)
  58879. {
  58880. var out = this.val;
  58881. var lr = left - right;
  58882. var bt = bottom - top;
  58883. var nf = near - far;
  58884. // Avoid division by zero
  58885. lr = (lr === 0) ? lr : 1 / lr;
  58886. bt = (bt === 0) ? bt : 1 / bt;
  58887. nf = (nf === 0) ? nf : 1 / nf;
  58888. out[0] = -2 * lr;
  58889. out[1] = 0;
  58890. out[2] = 0;
  58891. out[3] = 0;
  58892. out[4] = 0;
  58893. out[5] = -2 * bt;
  58894. out[6] = 0;
  58895. out[7] = 0;
  58896. out[8] = 0;
  58897. out[9] = 0;
  58898. out[10] = 2 * nf;
  58899. out[11] = 0;
  58900. out[12] = (left + right) * lr;
  58901. out[13] = (top + bottom) * bt;
  58902. out[14] = (far + near) * nf;
  58903. out[15] = 1;
  58904. return this;
  58905. },
  58906. /**
  58907. * Generate a look-at matrix with the given eye position, focal point, and up axis.
  58908. *
  58909. * @method Phaser.Math.Matrix4#lookAt
  58910. * @since 3.0.0
  58911. *
  58912. * @param {Phaser.Math.Vector3} eye - Position of the viewer
  58913. * @param {Phaser.Math.Vector3} center - Point the viewer is looking at
  58914. * @param {Phaser.Math.Vector3} up - vec3 pointing up.
  58915. *
  58916. * @return {Phaser.Math.Matrix4} This Matrix4.
  58917. */
  58918. lookAt: function (eye, center, up)
  58919. {
  58920. var out = this.val;
  58921. var eyex = eye.x;
  58922. var eyey = eye.y;
  58923. var eyez = eye.z;
  58924. var upx = up.x;
  58925. var upy = up.y;
  58926. var upz = up.z;
  58927. var centerx = center.x;
  58928. var centery = center.y;
  58929. var centerz = center.z;
  58930. if (Math.abs(eyex - centerx) < EPSILON &&
  58931. Math.abs(eyey - centery) < EPSILON &&
  58932. Math.abs(eyez - centerz) < EPSILON)
  58933. {
  58934. return this.identity();
  58935. }
  58936. var z0 = eyex - centerx;
  58937. var z1 = eyey - centery;
  58938. var z2 = eyez - centerz;
  58939. var len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);
  58940. z0 *= len;
  58941. z1 *= len;
  58942. z2 *= len;
  58943. var x0 = upy * z2 - upz * z1;
  58944. var x1 = upz * z0 - upx * z2;
  58945. var x2 = upx * z1 - upy * z0;
  58946. len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);
  58947. if (!len)
  58948. {
  58949. x0 = 0;
  58950. x1 = 0;
  58951. x2 = 0;
  58952. }
  58953. else
  58954. {
  58955. len = 1 / len;
  58956. x0 *= len;
  58957. x1 *= len;
  58958. x2 *= len;
  58959. }
  58960. var y0 = z1 * x2 - z2 * x1;
  58961. var y1 = z2 * x0 - z0 * x2;
  58962. var y2 = z0 * x1 - z1 * x0;
  58963. len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);
  58964. if (!len)
  58965. {
  58966. y0 = 0;
  58967. y1 = 0;
  58968. y2 = 0;
  58969. }
  58970. else
  58971. {
  58972. len = 1 / len;
  58973. y0 *= len;
  58974. y1 *= len;
  58975. y2 *= len;
  58976. }
  58977. out[0] = x0;
  58978. out[1] = y0;
  58979. out[2] = z0;
  58980. out[3] = 0;
  58981. out[4] = x1;
  58982. out[5] = y1;
  58983. out[6] = z1;
  58984. out[7] = 0;
  58985. out[8] = x2;
  58986. out[9] = y2;
  58987. out[10] = z2;
  58988. out[11] = 0;
  58989. out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);
  58990. out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);
  58991. out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);
  58992. out[15] = 1;
  58993. return this;
  58994. },
  58995. /**
  58996. * Set the values of this matrix from the given `yaw`, `pitch` and `roll` values.
  58997. *
  58998. * @method Phaser.Math.Matrix4#yawPitchRoll
  58999. * @since 3.0.0
  59000. *
  59001. * @param {number} yaw - [description]
  59002. * @param {number} pitch - [description]
  59003. * @param {number} roll - [description]
  59004. *
  59005. * @return {Phaser.Math.Matrix4} This Matrix4.
  59006. */
  59007. yawPitchRoll: function (yaw, pitch, roll)
  59008. {
  59009. this.zero();
  59010. _tempMat1.zero();
  59011. _tempMat2.zero();
  59012. var m0 = this.val;
  59013. var m1 = _tempMat1.val;
  59014. var m2 = _tempMat2.val;
  59015. // Rotate Z
  59016. var s = Math.sin(roll);
  59017. var c = Math.cos(roll);
  59018. m0[10] = 1;
  59019. m0[15] = 1;
  59020. m0[0] = c;
  59021. m0[1] = s;
  59022. m0[4] = -s;
  59023. m0[5] = c;
  59024. // Rotate X
  59025. s = Math.sin(pitch);
  59026. c = Math.cos(pitch);
  59027. m1[0] = 1;
  59028. m1[15] = 1;
  59029. m1[5] = c;
  59030. m1[10] = c;
  59031. m1[9] = -s;
  59032. m1[6] = s;
  59033. // Rotate Y
  59034. s = Math.sin(yaw);
  59035. c = Math.cos(yaw);
  59036. m2[5] = 1;
  59037. m2[15] = 1;
  59038. m2[0] = c;
  59039. m2[2] = -s;
  59040. m2[8] = s;
  59041. m2[10] = c;
  59042. this.multiplyLocal(_tempMat1);
  59043. this.multiplyLocal(_tempMat2);
  59044. return this;
  59045. },
  59046. /**
  59047. * Generate a world matrix from the given rotation, position, scale, view matrix and projection matrix.
  59048. *
  59049. * @method Phaser.Math.Matrix4#setWorldMatrix
  59050. * @since 3.0.0
  59051. *
  59052. * @param {Phaser.Math.Vector3} rotation - The rotation of the world matrix.
  59053. * @param {Phaser.Math.Vector3} position - The position of the world matrix.
  59054. * @param {Phaser.Math.Vector3} scale - The scale of the world matrix.
  59055. * @param {Phaser.Math.Matrix4} [viewMatrix] - The view matrix.
  59056. * @param {Phaser.Math.Matrix4} [projectionMatrix] - The projection matrix.
  59057. *
  59058. * @return {Phaser.Math.Matrix4} This Matrix4.
  59059. */
  59060. setWorldMatrix: function (rotation, position, scale, viewMatrix, projectionMatrix)
  59061. {
  59062. this.yawPitchRoll(rotation.y, rotation.x, rotation.z);
  59063. _tempMat1.scaling(scale.x, scale.y, scale.z);
  59064. _tempMat2.xyz(position.x, position.y, position.z);
  59065. this.multiplyLocal(_tempMat1);
  59066. this.multiplyLocal(_tempMat2);
  59067. if (viewMatrix !== undefined)
  59068. {
  59069. this.multiplyLocal(viewMatrix);
  59070. }
  59071. if (projectionMatrix !== undefined)
  59072. {
  59073. this.multiplyLocal(projectionMatrix);
  59074. }
  59075. return this;
  59076. }
  59077. });
  59078. var _tempMat1 = new Matrix4();
  59079. var _tempMat2 = new Matrix4();
  59080. module.exports = Matrix4;
  59081. /***/ }),
  59082. /* 273 */
  59083. /***/ (function(module, exports, __webpack_require__) {
  59084. /**
  59085. * @author Richard Davey <rich@photonstorm.com>
  59086. * @copyright 2018 Photon Storm Ltd.
  59087. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  59088. */
  59089. var Class = __webpack_require__(0);
  59090. var Matrix4 = __webpack_require__(272);
  59091. var RandomXYZ = __webpack_require__(531);
  59092. var RandomXYZW = __webpack_require__(530);
  59093. var RotateVec3 = __webpack_require__(529);
  59094. var Set = __webpack_require__(69);
  59095. var Sprite3D = __webpack_require__(154);
  59096. var Vector2 = __webpack_require__(6);
  59097. var Vector3 = __webpack_require__(87);
  59098. var Vector4 = __webpack_require__(271);
  59099. // Local cache vars
  59100. var tmpVec3 = new Vector3();
  59101. var tmpVec4 = new Vector4();
  59102. var dirvec = new Vector3();
  59103. var rightvec = new Vector3();
  59104. var billboardMatrix = new Matrix4();
  59105. // @author attribute https://github.com/mattdesl/cam3d/wiki
  59106. /**
  59107. * @typedef {object} RayDef
  59108. *
  59109. * @property {Phaser.Math.Vector3} origin - [description]
  59110. * @property {Phaser.Math.Vector3} direction - [description]
  59111. */
  59112. /**
  59113. * @classdesc
  59114. * [description]
  59115. *
  59116. * @class Camera
  59117. * @memberOf Phaser.Cameras.Sprite3D
  59118. * @constructor
  59119. * @since 3.0.0
  59120. *
  59121. * @param {Phaser.Scene} scene - [description]
  59122. */
  59123. var Camera = new Class({
  59124. initialize:
  59125. function Camera (scene)
  59126. {
  59127. /**
  59128. * [description]
  59129. *
  59130. * @name Phaser.Cameras.Sprite3D#scene
  59131. * @type {Phaser.Scene}
  59132. * @since 3.0.0
  59133. */
  59134. this.scene = scene;
  59135. /**
  59136. * [description]
  59137. *
  59138. * @name Phaser.Cameras.Sprite3D#displayList
  59139. * @type {Phaser.GameObjects.DisplayList}
  59140. * @since 3.0.0
  59141. */
  59142. this.displayList = scene.sys.displayList;
  59143. /**
  59144. * [description]
  59145. *
  59146. * @name Phaser.Cameras.Sprite3D#updateList
  59147. * @type {Phaser.GameObjects.UpdateList}
  59148. * @since 3.0.0
  59149. */
  59150. this.updateList = scene.sys.updateList;
  59151. /**
  59152. * [description]
  59153. *
  59154. * @name Phaser.Cameras.Sprite3D#name
  59155. * @type {string}
  59156. * @default ''
  59157. * @since 3.0.0
  59158. */
  59159. this.name = '';
  59160. /**
  59161. * [description]
  59162. *
  59163. * @name Phaser.Cameras.Sprite3D#direction
  59164. * @type {Phaser.Math.Vector3}
  59165. * @since 3.0.0
  59166. */
  59167. this.direction = new Vector3(0, 0, -1);
  59168. /**
  59169. * [description]
  59170. *
  59171. * @name Phaser.Cameras.Sprite3D#up
  59172. * @type {Phaser.Math.Vector3}
  59173. * @since 3.0.0
  59174. */
  59175. this.up = new Vector3(0, 1, 0);
  59176. /**
  59177. * [description]
  59178. *
  59179. * @name Phaser.Cameras.Sprite3D#position
  59180. * @type {Phaser.Math.Vector3}
  59181. * @since 3.0.0
  59182. */
  59183. this.position = new Vector3();
  59184. // The mapping from 3D size units to pixels.
  59185. // In the default case 1 3D unit = 128 pixels. So a sprite that is
  59186. // 256 x 128 px in size will be 2 x 1 units.
  59187. // Change to whatever best fits your game assets.
  59188. /**
  59189. * [description]
  59190. *
  59191. * @name Phaser.Cameras.Sprite3D#pixelScale
  59192. * @type {number}
  59193. * @since 3.0.0
  59194. */
  59195. this.pixelScale = 128;
  59196. /**
  59197. * [description]
  59198. *
  59199. * @name Phaser.Cameras.Sprite3D#projection
  59200. * @type {Phaser.Math.Matrix4}
  59201. * @since 3.0.0
  59202. */
  59203. this.projection = new Matrix4();
  59204. /**
  59205. * [description]
  59206. *
  59207. * @name Phaser.Cameras.Sprite3D#view
  59208. * @type {Phaser.Math.Matrix4}
  59209. * @since 3.0.0
  59210. */
  59211. this.view = new Matrix4();
  59212. /**
  59213. * [description]
  59214. *
  59215. * @name Phaser.Cameras.Sprite3D#combined
  59216. * @type {Phaser.Math.Matrix4}
  59217. * @since 3.0.0
  59218. */
  59219. this.combined = new Matrix4();
  59220. /**
  59221. * [description]
  59222. *
  59223. * @name Phaser.Cameras.Sprite3D#invProjectionView
  59224. * @type {Phaser.Math.Matrix4}
  59225. * @since 3.0.0
  59226. */
  59227. this.invProjectionView = new Matrix4();
  59228. /**
  59229. * [description]
  59230. *
  59231. * @name Phaser.Cameras.Sprite3D#near
  59232. * @type {number}
  59233. * @default 1
  59234. * @since 3.0.0
  59235. */
  59236. this.near = 1;
  59237. /**
  59238. * [description]
  59239. *
  59240. * @name Phaser.Cameras.Sprite3D#far
  59241. * @type {number}
  59242. * @since 3.0.0
  59243. */
  59244. this.far = 100;
  59245. /**
  59246. * [description]
  59247. *
  59248. * @name Phaser.Cameras.Sprite3D#ray
  59249. * @type {RayDef}
  59250. * @since 3.0.0
  59251. */
  59252. this.ray = {
  59253. origin: new Vector3(),
  59254. direction: new Vector3()
  59255. };
  59256. /**
  59257. * [description]
  59258. *
  59259. * @name Phaser.Cameras.Sprite3D#viewportWidth
  59260. * @type {number}
  59261. * @default 0
  59262. * @since 3.0.0
  59263. */
  59264. this.viewportWidth = 0;
  59265. /**
  59266. * [description]
  59267. *
  59268. * @name Phaser.Cameras.Sprite3D#viewportHeight
  59269. * @type {number}
  59270. * @default 0
  59271. * @since 3.0.0
  59272. */
  59273. this.viewportHeight = 0;
  59274. /**
  59275. * [description]
  59276. *
  59277. * @name Phaser.Cameras.Sprite3D#billboardMatrixDirty
  59278. * @type {boolean}
  59279. * @default true
  59280. * @since 3.0.0
  59281. */
  59282. this.billboardMatrixDirty = true;
  59283. /**
  59284. * [description]
  59285. *
  59286. * @name Phaser.Cameras.Sprite3D#children
  59287. * @type {Phaser.Structs.Set.<Phaser.GameObjects.GameObject>}
  59288. * @since 3.0.0
  59289. */
  59290. this.children = new Set();
  59291. },
  59292. /**
  59293. * [description]
  59294. *
  59295. * @method Phaser.Cameras.Sprite3D.Camera#setPosition
  59296. * @since 3.0.0
  59297. *
  59298. * @param {number} x - [description]
  59299. * @param {number} y - [description]
  59300. * @param {number} z - [description]
  59301. *
  59302. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59303. */
  59304. setPosition: function (x, y, z)
  59305. {
  59306. this.position.set(x, y, z);
  59307. return this.update();
  59308. },
  59309. /**
  59310. * [description]
  59311. *
  59312. * @method Phaser.Cameras.Sprite3D.Camera#setScene
  59313. * @since 3.0.0
  59314. *
  59315. * @param {Phaser.Scene} scene - [description]
  59316. *
  59317. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59318. */
  59319. setScene: function (scene)
  59320. {
  59321. this.scene = scene;
  59322. return this;
  59323. },
  59324. /**
  59325. * [description]
  59326. *
  59327. * @method Phaser.Cameras.Sprite3D.Camera#setPixelScale
  59328. * @since 3.0.0
  59329. *
  59330. * @param {number} value - [description]
  59331. *
  59332. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59333. */
  59334. setPixelScale: function (value)
  59335. {
  59336. this.pixelScale = value;
  59337. return this.update();
  59338. },
  59339. /**
  59340. * [description]
  59341. *
  59342. * @method Phaser.Cameras.Sprite3D.Camera#add
  59343. * @since 3.0.0
  59344. *
  59345. * @param {Phaser.GameObjects.Sprite3D} sprite3D - [description]
  59346. *
  59347. * @return {Phaser.GameObjects.Sprite3D} [description]
  59348. */
  59349. add: function (sprite3D)
  59350. {
  59351. this.children.set(sprite3D);
  59352. this.updateChildren();
  59353. return sprite3D;
  59354. },
  59355. /**
  59356. * [description]
  59357. *
  59358. * @method Phaser.Cameras.Sprite3D.Camera#remove
  59359. * @since 3.0.0
  59360. *
  59361. * @param {Phaser.GameObjects.GameObject} child - [description]
  59362. *
  59363. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59364. */
  59365. remove: function (child)
  59366. {
  59367. this.displayList.remove(child.gameObject);
  59368. this.updateList.remove(child.gameObject);
  59369. this.children.delete(child);
  59370. return this;
  59371. },
  59372. /**
  59373. * [description]
  59374. *
  59375. * @method Phaser.Cameras.Sprite3D.Camera#clear
  59376. * @since 3.0.0
  59377. *
  59378. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59379. */
  59380. clear: function ()
  59381. {
  59382. var children = this.getChildren();
  59383. for (var i = 0; i < children.length; i++)
  59384. {
  59385. this.remove(children[i]);
  59386. }
  59387. return this;
  59388. },
  59389. /**
  59390. * [description]
  59391. *
  59392. * @method Phaser.Cameras.Sprite3D.Camera#getChildren
  59393. * @since 3.0.0
  59394. *
  59395. * @return {array} [description]
  59396. */
  59397. getChildren: function ()
  59398. {
  59399. return this.children.entries;
  59400. },
  59401. /**
  59402. * [description]
  59403. *
  59404. * @method Phaser.Cameras.Sprite3D.Camera#create
  59405. * @since 3.0.0
  59406. *
  59407. * @param {number} x - [description]
  59408. * @param {number} y - [description]
  59409. * @param {number} z - [description]
  59410. * @param {string} key - [description]
  59411. * @param {(string|number)} frame - [description]
  59412. * @param {boolean} [visible=true] - [description]
  59413. *
  59414. * @return {Phaser.GameObjects.Sprite3D} [description]
  59415. */
  59416. create: function (x, y, z, key, frame, visible)
  59417. {
  59418. if (visible === undefined) { visible = true; }
  59419. var child = new Sprite3D(this.scene, x, y, z, key, frame);
  59420. this.displayList.add(child.gameObject);
  59421. this.updateList.add(child.gameObject);
  59422. child.visible = visible;
  59423. this.children.set(child);
  59424. this.updateChildren();
  59425. return child;
  59426. },
  59427. /**
  59428. * [description]
  59429. *
  59430. * @method Phaser.Cameras.Sprite3D.Camera#createMultiple
  59431. * @since 3.0.0
  59432. *
  59433. * @param {number} quantity - [description]
  59434. * @param {string} key - [description]
  59435. * @param {(string|number)} frame - [description]
  59436. * @param {boolean} [visible=true] - [description]
  59437. *
  59438. * @return {Phaser.GameObjects.Sprite3D[]} [description]
  59439. */
  59440. createMultiple: function (quantity, key, frame, visible)
  59441. {
  59442. if (visible === undefined) { visible = true; }
  59443. var output = [];
  59444. for (var i = 0; i < quantity; i++)
  59445. {
  59446. var child = new Sprite3D(this.scene, 0, 0, 0, key, frame);
  59447. this.displayList.add(child.gameObject);
  59448. this.updateList.add(child.gameObject);
  59449. child.visible = visible;
  59450. this.children.set(child);
  59451. output.push(child);
  59452. }
  59453. return output;
  59454. },
  59455. // Create a bunch of Sprite3D objects in a rectangle
  59456. // size and spacing are Vec3s (or if integers are converted to vec3s)
  59457. /**
  59458. * [description]
  59459. *
  59460. * @method Phaser.Cameras.Sprite3D.Camera#createRect
  59461. * @since 3.0.0
  59462. *
  59463. * @param {(number|{x:number,y:number})} size - [description]
  59464. * @param {(number|{x:number,y:number,z:number})} spacing - [description]
  59465. * @param {string} key - [description]
  59466. * @param {(string|number)} [frame] - [description]
  59467. *
  59468. * @return {Phaser.GameObjects.Sprite3D[]} [description]
  59469. */
  59470. createRect: function (size, spacing, key, frame)
  59471. {
  59472. if (typeof size === 'number') { size = { x: size, y: size, z: size }; }
  59473. if (typeof spacing === 'number') { spacing = { x: spacing, y: spacing, z: spacing }; }
  59474. var quantity = size.x * size.y * size.z;
  59475. var sprites = this.createMultiple(quantity, key, frame);
  59476. var i = 0;
  59477. for (var z = 0.5 - (size.z / 2); z < (size.z / 2); z++)
  59478. {
  59479. for (var y = 0.5 - (size.y / 2); y < (size.y / 2); y++)
  59480. {
  59481. for (var x = 0.5 - (size.x / 2); x < (size.x / 2); x++)
  59482. {
  59483. var bx = (x * spacing.x);
  59484. var by = (y * spacing.y);
  59485. var bz = (z * spacing.z);
  59486. sprites[i].position.set(bx, by, bz);
  59487. i++;
  59488. }
  59489. }
  59490. }
  59491. this.update();
  59492. return sprites;
  59493. },
  59494. /**
  59495. * [description]
  59496. *
  59497. * @method Phaser.Cameras.Sprite3D.Camera#randomSphere
  59498. * @since 3.0.0
  59499. *
  59500. * @param {number} [radius=1] - [description]
  59501. * @param {Phaser.GameObjects.Sprite3D[]} [sprites] - [description]
  59502. *
  59503. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59504. */
  59505. randomSphere: function (radius, sprites)
  59506. {
  59507. if (sprites === undefined) { sprites = this.getChildren(); }
  59508. for (var i = 0; i < sprites.length; i++)
  59509. {
  59510. RandomXYZ(sprites[i].position, radius);
  59511. }
  59512. return this.update();
  59513. },
  59514. /**
  59515. * [description]
  59516. *
  59517. * @method Phaser.Cameras.Sprite3D.Camera#randomCube
  59518. * @since 3.0.0
  59519. *
  59520. * @param {number} [scale=1] - [description]
  59521. * @param {Phaser.GameObjects.Sprite3D[]} [sprites] - [description]
  59522. *
  59523. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59524. */
  59525. randomCube: function (scale, sprites)
  59526. {
  59527. if (sprites === undefined) { sprites = this.getChildren(); }
  59528. for (var i = 0; i < sprites.length; i++)
  59529. {
  59530. RandomXYZW(sprites[i].position, scale);
  59531. }
  59532. return this.update();
  59533. },
  59534. /**
  59535. * [description]
  59536. *
  59537. * @method Phaser.Cameras.Sprite3D.Camera#translateChildren
  59538. * @since 3.0.0
  59539. *
  59540. * @param {Phaser.Math.Vector3} vec3 - [description]
  59541. * @param {Phaser.GameObjects.Sprite3D[]} sprites - [description]
  59542. *
  59543. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59544. */
  59545. translateChildren: function (vec3, sprites)
  59546. {
  59547. if (sprites === undefined) { sprites = this.getChildren(); }
  59548. for (var i = 0; i < sprites.length; i++)
  59549. {
  59550. sprites[i].position.add(vec3);
  59551. }
  59552. return this.update();
  59553. },
  59554. /**
  59555. * [description]
  59556. *
  59557. * @method Phaser.Cameras.Sprite3D.Camera#transformChildren
  59558. * @since 3.0.0
  59559. *
  59560. * @param {Phaser.Math.Matrix4} mat4 - [description]
  59561. * @param {Phaser.GameObjects.Sprite3D[]} sprites - [description]
  59562. *
  59563. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59564. */
  59565. transformChildren: function (mat4, sprites)
  59566. {
  59567. if (sprites === undefined) { sprites = this.getChildren(); }
  59568. for (var i = 0; i < sprites.length; i++)
  59569. {
  59570. sprites[i].position.transformMat4(mat4);
  59571. }
  59572. return this.update();
  59573. },
  59574. /**
  59575. * Sets the width and height of the viewport. Does not update any matrices.
  59576. *
  59577. * @method Phaser.Cameras.Sprite3D.Camera#setViewport
  59578. * @since 3.0.0
  59579. *
  59580. * @param {number} width - [description]
  59581. * @param {number} height - [description]
  59582. *
  59583. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59584. */
  59585. setViewport: function (width, height)
  59586. {
  59587. this.viewportWidth = width;
  59588. this.viewportHeight = height;
  59589. return this.update();
  59590. },
  59591. /**
  59592. * Translates this camera by a specified Vector3 object
  59593. * or x, y, z parameters. Any undefined x y z values will
  59594. * default to zero, leaving that component unaffected.
  59595. * If you wish to set the camera position directly call setPosition instead.
  59596. *
  59597. * @method Phaser.Cameras.Sprite3D.Camera#translate
  59598. * @since 3.0.0
  59599. *
  59600. * @param {(number|object)} x - [description]
  59601. * @param {number} [y] - [description]
  59602. * @param {number} [z] - [description]
  59603. *
  59604. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59605. */
  59606. translate: function (x, y, z)
  59607. {
  59608. if (typeof x === 'object')
  59609. {
  59610. this.position.x += x.x || 0;
  59611. this.position.y += x.y || 0;
  59612. this.position.z += x.z || 0;
  59613. }
  59614. else
  59615. {
  59616. this.position.x += x || 0;
  59617. this.position.y += y || 0;
  59618. this.position.z += z || 0;
  59619. }
  59620. return this.update();
  59621. },
  59622. /**
  59623. * [description]
  59624. *
  59625. * @method Phaser.Cameras.Sprite3D.Camera#lookAt
  59626. * @since 3.0.0
  59627. *
  59628. * @param {(number|object)} x - [description]
  59629. * @param {number} [y] - [description]
  59630. * @param {number} [z] - [description]
  59631. *
  59632. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59633. */
  59634. lookAt: function (x, y, z)
  59635. {
  59636. var dir = this.direction;
  59637. var up = this.up;
  59638. if (typeof x === 'object')
  59639. {
  59640. dir.copy(x);
  59641. }
  59642. else
  59643. {
  59644. dir.set(x, y, z);
  59645. }
  59646. dir.subtract(this.position).normalize();
  59647. // Calculate right vector
  59648. tmpVec3.copy(dir).cross(up).normalize();
  59649. // Calculate up vector
  59650. up.copy(tmpVec3).cross(dir).normalize();
  59651. return this.update();
  59652. },
  59653. /**
  59654. * [description]
  59655. *
  59656. * @method Phaser.Cameras.Sprite3D.Camera#rotate
  59657. * @since 3.0.0
  59658. *
  59659. * @param {number} radians - [description]
  59660. * @param {Phaser.Math.Vector3} axis - [description]
  59661. *
  59662. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59663. */
  59664. rotate: function (radians, axis)
  59665. {
  59666. RotateVec3(this.direction, axis, radians);
  59667. RotateVec3(this.up, axis, radians);
  59668. return this.update();
  59669. },
  59670. /**
  59671. * [description]
  59672. *
  59673. * @method Phaser.Cameras.Sprite3D.Camera#rotateAround
  59674. * @since 3.0.0
  59675. *
  59676. * @param {Phaser.Math.Vector3} point - [description]
  59677. * @param {number} radians - [description]
  59678. * @param {Phaser.Math.Vector3} axis - [description]
  59679. *
  59680. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59681. */
  59682. rotateAround: function (point, radians, axis)
  59683. {
  59684. tmpVec3.copy(point).subtract(this.position);
  59685. this.translate(tmpVec3);
  59686. this.rotate(radians, axis);
  59687. this.translate(tmpVec3.negate());
  59688. return this.update();
  59689. },
  59690. /**
  59691. * [description]
  59692. *
  59693. * @method Phaser.Cameras.Sprite3D.Camera#project
  59694. * @since 3.0.0
  59695. *
  59696. * @param {Phaser.Math.Vector3} vec - [description]
  59697. * @param {Phaser.Math.Vector4} out - [description]
  59698. *
  59699. * @return {Phaser.Math.Vector4} [description]
  59700. */
  59701. project: function (vec, out)
  59702. {
  59703. if (out === undefined) { out = new Vector4(); }
  59704. // TODO: support viewport XY
  59705. var viewportWidth = this.viewportWidth;
  59706. var viewportHeight = this.viewportHeight;
  59707. var n = Camera.NEAR_RANGE;
  59708. var f = Camera.FAR_RANGE;
  59709. // For useful Z and W values we should do the usual steps: clip space -> NDC -> window coords
  59710. // Implicit 1.0 for w component
  59711. tmpVec4.set(vec.x, vec.y, vec.z, 1.0);
  59712. // Transform into clip space
  59713. tmpVec4.transformMat4(this.combined);
  59714. // Avoid divide by zero when 0x0x0 camera projects to a 0x0x0 vec3
  59715. if (tmpVec4.w === 0)
  59716. {
  59717. tmpVec4.w = 1;
  59718. }
  59719. // Now into NDC
  59720. tmpVec4.x = tmpVec4.x / tmpVec4.w;
  59721. tmpVec4.y = tmpVec4.y / tmpVec4.w;
  59722. tmpVec4.z = tmpVec4.z / tmpVec4.w;
  59723. // And finally into window coordinates
  59724. out.x = viewportWidth / 2 * tmpVec4.x + (0 + viewportWidth / 2);
  59725. out.y = viewportHeight / 2 * tmpVec4.y + (0 + viewportHeight / 2);
  59726. out.z = (f - n) / 2 * tmpVec4.z + (f + n) / 2;
  59727. // If the out vector has a fourth component, we also store (1/clip.w), same idea as gl_FragCoord.w
  59728. if (out.w === 0 || out.w)
  59729. {
  59730. out.w = 1 / tmpVec4.w;
  59731. }
  59732. return out;
  59733. },
  59734. /**
  59735. * [description]
  59736. *
  59737. * @method Phaser.Cameras.Sprite3D.Camera#unproject
  59738. * @since 3.0.0
  59739. *
  59740. * @param {Phaser.Math.Vector4} vec - [description]
  59741. * @param {Phaser.Math.Vector3} out - [description]
  59742. *
  59743. * @return {Phaser.Math.Vector3} [description]
  59744. */
  59745. unproject: function (vec, out)
  59746. {
  59747. if (out === undefined) { out = new Vector3(); }
  59748. var viewport = tmpVec4.set(0, 0, this.viewportWidth, this.viewportHeight);
  59749. return out.copy(vec).unproject(viewport, this.invProjectionView);
  59750. },
  59751. /**
  59752. * [description]
  59753. *
  59754. * @method Phaser.Cameras.Sprite3D.Camera#getPickRay
  59755. * @since 3.0.0
  59756. *
  59757. * @param {number} x - [description]
  59758. * @param {number} [y] - [description]
  59759. *
  59760. * @return {RayDef} [description]
  59761. */
  59762. getPickRay: function (x, y)
  59763. {
  59764. var origin = this.ray.origin.set(x, y, 0);
  59765. var direction = this.ray.direction.set(x, y, 1);
  59766. var viewport = tmpVec4.set(0, 0, this.viewportWidth, this.viewportHeight);
  59767. var mtx = this.invProjectionView;
  59768. origin.unproject(viewport, mtx);
  59769. direction.unproject(viewport, mtx);
  59770. direction.subtract(origin).normalize();
  59771. return this.ray;
  59772. },
  59773. /**
  59774. * [description]
  59775. *
  59776. * @method Phaser.Cameras.Sprite3D.Camera#updateChildren
  59777. * @since 3.0.0
  59778. *
  59779. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59780. */
  59781. updateChildren: function ()
  59782. {
  59783. var children = this.children.entries;
  59784. for (var i = 0; i < children.length; i++)
  59785. {
  59786. children[i].project(this);
  59787. }
  59788. return this;
  59789. },
  59790. // Overriden by subclasses
  59791. /**
  59792. * [description]
  59793. *
  59794. * @method Phaser.Cameras.Sprite3D.Camera#update
  59795. * @since 3.0.0
  59796. *
  59797. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59798. */
  59799. update: function ()
  59800. {
  59801. return this.updateChildren();
  59802. },
  59803. /**
  59804. * [description]
  59805. *
  59806. * @method Phaser.Cameras.Sprite3D.Camera#updateBillboardMatrix
  59807. * @since 3.0.0
  59808. */
  59809. updateBillboardMatrix: function ()
  59810. {
  59811. var dir = dirvec.set(this.direction).negate();
  59812. // Better view-aligned billboards might use this:
  59813. // var dir = tmp.set(camera.position).subtract(p).normalize();
  59814. var right = rightvec.set(this.up).cross(dir).normalize();
  59815. var up = tmpVec3.set(dir).cross(right).normalize();
  59816. var out = billboardMatrix.val;
  59817. out[0] = right.x;
  59818. out[1] = right.y;
  59819. out[2] = right.z;
  59820. out[3] = 0;
  59821. out[4] = up.x;
  59822. out[5] = up.y;
  59823. out[6] = up.z;
  59824. out[7] = 0;
  59825. out[8] = dir.x;
  59826. out[9] = dir.y;
  59827. out[10] = dir.z;
  59828. out[11] = 0;
  59829. out[12] = 0;
  59830. out[13] = 0;
  59831. out[14] = 0;
  59832. out[15] = 1;
  59833. this.billboardMatrixDirty = false;
  59834. },
  59835. /**
  59836. * This is a utility function for canvas 3D rendering,
  59837. * which determines the "point size" of a camera-facing
  59838. * sprite billboard given its 3D world position
  59839. * (origin at center of sprite) and its world width
  59840. * and height in x/y.
  59841. *
  59842. * We place into the output Vector2 the scaled width
  59843. * and height. If no `out` is specified, a new Vector2
  59844. * will be created for convenience (this should be avoided
  59845. * in tight loops).
  59846. *
  59847. * @method Phaser.Cameras.Sprite3D.Camera#getPointSize
  59848. * @since 3.0.0
  59849. *
  59850. * @param {Phaser.Math.Vector2} vec - The position of the 3D Sprite.
  59851. * @param {Phaser.Math.Vector2} size - The x and y dimensions.
  59852. * @param {Phaser.Math.Vector2} out - The result, scaled x and y dimensions.
  59853. *
  59854. * @return {Phaser.Math.Vector2} [description]
  59855. */
  59856. getPointSize: function (vec, size, out)
  59857. {
  59858. if (out === undefined) { out = new Vector2(); }
  59859. // TODO: optimize this with a simple distance calculation:
  59860. // https://developer.valvesoftware.com/wiki/Field_of_View
  59861. if (this.billboardMatrixDirty)
  59862. {
  59863. this.updateBillboardMatrix();
  59864. }
  59865. var tmp = tmpVec3;
  59866. var dx = (size.x / this.pixelScale) / 2;
  59867. var dy = (size.y / this.pixelScale) / 2;
  59868. tmp.set(-dx, -dy, 0).transformMat4(billboardMatrix).add(vec);
  59869. this.project(tmp, tmp);
  59870. var tlx = tmp.x;
  59871. var tly = tmp.y;
  59872. tmp.set(dx, dy, 0).transformMat4(billboardMatrix).add(vec);
  59873. this.project(tmp, tmp);
  59874. var brx = tmp.x;
  59875. var bry = tmp.y;
  59876. // var w = Math.abs(brx - tlx);
  59877. // var h = Math.abs(bry - tly);
  59878. // Allow the projection to get negative ...
  59879. var w = brx - tlx;
  59880. var h = bry - tly;
  59881. return out.set(w, h);
  59882. },
  59883. /**
  59884. * [description]
  59885. *
  59886. * @method Phaser.Cameras.Sprite3D.Camera#destroy
  59887. * @since 3.0.0
  59888. */
  59889. destroy: function ()
  59890. {
  59891. this.children.clear();
  59892. this.scene = undefined;
  59893. this.children = undefined;
  59894. },
  59895. /**
  59896. * [description]
  59897. *
  59898. * @method Phaser.Cameras.Sprite3D.Camera#setX
  59899. * @since 3.0.0
  59900. *
  59901. * @param {number} value - [description]
  59902. *
  59903. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59904. */
  59905. setX: function (value)
  59906. {
  59907. this.position.x = value;
  59908. return this.update();
  59909. },
  59910. /**
  59911. * [description]
  59912. *
  59913. * @method Phaser.Cameras.Sprite3D.Camera#setY
  59914. * @since 3.0.0
  59915. *
  59916. * @param {number} value - [description]
  59917. *
  59918. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59919. */
  59920. setY: function (value)
  59921. {
  59922. this.position.y = value;
  59923. return this.update();
  59924. },
  59925. /**
  59926. * [description]
  59927. *
  59928. * @method Phaser.Cameras.Sprite3D.Camera#setZ
  59929. * @since 3.0.0
  59930. *
  59931. * @param {number} value - [description]
  59932. *
  59933. * @return {Phaser.Cameras.Sprite3D.Camera} This Camera object.
  59934. */
  59935. setZ: function (value)
  59936. {
  59937. this.position.z = value;
  59938. return this.update();
  59939. },
  59940. /**
  59941. * [description]
  59942. *
  59943. * @name Phaser.Cameras.Sprite3D.Camera#x
  59944. * @type {number}
  59945. * @since 3.0.0
  59946. */
  59947. x: {
  59948. get: function ()
  59949. {
  59950. return this.position.x;
  59951. },
  59952. set: function (value)
  59953. {
  59954. this.position.x = value;
  59955. this.update();
  59956. }
  59957. },
  59958. /**
  59959. * [description]
  59960. *
  59961. * @name Phaser.Cameras.Sprite3D.Camera#y
  59962. * @type {number}
  59963. * @since 3.0.0
  59964. */
  59965. y: {
  59966. get: function ()
  59967. {
  59968. return this.position.y;
  59969. },
  59970. set: function (value)
  59971. {
  59972. this.position.y = value;
  59973. this.update();
  59974. }
  59975. },
  59976. /**
  59977. * [description]
  59978. *
  59979. * @name Phaser.Cameras.Sprite3D.Camera#z
  59980. * @type {number}
  59981. * @since 3.0.0
  59982. */
  59983. z: {
  59984. get: function ()
  59985. {
  59986. return this.position.z;
  59987. },
  59988. set: function (value)
  59989. {
  59990. this.position.z = value;
  59991. this.update();
  59992. }
  59993. }
  59994. });
  59995. Camera.FAR_RANGE = 1.0;
  59996. Camera.NEAR_RANGE = 0.0;
  59997. module.exports = Camera;
  59998. /***/ }),
  59999. /* 274 */
  60000. /***/ (function(module, exports, __webpack_require__) {
  60001. /**
  60002. * @author Richard Davey <rich@photonstorm.com>
  60003. * @copyright 2018 Photon Storm Ltd.
  60004. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60005. */
  60006. var Color = __webpack_require__(30);
  60007. /**
  60008. * Converts a CSS 'web' string into a Phaser Color object.
  60009. *
  60010. * 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].
  60011. *
  60012. * @function Phaser.Display.Color.RGBStringToColor
  60013. * @since 3.0.0
  60014. *
  60015. * @param {string} rgb - The CSS format color string, using the `rgb` or `rgba` format.
  60016. *
  60017. * @return {Phaser.Display.Color} A Color object.
  60018. */
  60019. var RGBStringToColor = function (rgb)
  60020. {
  60021. var color = new Color();
  60022. var result = (/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d+(?:\.\d+)?))?\s*\)$/).exec(rgb.toLowerCase());
  60023. if (result)
  60024. {
  60025. var r = parseInt(result[1], 10);
  60026. var g = parseInt(result[2], 10);
  60027. var b = parseInt(result[3], 10);
  60028. var a = (result[4] !== undefined) ? parseFloat(result[4]) : 1;
  60029. color.setTo(r, g, b, a * 255);
  60030. }
  60031. return color;
  60032. };
  60033. module.exports = RGBStringToColor;
  60034. /***/ }),
  60035. /* 275 */
  60036. /***/ (function(module, exports, __webpack_require__) {
  60037. /**
  60038. * @author Richard Davey <rich@photonstorm.com>
  60039. * @copyright 2018 Photon Storm Ltd.
  60040. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60041. */
  60042. var Color = __webpack_require__(30);
  60043. /**
  60044. * Converts an object containing `r`, `g`, `b` and `a` properties into a Color class instance.
  60045. *
  60046. * @function Phaser.Display.Color.ObjectToColor
  60047. * @since 3.0.0
  60048. *
  60049. * @param {InputColorObject} input - An object containing `r`, `g`, `b` and `a` properties in the range 0 to 255.
  60050. *
  60051. * @return {Phaser.Display.Color} A Color object.
  60052. */
  60053. var ObjectToColor = function (input)
  60054. {
  60055. return new Color(input.r, input.g, input.b, input.a);
  60056. };
  60057. module.exports = ObjectToColor;
  60058. /***/ }),
  60059. /* 276 */
  60060. /***/ (function(module, exports) {
  60061. /**
  60062. * @author Richard Davey <rich@photonstorm.com>
  60063. * @copyright 2018 Photon Storm Ltd.
  60064. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60065. */
  60066. /**
  60067. * Return the component parts of a color as an Object with the properties alpha, red, green, blue.
  60068. *
  60069. * Alpha will only be set if it exists in the given color (0xAARRGGBB)
  60070. *
  60071. * @function Phaser.Display.Color.IntegerToRGB
  60072. * @since 3.0.0
  60073. *
  60074. * @param {integer} input - The color value to convert into a Color object.
  60075. *
  60076. * @return {ColorObject} An object with the red, green and blue values set in the r, g and b properties.
  60077. */
  60078. var IntegerToRGB = function (color)
  60079. {
  60080. if (color > 16777215)
  60081. {
  60082. // The color value has an alpha component
  60083. return {
  60084. a: color >>> 24,
  60085. r: color >> 16 & 0xFF,
  60086. g: color >> 8 & 0xFF,
  60087. b: color & 0xFF
  60088. };
  60089. }
  60090. else
  60091. {
  60092. return {
  60093. a: 255,
  60094. r: color >> 16 & 0xFF,
  60095. g: color >> 8 & 0xFF,
  60096. b: color & 0xFF
  60097. };
  60098. }
  60099. };
  60100. module.exports = IntegerToRGB;
  60101. /***/ }),
  60102. /* 277 */
  60103. /***/ (function(module, exports, __webpack_require__) {
  60104. /**
  60105. * @author Richard Davey <rich@photonstorm.com>
  60106. * @copyright 2018 Photon Storm Ltd.
  60107. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60108. */
  60109. var Color = __webpack_require__(30);
  60110. var IntegerToRGB = __webpack_require__(276);
  60111. /**
  60112. * Converts the given color value into an instance of a Color object.
  60113. *
  60114. * @function Phaser.Display.Color.IntegerToColor
  60115. * @since 3.0.0
  60116. *
  60117. * @param {integer} input - The color value to convert into a Color object.
  60118. *
  60119. * @return {Phaser.Display.Color} A Color object.
  60120. */
  60121. var IntegerToColor = function (input)
  60122. {
  60123. var rgb = IntegerToRGB(input);
  60124. return new Color(rgb.r, rgb.g, rgb.b, rgb.a);
  60125. };
  60126. module.exports = IntegerToColor;
  60127. /***/ }),
  60128. /* 278 */
  60129. /***/ (function(module, exports) {
  60130. /**
  60131. * @author Richard Davey <rich@photonstorm.com>
  60132. * @copyright 2018 Photon Storm Ltd.
  60133. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60134. */
  60135. /**
  60136. * Given an alpha and 3 color values this will return an integer representation of it.
  60137. *
  60138. * @function Phaser.Display.Color.GetColor32
  60139. * @since 3.0.0
  60140. *
  60141. * @param {integer} red - The red color value. A number between 0 and 255.
  60142. * @param {integer} green - The green color value. A number between 0 and 255.
  60143. * @param {integer} blue - The blue color value. A number between 0 and 255.
  60144. * @param {integer} alpha - The alpha color value. A number between 0 and 255.
  60145. *
  60146. * @return {number} The combined color value.
  60147. */
  60148. var GetColor32 = function (red, green, blue, alpha)
  60149. {
  60150. return alpha << 24 | red << 16 | green << 8 | blue;
  60151. };
  60152. module.exports = GetColor32;
  60153. /***/ }),
  60154. /* 279 */
  60155. /***/ (function(module, exports, __webpack_require__) {
  60156. /**
  60157. * @author Richard Davey <rich@photonstorm.com>
  60158. * @copyright 2018 Photon Storm Ltd.
  60159. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60160. */
  60161. var Color = __webpack_require__(30);
  60162. /**
  60163. * Converts a hex string into a Phaser Color object.
  60164. *
  60165. * 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.
  60166. *
  60167. * An alpha channel is _not_ supported.
  60168. *
  60169. * @function Phaser.Display.Color.HexStringToColor
  60170. * @since 3.0.0
  60171. *
  60172. * @param {string} hex - The hex color value to convert, such as `#0033ff` or the short-hand format: `#03f`.
  60173. *
  60174. * @return {Phaser.Display.Color} A Color object populated by the values of the given string.
  60175. */
  60176. var HexStringToColor = function (hex)
  60177. {
  60178. var color = new Color();
  60179. // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
  60180. hex = hex.replace(/^(?:#|0x)?([a-f\d])([a-f\d])([a-f\d])$/i, function (m, r, g, b)
  60181. {
  60182. return r + r + g + g + b + b;
  60183. });
  60184. var result = (/^(?:#|0x)?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i).exec(hex);
  60185. if (result)
  60186. {
  60187. var r = parseInt(result[1], 16);
  60188. var g = parseInt(result[2], 16);
  60189. var b = parseInt(result[3], 16);
  60190. color.setTo(r, g, b);
  60191. }
  60192. return color;
  60193. };
  60194. module.exports = HexStringToColor;
  60195. /***/ }),
  60196. /* 280 */
  60197. /***/ (function(module, exports, __webpack_require__) {
  60198. /**
  60199. * @author Richard Davey <rich@photonstorm.com>
  60200. * @copyright 2018 Photon Storm Ltd.
  60201. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60202. */
  60203. /**
  60204. * @namespace Phaser.Math.Easing.Stepped
  60205. */
  60206. module.exports = __webpack_require__(535);
  60207. /***/ }),
  60208. /* 281 */
  60209. /***/ (function(module, exports, __webpack_require__) {
  60210. /**
  60211. * @author Richard Davey <rich@photonstorm.com>
  60212. * @copyright 2018 Photon Storm Ltd.
  60213. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60214. */
  60215. /**
  60216. * @namespace Phaser.Math.Easing.Sine
  60217. */
  60218. module.exports = {
  60219. In: __webpack_require__(538),
  60220. Out: __webpack_require__(537),
  60221. InOut: __webpack_require__(536)
  60222. };
  60223. /***/ }),
  60224. /* 282 */
  60225. /***/ (function(module, exports, __webpack_require__) {
  60226. /**
  60227. * @author Richard Davey <rich@photonstorm.com>
  60228. * @copyright 2018 Photon Storm Ltd.
  60229. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60230. */
  60231. /**
  60232. * @namespace Phaser.Math.Easing.Quintic
  60233. */
  60234. module.exports = {
  60235. In: __webpack_require__(541),
  60236. Out: __webpack_require__(540),
  60237. InOut: __webpack_require__(539)
  60238. };
  60239. /***/ }),
  60240. /* 283 */
  60241. /***/ (function(module, exports, __webpack_require__) {
  60242. /**
  60243. * @author Richard Davey <rich@photonstorm.com>
  60244. * @copyright 2018 Photon Storm Ltd.
  60245. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60246. */
  60247. /**
  60248. * @namespace Phaser.Math.Easing.Quartic
  60249. */
  60250. module.exports = {
  60251. In: __webpack_require__(544),
  60252. Out: __webpack_require__(543),
  60253. InOut: __webpack_require__(542)
  60254. };
  60255. /***/ }),
  60256. /* 284 */
  60257. /***/ (function(module, exports, __webpack_require__) {
  60258. /**
  60259. * @author Richard Davey <rich@photonstorm.com>
  60260. * @copyright 2018 Photon Storm Ltd.
  60261. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60262. */
  60263. /**
  60264. * @namespace Phaser.Math.Easing.Quadratic
  60265. */
  60266. module.exports = {
  60267. In: __webpack_require__(547),
  60268. Out: __webpack_require__(546),
  60269. InOut: __webpack_require__(545)
  60270. };
  60271. /***/ }),
  60272. /* 285 */
  60273. /***/ (function(module, exports, __webpack_require__) {
  60274. /**
  60275. * @author Richard Davey <rich@photonstorm.com>
  60276. * @copyright 2018 Photon Storm Ltd.
  60277. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60278. */
  60279. /**
  60280. * @namespace Phaser.Math.Easing.Linear
  60281. */
  60282. module.exports = __webpack_require__(548);
  60283. /***/ }),
  60284. /* 286 */
  60285. /***/ (function(module, exports, __webpack_require__) {
  60286. /**
  60287. * @author Richard Davey <rich@photonstorm.com>
  60288. * @copyright 2018 Photon Storm Ltd.
  60289. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60290. */
  60291. /**
  60292. * @namespace Phaser.Math.Easing.Expo
  60293. */
  60294. module.exports = {
  60295. In: __webpack_require__(551),
  60296. Out: __webpack_require__(550),
  60297. InOut: __webpack_require__(549)
  60298. };
  60299. /***/ }),
  60300. /* 287 */
  60301. /***/ (function(module, exports, __webpack_require__) {
  60302. /**
  60303. * @author Richard Davey <rich@photonstorm.com>
  60304. * @copyright 2018 Photon Storm Ltd.
  60305. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60306. */
  60307. /**
  60308. * @namespace Phaser.Math.Easing.Elastic
  60309. */
  60310. module.exports = {
  60311. In: __webpack_require__(554),
  60312. Out: __webpack_require__(553),
  60313. InOut: __webpack_require__(552)
  60314. };
  60315. /***/ }),
  60316. /* 288 */
  60317. /***/ (function(module, exports, __webpack_require__) {
  60318. /**
  60319. * @author Richard Davey <rich@photonstorm.com>
  60320. * @copyright 2018 Photon Storm Ltd.
  60321. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60322. */
  60323. /**
  60324. * @namespace Phaser.Math.Easing.Cubic
  60325. */
  60326. module.exports = {
  60327. In: __webpack_require__(557),
  60328. Out: __webpack_require__(556),
  60329. InOut: __webpack_require__(555)
  60330. };
  60331. /***/ }),
  60332. /* 289 */
  60333. /***/ (function(module, exports, __webpack_require__) {
  60334. /**
  60335. * @author Richard Davey <rich@photonstorm.com>
  60336. * @copyright 2018 Photon Storm Ltd.
  60337. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60338. */
  60339. /**
  60340. * @namespace Phaser.Math.Easing.Circular
  60341. */
  60342. module.exports = {
  60343. In: __webpack_require__(560),
  60344. Out: __webpack_require__(559),
  60345. InOut: __webpack_require__(558)
  60346. };
  60347. /***/ }),
  60348. /* 290 */
  60349. /***/ (function(module, exports, __webpack_require__) {
  60350. /**
  60351. * @author Richard Davey <rich@photonstorm.com>
  60352. * @copyright 2018 Photon Storm Ltd.
  60353. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60354. */
  60355. /**
  60356. * @namespace Phaser.Math.Easing.Bounce
  60357. */
  60358. module.exports = {
  60359. In: __webpack_require__(563),
  60360. Out: __webpack_require__(562),
  60361. InOut: __webpack_require__(561)
  60362. };
  60363. /***/ }),
  60364. /* 291 */
  60365. /***/ (function(module, exports, __webpack_require__) {
  60366. /**
  60367. * @author Richard Davey <rich@photonstorm.com>
  60368. * @copyright 2018 Photon Storm Ltd.
  60369. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60370. */
  60371. /**
  60372. * @namespace Phaser.Math.Easing.Back
  60373. */
  60374. module.exports = {
  60375. In: __webpack_require__(566),
  60376. Out: __webpack_require__(565),
  60377. InOut: __webpack_require__(564)
  60378. };
  60379. /***/ }),
  60380. /* 292 */
  60381. /***/ (function(module, exports) {
  60382. /**
  60383. * @author Richard Davey <rich@photonstorm.com>
  60384. * @copyright 2018 Photon Storm Ltd.
  60385. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60386. */
  60387. /**
  60388. * Calculate a smoother interpolation percentage of `x` between `min` and `max`.
  60389. *
  60390. * The function receives the number `x` as an argument and returns 0 if `x` is less than or equal to the left edge,
  60391. * 1 if `x` is greater than or equal to the right edge, and smoothly interpolates, using a Hermite polynomial,
  60392. * between 0 and 1 otherwise.
  60393. *
  60394. * Produces an even smoother interpolation than {@link Phaser.Math.SmoothStep}.
  60395. *
  60396. * @function Phaser.Math.SmootherStep
  60397. * @since 3.0.0
  60398. * @see {@link https://en.wikipedia.org/wiki/Smoothstep#Variations}
  60399. *
  60400. * @param {number} x - The input value.
  60401. * @param {number} min - The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'.
  60402. * @param {number} max - The maximum value, also known as the 'right edge', assumed greater than the 'left edge'.
  60403. *
  60404. * @return {number} The percentage of interpolation, between 0 and 1.
  60405. */
  60406. var SmootherStep = function (x, min, max)
  60407. {
  60408. x = Math.max(0, Math.min(1, (x - min) / (max - min)));
  60409. return x * x * x * (x * (x * 6 - 15) + 10);
  60410. };
  60411. module.exports = SmootherStep;
  60412. /***/ }),
  60413. /* 293 */
  60414. /***/ (function(module, exports) {
  60415. /**
  60416. * @author Richard Davey <rich@photonstorm.com>
  60417. * @copyright 2018 Photon Storm Ltd.
  60418. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60419. */
  60420. /**
  60421. * [description]
  60422. *
  60423. * @function Phaser.Math.RotateAroundDistance
  60424. * @since 3.0.0
  60425. *
  60426. * @param {(Phaser.Geom.Point|object)} point - The point to be rotated.
  60427. * @param {number} x - The horizontal coordinate to rotate around.
  60428. * @param {number} y - The vertical coordinate to rotate around.
  60429. * @param {number} angle - The angle of rotation in radians.
  60430. * @param {number} distance - [description]
  60431. *
  60432. * @return {Phaser.Geom.Point} The given point.
  60433. */
  60434. var RotateAroundDistance = function (point, x, y, angle, distance)
  60435. {
  60436. var t = angle + Math.atan2(point.y - y, point.x - x);
  60437. point.x = x + (distance * Math.cos(t));
  60438. point.y = y + (distance * Math.sin(t));
  60439. return point;
  60440. };
  60441. module.exports = RotateAroundDistance;
  60442. /***/ }),
  60443. /* 294 */
  60444. /***/ (function(module, exports) {
  60445. /**
  60446. * @author Richard Davey <rich@photonstorm.com>
  60447. * @copyright 2018 Photon Storm Ltd.
  60448. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60449. */
  60450. /**
  60451. * Moves the element at the end of the array to the start, shifting all items in the process.
  60452. * The "rotation" happens to the right.
  60453. *
  60454. * @function Phaser.Utils.Array.RotateRight
  60455. * @since 3.0.0
  60456. *
  60457. * @param {array} array - The array to shift to the right. This array is modified in place.
  60458. * @param {integer} [total=1] - The number of times to shift the array.
  60459. *
  60460. * @return {*} The most recently shifted element.
  60461. */
  60462. var RotateRight = function (array, total)
  60463. {
  60464. if (total === undefined) { total = 1; }
  60465. var element = null;
  60466. for (var i = 0; i < total; i++)
  60467. {
  60468. element = array.pop();
  60469. array.unshift(element);
  60470. }
  60471. return element;
  60472. };
  60473. module.exports = RotateRight;
  60474. /***/ }),
  60475. /* 295 */
  60476. /***/ (function(module, exports) {
  60477. /**
  60478. * @author Richard Davey <rich@photonstorm.com>
  60479. * @copyright 2018 Photon Storm Ltd.
  60480. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60481. */
  60482. /**
  60483. * Moves the element at the start of the array to the end, shifting all items in the process.
  60484. * The "rotation" happens to the left.
  60485. *
  60486. * @function Phaser.Utils.Array.RotateLeft
  60487. * @since 3.0.0
  60488. *
  60489. * @param {array} array - The array to shift to the left. This array is modified in place.
  60490. * @param {integer} [total=1] - The number of times to shift the array.
  60491. *
  60492. * @return {*} The most recently shifted element.
  60493. */
  60494. var RotateLeft = function (array, total)
  60495. {
  60496. if (total === undefined) { total = 1; }
  60497. var element = null;
  60498. for (var i = 0; i < total; i++)
  60499. {
  60500. element = array.shift();
  60501. array.push(element);
  60502. }
  60503. return element;
  60504. };
  60505. module.exports = RotateLeft;
  60506. /***/ }),
  60507. /* 296 */
  60508. /***/ (function(module, exports) {
  60509. /**
  60510. * @author Richard Davey <rich@photonstorm.com>
  60511. * @copyright 2018 Photon Storm Ltd.
  60512. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60513. */
  60514. /**
  60515. * Provides methods used for setting the WebGL rendering pipeline of a Game Object.
  60516. *
  60517. * @name Phaser.GameObjects.Components.Pipeline
  60518. * @webglOnly
  60519. * @since 3.0.0
  60520. */
  60521. var Pipeline = {
  60522. /**
  60523. * The initial WebGL pipeline of this Game Object.
  60524. *
  60525. * @name Phaser.GameObjects.Components.Pipeline#defaultPipeline
  60526. * @type {Phaser.Renderer.WebGL.WebGLPipeline}
  60527. * @default null
  60528. * @webglOnly
  60529. * @since 3.0.0
  60530. */
  60531. defaultPipeline: null,
  60532. /**
  60533. * The current WebGL pipeline of this Game Object.
  60534. *
  60535. * @name Phaser.GameObjects.Components.Pipeline#pipeline
  60536. * @type {Phaser.Renderer.WebGL.WebGLPipeline}
  60537. * @default null
  60538. * @webglOnly
  60539. * @since 3.0.0
  60540. */
  60541. pipeline: null,
  60542. /**
  60543. * Sets the initial WebGL Pipeline of this Game Object.
  60544. * This should only be called during the instantiation of the Game Object.
  60545. *
  60546. * @method Phaser.GameObjects.Components.Pipeline#initPipeline
  60547. * @webglOnly
  60548. * @since 3.0.0
  60549. *
  60550. * @param {string} pipelineName - The name of the pipeline to set on this Game Object.
  60551. *
  60552. * @return {boolean} `true` if the pipeline was set successfully, otherwise `false`.
  60553. */
  60554. initPipeline: function (pipelineName)
  60555. {
  60556. var renderer = this.scene.sys.game.renderer;
  60557. if (renderer && renderer.gl && renderer.hasPipeline(pipelineName))
  60558. {
  60559. this.defaultPipeline = renderer.getPipeline(pipelineName);
  60560. this.pipeline = this.defaultPipeline;
  60561. return true;
  60562. }
  60563. return false;
  60564. },
  60565. /**
  60566. * Sets the active WebGL Pipeline of this Game Object.
  60567. *
  60568. * @method Phaser.GameObjects.Components.Pipeline#setPipeline
  60569. * @webglOnly
  60570. * @since 3.0.0
  60571. *
  60572. * @param {string} pipelineName - The name of the pipeline to set on this Game Object.
  60573. *
  60574. * @return {this} This Game Object instance.
  60575. */
  60576. setPipeline: function (pipelineName)
  60577. {
  60578. var renderer = this.scene.sys.game.renderer;
  60579. if (renderer && renderer.gl && renderer.hasPipeline(pipelineName))
  60580. {
  60581. this.pipeline = renderer.getPipeline(pipelineName);
  60582. }
  60583. return this;
  60584. },
  60585. /**
  60586. * Resets the WebGL Pipeline of this Game Object back to the default it was created with.
  60587. *
  60588. * @method Phaser.GameObjects.Components.Pipeline#resetPipeline
  60589. * @webglOnly
  60590. * @since 3.0.0
  60591. *
  60592. * @return {boolean} `true` if the pipeline was set successfully, otherwise `false`.
  60593. */
  60594. resetPipeline: function ()
  60595. {
  60596. this.pipeline = this.defaultPipeline;
  60597. return (this.pipeline !== null);
  60598. },
  60599. /**
  60600. * Gets the name of the WebGL Pipeline this Game Object is currently using.
  60601. *
  60602. * @method Phaser.GameObjects.Components.Pipeline#getPipelineName
  60603. * @webglOnly
  60604. * @since 3.0.0
  60605. *
  60606. * @return {string} The string-based name of the pipeline being used by this Game Object.
  60607. */
  60608. getPipelineName: function ()
  60609. {
  60610. return this.pipeline.name;
  60611. }
  60612. };
  60613. module.exports = Pipeline;
  60614. /***/ }),
  60615. /* 297 */
  60616. /***/ (function(module, exports) {
  60617. /**
  60618. * @author Richard Davey <rich@photonstorm.com>
  60619. * @copyright 2018 Photon Storm Ltd.
  60620. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60621. */
  60622. /**
  60623. * Rotate a `point` around `x` and `y` by the given `angle`.
  60624. *
  60625. * @function Phaser.Math.RotateAround
  60626. * @since 3.0.0
  60627. *
  60628. * @param {(Phaser.Geom.Point|object)} point - The point to be rotated.
  60629. * @param {number} x - The horizontal coordinate to rotate around.
  60630. * @param {number} y - The vertical coordinate to rotate around.
  60631. * @param {number} angle - The angle of rotation in radians.
  60632. *
  60633. * @return {Phaser.Geom.Point} The given point, rotated by the given angle around the given coordinates.
  60634. */
  60635. var RotateAround = function (point, x, y, angle)
  60636. {
  60637. var c = Math.cos(angle);
  60638. var s = Math.sin(angle);
  60639. var tx = point.x - x;
  60640. var ty = point.y - y;
  60641. point.x = tx * c - ty * s + x;
  60642. point.y = tx * s + ty * c + y;
  60643. return point;
  60644. };
  60645. module.exports = RotateAround;
  60646. /***/ }),
  60647. /* 298 */
  60648. /***/ (function(module, exports, __webpack_require__) {
  60649. /**
  60650. * @author Richard Davey <rich@photonstorm.com>
  60651. * @copyright 2018 Photon Storm Ltd.
  60652. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60653. */
  60654. var Point = __webpack_require__(5);
  60655. /**
  60656. * Get a point on a line that's a given percentage along its length.
  60657. *
  60658. * @function Phaser.Geom.Line.GetPoint
  60659. * @since 3.0.0
  60660. *
  60661. * @generic {Phaser.Geom.Point} O - [out,$return]
  60662. *
  60663. * @param {Phaser.Geom.Line} line - The line.
  60664. * @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.
  60665. * @param {(Phaser.Geom.Point|object)} [out] - An optional point, or point-like object, to store the coordinates of the point on the line.
  60666. *
  60667. * @return {(Phaser.Geom.Point|object)} The point on the line.
  60668. */
  60669. var GetPoint = function (line, position, out)
  60670. {
  60671. if (out === undefined) { out = new Point(); }
  60672. out.x = line.x1 + (line.x2 - line.x1) * position;
  60673. out.y = line.y1 + (line.y2 - line.y1) * position;
  60674. return out;
  60675. };
  60676. module.exports = GetPoint;
  60677. /***/ }),
  60678. /* 299 */
  60679. /***/ (function(module, exports, __webpack_require__) {
  60680. /**
  60681. * @author Richard Davey <rich@photonstorm.com>
  60682. * @copyright 2018 Photon Storm Ltd.
  60683. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60684. */
  60685. var GetPoint = __webpack_require__(136);
  60686. var Perimeter = __webpack_require__(97);
  60687. // Return an array of points from the perimeter of the rectangle
  60688. // each spaced out based on the quantity or step required
  60689. /**
  60690. * [description]
  60691. *
  60692. * @function Phaser.Geom.Rectangle.GetPoints
  60693. * @since 3.0.0
  60694. *
  60695. * @generic {Phaser.Geom.Point[]} O - [out,$return]
  60696. *
  60697. * @param {Phaser.Geom.Rectangle} rectangle - [description]
  60698. * @param {number} step - [description]
  60699. * @param {integer} quantity - [description]
  60700. * @param {(array|Phaser.Geom.Point[])} [out] - [description]
  60701. *
  60702. * @return {(array|Phaser.Geom.Point[])} [description]
  60703. */
  60704. var GetPoints = function (rectangle, quantity, stepRate, out)
  60705. {
  60706. if (out === undefined) { out = []; }
  60707. // If quantity is a falsey value (false, null, 0, undefined, etc) then we calculate it based on the stepRate instead.
  60708. if (!quantity)
  60709. {
  60710. quantity = Perimeter(rectangle) / stepRate;
  60711. }
  60712. for (var i = 0; i < quantity; i++)
  60713. {
  60714. var position = i / quantity;
  60715. out.push(GetPoint(rectangle, position));
  60716. }
  60717. return out;
  60718. };
  60719. module.exports = GetPoints;
  60720. /***/ }),
  60721. /* 300 */
  60722. /***/ (function(module, exports) {
  60723. /**
  60724. * @author Richard Davey <rich@photonstorm.com>
  60725. * @copyright 2018 Photon Storm Ltd.
  60726. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60727. */
  60728. /**
  60729. * Returns the circumference of the given Circle.
  60730. *
  60731. * @function Phaser.Geom.Circle.Circumference
  60732. * @since 3.0.0
  60733. *
  60734. * @param {Phaser.Geom.Circle} circle - The Circle to get the circumference of.
  60735. *
  60736. * @return {number} The circumference of the Circle.
  60737. */
  60738. var Circumference = function (circle)
  60739. {
  60740. return 2 * (Math.PI * circle.radius);
  60741. };
  60742. module.exports = Circumference;
  60743. /***/ }),
  60744. /* 301 */
  60745. /***/ (function(module, exports, __webpack_require__) {
  60746. /**
  60747. * @author Richard Davey <rich@photonstorm.com>
  60748. * @copyright 2018 Photon Storm Ltd.
  60749. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60750. */
  60751. var Circumference = __webpack_require__(300);
  60752. var CircumferencePoint = __webpack_require__(137);
  60753. var FromPercent = __webpack_require__(64);
  60754. var MATH_CONST = __webpack_require__(15);
  60755. /**
  60756. * Returns an array of Point objects containing the coordinates of the points around the circumference of the Circle,
  60757. * based on the given quantity or stepRate values.
  60758. *
  60759. * @function Phaser.Geom.Circle.GetPoints
  60760. * @since 3.0.0
  60761. *
  60762. * @param {Phaser.Geom.Circle} circle - The Circle to get the points from.
  60763. * @param {integer} quantity - The amount of points to return. If a falsey value the quantity will be derived from the `stepRate` instead.
  60764. * @param {number} [stepRate] - Sets the quantity by getting the circumference of the circle and dividing it by the stepRate.
  60765. * @param {array} [output] - An array to insert the points in to. If not provided a new array will be created.
  60766. *
  60767. * @return {Phaser.Geom.Point[]} An array of Point objects pertaining to the points around the circumference of the circle.
  60768. */
  60769. var GetPoints = function (circle, quantity, stepRate, out)
  60770. {
  60771. if (out === undefined) { out = []; }
  60772. // If quantity is a falsey value (false, null, 0, undefined, etc) then we calculate it based on the stepRate instead.
  60773. if (!quantity)
  60774. {
  60775. quantity = Circumference(circle) / stepRate;
  60776. }
  60777. for (var i = 0; i < quantity; i++)
  60778. {
  60779. var angle = FromPercent(i / quantity, 0, MATH_CONST.PI2);
  60780. out.push(CircumferencePoint(circle, angle));
  60781. }
  60782. return out;
  60783. };
  60784. module.exports = GetPoints;
  60785. /***/ }),
  60786. /* 302 */
  60787. /***/ (function(module, exports, __webpack_require__) {
  60788. /**
  60789. * @author Richard Davey <rich@photonstorm.com>
  60790. * @copyright 2018 Photon Storm Ltd.
  60791. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  60792. */
  60793. var Class = __webpack_require__(0);
  60794. /**
  60795. * @classdesc
  60796. * A seeded random data generator.
  60797. *
  60798. * @class RandomDataGenerator
  60799. * @memberOf Phaser.Math
  60800. * @constructor
  60801. * @since 3.0.0
  60802. *
  60803. * @param {string[]} [seeds] - The seeds.
  60804. */
  60805. var RandomDataGenerator = new Class({
  60806. initialize:
  60807. function RandomDataGenerator (seeds)
  60808. {
  60809. /**
  60810. * Internal var.
  60811. *
  60812. * @name Phaser.Math.RandomDataGenerator#c
  60813. * @type {number}
  60814. * @default 1
  60815. * @private
  60816. * @since 3.0.0
  60817. */
  60818. this.c = 1;
  60819. /**
  60820. * Internal var.
  60821. *
  60822. * @name Phaser.Math.RandomDataGenerator#s0
  60823. * @type {number}
  60824. * @default 0
  60825. * @private
  60826. * @since 3.0.0
  60827. */
  60828. this.s0 = 0;
  60829. /**
  60830. * Internal var.
  60831. *
  60832. * @name Phaser.Math.RandomDataGenerator#s1
  60833. * @type {number}
  60834. * @default 0
  60835. * @private
  60836. * @since 3.0.0
  60837. */
  60838. this.s1 = 0;
  60839. /**
  60840. * Internal var.
  60841. *
  60842. * @name Phaser.Math.RandomDataGenerator#s2
  60843. * @type {number}
  60844. * @default 0
  60845. * @private
  60846. * @since 3.0.0
  60847. */
  60848. this.s2 = 0;
  60849. /**
  60850. * Internal var.
  60851. *
  60852. * @name Phaser.Math.RandomDataGenerator#n
  60853. * @type {number}
  60854. * @default 0
  60855. * @private
  60856. * @since 3.2.0
  60857. */
  60858. this.n = 0;
  60859. /**
  60860. * Signs to choose from.
  60861. *
  60862. * @name Phaser.Math.RandomDataGenerator#signs
  60863. * @type {number[]}
  60864. * @since 3.0.0
  60865. */
  60866. this.signs = [ -1, 1 ];
  60867. if (seeds)
  60868. {
  60869. this.init(seeds);
  60870. }
  60871. },
  60872. /**
  60873. * Private random helper.
  60874. *
  60875. * @method Phaser.Math.RandomDataGenerator#rnd
  60876. * @since 3.0.0
  60877. * @private
  60878. *
  60879. * @return {number} A random number.
  60880. */
  60881. rnd: function ()
  60882. {
  60883. var t = 2091639 * this.s0 + this.c * 2.3283064365386963e-10; // 2^-32
  60884. this.c = t | 0;
  60885. this.s0 = this.s1;
  60886. this.s1 = this.s2;
  60887. this.s2 = t - this.c;
  60888. return this.s2;
  60889. },
  60890. /**
  60891. * Internal method that creates a seed hash.
  60892. *
  60893. * @method Phaser.Math.RandomDataGenerator#hash
  60894. * @since 3.0.0
  60895. * @private
  60896. *
  60897. * @param {string} data - The value to hash.
  60898. *
  60899. * @return {number} The hashed value.
  60900. */
  60901. hash: function (data)
  60902. {
  60903. var h;
  60904. var n = this.n;
  60905. data = data.toString();
  60906. for (var i = 0; i < data.length; i++)
  60907. {
  60908. n += data.charCodeAt(i);
  60909. h = 0.02519603282416938 * n;
  60910. n = h >>> 0;
  60911. h -= n;
  60912. h *= n;
  60913. n = h >>> 0;
  60914. h -= n;
  60915. n += h * 0x100000000;// 2^32
  60916. }
  60917. this.n = n;
  60918. return (n >>> 0) * 2.3283064365386963e-10;// 2^-32
  60919. },
  60920. /**
  60921. * Initialize the state of the random data generator.
  60922. *
  60923. * @method Phaser.Math.RandomDataGenerator#init
  60924. * @since 3.0.0
  60925. *
  60926. * @param {(string|string[])} seeds - The seeds to initialize the random data generator with.
  60927. */
  60928. init: function (seeds)
  60929. {
  60930. if (typeof seeds === 'string')
  60931. {
  60932. this.state(seeds);
  60933. }
  60934. else
  60935. {
  60936. this.sow(seeds);
  60937. }
  60938. },
  60939. /**
  60940. * Reset the seed of the random data generator.
  60941. *
  60942. * _Note_: the seed array is only processed up to the first `undefined` (or `null`) value, should such be present.
  60943. *
  60944. * @method Phaser.Math.RandomDataGenerator#sow
  60945. * @since 3.0.0
  60946. *
  60947. * @param {string[]} seeds - The array of seeds: the `toString()` of each value is used.
  60948. */
  60949. sow: function (seeds)
  60950. {
  60951. // Always reset to default seed
  60952. this.n = 0xefc8249d;
  60953. this.s0 = this.hash(' ');
  60954. this.s1 = this.hash(' ');
  60955. this.s2 = this.hash(' ');
  60956. this.c = 1;
  60957. if (!seeds)
  60958. {
  60959. return;
  60960. }
  60961. // Apply any seeds
  60962. for (var i = 0; i < seeds.length && (seeds[i] != null); i++)
  60963. {
  60964. var seed = seeds[i];
  60965. this.s0 -= this.hash(seed);
  60966. this.s0 += ~~(this.s0 < 0);
  60967. this.s1 -= this.hash(seed);
  60968. this.s1 += ~~(this.s1 < 0);
  60969. this.s2 -= this.hash(seed);
  60970. this.s2 += ~~(this.s2 < 0);
  60971. }
  60972. },
  60973. /**
  60974. * Returns a random integer between 0 and 2^32.
  60975. *
  60976. * @method Phaser.Math.RandomDataGenerator#integer
  60977. * @since 3.0.0
  60978. *
  60979. * @return {number} A random integer between 0 and 2^32.
  60980. */
  60981. integer: function ()
  60982. {
  60983. // 2^32
  60984. return this.rnd() * 0x100000000;
  60985. },
  60986. /**
  60987. * Returns a random real number between 0 and 1.
  60988. *
  60989. * @method Phaser.Math.RandomDataGenerator#frac
  60990. * @since 3.0.0
  60991. *
  60992. * @return {number} A random real number between 0 and 1.
  60993. */
  60994. frac: function ()
  60995. {
  60996. // 2^-53
  60997. return this.rnd() + (this.rnd() * 0x200000 | 0) * 1.1102230246251565e-16;
  60998. },
  60999. /**
  61000. * Returns a random real number between 0 and 2^32.
  61001. *
  61002. * @method Phaser.Math.RandomDataGenerator#real
  61003. * @since 3.0.0
  61004. *
  61005. * @return {number} A random real number between 0 and 2^32.
  61006. */
  61007. real: function ()
  61008. {
  61009. return this.integer() + this.frac();
  61010. },
  61011. /**
  61012. * Returns a random integer between and including min and max.
  61013. *
  61014. * @method Phaser.Math.RandomDataGenerator#integerInRange
  61015. * @since 3.0.0
  61016. *
  61017. * @param {number} min - The minimum value in the range.
  61018. * @param {number} max - The maximum value in the range.
  61019. *
  61020. * @return {number} A random number between min and max.
  61021. */
  61022. integerInRange: function (min, max)
  61023. {
  61024. return Math.floor(this.realInRange(0, max - min + 1) + min);
  61025. },
  61026. /**
  61027. * Returns a random integer between and including min and max.
  61028. * This method is an alias for RandomDataGenerator.integerInRange.
  61029. *
  61030. * @method Phaser.Math.RandomDataGenerator#between
  61031. * @since 3.0.0
  61032. *
  61033. * @param {number} min - The minimum value in the range.
  61034. * @param {number} max - The maximum value in the range.
  61035. *
  61036. * @return {number} A random number between min and max.
  61037. */
  61038. between: function (min, max)
  61039. {
  61040. return Math.floor(this.realInRange(0, max - min + 1) + min);
  61041. },
  61042. /**
  61043. * Returns a random real number between min and max.
  61044. *
  61045. * @method Phaser.Math.RandomDataGenerator#realInRange
  61046. * @since 3.0.0
  61047. *
  61048. * @param {number} min - The minimum value in the range.
  61049. * @param {number} max - The maximum value in the range.
  61050. *
  61051. * @return {number} A random number between min and max.
  61052. */
  61053. realInRange: function (min, max)
  61054. {
  61055. return this.frac() * (max - min) + min;
  61056. },
  61057. /**
  61058. * Returns a random real number between -1 and 1.
  61059. *
  61060. * @method Phaser.Math.RandomDataGenerator#normal
  61061. * @since 3.0.0
  61062. *
  61063. * @return {number} A random real number between -1 and 1.
  61064. */
  61065. normal: function ()
  61066. {
  61067. return 1 - (2 * this.frac());
  61068. },
  61069. /**
  61070. * Returns a valid RFC4122 version4 ID hex string from https://gist.github.com/1308368
  61071. *
  61072. * @method Phaser.Math.RandomDataGenerator#uuid
  61073. * @since 3.0.0
  61074. *
  61075. * @return {string} A valid RFC4122 version4 ID hex string
  61076. */
  61077. uuid: function ()
  61078. {
  61079. var a = '';
  61080. var b = '';
  61081. for (b = a = ''; a++ < 36; b += ~a % 5 | a * 3 & 4 ? (a ^ 15 ? 8 ^ this.frac() * (a ^ 20 ? 16 : 4) : 4).toString(16) : '-')
  61082. {
  61083. // eslint-disable-next-line no-empty
  61084. }
  61085. return b;
  61086. },
  61087. /**
  61088. * Returns a random element from within the given array.
  61089. *
  61090. * @method Phaser.Math.RandomDataGenerator#pick
  61091. * @since 3.0.0
  61092. *
  61093. * @param {array} array - The array to pick a random element from.
  61094. *
  61095. * @return {*} A random member of the array.
  61096. */
  61097. pick: function (array)
  61098. {
  61099. return array[this.integerInRange(0, array.length - 1)];
  61100. },
  61101. /**
  61102. * Returns a sign to be used with multiplication operator.
  61103. *
  61104. * @method Phaser.Math.RandomDataGenerator#sign
  61105. * @since 3.0.0
  61106. *
  61107. * @return {number} -1 or +1.
  61108. */
  61109. sign: function ()
  61110. {
  61111. return this.pick(this.signs);
  61112. },
  61113. /**
  61114. * Returns a random element from within the given array, favoring the earlier entries.
  61115. *
  61116. * @method Phaser.Math.RandomDataGenerator#weightedPick
  61117. * @since 3.0.0
  61118. *
  61119. * @param {array} array - The array to pick a random element from.
  61120. *
  61121. * @return {*} A random member of the array.
  61122. */
  61123. weightedPick: function (array)
  61124. {
  61125. return array[~~(Math.pow(this.frac(), 2) * (array.length - 1) + 0.5)];
  61126. },
  61127. /**
  61128. * 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.
  61129. *
  61130. * @method Phaser.Math.RandomDataGenerator#timestamp
  61131. * @since 3.0.0
  61132. *
  61133. * @param {number} min - The minimum value in the range.
  61134. * @param {number} max - The maximum value in the range.
  61135. *
  61136. * @return {number} A random timestamp between min and max.
  61137. */
  61138. timestamp: function (min, max)
  61139. {
  61140. return this.realInRange(min || 946684800000, max || 1577862000000);
  61141. },
  61142. /**
  61143. * Returns a random angle between -180 and 180.
  61144. *
  61145. * @method Phaser.Math.RandomDataGenerator#angle
  61146. * @since 3.0.0
  61147. *
  61148. * @return {number} A random number between -180 and 180.
  61149. */
  61150. angle: function ()
  61151. {
  61152. return this.integerInRange(-180, 180);
  61153. },
  61154. /**
  61155. * Returns a random rotation in radians, between -3.141 and 3.141
  61156. *
  61157. * @method Phaser.Math.RandomDataGenerator#rotation
  61158. * @since 3.0.0
  61159. *
  61160. * @return {number} A random number between -3.141 and 3.141
  61161. */
  61162. rotation: function ()
  61163. {
  61164. return this.realInRange(-3.1415926, 3.1415926);
  61165. },
  61166. /**
  61167. * Gets or Sets the state of the generator. This allows you to retain the values
  61168. * that the generator is using between games, i.e. in a game save file.
  61169. *
  61170. * To seed this generator with a previously saved state you can pass it as the
  61171. * `seed` value in your game config, or call this method directly after Phaser has booted.
  61172. *
  61173. * Call this method with no parameters to return the current state.
  61174. *
  61175. * If providing a state it should match the same format that this method
  61176. * returns, which is a string with a header `!rnd` followed by the `c`,
  61177. * `s0`, `s1` and `s2` values respectively, each comma-delimited.
  61178. *
  61179. * @method Phaser.Math.RandomDataGenerator#state
  61180. * @since 3.0.0
  61181. *
  61182. * @param {string} [state] - Generator state to be set.
  61183. *
  61184. * @return {string} The current state of the generator.
  61185. */
  61186. state: function (state)
  61187. {
  61188. if (typeof state === 'string' && state.match(/^!rnd/))
  61189. {
  61190. state = state.split(',');
  61191. this.c = parseFloat(state[1]);
  61192. this.s0 = parseFloat(state[2]);
  61193. this.s1 = parseFloat(state[3]);
  61194. this.s2 = parseFloat(state[4]);
  61195. }
  61196. return [ '!rnd', this.c, this.s0, this.s1, this.s2 ].join(',');
  61197. },
  61198. /**
  61199. * Shuffles the given array, using the current seed.
  61200. *
  61201. * @method Phaser.Math.RandomDataGenerator#shuffle
  61202. * @since 3.7.0
  61203. *
  61204. * @param {array} [array] - The array to be shuffled.
  61205. *
  61206. * @return {array} The shuffled array.
  61207. */
  61208. shuffle: function (array)
  61209. {
  61210. var len = array.length - 1;
  61211. for (var i = len; i > 0; i--)
  61212. {
  61213. var randomIndex = Math.floor(this.frac() * (len + 1));
  61214. var itemAtIndex = array[randomIndex];
  61215. array[randomIndex] = array[i];
  61216. array[i] = itemAtIndex;
  61217. }
  61218. return array;
  61219. }
  61220. });
  61221. module.exports = RandomDataGenerator;
  61222. /***/ }),
  61223. /* 303 */
  61224. /***/ (function(module, exports, __webpack_require__) {
  61225. /**
  61226. * @author Richard Davey <rich@photonstorm.com>
  61227. * @copyright 2018 Photon Storm Ltd.
  61228. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  61229. */
  61230. var CircumferencePoint = __webpack_require__(137);
  61231. var FromPercent = __webpack_require__(64);
  61232. var MATH_CONST = __webpack_require__(15);
  61233. var Point = __webpack_require__(5);
  61234. /**
  61235. * Returns a Point object containing the coordinates of a point on the circumference of the Circle
  61236. * based on the given angle normalized to the range 0 to 1. I.e. a value of 0.5 will give the point
  61237. * at 180 degrees around the circle.
  61238. *
  61239. * @function Phaser.Geom.Circle.GetPoint
  61240. * @since 3.0.0
  61241. *
  61242. * @generic {Phaser.Geom.Point} O - [out,$return]
  61243. *
  61244. * @param {Phaser.Geom.Circle} circle - The Circle to get the circumference point on.
  61245. * @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.
  61246. * @param {(Phaser.Geom.Point|object)} [out] - An object to store the return values in. If not given a Point object will be created.
  61247. *
  61248. * @return {(Phaser.Geom.Point|object)} A Point, or point-like object, containing the coordinates of the point around the circle.
  61249. */
  61250. var GetPoint = function (circle, position, out)
  61251. {
  61252. if (out === undefined) { out = new Point(); }
  61253. var angle = FromPercent(position, 0, MATH_CONST.PI2);
  61254. return CircumferencePoint(circle, angle, out);
  61255. };
  61256. module.exports = GetPoint;
  61257. /***/ }),
  61258. /* 304 */
  61259. /***/ (function(module, exports) {
  61260. /**
  61261. * @author Richard Davey <rich@photonstorm.com>
  61262. * @copyright 2018 Photon Storm Ltd.
  61263. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  61264. */
  61265. var ALIGN_CONST = {
  61266. /**
  61267. * A constant representing a top-left alignment or position.
  61268. * @constant
  61269. * @name Phaser.Display.Align.TOP_LEFT
  61270. * @since 3.0.0
  61271. * @type {integer}
  61272. */
  61273. TOP_LEFT: 0,
  61274. /**
  61275. * A constant representing a top-center alignment or position.
  61276. * @constant
  61277. * @name Phaser.Display.Align.TOP_CENTER
  61278. * @since 3.0.0
  61279. * @type {integer}
  61280. */
  61281. TOP_CENTER: 1,
  61282. /**
  61283. * A constant representing a top-right alignment or position.
  61284. * @constant
  61285. * @name Phaser.Display.Align.TOP_RIGHT
  61286. * @since 3.0.0
  61287. * @type {integer}
  61288. */
  61289. TOP_RIGHT: 2,
  61290. /**
  61291. * A constant representing a left-top alignment or position.
  61292. * @constant
  61293. * @name Phaser.Display.Align.LEFT_TOP
  61294. * @since 3.0.0
  61295. * @type {integer}
  61296. */
  61297. LEFT_TOP: 3,
  61298. /**
  61299. * A constant representing a left-center alignment or position.
  61300. * @constant
  61301. * @name Phaser.Display.Align.LEFT_CENTER
  61302. * @since 3.0.0
  61303. * @type {integer}
  61304. */
  61305. LEFT_CENTER: 4,
  61306. /**
  61307. * A constant representing a left-bottom alignment or position.
  61308. * @constant
  61309. * @name Phaser.Display.Align.LEFT_BOTTOM
  61310. * @since 3.0.0
  61311. * @type {integer}
  61312. */
  61313. LEFT_BOTTOM: 5,
  61314. /**
  61315. * A constant representing a center alignment or position.
  61316. * @constant
  61317. * @name Phaser.Display.Align.CENTER
  61318. * @since 3.0.0
  61319. * @type {integer}
  61320. */
  61321. CENTER: 6,
  61322. /**
  61323. * A constant representing a right-top alignment or position.
  61324. * @constant
  61325. * @name Phaser.Display.Align.RIGHT_TOP
  61326. * @since 3.0.0
  61327. * @type {integer}
  61328. */
  61329. RIGHT_TOP: 7,
  61330. /**
  61331. * A constant representing a right-center alignment or position.
  61332. * @constant
  61333. * @name Phaser.Display.Align.RIGHT_CENTER
  61334. * @since 3.0.0
  61335. * @type {integer}
  61336. */
  61337. RIGHT_CENTER: 8,
  61338. /**
  61339. * A constant representing a right-bottom alignment or position.
  61340. * @constant
  61341. * @name Phaser.Display.Align.RIGHT_BOTTOM
  61342. * @since 3.0.0
  61343. * @type {integer}
  61344. */
  61345. RIGHT_BOTTOM: 9,
  61346. /**
  61347. * A constant representing a bottom-left alignment or position.
  61348. * @constant
  61349. * @name Phaser.Display.Align.BOTTOM_LEFT
  61350. * @since 3.0.0
  61351. * @type {integer}
  61352. */
  61353. BOTTOM_LEFT: 10,
  61354. /**
  61355. * A constant representing a bottom-center alignment or position.
  61356. * @constant
  61357. * @name Phaser.Display.Align.BOTTOM_CENTER
  61358. * @since 3.0.0
  61359. * @type {integer}
  61360. */
  61361. BOTTOM_CENTER: 11,
  61362. /**
  61363. * A constant representing a bottom-right alignment or position.
  61364. * @constant
  61365. * @name Phaser.Display.Align.BOTTOM_RIGHT
  61366. * @since 3.0.0
  61367. * @type {integer}
  61368. */
  61369. BOTTOM_RIGHT: 12
  61370. };
  61371. module.exports = ALIGN_CONST;
  61372. /***/ }),
  61373. /* 305 */
  61374. /***/ (function(module, exports, __webpack_require__) {
  61375. /**
  61376. * The `Matter.Constraint` module contains methods for creating and manipulating constraints.
  61377. * Constraints are used for specifying that a fixed distance must be maintained between two bodies (or a body and a fixed world-space position).
  61378. * The stiffness of constraints can be modified to create springs or elastic.
  61379. *
  61380. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  61381. *
  61382. * @class Constraint
  61383. */
  61384. var Constraint = {};
  61385. module.exports = Constraint;
  61386. var Vertices = __webpack_require__(127);
  61387. var Vector = __webpack_require__(106);
  61388. var Sleeping = __webpack_require__(336);
  61389. var Bounds = __webpack_require__(126);
  61390. var Axes = __webpack_require__(685);
  61391. var Common = __webpack_require__(42);
  61392. (function() {
  61393. Constraint._warming = 0.4;
  61394. Constraint._torqueDampen = 1;
  61395. Constraint._minLength = 0.000001;
  61396. /**
  61397. * Creates a new constraint.
  61398. * All properties have default values, and many are pre-calculated automatically based on other properties.
  61399. * To simulate a revolute constraint (or pin joint) set `length: 0` and a high `stiffness` value (e.g. `0.7` or above).
  61400. * If the constraint is unstable, try lowering the `stiffness` value and / or increasing `engine.constraintIterations`.
  61401. * See the properties section below for detailed information on what you can pass via the `options` object.
  61402. * @method create
  61403. * @param {} options
  61404. * @return {constraint} constraint
  61405. */
  61406. Constraint.create = function(options) {
  61407. var constraint = options;
  61408. // if bodies defined but no points, use body centre
  61409. if (constraint.bodyA && !constraint.pointA)
  61410. constraint.pointA = { x: 0, y: 0 };
  61411. if (constraint.bodyB && !constraint.pointB)
  61412. constraint.pointB = { x: 0, y: 0 };
  61413. // calculate static length using initial world space points
  61414. var initialPointA = constraint.bodyA ? Vector.add(constraint.bodyA.position, constraint.pointA) : constraint.pointA,
  61415. initialPointB = constraint.bodyB ? Vector.add(constraint.bodyB.position, constraint.pointB) : constraint.pointB,
  61416. length = Vector.magnitude(Vector.sub(initialPointA, initialPointB));
  61417. constraint.length = typeof constraint.length !== 'undefined' ? constraint.length : length;
  61418. // option defaults
  61419. constraint.id = constraint.id || Common.nextId();
  61420. constraint.label = constraint.label || 'Constraint';
  61421. constraint.type = 'constraint';
  61422. constraint.stiffness = constraint.stiffness || (constraint.length > 0 ? 1 : 0.7);
  61423. constraint.damping = constraint.damping || 0;
  61424. constraint.angularStiffness = constraint.angularStiffness || 0;
  61425. constraint.angleA = constraint.bodyA ? constraint.bodyA.angle : constraint.angleA;
  61426. constraint.angleB = constraint.bodyB ? constraint.bodyB.angle : constraint.angleB;
  61427. constraint.plugin = {};
  61428. // render
  61429. var render = {
  61430. visible: true,
  61431. lineWidth: 2,
  61432. strokeStyle: '#ffffff',
  61433. type: 'line',
  61434. anchors: true
  61435. };
  61436. if (constraint.length === 0 && constraint.stiffness > 0.1) {
  61437. render.type = 'pin';
  61438. render.anchors = false;
  61439. } else if (constraint.stiffness < 0.9) {
  61440. render.type = 'spring';
  61441. }
  61442. constraint.render = Common.extend(render, constraint.render);
  61443. return constraint;
  61444. };
  61445. /**
  61446. * Prepares for solving by constraint warming.
  61447. * @private
  61448. * @method preSolveAll
  61449. * @param {body[]} bodies
  61450. */
  61451. Constraint.preSolveAll = function(bodies) {
  61452. for (var i = 0; i < bodies.length; i += 1) {
  61453. var body = bodies[i],
  61454. impulse = body.constraintImpulse;
  61455. if (body.isStatic || (impulse.x === 0 && impulse.y === 0 && impulse.angle === 0)) {
  61456. continue;
  61457. }
  61458. body.position.x += impulse.x;
  61459. body.position.y += impulse.y;
  61460. body.angle += impulse.angle;
  61461. }
  61462. };
  61463. /**
  61464. * Solves all constraints in a list of collisions.
  61465. * @private
  61466. * @method solveAll
  61467. * @param {constraint[]} constraints
  61468. * @param {number} timeScale
  61469. */
  61470. Constraint.solveAll = function(constraints, timeScale) {
  61471. // Solve fixed constraints first.
  61472. for (var i = 0; i < constraints.length; i += 1) {
  61473. var constraint = constraints[i],
  61474. fixedA = !constraint.bodyA || (constraint.bodyA && constraint.bodyA.isStatic),
  61475. fixedB = !constraint.bodyB || (constraint.bodyB && constraint.bodyB.isStatic);
  61476. if (fixedA || fixedB) {
  61477. Constraint.solve(constraints[i], timeScale);
  61478. }
  61479. }
  61480. // Solve free constraints last.
  61481. for (i = 0; i < constraints.length; i += 1) {
  61482. constraint = constraints[i];
  61483. fixedA = !constraint.bodyA || (constraint.bodyA && constraint.bodyA.isStatic);
  61484. fixedB = !constraint.bodyB || (constraint.bodyB && constraint.bodyB.isStatic);
  61485. if (!fixedA && !fixedB) {
  61486. Constraint.solve(constraints[i], timeScale);
  61487. }
  61488. }
  61489. };
  61490. /**
  61491. * Solves a distance constraint with Gauss-Siedel method.
  61492. * @private
  61493. * @method solve
  61494. * @param {constraint} constraint
  61495. * @param {number} timeScale
  61496. */
  61497. Constraint.solve = function(constraint, timeScale) {
  61498. var bodyA = constraint.bodyA,
  61499. bodyB = constraint.bodyB,
  61500. pointA = constraint.pointA,
  61501. pointB = constraint.pointB;
  61502. if (!bodyA && !bodyB)
  61503. return;
  61504. // update reference angle
  61505. if (bodyA && !bodyA.isStatic) {
  61506. Vector.rotate(pointA, bodyA.angle - constraint.angleA, pointA);
  61507. constraint.angleA = bodyA.angle;
  61508. }
  61509. // update reference angle
  61510. if (bodyB && !bodyB.isStatic) {
  61511. Vector.rotate(pointB, bodyB.angle - constraint.angleB, pointB);
  61512. constraint.angleB = bodyB.angle;
  61513. }
  61514. var pointAWorld = pointA,
  61515. pointBWorld = pointB;
  61516. if (bodyA) pointAWorld = Vector.add(bodyA.position, pointA);
  61517. if (bodyB) pointBWorld = Vector.add(bodyB.position, pointB);
  61518. if (!pointAWorld || !pointBWorld)
  61519. return;
  61520. var delta = Vector.sub(pointAWorld, pointBWorld),
  61521. currentLength = Vector.magnitude(delta);
  61522. // prevent singularity
  61523. if (currentLength < Constraint._minLength) {
  61524. currentLength = Constraint._minLength;
  61525. }
  61526. // solve distance constraint with Gauss-Siedel method
  61527. var difference = (currentLength - constraint.length) / currentLength,
  61528. stiffness = constraint.stiffness < 1 ? constraint.stiffness * timeScale : constraint.stiffness,
  61529. force = Vector.mult(delta, difference * stiffness),
  61530. massTotal = (bodyA ? bodyA.inverseMass : 0) + (bodyB ? bodyB.inverseMass : 0),
  61531. inertiaTotal = (bodyA ? bodyA.inverseInertia : 0) + (bodyB ? bodyB.inverseInertia : 0),
  61532. resistanceTotal = massTotal + inertiaTotal,
  61533. torque,
  61534. share,
  61535. normal,
  61536. normalVelocity,
  61537. relativeVelocity;
  61538. if (constraint.damping) {
  61539. var zero = Vector.create();
  61540. normal = Vector.div(delta, currentLength);
  61541. relativeVelocity = Vector.sub(
  61542. bodyB && Vector.sub(bodyB.position, bodyB.positionPrev) || zero,
  61543. bodyA && Vector.sub(bodyA.position, bodyA.positionPrev) || zero
  61544. );
  61545. normalVelocity = Vector.dot(normal, relativeVelocity);
  61546. }
  61547. if (bodyA && !bodyA.isStatic) {
  61548. share = bodyA.inverseMass / massTotal;
  61549. // keep track of applied impulses for post solving
  61550. bodyA.constraintImpulse.x -= force.x * share;
  61551. bodyA.constraintImpulse.y -= force.y * share;
  61552. // apply forces
  61553. bodyA.position.x -= force.x * share;
  61554. bodyA.position.y -= force.y * share;
  61555. // apply damping
  61556. if (constraint.damping) {
  61557. bodyA.positionPrev.x -= constraint.damping * normal.x * normalVelocity * share;
  61558. bodyA.positionPrev.y -= constraint.damping * normal.y * normalVelocity * share;
  61559. }
  61560. // apply torque
  61561. torque = (Vector.cross(pointA, force) / resistanceTotal) * Constraint._torqueDampen * bodyA.inverseInertia * (1 - constraint.angularStiffness);
  61562. bodyA.constraintImpulse.angle -= torque;
  61563. bodyA.angle -= torque;
  61564. }
  61565. if (bodyB && !bodyB.isStatic) {
  61566. share = bodyB.inverseMass / massTotal;
  61567. // keep track of applied impulses for post solving
  61568. bodyB.constraintImpulse.x += force.x * share;
  61569. bodyB.constraintImpulse.y += force.y * share;
  61570. // apply forces
  61571. bodyB.position.x += force.x * share;
  61572. bodyB.position.y += force.y * share;
  61573. // apply damping
  61574. if (constraint.damping) {
  61575. bodyB.positionPrev.x += constraint.damping * normal.x * normalVelocity * share;
  61576. bodyB.positionPrev.y += constraint.damping * normal.y * normalVelocity * share;
  61577. }
  61578. // apply torque
  61579. torque = (Vector.cross(pointB, force) / resistanceTotal) * Constraint._torqueDampen * bodyB.inverseInertia * (1 - constraint.angularStiffness);
  61580. bodyB.constraintImpulse.angle += torque;
  61581. bodyB.angle += torque;
  61582. }
  61583. };
  61584. /**
  61585. * Performs body updates required after solving constraints.
  61586. * @private
  61587. * @method postSolveAll
  61588. * @param {body[]} bodies
  61589. */
  61590. Constraint.postSolveAll = function(bodies) {
  61591. for (var i = 0; i < bodies.length; i++) {
  61592. var body = bodies[i],
  61593. impulse = body.constraintImpulse;
  61594. if (body.isStatic || (impulse.x === 0 && impulse.y === 0 && impulse.angle === 0)) {
  61595. continue;
  61596. }
  61597. Sleeping.set(body, false);
  61598. // update geometry and reset
  61599. for (var j = 0; j < body.parts.length; j++) {
  61600. var part = body.parts[j];
  61601. Vertices.translate(part.vertices, impulse);
  61602. if (j > 0) {
  61603. part.position.x += impulse.x;
  61604. part.position.y += impulse.y;
  61605. }
  61606. if (impulse.angle !== 0) {
  61607. Vertices.rotate(part.vertices, impulse.angle, body.position);
  61608. Axes.rotate(part.axes, impulse.angle);
  61609. if (j > 0) {
  61610. Vector.rotateAbout(part.position, impulse.angle, body.position, part.position);
  61611. }
  61612. }
  61613. Bounds.update(part.bounds, part.vertices, body.velocity);
  61614. }
  61615. // dampen the cached impulse for warming next step
  61616. impulse.angle *= Constraint._warming;
  61617. impulse.x *= Constraint._warming;
  61618. impulse.y *= Constraint._warming;
  61619. }
  61620. };
  61621. /*
  61622. *
  61623. * Properties Documentation
  61624. *
  61625. */
  61626. /**
  61627. * An integer `Number` uniquely identifying number generated in `Composite.create` by `Common.nextId`.
  61628. *
  61629. * @property id
  61630. * @type number
  61631. */
  61632. /**
  61633. * A `String` denoting the type of object.
  61634. *
  61635. * @property type
  61636. * @type string
  61637. * @default "constraint"
  61638. * @readOnly
  61639. */
  61640. /**
  61641. * An arbitrary `String` name to help the user identify and manage bodies.
  61642. *
  61643. * @property label
  61644. * @type string
  61645. * @default "Constraint"
  61646. */
  61647. /**
  61648. * An `Object` that defines the rendering properties to be consumed by the module `Matter.Render`.
  61649. *
  61650. * @property render
  61651. * @type object
  61652. */
  61653. /**
  61654. * A flag that indicates if the constraint should be rendered.
  61655. *
  61656. * @property render.visible
  61657. * @type boolean
  61658. * @default true
  61659. */
  61660. /**
  61661. * A `Number` that defines the line width to use when rendering the constraint outline.
  61662. * A value of `0` means no outline will be rendered.
  61663. *
  61664. * @property render.lineWidth
  61665. * @type number
  61666. * @default 2
  61667. */
  61668. /**
  61669. * A `String` that defines the stroke style to use when rendering the constraint outline.
  61670. * It is the same as when using a canvas, so it accepts CSS style property values.
  61671. *
  61672. * @property render.strokeStyle
  61673. * @type string
  61674. * @default a random colour
  61675. */
  61676. /**
  61677. * A `String` that defines the constraint rendering type.
  61678. * The possible values are 'line', 'pin', 'spring'.
  61679. * An appropriate render type will be automatically chosen unless one is given in options.
  61680. *
  61681. * @property render.type
  61682. * @type string
  61683. * @default 'line'
  61684. */
  61685. /**
  61686. * A `Boolean` that defines if the constraint's anchor points should be rendered.
  61687. *
  61688. * @property render.anchors
  61689. * @type boolean
  61690. * @default true
  61691. */
  61692. /**
  61693. * The first possible `Body` that this constraint is attached to.
  61694. *
  61695. * @property bodyA
  61696. * @type body
  61697. * @default null
  61698. */
  61699. /**
  61700. * The second possible `Body` that this constraint is attached to.
  61701. *
  61702. * @property bodyB
  61703. * @type body
  61704. * @default null
  61705. */
  61706. /**
  61707. * A `Vector` that specifies the offset of the constraint from center of the `constraint.bodyA` if defined, otherwise a world-space position.
  61708. *
  61709. * @property pointA
  61710. * @type vector
  61711. * @default { x: 0, y: 0 }
  61712. */
  61713. /**
  61714. * A `Vector` that specifies the offset of the constraint from center of the `constraint.bodyA` if defined, otherwise a world-space position.
  61715. *
  61716. * @property pointB
  61717. * @type vector
  61718. * @default { x: 0, y: 0 }
  61719. */
  61720. /**
  61721. * A `Number` that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`.
  61722. * A value of `1` means the constraint should be very stiff.
  61723. * A value of `0.2` means the constraint acts like a soft spring.
  61724. *
  61725. * @property stiffness
  61726. * @type number
  61727. * @default 1
  61728. */
  61729. /**
  61730. * A `Number` that specifies the damping of the constraint,
  61731. * i.e. the amount of resistance applied to each body based on their velocities to limit the amount of oscillation.
  61732. * Damping will only be apparent when the constraint also has a very low `stiffness`.
  61733. * A value of `0.1` means the constraint will apply heavy damping, resulting in little to no oscillation.
  61734. * A value of `0` means the constraint will apply no damping.
  61735. *
  61736. * @property damping
  61737. * @type number
  61738. * @default 0
  61739. */
  61740. /**
  61741. * A `Number` that specifies the target resting length of the constraint.
  61742. * It is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`.
  61743. *
  61744. * @property length
  61745. * @type number
  61746. */
  61747. /**
  61748. * An object reserved for storing plugin-specific properties.
  61749. *
  61750. * @property plugin
  61751. * @type {}
  61752. */
  61753. })();
  61754. /***/ }),
  61755. /* 306 */
  61756. /***/ (function(module, exports, __webpack_require__) {
  61757. /**
  61758. * The `Matter.Events` module contains methods to fire and listen to events on other objects.
  61759. *
  61760. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  61761. *
  61762. * @class Events
  61763. */
  61764. var Events = {};
  61765. module.exports = Events;
  61766. var Common = __webpack_require__(42);
  61767. (function() {
  61768. /**
  61769. * Subscribes a callback function to the given object's `eventName`.
  61770. * @method on
  61771. * @param {} object
  61772. * @param {string} eventNames
  61773. * @param {function} callback
  61774. */
  61775. Events.on = function(object, eventNames, callback) {
  61776. var names = eventNames.split(' '),
  61777. name;
  61778. for (var i = 0; i < names.length; i++) {
  61779. name = names[i];
  61780. object.events = object.events || {};
  61781. object.events[name] = object.events[name] || [];
  61782. object.events[name].push(callback);
  61783. }
  61784. return callback;
  61785. };
  61786. /**
  61787. * Removes the given event callback. If no callback, clears all callbacks in `eventNames`. If no `eventNames`, clears all events.
  61788. * @method off
  61789. * @param {} object
  61790. * @param {string} eventNames
  61791. * @param {function} callback
  61792. */
  61793. Events.off = function(object, eventNames, callback) {
  61794. if (!eventNames) {
  61795. object.events = {};
  61796. return;
  61797. }
  61798. // handle Events.off(object, callback)
  61799. if (typeof eventNames === 'function') {
  61800. callback = eventNames;
  61801. eventNames = Common.keys(object.events).join(' ');
  61802. }
  61803. var names = eventNames.split(' ');
  61804. for (var i = 0; i < names.length; i++) {
  61805. var callbacks = object.events[names[i]],
  61806. newCallbacks = [];
  61807. if (callback && callbacks) {
  61808. for (var j = 0; j < callbacks.length; j++) {
  61809. if (callbacks[j] !== callback)
  61810. newCallbacks.push(callbacks[j]);
  61811. }
  61812. }
  61813. object.events[names[i]] = newCallbacks;
  61814. }
  61815. };
  61816. /**
  61817. * Fires all the callbacks subscribed to the given object's `eventName`, in the order they subscribed, if any.
  61818. * @method trigger
  61819. * @param {} object
  61820. * @param {string} eventNames
  61821. * @param {} event
  61822. */
  61823. Events.trigger = function(object, eventNames, event) {
  61824. var names,
  61825. name,
  61826. callbacks,
  61827. eventClone;
  61828. if (object.events) {
  61829. if (!event)
  61830. event = {};
  61831. names = eventNames.split(' ');
  61832. for (var i = 0; i < names.length; i++) {
  61833. name = names[i];
  61834. callbacks = object.events[name];
  61835. if (callbacks) {
  61836. eventClone = Common.clone(event, false);
  61837. eventClone.name = name;
  61838. eventClone.source = object;
  61839. for (var j = 0; j < callbacks.length; j++) {
  61840. callbacks[j].apply(object, [eventClone]);
  61841. }
  61842. }
  61843. }
  61844. }
  61845. };
  61846. })();
  61847. /***/ }),
  61848. /* 307 */
  61849. /***/ (function(module, exports, __webpack_require__) {
  61850. /**
  61851. * @author Richard Davey <rich@photonstorm.com>
  61852. * @copyright 2018 Photon Storm Ltd.
  61853. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  61854. */
  61855. var Class = __webpack_require__(0);
  61856. /**
  61857. * This event is dispatched when an animation starts playing.
  61858. *
  61859. * @event Phaser.GameObjects.Components.Animation#onStartEvent
  61860. * @param {Phaser.Animations.Animation} animation - Reference to the currently playing animation.
  61861. * @param {Phaser.Animations.AnimationFrame} frame - Reference to the current Animation Frame.
  61862. */
  61863. /**
  61864. * This event is dispatched when an animation repeats.
  61865. *
  61866. * @event Phaser.GameObjects.Components.Animation#onRepeatEvent
  61867. * @param {Phaser.Animations.Animation} animation - Reference to the currently playing animation.
  61868. * @param {Phaser.Animations.AnimationFrame} frame - Reference to the current Animation Frame.
  61869. * @param {integer} repeatCount - The number of times this animation has repeated.
  61870. */
  61871. /**
  61872. * This event is dispatched when an animation updates. This happens when the animation frame changes,
  61873. * based on the animation frame rate and other factors like timeScale and delay.
  61874. *
  61875. * @event Phaser.GameObjects.Components.Animation#onUpdateEvent
  61876. * @param {Phaser.Animations.Animation} animation - Reference to the currently playing animation.
  61877. * @param {Phaser.Animations.AnimationFrame} frame - Reference to the current Animation Frame.
  61878. */
  61879. /**
  61880. * This event is dispatched when an animation completes playing, either naturally or via Animation.stop.
  61881. *
  61882. * @event Phaser.GameObjects.Components.Animation#onCompleteEvent
  61883. * @param {Phaser.Animations.Animation} animation - Reference to the currently playing animation.
  61884. * @param {Phaser.Animations.AnimationFrame} frame - Reference to the current Animation Frame.
  61885. */
  61886. /**
  61887. * @classdesc
  61888. * A Game Object Animation Controller.
  61889. *
  61890. * This controller lives as an instance within a Game Object, accessible as `sprite.anims`.
  61891. *
  61892. * @class Animation
  61893. * @memberOf Phaser.GameObjects.Components
  61894. * @constructor
  61895. * @since 3.0.0
  61896. *
  61897. * @param {Phaser.GameObjects.GameObject} parent - The Game Object to which this animation controller belongs.
  61898. */
  61899. var Animation = new Class({
  61900. initialize:
  61901. function Animation (parent)
  61902. {
  61903. /**
  61904. * The Game Object to which this animation controller belongs.
  61905. *
  61906. * @name Phaser.GameObjects.Components.Animation#parent
  61907. * @type {Phaser.GameObjects.GameObject}
  61908. * @since 3.0.0
  61909. */
  61910. this.parent = parent;
  61911. /**
  61912. * A reference to the global Animation Manager.
  61913. *
  61914. * @name Phaser.GameObjects.Components.Animation#animationManager
  61915. * @type {Phaser.Animations.AnimationManager}
  61916. * @since 3.0.0
  61917. */
  61918. this.animationManager = parent.scene.sys.anims;
  61919. this.animationManager.once('remove', this.remove, this);
  61920. /**
  61921. * Is an animation currently playing or not?
  61922. *
  61923. * @name Phaser.GameObjects.Components.Animation#isPlaying
  61924. * @type {boolean}
  61925. * @default false
  61926. * @since 3.0.0
  61927. */
  61928. this.isPlaying = false;
  61929. /**
  61930. * The current Animation loaded into this Animation Controller.
  61931. *
  61932. * @name Phaser.GameObjects.Components.Animation#currentAnim
  61933. * @type {?Phaser.Animations.Animation}
  61934. * @default null
  61935. * @since 3.0.0
  61936. */
  61937. this.currentAnim = null;
  61938. /**
  61939. * The current AnimationFrame being displayed by this Animation Controller.
  61940. *
  61941. * @name Phaser.GameObjects.Components.Animation#currentFrame
  61942. * @type {?Phaser.Animations.AnimationFrame}
  61943. * @default null
  61944. * @since 3.0.0
  61945. */
  61946. this.currentFrame = null;
  61947. /**
  61948. * Time scale factor.
  61949. *
  61950. * @name Phaser.GameObjects.Components.Animation#_timeScale
  61951. * @type {number}
  61952. * @private
  61953. * @default 1
  61954. * @since 3.0.0
  61955. */
  61956. this._timeScale = 1;
  61957. /**
  61958. * The frame rate of playback in frames per second.
  61959. * The default is 24 if the `duration` property is `null`.
  61960. *
  61961. * @name Phaser.GameObjects.Components.Animation#frameRate
  61962. * @type {number}
  61963. * @default 0
  61964. * @since 3.0.0
  61965. */
  61966. this.frameRate = 0;
  61967. /**
  61968. * How long the animation should play for, in milliseconds.
  61969. * If the `frameRate` property has been set then it overrides this value,
  61970. * otherwise the `frameRate` is derived from `duration`.
  61971. *
  61972. * @name Phaser.GameObjects.Components.Animation#duration
  61973. * @type {number}
  61974. * @default 0
  61975. * @since 3.0.0
  61976. */
  61977. this.duration = 0;
  61978. /**
  61979. * ms per frame, not including frame specific modifiers that may be present in the Animation data.
  61980. *
  61981. * @name Phaser.GameObjects.Components.Animation#msPerFrame
  61982. * @type {number}
  61983. * @default 0
  61984. * @since 3.0.0
  61985. */
  61986. this.msPerFrame = 0;
  61987. /**
  61988. * Skip frames if the time lags, or always advanced anyway?
  61989. *
  61990. * @name Phaser.GameObjects.Components.Animation#skipMissedFrames
  61991. * @type {boolean}
  61992. * @default true
  61993. * @since 3.0.0
  61994. */
  61995. this.skipMissedFrames = true;
  61996. /**
  61997. * A delay before starting playback, in milliseconds.
  61998. *
  61999. * @name Phaser.GameObjects.Components.Animation#_delay
  62000. * @type {number}
  62001. * @private
  62002. * @default 0
  62003. * @since 3.0.0
  62004. */
  62005. this._delay = 0;
  62006. /**
  62007. * Number of times to repeat the animation (-1 for infinity)
  62008. *
  62009. * @name Phaser.GameObjects.Components.Animation#_repeat
  62010. * @type {number}
  62011. * @private
  62012. * @default 0
  62013. * @since 3.0.0
  62014. */
  62015. this._repeat = 0;
  62016. /**
  62017. * Delay before the repeat starts, in milliseconds.
  62018. *
  62019. * @name Phaser.GameObjects.Components.Animation#_repeatDelay
  62020. * @type {number}
  62021. * @private
  62022. * @default 0
  62023. * @since 3.0.0
  62024. */
  62025. this._repeatDelay = 0;
  62026. /**
  62027. * Should the animation yoyo? (reverse back down to the start) before repeating?
  62028. *
  62029. * @name Phaser.GameObjects.Components.Animation#_yoyo
  62030. * @type {boolean}
  62031. * @private
  62032. * @default false
  62033. * @since 3.0.0
  62034. */
  62035. this._yoyo = false;
  62036. /**
  62037. * Will the playhead move forwards (`true`) or in reverse (`false`)
  62038. *
  62039. * @name Phaser.GameObjects.Components.Animation#forward
  62040. * @type {boolean}
  62041. * @default true
  62042. * @since 3.0.0
  62043. */
  62044. this.forward = true;
  62045. /**
  62046. * Internal time overflow accumulator.
  62047. *
  62048. * @name Phaser.GameObjects.Components.Animation#accumulator
  62049. * @type {number}
  62050. * @default 0
  62051. * @since 3.0.0
  62052. */
  62053. this.accumulator = 0;
  62054. /**
  62055. * The time point at which the next animation frame will change.
  62056. *
  62057. * @name Phaser.GameObjects.Components.Animation#nextTick
  62058. * @type {number}
  62059. * @default 0
  62060. * @since 3.0.0
  62061. */
  62062. this.nextTick = 0;
  62063. /**
  62064. * An internal counter keeping track of how many repeats are left to play.
  62065. *
  62066. * @name Phaser.GameObjects.Components.Animation#repeatCounter
  62067. * @type {number}
  62068. * @default 0
  62069. * @since 3.0.0
  62070. */
  62071. this.repeatCounter = 0;
  62072. /**
  62073. * An internal flag keeping track of pending repeats.
  62074. *
  62075. * @name Phaser.GameObjects.Components.Animation#pendingRepeat
  62076. * @type {boolean}
  62077. * @default false
  62078. * @since 3.0.0
  62079. */
  62080. this.pendingRepeat = false;
  62081. /**
  62082. * Is the Animation paused?
  62083. *
  62084. * @name Phaser.GameObjects.Components.Animation#_paused
  62085. * @type {boolean}
  62086. * @private
  62087. * @default false
  62088. * @since 3.0.0
  62089. */
  62090. this._paused = false;
  62091. /**
  62092. * Was the animation previously playing before being paused?
  62093. *
  62094. * @name Phaser.GameObjects.Components.Animation#_wasPlaying
  62095. * @type {boolean}
  62096. * @private
  62097. * @default false
  62098. * @since 3.0.0
  62099. */
  62100. this._wasPlaying = false;
  62101. /**
  62102. * Internal property tracking if this Animation is waiting to stop.
  62103. *
  62104. * 0 = No
  62105. * 1 = Waiting for ms to pass
  62106. * 2 = Waiting for repeat
  62107. * 3 = Waiting for specific frame
  62108. *
  62109. * @name Phaser.GameObjects.Components.Animation#_pendingStop
  62110. * @type {integer}
  62111. * @private
  62112. * @since 3.4.0
  62113. */
  62114. this._pendingStop = 0;
  62115. /**
  62116. * Internal property used by _pendingStop.
  62117. *
  62118. * @name Phaser.GameObjects.Components.Animation#_pendingStopValue
  62119. * @type {any}
  62120. * @private
  62121. * @since 3.4.0
  62122. */
  62123. this._pendingStopValue;
  62124. },
  62125. /**
  62126. * Sets the amount of time, in milliseconds, that the animation will be delayed before starting playback.
  62127. *
  62128. * @method Phaser.GameObjects.Components.Animation#setDelay
  62129. * @since 3.4.0
  62130. *
  62131. * @param {integer} [value=0] - The amount of time, in milliseconds, to wait before starting playback.
  62132. *
  62133. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62134. */
  62135. setDelay: function (value)
  62136. {
  62137. if (value === undefined) { value = 0; }
  62138. this._delay = value;
  62139. return this.parent;
  62140. },
  62141. /**
  62142. * Gets the amount of time, in milliseconds that the animation will be delayed before starting playback.
  62143. *
  62144. * @method Phaser.GameObjects.Components.Animation#getDelay
  62145. * @since 3.4.0
  62146. *
  62147. * @return {integer} The amount of time, in milliseconds, the Animation will wait before starting playback.
  62148. */
  62149. getDelay: function ()
  62150. {
  62151. return this._delay;
  62152. },
  62153. /**
  62154. * Waits for the specified delay, in milliseconds, then starts playback of the requested animation.
  62155. *
  62156. * @method Phaser.GameObjects.Components.Animation#delayedPlay
  62157. * @since 3.0.0
  62158. *
  62159. * @param {integer} delay - The delay, in milliseconds, to wait before starting the animation playing.
  62160. * @param {string} key - The key of the animation to play.
  62161. * @param {integer} [startFrame=0] - The frame of the animation to start from.
  62162. *
  62163. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62164. */
  62165. delayedPlay: function (delay, key, startFrame)
  62166. {
  62167. this.play(key, true, startFrame);
  62168. this.nextTick += delay;
  62169. return this.parent;
  62170. },
  62171. /**
  62172. * Returns the key of the animation currently loaded into this component.
  62173. *
  62174. * @method Phaser.GameObjects.Components.Animation#getCurrentKey
  62175. * @since 3.0.0
  62176. *
  62177. * @return {string} The key of the Animation loaded into this component.
  62178. */
  62179. getCurrentKey: function ()
  62180. {
  62181. if (this.currentAnim)
  62182. {
  62183. return this.currentAnim.key;
  62184. }
  62185. },
  62186. /**
  62187. * Internal method used to load an animation into this component.
  62188. *
  62189. * @method Phaser.GameObjects.Components.Animation#load
  62190. * @protected
  62191. * @since 3.0.0
  62192. *
  62193. * @param {string} key - The key of the animation to load.
  62194. * @param {integer} [startFrame=0] - The start frame of the animation to load.
  62195. *
  62196. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62197. */
  62198. load: function (key, startFrame)
  62199. {
  62200. if (startFrame === undefined) { startFrame = 0; }
  62201. if (this.isPlaying)
  62202. {
  62203. this.stop();
  62204. }
  62205. // Load the new animation in
  62206. this.animationManager.load(this, key, startFrame);
  62207. return this.parent;
  62208. },
  62209. /**
  62210. * Pause the current animation and set the `isPlaying` property to `false`.
  62211. * You can optionally pause it at a specific frame.
  62212. *
  62213. * @method Phaser.GameObjects.Components.Animation#pause
  62214. * @since 3.0.0
  62215. *
  62216. * @param {Phaser.Animations.AnimationFrame} [atFrame] - An optional frame to set after pausing the animation.
  62217. *
  62218. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62219. */
  62220. pause: function (atFrame)
  62221. {
  62222. if (!this._paused)
  62223. {
  62224. this._paused = true;
  62225. this._wasPlaying = this.isPlaying;
  62226. this.isPlaying = false;
  62227. }
  62228. if (atFrame !== undefined)
  62229. {
  62230. this.updateFrame(atFrame);
  62231. }
  62232. return this.parent;
  62233. },
  62234. /**
  62235. * Resumes playback of a paused animation and sets the `isPlaying` property to `true`.
  62236. * You can optionally tell it to start playback from a specific frame.
  62237. *
  62238. * @method Phaser.GameObjects.Components.Animation#resume
  62239. * @since 3.0.0
  62240. *
  62241. * @param {Phaser.Animations.AnimationFrame} [fromFrame] - An optional frame to set before restarting playback.
  62242. *
  62243. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62244. */
  62245. resume: function (fromFrame)
  62246. {
  62247. if (this._paused)
  62248. {
  62249. this._paused = false;
  62250. this.isPlaying = this._wasPlaying;
  62251. }
  62252. if (fromFrame !== undefined)
  62253. {
  62254. this.updateFrame(fromFrame);
  62255. }
  62256. return this.parent;
  62257. },
  62258. /**
  62259. * `true` if the current animation is paused, otherwise `false`.
  62260. *
  62261. * @name Phaser.GameObjects.Components.Animation#isPaused
  62262. * @readOnly
  62263. * @type {boolean}
  62264. * @since 3.4.0
  62265. */
  62266. isPaused: {
  62267. get: function ()
  62268. {
  62269. return this._paused;
  62270. }
  62271. },
  62272. /**
  62273. * Plays an Animation on the Game Object that owns this Animation Component.
  62274. *
  62275. * @method Phaser.GameObjects.Components.Animation#play
  62276. * @fires Phaser.GameObjects.Components.Animation#onStartEvent
  62277. * @since 3.0.0
  62278. *
  62279. * @param {string} key - The string-based key of the animation to play, as defined previously in the Animation Manager.
  62280. * @param {boolean} [ignoreIfPlaying=false] - If an animation is already playing then ignore this call.
  62281. * @param {integer} [startFrame=0] - Optionally start the animation playing from this frame index.
  62282. *
  62283. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62284. */
  62285. play: function (key, ignoreIfPlaying, startFrame)
  62286. {
  62287. if (ignoreIfPlaying === undefined) { ignoreIfPlaying = false; }
  62288. if (startFrame === undefined) { startFrame = 0; }
  62289. if (ignoreIfPlaying && this.isPlaying && this.currentAnim.key === key)
  62290. {
  62291. return this.parent;
  62292. }
  62293. this.load(key, startFrame);
  62294. var anim = this.currentAnim;
  62295. var gameObject = this.parent;
  62296. // Should give us 9,007,199,254,740,991 safe repeats
  62297. this.repeatCounter = (this._repeat === -1) ? Number.MAX_VALUE : this._repeat;
  62298. anim.getFirstTick(this);
  62299. this.forward = true;
  62300. this.isPlaying = true;
  62301. this.pendingRepeat = false;
  62302. if (anim.showOnStart)
  62303. {
  62304. gameObject.visible = true;
  62305. }
  62306. gameObject.emit('animationstart', this.currentAnim, this.currentFrame);
  62307. return gameObject;
  62308. },
  62309. /**
  62310. * Returns a value between 0 and 1 indicating how far this animation is through, ignoring repeats and yoyos.
  62311. * If the animation has a non-zero repeat defined, `getProgress` and `getTotalProgress` will be different
  62312. * because `getProgress` doesn't include any repeats or repeat delays, whereas `getTotalProgress` does.
  62313. *
  62314. * @method Phaser.GameObjects.Components.Animation#getProgress
  62315. * @since 3.4.0
  62316. *
  62317. * @return {number} The progress of the current animation, between 0 and 1.
  62318. */
  62319. getProgress: function ()
  62320. {
  62321. var p = this.currentFrame.progress;
  62322. if (!this.forward)
  62323. {
  62324. p = 1 - p;
  62325. }
  62326. return p;
  62327. },
  62328. /**
  62329. * Takes a value between 0 and 1 and uses it to set how far this animation is through playback.
  62330. * Does not factor in repeats or yoyos, but does handle playing forwards or backwards.
  62331. *
  62332. * @method Phaser.GameObjects.Components.Animation#setProgress
  62333. * @since 3.4.0
  62334. *
  62335. * @param {number} [value=0] - The progress value, between 0 and 1.
  62336. *
  62337. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62338. */
  62339. setProgress: function (value)
  62340. {
  62341. if (!this.forward)
  62342. {
  62343. value = 1 - value;
  62344. }
  62345. this.setCurrentFrame(this.currentAnim.getFrameByProgress(value));
  62346. return this.parent;
  62347. },
  62348. /**
  62349. * Handle the removal of an animation from the Animation Manager.
  62350. *
  62351. * @method Phaser.GameObjects.Components.Animation#remove
  62352. * @since 3.0.0
  62353. *
  62354. * @param {string} [key] - The key of the removed Animation.
  62355. * @param {Phaser.Animations.Animation} [animation] - The removed Animation.
  62356. */
  62357. remove: function (key, animation)
  62358. {
  62359. if (animation === undefined) { animation = this.currentAnim; }
  62360. if (this.isPlaying && animation.key === this.currentAnim.key)
  62361. {
  62362. this.stop();
  62363. this.setCurrentFrame(this.currentAnim.frames[0]);
  62364. }
  62365. },
  62366. /**
  62367. * Gets the number of times that the animation will repeat
  62368. * after its first iteration. For example, if returns 1, the animation will
  62369. * play a total of twice (the initial play plus 1 repeat).
  62370. * A value of -1 means the animation will repeat indefinitely.
  62371. *
  62372. * @method Phaser.GameObjects.Components.Animation#getRepeat
  62373. * @since 3.4.0
  62374. *
  62375. * @return {integer} The number of times that the animation will repeat.
  62376. */
  62377. getRepeat: function ()
  62378. {
  62379. return this._repeat;
  62380. },
  62381. /**
  62382. * Sets the number of times that the animation should repeat
  62383. * after its first iteration. For example, if repeat is 1, the animation will
  62384. * play a total of twice (the initial play plus 1 repeat).
  62385. * To repeat indefinitely, use -1. repeat should always be an integer.
  62386. *
  62387. * @method Phaser.GameObjects.Components.Animation#setRepeat
  62388. * @since 3.4.0
  62389. *
  62390. * @param {integer} value - The number of times that the animation should repeat.
  62391. *
  62392. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62393. */
  62394. setRepeat: function (value)
  62395. {
  62396. this._repeat = value;
  62397. this.repeatCounter = 0;
  62398. return this.parent;
  62399. },
  62400. /**
  62401. * Gets the amount of delay between repeats, if any.
  62402. *
  62403. * @method Phaser.GameObjects.Components.Animation#getRepeatDelay
  62404. * @since 3.4.0
  62405. *
  62406. * @return {number} The delay between repeats.
  62407. */
  62408. getRepeatDelay: function ()
  62409. {
  62410. return this._repeatDelay;
  62411. },
  62412. /**
  62413. * Sets the amount of time in seconds between repeats.
  62414. * For example, if `repeat` is 2 and `repeatDelay` is 10, the animation will play initially,
  62415. * then wait for 10 seconds before repeating, then play again, then wait another 10 seconds
  62416. * before doing its final repeat.
  62417. *
  62418. * @method Phaser.GameObjects.Components.Animation#setRepeatDelay
  62419. * @since 3.4.0
  62420. *
  62421. * @param {number} value - The delay to wait between repeats, in seconds.
  62422. *
  62423. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62424. */
  62425. setRepeatDelay: function (value)
  62426. {
  62427. this._repeatDelay = value;
  62428. return this.parent;
  62429. },
  62430. /**
  62431. * Restarts the current animation from its beginning, optionally including its delay value.
  62432. *
  62433. * @method Phaser.GameObjects.Components.Animation#restart
  62434. * @since 3.0.0
  62435. *
  62436. * @param {boolean} [includeDelay=false] - Whether to include the delay value of the animation when restarting.
  62437. *
  62438. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62439. */
  62440. restart: function (includeDelay)
  62441. {
  62442. if (includeDelay === undefined) { includeDelay = false; }
  62443. this.currentAnim.getFirstTick(this, includeDelay);
  62444. this.forward = true;
  62445. this.isPlaying = true;
  62446. this.pendingRepeat = false;
  62447. this._paused = false;
  62448. // Set frame
  62449. this.updateFrame(this.currentAnim.frames[0]);
  62450. return this.parent;
  62451. },
  62452. /**
  62453. * Immediately stops the current animation from playing and dispatches the `animationcomplete` event.
  62454. *
  62455. * @method Phaser.GameObjects.Components.Animation#stop
  62456. * @fires Phaser.GameObjects.Components.Animation#onCompleteEvent
  62457. * @since 3.0.0
  62458. *
  62459. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62460. */
  62461. stop: function ()
  62462. {
  62463. this._pendingStop = 0;
  62464. this.isPlaying = false;
  62465. var gameObject = this.parent;
  62466. gameObject.emit('animationcomplete', this.currentAnim, this.currentFrame);
  62467. return gameObject;
  62468. },
  62469. /**
  62470. * Stops the current animation from playing after the specified time delay, given in milliseconds.
  62471. *
  62472. * @method Phaser.GameObjects.Components.Animation#stopAfterDelay
  62473. * @fires Phaser.GameObjects.Components.Animation#onCompleteEvent
  62474. * @since 3.4.0
  62475. *
  62476. * @param {integer} delay - The number of milliseconds to wait before stopping this animation.
  62477. *
  62478. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62479. */
  62480. stopAfterDelay: function (delay)
  62481. {
  62482. this._pendingStop = 1;
  62483. this._pendingStopValue = delay;
  62484. return this.parent;
  62485. },
  62486. /**
  62487. * Stops the current animation from playing when it next repeats.
  62488. *
  62489. * @method Phaser.GameObjects.Components.Animation#stopOnRepeat
  62490. * @fires Phaser.GameObjects.Components.Animation#onCompleteEvent
  62491. * @since 3.4.0
  62492. *
  62493. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62494. */
  62495. stopOnRepeat: function ()
  62496. {
  62497. this._pendingStop = 2;
  62498. return this.parent;
  62499. },
  62500. /**
  62501. * Stops the current animation from playing when it next sets the given frame.
  62502. * If this frame doesn't exist within the animation it will not stop it from playing.
  62503. *
  62504. * @method Phaser.GameObjects.Components.Animation#stopOnFrame
  62505. * @fires Phaser.GameObjects.Components.Animation#onCompleteEvent
  62506. * @since 3.4.0
  62507. *
  62508. * @param {Phaser.Animations.AnimationFrame} delay - The frame to check before stopping this animation.
  62509. *
  62510. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62511. */
  62512. stopOnFrame: function (frame)
  62513. {
  62514. this._pendingStop = 3;
  62515. this._pendingStopValue = frame;
  62516. return this.parent;
  62517. },
  62518. /**
  62519. * Sets the Time Scale factor, allowing you to make the animation go go faster or slower than default.
  62520. * Where 1 = normal speed (the default), 0.5 = half speed, 2 = double speed, etc.
  62521. *
  62522. * @method Phaser.GameObjects.Components.Animation#setTimeScale
  62523. * @since 3.4.0
  62524. *
  62525. * @param {number} [value=1] - The time scale factor, where 1 is no change, 0.5 is half speed, etc.
  62526. *
  62527. * @return {Phaser.GameObjects.GameObject} The Game Object that owns this Animation Component.
  62528. */
  62529. setTimeScale: function (value)
  62530. {
  62531. if (value === undefined) { value = 1; }
  62532. this._timeScale = value;
  62533. return this.parent;
  62534. },
  62535. /**
  62536. * Gets the Time Scale factor.
  62537. *
  62538. * @method Phaser.GameObjects.Components.Animation#getTimeScale
  62539. * @since 3.4.0
  62540. *
  62541. * @return {number} The Time Scale value.
  62542. */
  62543. getTimeScale: function ()
  62544. {
  62545. return this._timeScale;
  62546. },
  62547. /**
  62548. * Returns the total number of frames in this animation.
  62549. *
  62550. * @method Phaser.GameObjects.Components.Animation#getTotalFrames
  62551. * @since 3.4.0
  62552. *
  62553. * @return {integer} The total number of frames in this animation.
  62554. */
  62555. getTotalFrames: function ()
  62556. {
  62557. return this.currentAnim.frames.length;
  62558. },
  62559. /**
  62560. * The internal update loop for the Animation Component.
  62561. *
  62562. * @method Phaser.GameObjects.Components.Animation#update
  62563. * @since 3.0.0
  62564. *
  62565. * @param {number} time - The current timestamp.
  62566. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  62567. */
  62568. update: function (time, delta)
  62569. {
  62570. if (!this.currentAnim || !this.isPlaying || this.currentAnim.paused)
  62571. {
  62572. return;
  62573. }
  62574. this.accumulator += delta * this._timeScale;
  62575. if (this._pendingStop === 1)
  62576. {
  62577. this._pendingStopValue -= delta;
  62578. if (this._pendingStopValue <= 0)
  62579. {
  62580. return this.currentAnim.completeAnimation(this);
  62581. }
  62582. }
  62583. if (this.accumulator >= this.nextTick)
  62584. {
  62585. this.currentAnim.setFrame(this);
  62586. }
  62587. },
  62588. /**
  62589. * Sets the given Animation Frame as being the current frame
  62590. * and applies it to the parent Game Object, adjusting its size and origin as needed.
  62591. *
  62592. * @method Phaser.GameObjects.Components.Animation#setCurrentFrame
  62593. * @since 3.4.0
  62594. *
  62595. * @param {Phaser.Animations.AnimationFrame} animationFrame - The Animation Frame to set as being current.
  62596. *
  62597. * @return {Phaser.GameObjects.GameObject} The Game Object this Animation Component belongs to.
  62598. */
  62599. setCurrentFrame: function (animationFrame)
  62600. {
  62601. var gameObject = this.parent;
  62602. this.currentFrame = animationFrame;
  62603. gameObject.texture = animationFrame.frame.texture;
  62604. gameObject.frame = animationFrame.frame;
  62605. gameObject.setSizeToFrame();
  62606. if (animationFrame.frame.customPivot)
  62607. {
  62608. gameObject.setOrigin(animationFrame.frame.pivotX, animationFrame.frame.pivotY);
  62609. }
  62610. else
  62611. {
  62612. gameObject.updateDisplayOrigin();
  62613. }
  62614. return gameObject;
  62615. },
  62616. /**
  62617. * Internal frame change handler.
  62618. *
  62619. * @method Phaser.GameObjects.Components.Animation#updateFrame
  62620. * @fires Phaser.GameObjects.Components.Animation#onUpdateEvent
  62621. * @private
  62622. * @since 3.0.0
  62623. *
  62624. * @param {Phaser.Animations.AnimationFrame} animationFrame - The animation frame to change to.
  62625. */
  62626. updateFrame: function (animationFrame)
  62627. {
  62628. var gameObject = this.setCurrentFrame(animationFrame);
  62629. if (this.isPlaying)
  62630. {
  62631. if (animationFrame.setAlpha)
  62632. {
  62633. gameObject.alpha = animationFrame.alpha;
  62634. }
  62635. var anim = this.currentAnim;
  62636. gameObject.emit('animationupdate', anim, animationFrame);
  62637. if (this._pendingStop === 3 && this._pendingStopValue === animationFrame)
  62638. {
  62639. this.currentAnim.completeAnimation(this);
  62640. }
  62641. }
  62642. },
  62643. /**
  62644. * Sets if the current Animation will yoyo when it reaches the end.
  62645. * A yoyo'ing animation will play through consecutively, and then reverse-play back to the start again.
  62646. *
  62647. * @method Phaser.GameObjects.Components.Animation#setYoyo
  62648. * @since 3.4.0
  62649. *
  62650. * @param {boolean} [value=false] - `true` if the animation should yoyo, `false` to not.
  62651. *
  62652. * @return {Phaser.GameObjects.GameObject} The Game Object this Animation Component belongs to.
  62653. */
  62654. setYoyo: function (value)
  62655. {
  62656. if (value === undefined) { value = false; }
  62657. this._yoyo = value;
  62658. return this.parent;
  62659. },
  62660. /**
  62661. * Gets if the current Animation will yoyo when it reaches the end.
  62662. * A yoyo'ing animation will play through consecutively, and then reverse-play back to the start again.
  62663. *
  62664. * @method Phaser.GameObjects.Components.Animation#getYoyo
  62665. * @since 3.4.0
  62666. *
  62667. * @return {boolean} `true` if the animation is set to yoyo, `false` if not.
  62668. */
  62669. getYoyo: function ()
  62670. {
  62671. return this._yoyo;
  62672. },
  62673. /**
  62674. * Destroy this Animation component.
  62675. *
  62676. * Unregisters event listeners and cleans up its references.
  62677. *
  62678. * @method Phaser.GameObjects.Components.Animation#destroy
  62679. * @since 3.0.0
  62680. */
  62681. destroy: function ()
  62682. {
  62683. this.animationManager.off('remove', this.remove, this);
  62684. this.animationManager = null;
  62685. this.parent = null;
  62686. this.currentAnim = null;
  62687. this.currentFrame = null;
  62688. }
  62689. });
  62690. module.exports = Animation;
  62691. /***/ }),
  62692. /* 308 */
  62693. /***/ (function(module, exports, __webpack_require__) {
  62694. /**
  62695. * @author Richard Davey <rich@photonstorm.com>
  62696. * @copyright 2018 Photon Storm Ltd.
  62697. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  62698. */
  62699. var Class = __webpack_require__(0);
  62700. var NumberTweenBuilder = __webpack_require__(166);
  62701. var PluginCache = __webpack_require__(12);
  62702. var TimelineBuilder = __webpack_require__(165);
  62703. var TWEEN_CONST = __webpack_require__(61);
  62704. var TweenBuilder = __webpack_require__(71);
  62705. /**
  62706. * @classdesc
  62707. * [description]
  62708. *
  62709. * @class TweenManager
  62710. * @memberOf Phaser.Tweens
  62711. * @constructor
  62712. * @since 3.0.0
  62713. *
  62714. * @param {Phaser.Scene} scene - [description]
  62715. */
  62716. var TweenManager = new Class({
  62717. initialize:
  62718. function TweenManager (scene)
  62719. {
  62720. /**
  62721. * [description]
  62722. *
  62723. * @name Phaser.Tweens.TweenManager#scene
  62724. * @type {Phaser.Scene}
  62725. * @since 3.0.0
  62726. */
  62727. this.scene = scene;
  62728. /**
  62729. * [description]
  62730. *
  62731. * @name Phaser.Tweens.TweenManager#systems
  62732. * @type {Phaser.Scenes.Systems}
  62733. * @since 3.0.0
  62734. */
  62735. this.systems = scene.sys;
  62736. /**
  62737. * [description]
  62738. *
  62739. * @name Phaser.Tweens.TweenManager#timeScale
  62740. * @type {number}
  62741. * @default 1
  62742. * @since 3.0.0
  62743. */
  62744. this.timeScale = 1;
  62745. /**
  62746. * [description]
  62747. *
  62748. * @name Phaser.Tweens.TweenManager#_add
  62749. * @type {array}
  62750. * @private
  62751. * @since 3.0.0
  62752. */
  62753. this._add = [];
  62754. /**
  62755. * [description]
  62756. *
  62757. * @name Phaser.Tweens.TweenManager#_pending
  62758. * @type {array}
  62759. * @private
  62760. * @since 3.0.0
  62761. */
  62762. this._pending = [];
  62763. /**
  62764. * [description]
  62765. *
  62766. * @name Phaser.Tweens.TweenManager#_active
  62767. * @type {array}
  62768. * @private
  62769. * @since 3.0.0
  62770. */
  62771. this._active = [];
  62772. /**
  62773. * [description]
  62774. *
  62775. * @name Phaser.Tweens.TweenManager#_destroy
  62776. * @type {array}
  62777. * @private
  62778. * @since 3.0.0
  62779. */
  62780. this._destroy = [];
  62781. /**
  62782. * [description]
  62783. *
  62784. * @name Phaser.Tweens.TweenManager#_toProcess
  62785. * @type {integer}
  62786. * @private
  62787. * @default 0
  62788. * @since 3.0.0
  62789. */
  62790. this._toProcess = 0;
  62791. scene.sys.events.once('boot', this.boot, this);
  62792. scene.sys.events.on('start', this.start, this);
  62793. },
  62794. /**
  62795. * This method is called automatically, only once, when the Scene is first created.
  62796. * Do not invoke it directly.
  62797. *
  62798. * @method Phaser.Tweens.TweenManager#boot
  62799. * @private
  62800. * @since 3.5.1
  62801. */
  62802. boot: function ()
  62803. {
  62804. this.systems.events.once('destroy', this.destroy, this);
  62805. },
  62806. /**
  62807. * This method is called automatically by the Scene when it is starting up.
  62808. * It is responsible for creating local systems, properties and listening for Scene events.
  62809. * Do not invoke it directly.
  62810. *
  62811. * @method Phaser.Tweens.TweenManager#start
  62812. * @private
  62813. * @since 3.5.0
  62814. */
  62815. start: function ()
  62816. {
  62817. var eventEmitter = this.systems.events;
  62818. eventEmitter.on('preupdate', this.preUpdate, this);
  62819. eventEmitter.on('update', this.update, this);
  62820. eventEmitter.once('shutdown', this.shutdown, this);
  62821. this.timeScale = 1;
  62822. },
  62823. /**
  62824. * Create a Tween Timeline and return it, but do NOT add it to the active or pending Tween lists.
  62825. *
  62826. * @method Phaser.Tweens.TweenManager#createTimeline
  62827. * @since 3.0.0
  62828. *
  62829. * @param {object} config - [description]
  62830. *
  62831. * @return {Phaser.Tweens.Timeline} [description]
  62832. */
  62833. createTimeline: function (config)
  62834. {
  62835. return TimelineBuilder(this, config);
  62836. },
  62837. /**
  62838. * Create a Tween Timeline and add it to the active Tween list/
  62839. *
  62840. * @method Phaser.Tweens.TweenManager#timeline
  62841. * @since 3.0.0
  62842. *
  62843. * @param {object} config - [description]
  62844. *
  62845. * @return {Phaser.Tweens.Timeline} [description]
  62846. */
  62847. timeline: function (config)
  62848. {
  62849. var timeline = TimelineBuilder(this, config);
  62850. if (!timeline.paused)
  62851. {
  62852. this._add.push(timeline);
  62853. this._toProcess++;
  62854. }
  62855. return timeline;
  62856. },
  62857. /**
  62858. * Create a Tween and return it, but do NOT add it to the active or pending Tween lists.
  62859. *
  62860. * @method Phaser.Tweens.TweenManager#create
  62861. * @since 3.0.0
  62862. *
  62863. * @param {object} config - [description]
  62864. *
  62865. * @return {Phaser.Tweens.Tween} [description]
  62866. */
  62867. create: function (config)
  62868. {
  62869. return TweenBuilder(this, config);
  62870. },
  62871. /**
  62872. * Create a Tween and add it to the active Tween list.
  62873. *
  62874. * @method Phaser.Tweens.TweenManager#add
  62875. * @since 3.0.0
  62876. *
  62877. * @param {object} config - [description]
  62878. *
  62879. * @return {Phaser.Tweens.Tween} [description]
  62880. */
  62881. add: function (config)
  62882. {
  62883. var tween = TweenBuilder(this, config);
  62884. this._add.push(tween);
  62885. this._toProcess++;
  62886. return tween;
  62887. },
  62888. /**
  62889. * Add an existing tween into the active Tween list.
  62890. *
  62891. * @method Phaser.Tweens.TweenManager#existing
  62892. * @since 3.0.0
  62893. *
  62894. * @param {Phaser.Tweens.Tween} tween - [description]
  62895. *
  62896. * @return {Phaser.Tweens.TweenManager} This Tween Manager object.
  62897. */
  62898. existing: function (tween)
  62899. {
  62900. this._add.push(tween);
  62901. this._toProcess++;
  62902. return this;
  62903. },
  62904. /**
  62905. * Create a Tween and add it to the active Tween list.
  62906. *
  62907. * @method Phaser.Tweens.TweenManager#addCounter
  62908. * @since 3.0.0
  62909. *
  62910. * @param {object} config - [description]
  62911. *
  62912. * @return {Phaser.Tweens.Tween} [description]
  62913. */
  62914. addCounter: function (config)
  62915. {
  62916. var tween = NumberTweenBuilder(this, config);
  62917. this._add.push(tween);
  62918. this._toProcess++;
  62919. return tween;
  62920. },
  62921. /**
  62922. * [description]
  62923. *
  62924. * @method Phaser.Tweens.TweenManager#preUpdate
  62925. * @since 3.0.0
  62926. */
  62927. preUpdate: function ()
  62928. {
  62929. if (this._toProcess === 0)
  62930. {
  62931. // Quick bail
  62932. return;
  62933. }
  62934. var list = this._destroy;
  62935. var active = this._active;
  62936. var i;
  62937. var tween;
  62938. // Clear the 'destroy' list
  62939. for (i = 0; i < list.length; i++)
  62940. {
  62941. tween = list[i];
  62942. // Remove from the 'active' array
  62943. var idx = active.indexOf(tween);
  62944. if (idx !== -1)
  62945. {
  62946. tween.state = TWEEN_CONST.REMOVED;
  62947. active.splice(idx, 1);
  62948. }
  62949. }
  62950. list.length = 0;
  62951. // Process the addition list
  62952. // This stops callbacks and out of sync events from populating the active array mid-way during the update
  62953. list = this._add;
  62954. for (i = 0; i < list.length; i++)
  62955. {
  62956. tween = list[i];
  62957. if (tween.state === TWEEN_CONST.PENDING_ADD)
  62958. {
  62959. // Return true if the Tween should be started right away, otherwise false
  62960. if (tween.init())
  62961. {
  62962. tween.play();
  62963. this._active.push(tween);
  62964. }
  62965. else
  62966. {
  62967. this._pending.push(tween);
  62968. }
  62969. }
  62970. }
  62971. list.length = 0;
  62972. this._toProcess = 0;
  62973. },
  62974. /**
  62975. * [description]
  62976. *
  62977. * @method Phaser.Tweens.TweenManager#update
  62978. * @since 3.0.0
  62979. *
  62980. * @param {number} timestamp - [description]
  62981. * @param {number} delta - [description]
  62982. */
  62983. update: function (timestamp, delta)
  62984. {
  62985. // Process active tweens
  62986. var list = this._active;
  62987. var tween;
  62988. // Scale the delta
  62989. delta *= this.timeScale;
  62990. for (var i = 0; i < list.length; i++)
  62991. {
  62992. tween = list[i];
  62993. // If Tween.update returns 'true' then it means it has completed,
  62994. // so move it to the destroy list
  62995. if (tween.update(timestamp, delta))
  62996. {
  62997. this._destroy.push(tween);
  62998. this._toProcess++;
  62999. }
  63000. }
  63001. },
  63002. /**
  63003. * [description]
  63004. *
  63005. * @method Phaser.Tweens.TweenManager#makeActive
  63006. * @since 3.0.0
  63007. *
  63008. * @param {Phaser.Tweens.Tween} tween - [description]
  63009. *
  63010. * @return {Phaser.Tweens.TweenManager} This Tween Manager object.
  63011. */
  63012. makeActive: function (tween)
  63013. {
  63014. if (this._add.indexOf(tween) !== -1 || this._active.indexOf(tween) !== -1)
  63015. {
  63016. return;
  63017. }
  63018. var idx = this._pending.indexOf(tween);
  63019. if (idx !== -1)
  63020. {
  63021. this._pending.splice(idx, 1);
  63022. }
  63023. this._add.push(tween);
  63024. tween.state = TWEEN_CONST.PENDING_ADD;
  63025. this._toProcess++;
  63026. return this;
  63027. },
  63028. /**
  63029. * Passes all Tweens to the given callback.
  63030. *
  63031. * @method Phaser.Tweens.TweenManager#each
  63032. * @since 3.0.0
  63033. *
  63034. * @param {function} callback - [description]
  63035. * @param {object} [scope] - [description]
  63036. * @param {...*} [args] - [description]
  63037. */
  63038. each: function (callback, scope)
  63039. {
  63040. var args = [ null ];
  63041. for (var i = 1; i < arguments.length; i++)
  63042. {
  63043. args.push(arguments[i]);
  63044. }
  63045. for (var texture in this.list)
  63046. {
  63047. args[0] = this.list[texture];
  63048. callback.apply(scope, args);
  63049. }
  63050. },
  63051. /**
  63052. * [description]
  63053. *
  63054. * @method Phaser.Tweens.TweenManager#getAllTweens
  63055. * @since 3.0.0
  63056. *
  63057. * @return {Phaser.Tweens.Tween[]} [description]
  63058. */
  63059. getAllTweens: function ()
  63060. {
  63061. var list = this._active;
  63062. var output = [];
  63063. for (var i = 0; i < list.length; i++)
  63064. {
  63065. output.push(list[i]);
  63066. }
  63067. return output;
  63068. },
  63069. /**
  63070. * [description]
  63071. *
  63072. * @method Phaser.Tweens.TweenManager#getGlobalTimeScale
  63073. * @since 3.0.0
  63074. *
  63075. * @return {number} [description]
  63076. */
  63077. getGlobalTimeScale: function ()
  63078. {
  63079. return this.timeScale;
  63080. },
  63081. /**
  63082. * [description]
  63083. *
  63084. * @method Phaser.Tweens.TweenManager#getTweensOf
  63085. * @since 3.0.0
  63086. *
  63087. * @param {(object|array)} target - [description]
  63088. *
  63089. * @return {Phaser.Tweens.Tween[]} [description]
  63090. */
  63091. getTweensOf: function (target)
  63092. {
  63093. var list = this._active;
  63094. var tween;
  63095. var output = [];
  63096. var i;
  63097. if (Array.isArray(target))
  63098. {
  63099. for (i = 0; i < list.length; i++)
  63100. {
  63101. tween = list[i];
  63102. for (var t = 0; t < target.length; t++)
  63103. {
  63104. if (tween.hasTarget(target[t]))
  63105. {
  63106. output.push(tween);
  63107. }
  63108. }
  63109. }
  63110. }
  63111. else
  63112. {
  63113. for (i = 0; i < list.length; i++)
  63114. {
  63115. tween = list[i];
  63116. if (tween.hasTarget(target))
  63117. {
  63118. output.push(tween);
  63119. }
  63120. }
  63121. }
  63122. return output;
  63123. },
  63124. /**
  63125. * [description]
  63126. *
  63127. * @method Phaser.Tweens.TweenManager#isTweening
  63128. * @since 3.0.0
  63129. *
  63130. * @param {object} target - [description]
  63131. *
  63132. * @return {boolean} [description]
  63133. */
  63134. isTweening: function (target)
  63135. {
  63136. var list = this._active;
  63137. var tween;
  63138. for (var i = 0; i < list.length; i++)
  63139. {
  63140. tween = list[i];
  63141. if (tween.hasTarget(target) && tween.isPlaying())
  63142. {
  63143. return true;
  63144. }
  63145. }
  63146. return false;
  63147. },
  63148. /**
  63149. * [description]
  63150. *
  63151. * @method Phaser.Tweens.TweenManager#killAll
  63152. * @since 3.0.0
  63153. *
  63154. * @return {Phaser.Tweens.TweenManager} [description]
  63155. */
  63156. killAll: function ()
  63157. {
  63158. var tweens = this.getAllTweens();
  63159. for (var i = 0; i < tweens.length; i++)
  63160. {
  63161. tweens[i].stop();
  63162. }
  63163. return this;
  63164. },
  63165. /**
  63166. * [description]
  63167. *
  63168. * @method Phaser.Tweens.TweenManager#killTweensOf
  63169. * @since 3.0.0
  63170. *
  63171. * @param {(object|array)} target - [description]
  63172. *
  63173. * @return {Phaser.Tweens.TweenManager} [description]
  63174. */
  63175. killTweensOf: function (target)
  63176. {
  63177. var tweens = this.getTweensOf(target);
  63178. for (var i = 0; i < tweens.length; i++)
  63179. {
  63180. tweens[i].stop();
  63181. }
  63182. return this;
  63183. },
  63184. /**
  63185. * [description]
  63186. *
  63187. * @method Phaser.Tweens.TweenManager#pauseAll
  63188. * @since 3.0.0
  63189. *
  63190. * @return {Phaser.Tweens.TweenManager} [description]
  63191. */
  63192. pauseAll: function ()
  63193. {
  63194. var list = this._active;
  63195. for (var i = 0; i < list.length; i++)
  63196. {
  63197. list[i].pause();
  63198. }
  63199. return this;
  63200. },
  63201. /**
  63202. * [description]
  63203. *
  63204. * @method Phaser.Tweens.TweenManager#resumeAll
  63205. * @since 3.0.0
  63206. *
  63207. * @return {Phaser.Tweens.TweenManager} [description]
  63208. */
  63209. resumeAll: function ()
  63210. {
  63211. var list = this._active;
  63212. for (var i = 0; i < list.length; i++)
  63213. {
  63214. list[i].resume();
  63215. }
  63216. return this;
  63217. },
  63218. /**
  63219. * [description]
  63220. *
  63221. * @method Phaser.Tweens.TweenManager#setGlobalTimeScale
  63222. * @since 3.0.0
  63223. *
  63224. * @param {number} value - [description]
  63225. *
  63226. * @return {Phaser.Tweens.TweenManager} [description]
  63227. */
  63228. setGlobalTimeScale: function (value)
  63229. {
  63230. this.timeScale = value;
  63231. return this;
  63232. },
  63233. /**
  63234. * The Scene that owns this plugin is shutting down.
  63235. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  63236. *
  63237. * @method Phaser.Tweens.TweenManager#shutdown
  63238. * @since 3.0.0
  63239. */
  63240. shutdown: function ()
  63241. {
  63242. this.killAll();
  63243. this._add = [];
  63244. this._pending = [];
  63245. this._active = [];
  63246. this._destroy = [];
  63247. this._toProcess = 0;
  63248. var eventEmitter = this.systems.events;
  63249. eventEmitter.off('preupdate', this.preUpdate, this);
  63250. eventEmitter.off('update', this.update, this);
  63251. eventEmitter.off('shutdown', this.shutdown, this);
  63252. },
  63253. /**
  63254. * The Scene that owns this plugin is being destroyed.
  63255. * We need to shutdown and then kill off all external references.
  63256. *
  63257. * @method Phaser.Tweens.TweenManager#destroy
  63258. * @since 3.0.0
  63259. */
  63260. destroy: function ()
  63261. {
  63262. this.shutdown();
  63263. this.scene.sys.events.off('start', this.start, this);
  63264. this.scene = null;
  63265. this.systems = null;
  63266. }
  63267. });
  63268. PluginCache.register('TweenManager', TweenManager, 'tweens');
  63269. module.exports = TweenManager;
  63270. /***/ }),
  63271. /* 309 */
  63272. /***/ (function(module, exports) {
  63273. /**
  63274. * @author Richard Davey <rich@photonstorm.com>
  63275. * @copyright 2018 Photon Storm Ltd.
  63276. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  63277. */
  63278. // RESERVED properties that a Tween config object uses
  63279. // completeDelay: The time the tween will wait before the onComplete event is dispatched once it has completed
  63280. // delay: The time the tween will wait before it first starts
  63281. // duration: The duration of the tween
  63282. // ease: The ease function used by the tween
  63283. // easeParams: The parameters to go with the ease function (if any)
  63284. // flipX: flip X the GameObject on tween end
  63285. // flipY: flip Y the GameObject on tween end// hold: The time the tween will pause before running a yoyo
  63286. // hold: The time the tween will pause before running a yoyo
  63287. // loop: The time the tween will pause before starting either a yoyo or returning to the start for a repeat
  63288. // loopDelay:
  63289. // offset: Used when the Tween is part of a Timeline
  63290. // paused: Does the tween start in a paused state, or playing?
  63291. // props: The properties being tweened by the tween
  63292. // repeat: The number of times the tween will repeat itself (a value of 1 means the tween will play twice, as it repeated once)
  63293. // repeatDelay: The time the tween will pause for before starting a repeat. The tween holds in the start state.
  63294. // targets: The targets the tween is updating.
  63295. // useFrames: Use frames or milliseconds?
  63296. // yoyo: boolean - Does the tween reverse itself (yoyo) when it reaches the end?
  63297. module.exports = [
  63298. 'callbackScope',
  63299. 'completeDelay',
  63300. 'delay',
  63301. 'duration',
  63302. 'ease',
  63303. 'easeParams',
  63304. 'flipX',
  63305. 'flipY',
  63306. 'hold',
  63307. 'loop',
  63308. 'loopDelay',
  63309. 'offset',
  63310. 'onComplete',
  63311. 'onCompleteParams',
  63312. 'onCompleteScope',
  63313. 'onLoop',
  63314. 'onLoopParams',
  63315. 'onLoopScope',
  63316. 'onRepeat',
  63317. 'onRepeatParams',
  63318. 'onRepeatScope',
  63319. 'onStart',
  63320. 'onStartParams',
  63321. 'onStartScope',
  63322. 'onUpdate',
  63323. 'onUpdateParams',
  63324. 'onUpdateScope',
  63325. 'onYoyo',
  63326. 'onYoyoParams',
  63327. 'onYoyoScope',
  63328. 'paused',
  63329. 'props',
  63330. 'repeat',
  63331. 'repeatDelay',
  63332. 'targets',
  63333. 'useFrames',
  63334. 'yoyo'
  63335. ];
  63336. /***/ }),
  63337. /* 310 */
  63338. /***/ (function(module, exports, __webpack_require__) {
  63339. /**
  63340. * @author Richard Davey <rich@photonstorm.com>
  63341. * @copyright 2018 Photon Storm Ltd.
  63342. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  63343. */
  63344. /**
  63345. * @namespace Phaser.Tweens.Builders
  63346. */
  63347. module.exports = {
  63348. GetBoolean: __webpack_require__(62),
  63349. GetEaseFunction: __webpack_require__(63),
  63350. GetNewValue: __webpack_require__(72),
  63351. GetProps: __webpack_require__(168),
  63352. GetTargets: __webpack_require__(102),
  63353. GetTweens: __webpack_require__(167),
  63354. GetValueOp: __webpack_require__(101),
  63355. NumberTweenBuilder: __webpack_require__(166),
  63356. TimelineBuilder: __webpack_require__(165),
  63357. TweenBuilder: __webpack_require__(71)
  63358. };
  63359. /***/ }),
  63360. /* 311 */
  63361. /***/ (function(module, exports, __webpack_require__) {
  63362. /**
  63363. * @author Richard Davey <rich@photonstorm.com>
  63364. * @copyright 2018 Photon Storm Ltd.
  63365. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  63366. */
  63367. var CONST = __webpack_require__(61);
  63368. var Extend = __webpack_require__(16);
  63369. /**
  63370. * @namespace Phaser.Tweens
  63371. */
  63372. var Tweens = {
  63373. Builders: __webpack_require__(310),
  63374. TweenManager: __webpack_require__(308),
  63375. Tween: __webpack_require__(99),
  63376. TweenData: __webpack_require__(98),
  63377. Timeline: __webpack_require__(164)
  63378. };
  63379. // Merge in the consts
  63380. Tweens = Extend(false, Tweens, CONST);
  63381. module.exports = Tweens;
  63382. /***/ }),
  63383. /* 312 */
  63384. /***/ (function(module, exports, __webpack_require__) {
  63385. /**
  63386. * @author Richard Davey <rich@photonstorm.com>
  63387. * @copyright 2018 Photon Storm Ltd.
  63388. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  63389. */
  63390. var Class = __webpack_require__(0);
  63391. var PluginCache = __webpack_require__(12);
  63392. var TimerEvent = __webpack_require__(169);
  63393. /**
  63394. * @classdesc
  63395. * [description]
  63396. *
  63397. * @class Clock
  63398. * @memberOf Phaser.Time
  63399. * @constructor
  63400. * @since 3.0.0
  63401. *
  63402. * @param {Phaser.Scene} scene - [description]
  63403. */
  63404. var Clock = new Class({
  63405. initialize:
  63406. function Clock (scene)
  63407. {
  63408. /**
  63409. * [description]
  63410. *
  63411. * @name Phaser.Time.Clock#scene
  63412. * @type {Phaser.Scene}
  63413. * @since 3.0.0
  63414. */
  63415. this.scene = scene;
  63416. /**
  63417. * [description]
  63418. *
  63419. * @name Phaser.Time.Clock#systems
  63420. * @type {Phaser.Scenes.Systems}
  63421. * @since 3.0.0
  63422. */
  63423. this.systems = scene.sys;
  63424. /**
  63425. * [description]
  63426. *
  63427. * @name Phaser.Time.Clock#now
  63428. * @type {number}
  63429. * @since 3.0.0
  63430. */
  63431. this.now = Date.now();
  63432. // Scale the delta time coming into the Clock by this factor
  63433. // which then influences anything using this Clock for calculations, like TimerEvents
  63434. /**
  63435. * [description]
  63436. *
  63437. * @name Phaser.Time.Clock#timeScale
  63438. * @type {number}
  63439. * @default 1
  63440. * @since 3.0.0
  63441. */
  63442. this.timeScale = 1;
  63443. /**
  63444. * [description]
  63445. *
  63446. * @name Phaser.Time.Clock#paused
  63447. * @type {boolean}
  63448. * @default false
  63449. * @since 3.0.0
  63450. */
  63451. this.paused = false;
  63452. /**
  63453. * [description]
  63454. *
  63455. * @name Phaser.Time.Clock#_active
  63456. * @type {Phaser.Time.TimerEvent[]}
  63457. * @private
  63458. * @default []
  63459. * @since 3.0.0
  63460. */
  63461. this._active = [];
  63462. /**
  63463. * [description]
  63464. *
  63465. * @name Phaser.Time.Clock#_pendingInsertion
  63466. * @type {Phaser.Time.TimerEvent[]}
  63467. * @private
  63468. * @default []
  63469. * @since 3.0.0
  63470. */
  63471. this._pendingInsertion = [];
  63472. /**
  63473. * [description]
  63474. *
  63475. * @name Phaser.Time.Clock#_pendingRemoval
  63476. * @type {Phaser.Time.TimerEvent[]}
  63477. * @private
  63478. * @default []
  63479. * @since 3.0.0
  63480. */
  63481. this._pendingRemoval = [];
  63482. scene.sys.events.once('boot', this.boot, this);
  63483. scene.sys.events.on('start', this.start, this);
  63484. },
  63485. /**
  63486. * This method is called automatically, only once, when the Scene is first created.
  63487. * Do not invoke it directly.
  63488. *
  63489. * @method Phaser.Time.Clock#boot
  63490. * @private
  63491. * @since 3.5.1
  63492. */
  63493. boot: function ()
  63494. {
  63495. this.systems.events.once('destroy', this.destroy, this);
  63496. },
  63497. /**
  63498. * This method is called automatically by the Scene when it is starting up.
  63499. * It is responsible for creating local systems, properties and listening for Scene events.
  63500. * Do not invoke it directly.
  63501. *
  63502. * @method Phaser.Time.Clock#start
  63503. * @private
  63504. * @since 3.5.0
  63505. */
  63506. start: function ()
  63507. {
  63508. var eventEmitter = this.systems.events;
  63509. eventEmitter.on('preupdate', this.preUpdate, this);
  63510. eventEmitter.on('update', this.update, this);
  63511. eventEmitter.once('shutdown', this.shutdown, this);
  63512. },
  63513. /**
  63514. * [description]
  63515. *
  63516. * @method Phaser.Time.Clock#addEvent
  63517. * @since 3.0.0
  63518. *
  63519. * @param {TimerEventConfig} config - [description]
  63520. *
  63521. * @return {Phaser.Time.TimerEvent} [description]
  63522. */
  63523. addEvent: function (config)
  63524. {
  63525. var event = new TimerEvent(config);
  63526. this._pendingInsertion.push(event);
  63527. return event;
  63528. },
  63529. /**
  63530. * [description]
  63531. *
  63532. * @method Phaser.Time.Clock#delayedCall
  63533. * @since 3.0.0
  63534. *
  63535. * @param {number} delay - [description]
  63536. * @param {function} callback - [description]
  63537. * @param {Array.<*>} args - [description]
  63538. * @param {*} callbackScope - [description]
  63539. *
  63540. * @return {Phaser.Time.TimerEvent} [description]
  63541. */
  63542. delayedCall: function (delay, callback, args, callbackScope)
  63543. {
  63544. return this.addEvent({ delay: delay, callback: callback, args: args, callbackScope: callbackScope });
  63545. },
  63546. /**
  63547. * [description]
  63548. *
  63549. * @method Phaser.Time.Clock#clearPendingEvents
  63550. * @since 3.0.0
  63551. *
  63552. * @return {Phaser.Time.Clock} [description]
  63553. */
  63554. clearPendingEvents: function ()
  63555. {
  63556. this._pendingInsertion = [];
  63557. return this;
  63558. },
  63559. /**
  63560. * [description]
  63561. *
  63562. * @method Phaser.Time.Clock#removeAllEvents
  63563. * @since 3.0.0
  63564. *
  63565. * @return {Phaser.Time.Clock} [description]
  63566. */
  63567. removeAllEvents: function ()
  63568. {
  63569. this._pendingRemoval = this._pendingRemoval.concat(this._active);
  63570. return this;
  63571. },
  63572. /**
  63573. * [description]
  63574. *
  63575. * @method Phaser.Time.Clock#preUpdate
  63576. * @since 3.0.0
  63577. *
  63578. * @param {number} time - [description]
  63579. * @param {number} delta - [description]
  63580. */
  63581. preUpdate: function ()
  63582. {
  63583. var toRemove = this._pendingRemoval.length;
  63584. var toInsert = this._pendingInsertion.length;
  63585. if (toRemove === 0 && toInsert === 0)
  63586. {
  63587. // Quick bail
  63588. return;
  63589. }
  63590. var i;
  63591. var event;
  63592. // Delete old events
  63593. for (i = 0; i < toRemove; i++)
  63594. {
  63595. event = this._pendingRemoval[i];
  63596. var index = this._active.indexOf(event);
  63597. if (index > -1)
  63598. {
  63599. this._active.splice(index, 1);
  63600. }
  63601. // Pool them?
  63602. event.destroy();
  63603. }
  63604. for (i = 0; i < toInsert; i++)
  63605. {
  63606. event = this._pendingInsertion[i];
  63607. this._active.push(event);
  63608. }
  63609. // Clear the lists
  63610. this._pendingRemoval.length = 0;
  63611. this._pendingInsertion.length = 0;
  63612. },
  63613. /**
  63614. * [description]
  63615. *
  63616. * @method Phaser.Time.Clock#update
  63617. * @since 3.0.0
  63618. *
  63619. * @param {number} time - [description]
  63620. * @param {number} delta - [description]
  63621. */
  63622. update: function (time, delta)
  63623. {
  63624. this.now = time;
  63625. if (this.paused)
  63626. {
  63627. return;
  63628. }
  63629. delta *= this.timeScale;
  63630. for (var i = 0; i < this._active.length; i++)
  63631. {
  63632. var event = this._active[i];
  63633. if (event.paused)
  63634. {
  63635. continue;
  63636. }
  63637. // Use delta time to increase elapsed.
  63638. // Avoids needing to adjust for pause / resume.
  63639. // Automatically smoothed by TimeStep class.
  63640. // In testing accurate to +- 1ms!
  63641. event.elapsed += delta * event.timeScale;
  63642. if (event.elapsed >= event.delay)
  63643. {
  63644. var remainder = event.elapsed - event.delay;
  63645. // Limit it, in case it's checked in the callback
  63646. event.elapsed = event.delay;
  63647. // Process the event
  63648. if (!event.hasDispatched && event.callback)
  63649. {
  63650. event.hasDispatched = true;
  63651. event.callback.apply(event.callbackScope, event.args);
  63652. }
  63653. if (event.repeatCount > 0)
  63654. {
  63655. event.repeatCount--;
  63656. event.elapsed = remainder;
  63657. event.hasDispatched = false;
  63658. }
  63659. else
  63660. {
  63661. this._pendingRemoval.push(event);
  63662. }
  63663. }
  63664. }
  63665. },
  63666. /**
  63667. * The Scene that owns this plugin is shutting down.
  63668. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  63669. *
  63670. * @method Phaser.Time.Clock#shutdown
  63671. * @private
  63672. * @since 3.0.0
  63673. */
  63674. shutdown: function ()
  63675. {
  63676. var i;
  63677. for (i = 0; i < this._pendingInsertion.length; i++)
  63678. {
  63679. this._pendingInsertion[i].destroy();
  63680. }
  63681. for (i = 0; i < this._active.length; i++)
  63682. {
  63683. this._active[i].destroy();
  63684. }
  63685. for (i = 0; i < this._pendingRemoval.length; i++)
  63686. {
  63687. this._pendingRemoval[i].destroy();
  63688. }
  63689. this._active.length = 0;
  63690. this._pendingRemoval.length = 0;
  63691. this._pendingInsertion.length = 0;
  63692. var eventEmitter = this.systems.events;
  63693. eventEmitter.off('preupdate', this.preUpdate, this);
  63694. eventEmitter.off('update', this.update, this);
  63695. eventEmitter.off('shutdown', this.shutdown, this);
  63696. },
  63697. /**
  63698. * The Scene that owns this plugin is being destroyed.
  63699. * We need to shutdown and then kill off all external references.
  63700. *
  63701. * @method Phaser.Time.Clock#destroy
  63702. * @private
  63703. * @since 3.0.0
  63704. */
  63705. destroy: function ()
  63706. {
  63707. this.shutdown();
  63708. this.scene.sys.events.off('start', this.start, this);
  63709. this.scene = null;
  63710. this.systems = null;
  63711. }
  63712. });
  63713. PluginCache.register('Clock', Clock, 'time');
  63714. module.exports = Clock;
  63715. /***/ }),
  63716. /* 313 */
  63717. /***/ (function(module, exports, __webpack_require__) {
  63718. /**
  63719. * @author Richard Davey <rich@photonstorm.com>
  63720. * @copyright 2018 Photon Storm Ltd.
  63721. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  63722. */
  63723. /**
  63724. * @namespace Phaser.Time
  63725. */
  63726. module.exports = {
  63727. Clock: __webpack_require__(312),
  63728. TimerEvent: __webpack_require__(169)
  63729. };
  63730. /***/ }),
  63731. /* 314 */
  63732. /***/ (function(module, exports, __webpack_require__) {
  63733. /**
  63734. * @author Richard Davey <rich@photonstorm.com>
  63735. * @copyright 2018 Photon Storm Ltd.
  63736. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  63737. */
  63738. var Class = __webpack_require__(0);
  63739. var Components = __webpack_require__(17);
  63740. var CONST = __webpack_require__(22);
  63741. var GameObject = __webpack_require__(2);
  63742. var StaticTilemapLayerRender = __webpack_require__(629);
  63743. var TilemapComponents = __webpack_require__(142);
  63744. var Utils = __webpack_require__(21);
  63745. /**
  63746. * @classdesc
  63747. * A StaticTilemapLayer is a game object that renders LayerData from a Tilemap. A
  63748. * StaticTilemapLayer can only render tiles from a single tileset.
  63749. *
  63750. * A StaticTilemapLayer is optimized for speed over flexibility. You cannot apply per-tile
  63751. * effects like tint or alpha. You cannot change the tiles in a StaticTilemapLayer. Use this
  63752. * over a DynamicTilemapLayer when you don't need either of those features.
  63753. *
  63754. * @class StaticTilemapLayer
  63755. * @extends Phaser.GameObjects.GameObject
  63756. * @memberOf Phaser.Tilemaps
  63757. * @constructor
  63758. * @since 3.0.0
  63759. *
  63760. * @extends Phaser.GameObjects.Components.Alpha
  63761. * @extends Phaser.GameObjects.Components.BlendMode
  63762. * @extends Phaser.GameObjects.Components.ComputedSize
  63763. * @extends Phaser.GameObjects.Components.Depth
  63764. * @extends Phaser.GameObjects.Components.Flip
  63765. * @extends Phaser.GameObjects.Components.GetBounds
  63766. * @extends Phaser.GameObjects.Components.Origin
  63767. * @extends Phaser.GameObjects.Components.Pipeline
  63768. * @extends Phaser.GameObjects.Components.ScaleMode
  63769. * @extends Phaser.GameObjects.Components.Transform
  63770. * @extends Phaser.GameObjects.Components.Visible
  63771. * @extends Phaser.GameObjects.Components.ScrollFactor
  63772. *
  63773. * @param {Phaser.Scene} scene - [description]
  63774. * @param {Phaser.Tilemaps.Tilemap} tilemap - The Tilemap this layer is a part of.
  63775. * @param {integer} layerIndex - The index of the LayerData associated with this layer.
  63776. * @param {Phaser.Tilemaps.Tileset} tileset - The tileset used to render the tiles in this layer.
  63777. * @param {number} [x=0] - The world x position where the top left of this layer will be placed.
  63778. * @param {number} [y=0] - The world y position where the top left of this layer will be placed.
  63779. */
  63780. var StaticTilemapLayer = new Class({
  63781. Extends: GameObject,
  63782. Mixins: [
  63783. Components.Alpha,
  63784. Components.BlendMode,
  63785. Components.ComputedSize,
  63786. Components.Depth,
  63787. Components.Flip,
  63788. Components.GetBounds,
  63789. Components.Origin,
  63790. Components.Pipeline,
  63791. Components.ScaleMode,
  63792. Components.Transform,
  63793. Components.Visible,
  63794. Components.ScrollFactor,
  63795. StaticTilemapLayerRender
  63796. ],
  63797. initialize:
  63798. function StaticTilemapLayer (scene, tilemap, layerIndex, tileset, x, y)
  63799. {
  63800. GameObject.call(this, scene, 'StaticTilemapLayer');
  63801. /**
  63802. * Used internally by physics system to perform fast type checks.
  63803. *
  63804. * @name Phaser.Tilemaps.StaticTilemapLayer#isTilemap
  63805. * @type {boolean}
  63806. * @readOnly
  63807. * @since 3.0.0
  63808. */
  63809. this.isTilemap = true;
  63810. /**
  63811. * The Tilemap that this layer is a part of.
  63812. *
  63813. * @name Phaser.Tilemaps.StaticTilemapLayer#tilemap
  63814. * @type {Phaser.Tilemaps.Tilemap}
  63815. * @since 3.0.0
  63816. */
  63817. this.tilemap = tilemap;
  63818. /**
  63819. * The index of the LayerData associated with this layer.
  63820. *
  63821. * @name Phaser.Tilemaps.StaticTilemapLayer#layerIndex
  63822. * @type {integer}
  63823. * @since 3.0.0
  63824. */
  63825. this.layerIndex = layerIndex;
  63826. /**
  63827. * The LayerData associated with this layer. LayerData can only be associated with one
  63828. * tilemap layer.
  63829. *
  63830. * @name Phaser.Tilemaps.StaticTilemapLayer#layer
  63831. * @type {Phaser.Tilemaps.LayerData}
  63832. * @since 3.0.0
  63833. */
  63834. this.layer = tilemap.layers[layerIndex];
  63835. this.layer.tilemapLayer = this; // Link the LayerData with this static tilemap layer
  63836. /**
  63837. * The Tileset associated with this layer. A tilemap layer can only render from one Tileset.
  63838. *
  63839. * @name Phaser.Tilemaps.StaticTilemapLayer#tileset
  63840. * @type {Phaser.Tilemaps.Tileset}
  63841. * @since 3.0.0
  63842. */
  63843. this.tileset = tileset;
  63844. /**
  63845. * Used internally with the canvas render. This holds the tiles that are visible within the
  63846. * camera.
  63847. *
  63848. * @name Phaser.Tilemaps.StaticTilemapLayer#culledTiles
  63849. * @type {array}
  63850. * @since 3.0.0
  63851. */
  63852. this.culledTiles = [];
  63853. /**
  63854. * @name Phaser.Tilemaps.StaticTilemapLayer#vertexBuffer
  63855. * @type {array}
  63856. * @private
  63857. * @since 3.0.0
  63858. */
  63859. this.vertexBuffer = null;
  63860. /**
  63861. * @name Phaser.Tilemaps.StaticTilemapLayer#renderer
  63862. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  63863. * @private
  63864. * @since 3.0.0
  63865. */
  63866. this.renderer = scene.sys.game.renderer;
  63867. /**
  63868. * @name Phaser.Tilemaps.StaticTilemapLayer#bufferData
  63869. * @type {ArrayBuffer}
  63870. * @private
  63871. * @since 3.0.0
  63872. */
  63873. this.bufferData = null;
  63874. /**
  63875. * @name Phaser.Tilemaps.StaticTilemapLayer#vertexViewF32
  63876. * @type {Float32Array}
  63877. * @private
  63878. * @since 3.0.0
  63879. */
  63880. this.vertexViewF32 = null;
  63881. /**
  63882. * @name Phaser.Tilemaps.StaticTilemapLayer#vertexViewU32
  63883. * @type {Uint32Array}
  63884. * @private
  63885. * @since 3.0.0
  63886. */
  63887. this.vertexViewU32 = null;
  63888. /**
  63889. * @name Phaser.Tilemaps.StaticTilemapLayer#dirty
  63890. * @type {boolean}
  63891. * @private
  63892. * @since 3.0.0
  63893. */
  63894. this.dirty = true;
  63895. /**
  63896. * @name Phaser.Tilemaps.StaticTilemapLayer#vertexCount
  63897. * @type {integer}
  63898. * @private
  63899. * @since 3.0.0
  63900. */
  63901. this.vertexCount = 0;
  63902. this.setAlpha(this.layer.alpha);
  63903. this.setPosition(x, y);
  63904. this.setOrigin();
  63905. this.setSize(this.layer.tileWidth * this.layer.width, this.layer.tileHeight * this.layer.height);
  63906. this.initPipeline('TextureTintPipeline');
  63907. if (scene.sys.game.config.renderType === CONST.WEBGL)
  63908. {
  63909. scene.sys.game.renderer.onContextRestored(function ()
  63910. {
  63911. this.dirty = true;
  63912. this.vertexBuffer = null;
  63913. }, this);
  63914. }
  63915. },
  63916. /**
  63917. * Upload the tile data to a VBO.
  63918. *
  63919. * @method Phaser.Tilemaps.StaticTilemapLayer#upload
  63920. * @since 3.0.0
  63921. *
  63922. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera to render to.
  63923. *
  63924. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  63925. */
  63926. upload: function (camera)
  63927. {
  63928. var renderer = this.renderer;
  63929. var gl = renderer.gl;
  63930. if (gl)
  63931. {
  63932. var pipeline = renderer.pipelines.TextureTintPipeline;
  63933. if (this.dirty)
  63934. {
  63935. var tileset = this.tileset;
  63936. var mapWidth = this.layer.width;
  63937. var mapHeight = this.layer.height;
  63938. var width = tileset.image.source[0].width;
  63939. var height = tileset.image.source[0].height;
  63940. var mapData = this.layer.data;
  63941. var tile;
  63942. var row;
  63943. var col;
  63944. var texCoords;
  63945. var vertexBuffer = this.vertexBuffer;
  63946. var bufferData = this.bufferData;
  63947. var voffset = -1;
  63948. var vertexCount = 0;
  63949. var tintEffect = false;
  63950. var bufferSize = (mapWidth * mapHeight) * pipeline.vertexSize * 6;
  63951. if (bufferData === null)
  63952. {
  63953. bufferData = new ArrayBuffer(bufferSize);
  63954. this.bufferData = bufferData;
  63955. this.vertexViewF32 = new Float32Array(bufferData);
  63956. this.vertexViewU32 = new Uint32Array(bufferData);
  63957. }
  63958. var vertexViewF32 = this.vertexViewF32;
  63959. var vertexViewU32 = this.vertexViewU32;
  63960. var c = 0;
  63961. var i = 0;
  63962. for (row = 0; row < mapHeight; ++row)
  63963. {
  63964. for (col = 0; col < mapWidth; ++col)
  63965. {
  63966. c++;
  63967. tile = mapData[row][col];
  63968. if (!tile || tile.index === -1 || !tile.visible)
  63969. {
  63970. continue;
  63971. }
  63972. var tx = tile.pixelX;
  63973. var ty = tile.pixelY;
  63974. var txw = tx + tile.width;
  63975. var tyh = ty + tile.height;
  63976. texCoords = tileset.getTileTextureCoordinates(tile.index);
  63977. if (!texCoords)
  63978. {
  63979. continue;
  63980. }
  63981. var u0 = texCoords.x / width;
  63982. var v0 = texCoords.y / height;
  63983. var u1 = (texCoords.x + tile.width) / width;
  63984. var v1 = (texCoords.y + tile.height) / height;
  63985. var tint = Utils.getTintAppendFloatAlpha(0xffffff, camera.alpha * this.alpha * tile.alpha);
  63986. var tx0 = tx;
  63987. var ty0 = ty;
  63988. var tx1 = tx;
  63989. var ty1 = tyh;
  63990. var tx2 = txw;
  63991. var ty2 = tyh;
  63992. var tx3 = txw;
  63993. var ty3 = ty;
  63994. vertexViewF32[++voffset] = tx0;
  63995. vertexViewF32[++voffset] = ty0;
  63996. vertexViewF32[++voffset] = u0;
  63997. vertexViewF32[++voffset] = v0;
  63998. vertexViewF32[++voffset] = tintEffect;
  63999. vertexViewU32[++voffset] = tint;
  64000. vertexViewF32[++voffset] = tx1;
  64001. vertexViewF32[++voffset] = ty1;
  64002. vertexViewF32[++voffset] = u0;
  64003. vertexViewF32[++voffset] = v1;
  64004. vertexViewF32[++voffset] = tintEffect;
  64005. vertexViewU32[++voffset] = tint;
  64006. vertexViewF32[++voffset] = tx2;
  64007. vertexViewF32[++voffset] = ty2;
  64008. vertexViewF32[++voffset] = u1;
  64009. vertexViewF32[++voffset] = v1;
  64010. vertexViewF32[++voffset] = tintEffect;
  64011. vertexViewU32[++voffset] = tint;
  64012. vertexViewF32[++voffset] = tx0;
  64013. vertexViewF32[++voffset] = ty0;
  64014. vertexViewF32[++voffset] = u0;
  64015. vertexViewF32[++voffset] = v0;
  64016. vertexViewF32[++voffset] = tintEffect;
  64017. vertexViewU32[++voffset] = tint;
  64018. vertexViewF32[++voffset] = tx2;
  64019. vertexViewF32[++voffset] = ty2;
  64020. vertexViewF32[++voffset] = u1;
  64021. vertexViewF32[++voffset] = v1;
  64022. vertexViewF32[++voffset] = tintEffect;
  64023. vertexViewU32[++voffset] = tint;
  64024. vertexViewF32[++voffset] = tx3;
  64025. vertexViewF32[++voffset] = ty3;
  64026. vertexViewF32[++voffset] = u1;
  64027. vertexViewF32[++voffset] = v0;
  64028. vertexViewF32[++voffset] = tintEffect;
  64029. vertexViewU32[++voffset] = tint;
  64030. vertexCount += 6;
  64031. i++;
  64032. }
  64033. }
  64034. this.vertexCount = vertexCount;
  64035. this.dirty = false;
  64036. if (vertexBuffer === null)
  64037. {
  64038. vertexBuffer = renderer.createVertexBuffer(bufferData, gl.STATIC_DRAW);
  64039. this.vertexBuffer = vertexBuffer;
  64040. }
  64041. else
  64042. {
  64043. renderer.setVertexBuffer(vertexBuffer);
  64044. gl.bufferSubData(gl.ARRAY_BUFFER, 0, bufferData);
  64045. }
  64046. window.noCull = c;
  64047. window.cull = i;
  64048. }
  64049. pipeline.modelIdentity();
  64050. pipeline.modelTranslate(this.x - (camera.scrollX * this.scrollFactorX), this.y - (camera.scrollY * this.scrollFactorY), 0);
  64051. pipeline.modelScale(this.scaleX, this.scaleY, 1);
  64052. pipeline.viewLoad2D(camera.matrix.matrix);
  64053. }
  64054. return this;
  64055. },
  64056. /**
  64057. * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting
  64058. * faces are used internally for optimizing collisions against tiles. This method is mostly used
  64059. * internally to optimize recalculating faces when only one tile has been changed.
  64060. *
  64061. * @method Phaser.Tilemaps.StaticTilemapLayer#calculateFacesAt
  64062. * @since 3.0.0
  64063. *
  64064. * @param {integer} tileX - The x coordinate.
  64065. * @param {integer} tileY - The y coordinate.
  64066. *
  64067. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  64068. */
  64069. calculateFacesAt: function (tileX, tileY)
  64070. {
  64071. TilemapComponents.CalculateFacesAt(tileX, tileY, this.layer);
  64072. return this;
  64073. },
  64074. /**
  64075. * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the
  64076. * layer. Interesting faces are used internally for optimizing collisions against tiles. This method
  64077. * is mostly used internally.
  64078. *
  64079. * @method Phaser.Tilemaps.StaticTilemapLayer#calculateFacesWithin
  64080. * @since 3.0.0
  64081. *
  64082. * @param {integer} [tileX=0] - [description]
  64083. * @param {integer} [tileY=0] - [description]
  64084. * @param {integer} [width=max width based on tileX] - [description]
  64085. * @param {integer} [height=max height based on tileY] - [description]
  64086. *
  64087. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  64088. */
  64089. calculateFacesWithin: function (tileX, tileY, width, height)
  64090. {
  64091. TilemapComponents.CalculateFacesWithin(tileX, tileY, width, height, this.layer);
  64092. return this;
  64093. },
  64094. /**
  64095. * Creates a Sprite for every object matching the given tile indexes in the layer. You can
  64096. * optionally specify if each tile will be replaced with a new tile after the Sprite has been
  64097. * created. This is useful if you want to lay down special tiles in a level that are converted to
  64098. * Sprites, but want to replace the tile itself with a floor tile or similar once converted.
  64099. *
  64100. * @method Phaser.Tilemaps.StaticTilemapLayer#createFromTiles
  64101. * @since 3.0.0
  64102. *
  64103. * @param {(integer|array)} indexes - The tile index, or array of indexes, to create Sprites from.
  64104. * @param {(integer|array)} replacements - The tile index, or array of indexes, to change a converted
  64105. * tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a
  64106. * one-to-one mapping with the indexes array.
  64107. * @param {object} spriteConfig - The config object to pass into the Sprite creator (i.e.
  64108. * scene.make.sprite).
  64109. * @param {Phaser.Scene} [scene=scene the map is within] - The Scene to create the Sprites within.
  64110. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when determining the world XY
  64111. *
  64112. * @return {Phaser.GameObjects.Sprite[]} An array of the Sprites that were created.
  64113. */
  64114. createFromTiles: function (indexes, replacements, spriteConfig, scene, camera)
  64115. {
  64116. return TilemapComponents.CreateFromTiles(indexes, replacements, spriteConfig, scene, camera, this.layer);
  64117. },
  64118. /**
  64119. * Returns the tiles in the given layer that are within the cameras viewport.
  64120. * This is used internally.
  64121. *
  64122. * @method Phaser.Tilemaps.StaticTilemapLayer#cull
  64123. * @since 3.0.0
  64124. *
  64125. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to run the cull check against.
  64126. *
  64127. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  64128. */
  64129. cull: function (camera)
  64130. {
  64131. return TilemapComponents.CullTiles(this.layer, camera, this.culledTiles);
  64132. },
  64133. /**
  64134. * Destroys this StaticTilemapLayer and removes its link to the associated LayerData.
  64135. *
  64136. * @method Phaser.Tilemaps.StaticTilemapLayer#destroy
  64137. * @since 3.0.0
  64138. */
  64139. destroy: function ()
  64140. {
  64141. // Uninstall this layer only if it is still installed on the LayerData object
  64142. if (this.layer.tilemapLayer === this)
  64143. {
  64144. this.layer.tilemapLayer = undefined;
  64145. }
  64146. this.tilemap = undefined;
  64147. this.layer = undefined;
  64148. this.tileset = undefined;
  64149. GameObject.prototype.destroy.call(this);
  64150. },
  64151. /**
  64152. * Searches the entire map layer for the first tile matching the given index, then returns that Tile
  64153. * object. If no match is found, it returns null. The search starts from the top-left tile and
  64154. * continues horizontally until it hits the end of the row, then it drops down to the next column.
  64155. * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to
  64156. * the top-left.
  64157. *
  64158. * @method Phaser.Tilemaps.StaticTilemapLayer#findByIndex
  64159. * @since 3.0.0
  64160. *
  64161. * @param {integer} index - The tile index value to search for.
  64162. * @param {integer} [skip=0] - The number of times to skip a matching tile before returning.
  64163. * @param {boolean} [reverse=false] - If true it will scan the layer in reverse, starting at the
  64164. * bottom-right. Otherwise it scans from the top-left.
  64165. *
  64166. * @return {Phaser.Tilemaps.Tile} A Tile object.
  64167. */
  64168. findByIndex: function (findIndex, skip, reverse)
  64169. {
  64170. return TilemapComponents.FindByIndex(findIndex, skip, reverse, this.layer);
  64171. },
  64172. /**
  64173. * Find the first tile in the given rectangular area (in tile coordinates) of the layer that
  64174. * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns
  64175. * true. Similar to Array.prototype.find in vanilla JS.
  64176. *
  64177. * @method Phaser.Tilemaps.StaticTilemapLayer#findTile
  64178. * @since 3.0.0
  64179. *
  64180. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  64181. * callback as the first and only parameter.
  64182. * @param {object} [context] - The context under which the callback should be run.
  64183. * @param {integer} [tileX=0] - [description]
  64184. * @param {integer} [tileY=0] - [description]
  64185. * @param {integer} [width=max width based on tileX] - [description]
  64186. * @param {integer} [height=max height based on tileY] - [description]
  64187. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  64188. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  64189. * -1 for an index.
  64190. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide
  64191. * on at least one side.
  64192. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  64193. * have at least one interesting face.
  64194. *
  64195. * @return {?Phaser.Tilemaps.Tile}
  64196. */
  64197. findTile: function (callback, context, tileX, tileY, width, height, filteringOptions)
  64198. {
  64199. return TilemapComponents.FindTile(callback, context, tileX, tileY, width, height, filteringOptions, this.layer);
  64200. },
  64201. /**
  64202. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  64203. * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns
  64204. * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS.
  64205. *
  64206. * @method Phaser.Tilemaps.StaticTilemapLayer#filterTiles
  64207. * @since 3.0.0
  64208. *
  64209. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  64210. * callback as the first and only parameter. The callback should return true for tiles that pass the
  64211. * filter.
  64212. * @param {object} [context] - The context under which the callback should be run.
  64213. * @param {integer} [tileX=0] - [description]
  64214. * @param {integer} [tileY=0] - [description]
  64215. * @param {integer} [width=max width based on tileX] - [description]
  64216. * @param {integer} [height=max height based on tileY] - [description]
  64217. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  64218. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  64219. * -1 for an index.
  64220. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide
  64221. * on at least one side.
  64222. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  64223. * have at least one interesting face.
  64224. *
  64225. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  64226. */
  64227. filterTiles: function (callback, context, tileX, tileY, width, height, filteringOptions)
  64228. {
  64229. return TilemapComponents.FilterTiles(callback, context, tileX, tileY, width, height, filteringOptions, this.layer);
  64230. },
  64231. /**
  64232. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  64233. * callback. Similar to Array.prototype.forEach in vanilla JS.
  64234. *
  64235. * @method Phaser.Tilemaps.StaticTilemapLayer#forEachTile
  64236. * @since 3.0.0
  64237. *
  64238. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  64239. * callback as the first and only parameter.
  64240. * @param {object} [context] - The context under which the callback should be run.
  64241. * @param {integer} [tileX=0] - [description]
  64242. * @param {integer} [tileY=0] - [description]
  64243. * @param {integer} [width=max width based on tileX] - [description]
  64244. * @param {integer} [height=max height based on tileY] - [description]
  64245. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  64246. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  64247. * -1 for an index.
  64248. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide
  64249. * on at least one side.
  64250. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  64251. * have at least one interesting face.
  64252. *
  64253. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  64254. */
  64255. forEachTile: function (callback, context, tileX, tileY, width, height, filteringOptions)
  64256. {
  64257. TilemapComponents.ForEachTile(callback, context, tileX, tileY, width, height, filteringOptions, this.layer);
  64258. return this;
  64259. },
  64260. /**
  64261. * Gets a tile at the given tile coordinates from the given layer.
  64262. *
  64263. * @method Phaser.Tilemaps.StaticTilemapLayer#getTileAt
  64264. * @since 3.0.0
  64265. *
  64266. * @param {integer} tileX - X position to get the tile from (given in tile units, not pixels).
  64267. * @param {integer} tileY - Y position to get the tile from (given in tile units, not pixels).
  64268. * @param {boolean} [nonNull=false] - If true getTile won't return null for empty tiles, but a Tile
  64269. * object with an index of -1.
  64270. *
  64271. * @return {Phaser.Tilemaps.Tile} The tile at the given coordinates or null if no tile was found or the coordinates were invalid.
  64272. */
  64273. getTileAt: function (tileX, tileY, nonNull)
  64274. {
  64275. return TilemapComponents.GetTileAt(tileX, tileY, nonNull, this.layer);
  64276. },
  64277. /**
  64278. * Gets a tile at the given world coordinates from the given layer.
  64279. *
  64280. * @method Phaser.Tilemaps.StaticTilemapLayer#getTileAtWorldXY
  64281. * @since 3.0.0
  64282. *
  64283. * @param {number} worldX - X position to get the tile from (given in pixels)
  64284. * @param {number} worldY - Y position to get the tile from (given in pixels)
  64285. * @param {boolean} [nonNull=false] - If true, function won't return null for empty tiles, but a Tile
  64286. * object with an index of -1.
  64287. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  64288. *
  64289. * @return {Phaser.Tilemaps.Tile} The tile at the given coordinates or null if no tile was found or the coordinates
  64290. * were invalid.
  64291. */
  64292. getTileAtWorldXY: function (worldX, worldY, nonNull, camera)
  64293. {
  64294. return TilemapComponents.GetTileAtWorldXY(worldX, worldY, nonNull, camera, this.layer);
  64295. },
  64296. /**
  64297. * Gets the tiles in the given rectangular area (in tile coordinates) of the layer.
  64298. *
  64299. * @method Phaser.Tilemaps.StaticTilemapLayer#getTilesWithin
  64300. * @since 3.0.0
  64301. *
  64302. * @param {integer} [tileX=0] - [description]
  64303. * @param {integer} [tileY=0] - [description]
  64304. * @param {integer} [width=max width based on tileX] - [description]
  64305. * @param {integer} [height=max height based on tileY] - [description]
  64306. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  64307. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  64308. * -1 for an index.
  64309. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on
  64310. * at least one side.
  64311. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  64312. * have at least one interesting face.
  64313. *
  64314. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  64315. */
  64316. getTilesWithin: function (tileX, tileY, width, height, filteringOptions)
  64317. {
  64318. return TilemapComponents.GetTilesWithin(tileX, tileY, width, height, filteringOptions, this.layer);
  64319. },
  64320. /**
  64321. * Gets the tiles in the given rectangular area (in world coordinates) of the layer.
  64322. *
  64323. * @method Phaser.Tilemaps.StaticTilemapLayer#getTilesWithinWorldXY
  64324. * @since 3.0.0
  64325. *
  64326. * @param {number} worldX - [description]
  64327. * @param {number} worldY - [description]
  64328. * @param {number} width - [description]
  64329. * @param {number} height - [description]
  64330. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  64331. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  64332. * -1 for an index.
  64333. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on
  64334. * at least one side.
  64335. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  64336. * have at least one interesting face.
  64337. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  64338. *
  64339. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  64340. */
  64341. getTilesWithinWorldXY: function (worldX, worldY, width, height, filteringOptions, camera)
  64342. {
  64343. return TilemapComponents.GetTilesWithinWorldXY(worldX, worldY, width, height, filteringOptions, camera, this.layer);
  64344. },
  64345. /**
  64346. * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle,
  64347. * Line, Rectangle or Triangle. The shape should be in world coordinates.
  64348. *
  64349. * @method Phaser.Tilemaps.StaticTilemapLayer#getTilesWithinShape
  64350. * @since 3.0.0
  64351. *
  64352. * @param {(Phaser.Geom.Circle|Phaser.Geom.Line|Phaser.Geom.Rectangle|Phaser.Geom.Triangle)} shape - A shape in world (pixel) coordinates
  64353. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  64354. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  64355. * -1 for an index.
  64356. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on
  64357. * at least one side.
  64358. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  64359. * have at least one interesting face.
  64360. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  64361. *
  64362. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  64363. */
  64364. getTilesWithinShape: function (shape, filteringOptions, camera)
  64365. {
  64366. return TilemapComponents.GetTilesWithinShape(shape, filteringOptions, camera, this.layer);
  64367. },
  64368. /**
  64369. * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns
  64370. * false if there is no tile or if the tile at that location has an index of -1.
  64371. *
  64372. * @method Phaser.Tilemaps.StaticTilemapLayer#hasTileAt
  64373. * @since 3.0.0
  64374. *
  64375. * @param {integer} tileX - [description]
  64376. * @param {integer} tileY - [description]
  64377. *
  64378. * @return {boolean}
  64379. */
  64380. hasTileAt: function (tileX, tileY)
  64381. {
  64382. return TilemapComponents.HasTileAt(tileX, tileY, this.layer);
  64383. },
  64384. /**
  64385. * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns
  64386. * false if there is no tile or if the tile at that location has an index of -1.
  64387. *
  64388. * @method Phaser.Tilemaps.StaticTilemapLayer#hasTileAtWorldXY
  64389. * @since 3.0.0
  64390. *
  64391. * @param {number} worldX - [description]
  64392. * @param {number} worldY - [description]
  64393. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  64394. *
  64395. * @return {boolean}
  64396. */
  64397. hasTileAtWorldXY: function (worldX, worldY, camera)
  64398. {
  64399. return TilemapComponents.HasTileAtWorldXY(worldX, worldY, camera, this.layer);
  64400. },
  64401. /**
  64402. * Draws a debug representation of the layer to the given Graphics. This is helpful when you want to
  64403. * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles
  64404. * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation
  64405. * wherever you want on the screen.
  64406. *
  64407. * @method Phaser.Tilemaps.StaticTilemapLayer#renderDebug
  64408. * @since 3.0.0
  64409. *
  64410. * @param {Phaser.GameObjects.Graphics} graphics - The target Graphics object to draw upon.
  64411. * @param {object} styleConfig - An object specifying the colors to use for the debug drawing.
  64412. * @param {?Color} [styleConfig.tileColor=blue] - Color to use for drawing a filled rectangle at
  64413. * non-colliding tile locations. If set to null, non-colliding tiles will not be drawn.
  64414. * @param {?Color} [styleConfig.collidingTileColor=orange] - Color to use for drawing a filled
  64415. * rectangle at colliding tile locations. If set to null, colliding tiles will not be drawn.
  64416. * @param {?Color} [styleConfig.faceColor=grey] - Color to use for drawing a line at interesting
  64417. * tile faces. If set to null, interesting tile faces will not be drawn.
  64418. *
  64419. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  64420. */
  64421. renderDebug: function (graphics, styleConfig)
  64422. {
  64423. TilemapComponents.RenderDebug(graphics, styleConfig, this.layer);
  64424. return this;
  64425. },
  64426. /**
  64427. * Sets collision on the given tile or tiles within a layer by index. You can pass in either a
  64428. * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if
  64429. * collision will be enabled (true) or disabled (false).
  64430. *
  64431. * @method Phaser.Tilemaps.StaticTilemapLayer#setCollision
  64432. * @since 3.0.0
  64433. *
  64434. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes.
  64435. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  64436. * collision.
  64437. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  64438. * update.
  64439. *
  64440. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  64441. */
  64442. setCollision: function (indexes, collides, recalculateFaces)
  64443. {
  64444. TilemapComponents.SetCollision(indexes, collides, recalculateFaces, this.layer);
  64445. return this;
  64446. },
  64447. /**
  64448. * Sets collision on a range of tiles in a layer whose index is between the specified `start` and
  64449. * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set
  64450. * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be
  64451. * enabled (true) or disabled (false).
  64452. *
  64453. * @method Phaser.Tilemaps.StaticTilemapLayer#setCollisionBetween
  64454. * @since 3.0.0
  64455. *
  64456. * @param {integer} start - The first index of the tile to be set for collision.
  64457. * @param {integer} stop - The last index of the tile to be set for collision.
  64458. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  64459. * collision.
  64460. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  64461. * update.
  64462. *
  64463. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  64464. */
  64465. setCollisionBetween: function (start, stop, collides, recalculateFaces)
  64466. {
  64467. TilemapComponents.SetCollisionBetween(start, stop, collides, recalculateFaces, this.layer);
  64468. return this;
  64469. },
  64470. /**
  64471. * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property
  64472. * that matches the given properties object, its collision flag will be set. The `collides`
  64473. * parameter controls if collision will be enabled (true) or disabled (false). Passing in
  64474. * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that
  64475. * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can
  64476. * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a
  64477. * "types" property that matches any of those values, its collision flag will be updated.
  64478. *
  64479. * @method Phaser.Tilemaps.StaticTilemapLayer#setCollisionByProperty
  64480. * @since 3.0.0
  64481. *
  64482. * @param {object} properties - An object with tile properties and corresponding values that should
  64483. * be checked.
  64484. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  64485. * collision.
  64486. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  64487. * update.
  64488. *
  64489. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  64490. */
  64491. setCollisionByProperty: function (properties, collides, recalculateFaces)
  64492. {
  64493. TilemapComponents.SetCollisionByProperty(properties, collides, recalculateFaces, this.layer);
  64494. return this;
  64495. },
  64496. /**
  64497. * Sets collision on all tiles in the given layer, except for tiles that have an index specified in
  64498. * the given array. The `collides` parameter controls if collision will be enabled (true) or
  64499. * disabled (false).
  64500. *
  64501. * @method Phaser.Tilemaps.StaticTilemapLayer#setCollisionByExclusion
  64502. * @since 3.0.0
  64503. *
  64504. * @param {integer[]} indexes - An array of the tile indexes to not be counted for collision.
  64505. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  64506. * collision.
  64507. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  64508. * update.
  64509. *
  64510. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  64511. */
  64512. setCollisionByExclusion: function (indexes, collides, recalculateFaces)
  64513. {
  64514. TilemapComponents.SetCollisionByExclusion(indexes, collides, recalculateFaces, this.layer);
  64515. return this;
  64516. },
  64517. /**
  64518. * Sets a global collision callback for the given tile index within the layer. This will affect all
  64519. * tiles on this layer that have the same index. If a callback is already set for the tile index it
  64520. * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile
  64521. * at a specific location on the map then see setTileLocationCallback.
  64522. *
  64523. * @method Phaser.Tilemaps.StaticTilemapLayer#setTileIndexCallback
  64524. * @since 3.0.0
  64525. *
  64526. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes to have a
  64527. * collision callback set for.
  64528. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  64529. * @param {object} callbackContext - The context under which the callback is called.
  64530. *
  64531. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  64532. */
  64533. setTileIndexCallback: function (indexes, callback, callbackContext)
  64534. {
  64535. TilemapComponents.SetTileIndexCallback(indexes, callback, callbackContext, this.layer);
  64536. return this;
  64537. },
  64538. /**
  64539. * Sets collision on the tiles within a layer by checking each tiles collision group data
  64540. * (typically defined in Tiled within the tileset collision editor). If any objects are found within
  64541. * a tiles collision group, the tile's colliding information will be set. The `collides` parameter
  64542. * controls if collision will be enabled (true) or disabled (false).
  64543. *
  64544. * @method Phaser.Tilemaps.StaticTilemapLayer#setCollisionFromCollisionGroup
  64545. * @since 3.0.0
  64546. *
  64547. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  64548. * collision.
  64549. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  64550. * update.
  64551. *
  64552. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  64553. */
  64554. setCollisionFromCollisionGroup: function (collides, recalculateFaces)
  64555. {
  64556. TilemapComponents.SetCollisionFromCollisionGroup(collides, recalculateFaces, this.layer);
  64557. return this;
  64558. },
  64559. /**
  64560. * Sets a collision callback for the given rectangular area (in tile coordinates) within the layer.
  64561. * If a callback is already set for the tile index it will be replaced. Set the callback to null to
  64562. * remove it.
  64563. *
  64564. * @method Phaser.Tilemaps.StaticTilemapLayer#setTileLocationCallback
  64565. * @since 3.0.0
  64566. *
  64567. * @param {integer} tileX - [description]
  64568. * @param {integer} tileY - [description]
  64569. * @param {integer} width - [description]
  64570. * @param {integer} height - [description]
  64571. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  64572. * @param {object} [callbackContext] - The context under which the callback is called.
  64573. *
  64574. * @return {Phaser.Tilemaps.StaticTilemapLayer} This Tilemap Layer object.
  64575. */
  64576. setTileLocationCallback: function (tileX, tileY, width, height, callback, callbackContext)
  64577. {
  64578. TilemapComponents.SetTileLocationCallback(tileX, tileY, width, height, callback, callbackContext, this.layer);
  64579. return this;
  64580. },
  64581. /**
  64582. * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the
  64583. * layers position, scale and scroll.
  64584. *
  64585. * @method Phaser.Tilemaps.StaticTilemapLayer#tileToWorldX
  64586. * @since 3.0.0
  64587. *
  64588. * @param {integer} tileX - [description]
  64589. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  64590. *
  64591. * @return {number}
  64592. */
  64593. tileToWorldX: function (tileX, camera)
  64594. {
  64595. return TilemapComponents.TileToWorldX(tileX, camera, this.layer);
  64596. },
  64597. /**
  64598. * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the
  64599. * layers position, scale and scroll.
  64600. *
  64601. * @method Phaser.Tilemaps.StaticTilemapLayer#tileToWorldY
  64602. * @since 3.0.0
  64603. *
  64604. * @param {integer} tileY - [description]
  64605. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  64606. *
  64607. * @return {number}
  64608. */
  64609. tileToWorldY: function (tileY, camera)
  64610. {
  64611. return TilemapComponents.TileToWorldY(tileY, camera, this.layer);
  64612. },
  64613. /**
  64614. * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the
  64615. * layers position, scale and scroll. This will return a new Vector2 object or update the given
  64616. * `point` object.
  64617. *
  64618. * @method Phaser.Tilemaps.StaticTilemapLayer#tileToWorldXY
  64619. * @since 3.0.0
  64620. *
  64621. * @param {integer} tileX - [description]
  64622. * @param {integer} tileY - [description]
  64623. * @param {Phaser.Math.Vector2} [point] - [description]
  64624. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  64625. *
  64626. * @return {Phaser.Math.Vector2}
  64627. */
  64628. tileToWorldXY: function (tileX, tileY, point, camera)
  64629. {
  64630. return TilemapComponents.TileToWorldXY(tileX, tileY, point, camera, this.layer);
  64631. },
  64632. /**
  64633. * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the
  64634. * layers position, scale and scroll.
  64635. *
  64636. * @method Phaser.Tilemaps.StaticTilemapLayer#worldToTileX
  64637. * @since 3.0.0
  64638. *
  64639. * @param {number} worldX - [description]
  64640. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  64641. * nearest integer.
  64642. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  64643. *
  64644. * @return {number}
  64645. */
  64646. worldToTileX: function (worldX, snapToFloor, camera)
  64647. {
  64648. return TilemapComponents.WorldToTileX(worldX, snapToFloor, camera, this.layer);
  64649. },
  64650. /**
  64651. * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the
  64652. * layers position, scale and scroll.
  64653. *
  64654. * @method Phaser.Tilemaps.StaticTilemapLayer#worldToTileY
  64655. * @since 3.0.0
  64656. *
  64657. * @param {number} worldY - [description]
  64658. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  64659. * nearest integer.
  64660. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  64661. *
  64662. * @return {number}
  64663. */
  64664. worldToTileY: function (worldY, snapToFloor, camera)
  64665. {
  64666. return TilemapComponents.WorldToTileY(worldY, snapToFloor, camera, this.layer);
  64667. },
  64668. /**
  64669. * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the
  64670. * layers position, scale and scroll. This will return a new Vector2 object or update the given
  64671. * `point` object.
  64672. *
  64673. * @method Phaser.Tilemaps.StaticTilemapLayer#worldToTileXY
  64674. * @since 3.0.0
  64675. *
  64676. * @param {number} worldX - [description]
  64677. * @param {number} worldY - [description]
  64678. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  64679. * nearest integer.
  64680. * @param {Phaser.Math.Vector2} [point] - [description]
  64681. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  64682. *
  64683. * @return {Phaser.Math.Vector2}
  64684. */
  64685. worldToTileXY: function (worldX, worldY, snapToFloor, point, camera)
  64686. {
  64687. return TilemapComponents.WorldToTileXY(worldX, worldY, snapToFloor, point, camera, this.layer);
  64688. }
  64689. });
  64690. module.exports = StaticTilemapLayer;
  64691. /***/ }),
  64692. /* 315 */
  64693. /***/ (function(module, exports, __webpack_require__) {
  64694. /**
  64695. * @author Richard Davey <rich@photonstorm.com>
  64696. * @copyright 2018 Photon Storm Ltd.
  64697. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  64698. */
  64699. var Class = __webpack_require__(0);
  64700. var Components = __webpack_require__(17);
  64701. var DynamicTilemapLayerRender = __webpack_require__(632);
  64702. var GameObject = __webpack_require__(2);
  64703. var TilemapComponents = __webpack_require__(142);
  64704. /**
  64705. * @classdesc
  64706. * A DynamicTilemapLayer is a game object that renders LayerData from a Tilemap. A
  64707. * DynamicTilemapLayer can only render tiles from a single tileset.
  64708. *
  64709. * A DynamicTilemapLayer trades some speed for being able to apply powerful effects. Unlike a
  64710. * StaticTilemapLayer, you can apply per-tile effects like tint or alpha, and you can change the
  64711. * tiles in a DynamicTilemapLayer. Use this over a StaticTilemapLayer when you need those
  64712. * features.
  64713. *
  64714. * @class DynamicTilemapLayer
  64715. * @extends Phaser.GameObjects.GameObject
  64716. * @memberOf Phaser.Tilemaps
  64717. * @constructor
  64718. * @since 3.0.0
  64719. *
  64720. * @extends Phaser.GameObjects.Components.Alpha
  64721. * @extends Phaser.GameObjects.Components.BlendMode
  64722. * @extends Phaser.GameObjects.Components.ComputedSize
  64723. * @extends Phaser.GameObjects.Components.Depth
  64724. * @extends Phaser.GameObjects.Components.Flip
  64725. * @extends Phaser.GameObjects.Components.GetBounds
  64726. * @extends Phaser.GameObjects.Components.Origin
  64727. * @extends Phaser.GameObjects.Components.Pipeline
  64728. * @extends Phaser.GameObjects.Components.ScaleMode
  64729. * @extends Phaser.GameObjects.Components.ScrollFactor
  64730. * @extends Phaser.GameObjects.Components.Transform
  64731. * @extends Phaser.GameObjects.Components.Visible
  64732. *
  64733. * @param {Phaser.Scene} scene - [description]
  64734. * @param {Phaser.Tilemaps.Tilemap} tilemap - The Tilemap this layer is a part of.
  64735. * @param {integer} layerIndex - The index of the LayerData associated with this layer.
  64736. * @param {Phaser.Tilemaps.Tileset} tileset - The tileset used to render the tiles in this layer.
  64737. * @param {number} [x=0] - The world x position where the top left of this layer will be placed.
  64738. * @param {number} [y=0] - The world y position where the top left of this layer will be placed.
  64739. */
  64740. var DynamicTilemapLayer = new Class({
  64741. Extends: GameObject,
  64742. Mixins: [
  64743. Components.Alpha,
  64744. Components.BlendMode,
  64745. Components.ComputedSize,
  64746. Components.Depth,
  64747. Components.Flip,
  64748. Components.GetBounds,
  64749. Components.Origin,
  64750. Components.Pipeline,
  64751. Components.ScaleMode,
  64752. Components.Transform,
  64753. Components.Visible,
  64754. Components.ScrollFactor,
  64755. DynamicTilemapLayerRender
  64756. ],
  64757. initialize:
  64758. function DynamicTilemapLayer (scene, tilemap, layerIndex, tileset, x, y)
  64759. {
  64760. GameObject.call(this, scene, 'DynamicTilemapLayer');
  64761. /**
  64762. * Used internally by physics system to perform fast type checks.
  64763. *
  64764. * @name Phaser.Tilemaps.DynamicTilemapLayer#isTilemap
  64765. * @type {boolean}
  64766. * @readOnly
  64767. * @since 3.0.0
  64768. */
  64769. this.isTilemap = true;
  64770. /**
  64771. * The Tilemap that this layer is a part of.
  64772. *
  64773. * @name Phaser.Tilemaps.DynamicTilemapLayer#tilemap
  64774. * @type {Phaser.Tilemaps.Tilemap}
  64775. * @since 3.0.0
  64776. */
  64777. this.tilemap = tilemap;
  64778. /**
  64779. * The index of the LayerData associated with this layer.
  64780. *
  64781. * @name Phaser.Tilemaps.DynamicTilemapLayer#layerIndex
  64782. * @type {integer}
  64783. * @since 3.0.0
  64784. */
  64785. this.layerIndex = layerIndex;
  64786. /**
  64787. * The LayerData associated with this layer. LayerData can only be associated with one
  64788. * tilemap layer.
  64789. *
  64790. * @name Phaser.Tilemaps.DynamicTilemapLayer#layer
  64791. * @type {Phaser.Tilemaps.LayerData}
  64792. * @since 3.0.0
  64793. */
  64794. this.layer = tilemap.layers[layerIndex];
  64795. this.layer.tilemapLayer = this; // Link the LayerData with this static tilemap layer
  64796. /**
  64797. * The Tileset associated with this layer. A tilemap layer can only render from one Tileset.
  64798. *
  64799. * @name Phaser.Tilemaps.DynamicTilemapLayer#tileset
  64800. * @type {Phaser.Tilemaps.Tileset}
  64801. * @since 3.0.0
  64802. */
  64803. this.tileset = tileset;
  64804. /**
  64805. * Used internally with the canvas render. This holds the tiles that are visible within the
  64806. * camera.
  64807. *
  64808. * @name Phaser.Tilemaps.DynamicTilemapLayer#culledTiles
  64809. * @type {array}
  64810. * @since 3.0.0
  64811. */
  64812. this.culledTiles = [];
  64813. /**
  64814. * You can control if the Cameras should cull tiles before rendering them or not.
  64815. * By default the camera will try to cull the tiles in this layer, to avoid over-drawing to the renderer.
  64816. *
  64817. * However, there are some instances when you may wish to disable this, and toggling this flag allows
  64818. * you to do so. Also see `setSkipCull` for a chainable method that does the same thing.
  64819. *
  64820. * @name Phaser.Tilemaps.DynamicTilemapLayer#skipCull
  64821. * @type {boolean}
  64822. * @since 3.11.0
  64823. */
  64824. this.skipCull = false;
  64825. /**
  64826. * The total number of tiles drawn by the renderer in the last frame.
  64827. *
  64828. * @name Phaser.Tilemaps.DynamicTilemapLayer#tilesDrawn
  64829. * @type {number}
  64830. * @readOnly
  64831. * @since 3.11.0
  64832. */
  64833. this.tilesDrawn = 0;
  64834. /**
  64835. * The total number of tiles in this layer. Updated every frame.
  64836. *
  64837. * @name Phaser.Tilemaps.DynamicTilemapLayer#tilesTotal
  64838. * @type {number}
  64839. * @readOnly
  64840. * @since 3.11.0
  64841. */
  64842. this.tilesTotal = this.layer.width * this.layer.height;
  64843. /**
  64844. * The amount of extra tiles to add into the cull rectangle when calculating its horizontal size.
  64845. *
  64846. * See the method `setCullPadding` for more details.
  64847. *
  64848. * @name Phaser.Tilemaps.DynamicTilemapLayer#cullPaddingX
  64849. * @type {number}
  64850. * @default 1
  64851. * @since 3.11.0
  64852. */
  64853. this.cullPaddingX = 1;
  64854. /**
  64855. * The amount of extra tiles to add into the cull rectangle when calculating its vertical size.
  64856. *
  64857. * See the method `setCullPadding` for more details.
  64858. *
  64859. * @name Phaser.Tilemaps.DynamicTilemapLayer#cullPaddingY
  64860. * @type {number}
  64861. * @default 1
  64862. * @since 3.11.0
  64863. */
  64864. this.cullPaddingY = 1;
  64865. /**
  64866. * The callback that is invoked when the tiles are culled.
  64867. *
  64868. * By default it will call `TilemapComponents.CullTiles` but you can override this to call any function you like.
  64869. *
  64870. * It will be sent 3 arguments:
  64871. *
  64872. * 1) The Phaser.Tilemaps.LayerData object for this Layer
  64873. * 2) The Camera that is culling the layer. You can check its `dirty` property to see if it has changed since the last cull.
  64874. * 3) A reference to the `culledTiles` array, which should be used to store the tiles you want rendered.
  64875. *
  64876. * See the `TilemapComponents.CullTiles` source code for details on implementing your own culling system.
  64877. *
  64878. * @name Phaser.Tilemaps.DynamicTilemapLayer#cullCallback
  64879. * @type {function}
  64880. * @since 3.11.0
  64881. */
  64882. this.cullCallback = TilemapComponents.CullTiles;
  64883. this.setAlpha(this.layer.alpha);
  64884. this.setPosition(x, y);
  64885. this.setOrigin();
  64886. this.setSize(this.layer.tileWidth * this.layer.width, this.layer.tileHeight * this.layer.height);
  64887. this.initPipeline('TextureTintPipeline');
  64888. },
  64889. /**
  64890. * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting
  64891. * faces are used internally for optimizing collisions against tiles. This method is mostly used
  64892. * internally to optimize recalculating faces when only one tile has been changed.
  64893. *
  64894. * @method Phaser.Tilemaps.DynamicTilemapLayer#calculateFacesAt
  64895. * @since 3.0.0
  64896. *
  64897. * @param {integer} tileX - The x coordinate.
  64898. * @param {integer} tileY - The y coordinate.
  64899. *
  64900. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  64901. */
  64902. calculateFacesAt: function (tileX, tileY)
  64903. {
  64904. TilemapComponents.CalculateFacesAt(tileX, tileY, this.layer);
  64905. return this;
  64906. },
  64907. /**
  64908. * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the
  64909. * layer. Interesting faces are used internally for optimizing collisions against tiles. This method
  64910. * is mostly used internally.
  64911. *
  64912. * @method Phaser.Tilemaps.DynamicTilemapLayer#calculateFacesWithin
  64913. * @since 3.0.0
  64914. *
  64915. * @param {integer} [tileX=0] - [description]
  64916. * @param {integer} [tileY=0] - [description]
  64917. * @param {integer} [width=max width based on tileX] - [description]
  64918. * @param {integer} [height=max height based on tileY] - [description]
  64919. *
  64920. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  64921. */
  64922. calculateFacesWithin: function (tileX, tileY, width, height)
  64923. {
  64924. TilemapComponents.CalculateFacesWithin(tileX, tileY, width, height, this.layer);
  64925. return this;
  64926. },
  64927. /**
  64928. * Creates a Sprite for every object matching the given tile indexes in the layer. You can
  64929. * optionally specify if each tile will be replaced with a new tile after the Sprite has been
  64930. * created. This is useful if you want to lay down special tiles in a level that are converted to
  64931. * Sprites, but want to replace the tile itself with a floor tile or similar once converted.
  64932. *
  64933. * @method Phaser.Tilemaps.DynamicTilemapLayer#createFromTiles
  64934. * @since 3.0.0
  64935. *
  64936. * @param {(integer|array)} indexes - The tile index, or array of indexes, to create Sprites from.
  64937. * @param {(integer|array)} replacements - The tile index, or array of indexes, to change a converted
  64938. * tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a
  64939. * one-to-one mapping with the indexes array.
  64940. * @param {object} spriteConfig - The config object to pass into the Sprite creator (i.e.
  64941. * scene.make.sprite).
  64942. * @param {Phaser.Scene} [scene=scene the map is within] - The Scene to create the Sprites within.
  64943. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when determining the world XY
  64944. *
  64945. * @return {Phaser.GameObjects.Sprite[]} An array of the Sprites that were created.
  64946. */
  64947. createFromTiles: function (indexes, replacements, spriteConfig, scene, camera)
  64948. {
  64949. return TilemapComponents.CreateFromTiles(indexes, replacements, spriteConfig, scene, camera, this.layer);
  64950. },
  64951. /**
  64952. * Returns the tiles in the given layer that are within the cameras viewport.
  64953. * This is used internally.
  64954. *
  64955. * @method Phaser.Tilemaps.DynamicTilemapLayer#cull
  64956. * @since 3.0.0
  64957. *
  64958. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to run the cull check against.
  64959. *
  64960. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  64961. */
  64962. cull: function (camera)
  64963. {
  64964. return this.cullCallback(this.layer, camera, this.culledTiles);
  64965. },
  64966. /**
  64967. * Copies the tiles in the source rectangular area to a new destination (all specified in tile
  64968. * coordinates) within the layer. This copies all tile properties & recalculates collision
  64969. * information in the destination region.
  64970. *
  64971. * @method Phaser.Tilemaps.DynamicTilemapLayer#copy
  64972. * @since 3.0.0
  64973. *
  64974. * @param {integer} srcTileX - [description]
  64975. * @param {integer} srcTileY - [description]
  64976. * @param {integer} width - [description]
  64977. * @param {integer} height - [description]
  64978. * @param {integer} destTileX - [description]
  64979. * @param {integer} destTileY - [description]
  64980. * @param {boolean} [recalculateFaces=true] - [description]
  64981. *
  64982. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  64983. */
  64984. copy: function (srcTileX, srcTileY, width, height, destTileX, destTileY, recalculateFaces)
  64985. {
  64986. TilemapComponents.Copy(srcTileX, srcTileY, width, height, destTileX, destTileY, recalculateFaces, this.layer);
  64987. return this;
  64988. },
  64989. /**
  64990. * Destroys this DynamicTilemapLayer and removes its link to the associated LayerData.
  64991. *
  64992. * @method Phaser.Tilemaps.DynamicTilemapLayer#destroy
  64993. * @since 3.0.0
  64994. */
  64995. destroy: function ()
  64996. {
  64997. // Uninstall this layer only if it is still installed on the LayerData object
  64998. if (this.layer.tilemapLayer === this)
  64999. {
  65000. this.layer.tilemapLayer = undefined;
  65001. }
  65002. this.tilemap = undefined;
  65003. this.layer = undefined;
  65004. this.tileset = undefined;
  65005. this.culledTiles.length = 0;
  65006. this.cullCallback = null;
  65007. GameObject.prototype.destroy.call(this);
  65008. },
  65009. /**
  65010. * Sets the tiles in the given rectangular area (in tile coordinates) of the layer with the
  65011. * specified index. Tiles will be set to collide if the given index is a colliding index.
  65012. * Collision information in the region will be recalculated.
  65013. *
  65014. * @method Phaser.Tilemaps.DynamicTilemapLayer#fill
  65015. * @since 3.0.0
  65016. *
  65017. * @param {integer} index - [description]
  65018. * @param {integer} [tileX=0] - [description]
  65019. * @param {integer} [tileY=0] - [description]
  65020. * @param {integer} [width=max width based on tileX] - [description]
  65021. * @param {integer} [height=max height based on tileY] - [description]
  65022. * @param {boolean} [recalculateFaces=true] - [description]
  65023. *
  65024. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65025. */
  65026. fill: function (index, tileX, tileY, width, height, recalculateFaces)
  65027. {
  65028. TilemapComponents.Fill(index, tileX, tileY, width, height, recalculateFaces, this.layer);
  65029. return this;
  65030. },
  65031. /**
  65032. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  65033. * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns
  65034. * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS.
  65035. *
  65036. * @method Phaser.Tilemaps.DynamicTilemapLayer#filterTiles
  65037. * @since 3.0.0
  65038. *
  65039. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  65040. * callback as the first and only parameter. The callback should return true for tiles that pass the
  65041. * filter.
  65042. * @param {object} [context] - The context under which the callback should be run.
  65043. * @param {integer} [tileX=0] - [description]
  65044. * @param {integer} [tileY=0] - [description]
  65045. * @param {integer} [width=max width based on tileX] - [description]
  65046. * @param {integer} [height=max height based on tileY] - [description]
  65047. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  65048. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  65049. * -1 for an index.
  65050. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide
  65051. * on at least one side.
  65052. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  65053. * have at least one interesting face.
  65054. *
  65055. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  65056. */
  65057. filterTiles: function (callback, context, tileX, tileY, width, height, filteringOptions)
  65058. {
  65059. return TilemapComponents.FilterTiles(callback, context, tileX, tileY, width, height, filteringOptions, this.layer);
  65060. },
  65061. /**
  65062. * Searches the entire map layer for the first tile matching the given index, then returns that Tile
  65063. * object. If no match is found, it returns null. The search starts from the top-left tile and
  65064. * continues horizontally until it hits the end of the row, then it drops down to the next column.
  65065. * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to
  65066. * the top-left.
  65067. *
  65068. * @method Phaser.Tilemaps.DynamicTilemapLayer#findByIndex
  65069. * @since 3.0.0
  65070. *
  65071. * @param {integer} index - The tile index value to search for.
  65072. * @param {integer} [skip=0] - The number of times to skip a matching tile before returning.
  65073. * @param {boolean} [reverse=false] - If true it will scan the layer in reverse, starting at the
  65074. * bottom-right. Otherwise it scans from the top-left.
  65075. *
  65076. * @return {Phaser.Tilemaps.Tile} A Tile object.
  65077. */
  65078. findByIndex: function (findIndex, skip, reverse)
  65079. {
  65080. return TilemapComponents.FindByIndex(findIndex, skip, reverse, this.layer);
  65081. },
  65082. /**
  65083. * Find the first tile in the given rectangular area (in tile coordinates) of the layer that
  65084. * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns
  65085. * true. Similar to Array.prototype.find in vanilla JS.
  65086. *
  65087. * @method Phaser.Tilemaps.DynamicTilemapLayer#findTile
  65088. * @since 3.0.0
  65089. *
  65090. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  65091. * callback as the first and only parameter.
  65092. * @param {object} [context] - The context under which the callback should be run.
  65093. * @param {integer} [tileX=0] - [description]
  65094. * @param {integer} [tileY=0] - [description]
  65095. * @param {integer} [width=max width based on tileX] - [description]
  65096. * @param {integer} [height=max height based on tileY] - [description]
  65097. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  65098. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  65099. * -1 for an index.
  65100. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide
  65101. * on at least one side.
  65102. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  65103. * have at least one interesting face.
  65104. *
  65105. * @return {?Phaser.Tilemaps.Tile}
  65106. */
  65107. findTile: function (callback, context, tileX, tileY, width, height, filteringOptions)
  65108. {
  65109. return TilemapComponents.FindTile(callback, context, tileX, tileY, width, height, filteringOptions, this.layer);
  65110. },
  65111. /**
  65112. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  65113. * callback. Similar to Array.prototype.forEach in vanilla JS.
  65114. *
  65115. * @method Phaser.Tilemaps.DynamicTilemapLayer#forEachTile
  65116. * @since 3.0.0
  65117. *
  65118. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  65119. * callback as the first and only parameter.
  65120. * @param {object} [context] - The context under which the callback should be run.
  65121. * @param {integer} [tileX=0] - [description]
  65122. * @param {integer} [tileY=0] - [description]
  65123. * @param {integer} [width=max width based on tileX] - [description]
  65124. * @param {integer} [height=max height based on tileY] - [description]
  65125. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  65126. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  65127. * -1 for an index.
  65128. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide
  65129. * on at least one side.
  65130. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  65131. * have at least one interesting face.
  65132. *
  65133. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65134. */
  65135. forEachTile: function (callback, context, tileX, tileY, width, height, filteringOptions)
  65136. {
  65137. TilemapComponents.ForEachTile(callback, context, tileX, tileY, width, height, filteringOptions, this.layer);
  65138. return this;
  65139. },
  65140. /**
  65141. * Gets a tile at the given tile coordinates from the given layer.
  65142. *
  65143. * @method Phaser.Tilemaps.DynamicTilemapLayer#getTileAt
  65144. * @since 3.0.0
  65145. *
  65146. * @param {integer} tileX - X position to get the tile from (given in tile units, not pixels).
  65147. * @param {integer} tileY - Y position to get the tile from (given in tile units, not pixels).
  65148. * @param {boolean} [nonNull=false] - If true getTile won't return null for empty tiles, but a Tile
  65149. * object with an index of -1.
  65150. *
  65151. * @return {Phaser.Tilemaps.Tile} The tile at the given coordinates or null if no tile was found or the coordinates were invalid.
  65152. */
  65153. getTileAt: function (tileX, tileY, nonNull)
  65154. {
  65155. return TilemapComponents.GetTileAt(tileX, tileY, nonNull, this.layer);
  65156. },
  65157. /**
  65158. * Gets a tile at the given world coordinates from the given layer.
  65159. *
  65160. * @method Phaser.Tilemaps.DynamicTilemapLayer#getTileAtWorldXY
  65161. * @since 3.0.0
  65162. *
  65163. * @param {number} worldX - X position to get the tile from (given in pixels)
  65164. * @param {number} worldY - Y position to get the tile from (given in pixels)
  65165. * @param {boolean} [nonNull=false] - If true, function won't return null for empty tiles, but a Tile
  65166. * object with an index of -1.
  65167. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  65168. *
  65169. * @return {Phaser.Tilemaps.Tile} The tile at the given coordinates or null if no tile was found or the coordinates
  65170. * were invalid.
  65171. */
  65172. getTileAtWorldXY: function (worldX, worldY, nonNull, camera)
  65173. {
  65174. return TilemapComponents.GetTileAtWorldXY(worldX, worldY, nonNull, camera, this.layer);
  65175. },
  65176. /**
  65177. * Gets the tiles in the given rectangular area (in tile coordinates) of the layer.
  65178. *
  65179. * @method Phaser.Tilemaps.DynamicTilemapLayer#getTilesWithin
  65180. * @since 3.0.0
  65181. *
  65182. * @param {integer} [tileX=0] - [description]
  65183. * @param {integer} [tileY=0] - [description]
  65184. * @param {integer} [width=max width based on tileX] - [description]
  65185. * @param {integer} [height=max height based on tileY] - [description]
  65186. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  65187. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  65188. * -1 for an index.
  65189. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on
  65190. * at least one side.
  65191. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  65192. * have at least one interesting face.
  65193. *
  65194. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  65195. */
  65196. getTilesWithin: function (tileX, tileY, width, height, filteringOptions)
  65197. {
  65198. return TilemapComponents.GetTilesWithin(tileX, tileY, width, height, filteringOptions, this.layer);
  65199. },
  65200. /**
  65201. * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle,
  65202. * Line, Rectangle or Triangle. The shape should be in world coordinates.
  65203. *
  65204. * @method Phaser.Tilemaps.DynamicTilemapLayer#getTilesWithinShape
  65205. * @since 3.0.0
  65206. *
  65207. * @param {(Phaser.Geom.Circle|Phaser.Geom.Line|Phaser.Geom.Rectangle|Phaser.Geom.Triangle)} shape - A shape in world (pixel) coordinates
  65208. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  65209. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  65210. * -1 for an index.
  65211. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on
  65212. * at least one side.
  65213. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  65214. * have at least one interesting face.
  65215. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  65216. *
  65217. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  65218. */
  65219. getTilesWithinShape: function (shape, filteringOptions, camera)
  65220. {
  65221. return TilemapComponents.GetTilesWithinShape(shape, filteringOptions, camera, this.layer);
  65222. },
  65223. /**
  65224. * Gets the tiles in the given rectangular area (in world coordinates) of the layer.
  65225. *
  65226. * @method Phaser.Tilemaps.DynamicTilemapLayer#getTilesWithinWorldXY
  65227. * @since 3.0.0
  65228. *
  65229. * @param {number} worldX - [description]
  65230. * @param {number} worldY - [description]
  65231. * @param {number} width - [description]
  65232. * @param {number} height - [description]
  65233. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  65234. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  65235. * -1 for an index.
  65236. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on
  65237. * at least one side.
  65238. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  65239. * have at least one interesting face.
  65240. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  65241. *
  65242. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  65243. */
  65244. getTilesWithinWorldXY: function (worldX, worldY, width, height, filteringOptions, camera)
  65245. {
  65246. return TilemapComponents.GetTilesWithinWorldXY(worldX, worldY, width, height, filteringOptions, camera, this.layer);
  65247. },
  65248. /**
  65249. * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns
  65250. * false if there is no tile or if the tile at that location has an index of -1.
  65251. *
  65252. * @method Phaser.Tilemaps.DynamicTilemapLayer#hasTileAt
  65253. * @since 3.0.0
  65254. *
  65255. * @param {integer} tileX - [description]
  65256. * @param {integer} tileY - [description]
  65257. *
  65258. * @return {boolean}
  65259. */
  65260. hasTileAt: function (tileX, tileY)
  65261. {
  65262. return TilemapComponents.HasTileAt(tileX, tileY, this.layer);
  65263. },
  65264. /**
  65265. * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns
  65266. * false if there is no tile or if the tile at that location has an index of -1.
  65267. *
  65268. * @method Phaser.Tilemaps.DynamicTilemapLayer#hasTileAtWorldXY
  65269. * @since 3.0.0
  65270. *
  65271. * @param {number} worldX - [description]
  65272. * @param {number} worldY - [description]
  65273. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  65274. *
  65275. * @return {boolean}
  65276. */
  65277. hasTileAtWorldXY: function (worldX, worldY, camera)
  65278. {
  65279. return TilemapComponents.HasTileAtWorldXY(worldX, worldY, camera, this.layer);
  65280. },
  65281. /**
  65282. * Puts a tile at the given tile coordinates in the specified layer. You can pass in either an index
  65283. * or a Tile object. If you pass in a Tile, all attributes will be copied over to the specified
  65284. * location. If you pass in an index, only the index at the specified location will be changed.
  65285. * Collision information will be recalculated at the specified location.
  65286. *
  65287. * @method Phaser.Tilemaps.DynamicTilemapLayer#putTileAt
  65288. * @since 3.0.0
  65289. *
  65290. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  65291. * @param {integer} tileX - [description]
  65292. * @param {integer} tileY - [description]
  65293. * @param {boolean} [recalculateFaces=true] - [description]
  65294. *
  65295. * @return {Phaser.Tilemaps.Tile} A Tile object.
  65296. */
  65297. putTileAt: function (tile, tileX, tileY, recalculateFaces)
  65298. {
  65299. return TilemapComponents.PutTileAt(tile, tileX, tileY, recalculateFaces, this.layer);
  65300. },
  65301. /**
  65302. * Puts a tile at the given world coordinates (pixels) in the specified layer. You can pass in either
  65303. * an index or a Tile object. If you pass in a Tile, all attributes will be copied over to the
  65304. * specified location. If you pass in an index, only the index at the specified location will be
  65305. * changed. Collision information will be recalculated at the specified location.
  65306. *
  65307. * @method Phaser.Tilemaps.DynamicTilemapLayer#putTileAtWorldXY
  65308. * @since 3.0.0
  65309. *
  65310. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  65311. * @param {integer} worldX - [description]
  65312. * @param {integer} worldY - [description]
  65313. * @param {boolean} [recalculateFaces=true] - [description]
  65314. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - [description]
  65315. *
  65316. * @return {Phaser.Tilemaps.Tile} A Tile object.
  65317. */
  65318. putTileAtWorldXY: function (tile, worldX, worldY, recalculateFaces, camera)
  65319. {
  65320. return TilemapComponents.PutTileAtWorldXY(tile, worldX, worldY, recalculateFaces, camera, this.layer);
  65321. },
  65322. /**
  65323. * Puts an array of tiles or a 2D array of tiles at the given tile coordinates in the specified
  65324. * layer. The array can be composed of either tile indexes or Tile objects. If you pass in a Tile,
  65325. * all attributes will be copied over to the specified location. If you pass in an index, only the
  65326. * index at the specified location will be changed. Collision information will be recalculated
  65327. * within the region tiles were changed.
  65328. *
  65329. * @method Phaser.Tilemaps.DynamicTilemapLayer#putTilesAt
  65330. * @since 3.0.0
  65331. *
  65332. * @param {(integer[]|integer[][]|Phaser.Tilemaps.Tile[]|Phaser.Tilemaps.Tile[][])} tile - A row (array) or grid (2D array) of Tiles
  65333. * or tile indexes to place.
  65334. * @param {integer} tileX - [description]
  65335. * @param {integer} tileY - [description]
  65336. * @param {boolean} [recalculateFaces=true] - [description]
  65337. *
  65338. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65339. */
  65340. putTilesAt: function (tilesArray, tileX, tileY, recalculateFaces)
  65341. {
  65342. TilemapComponents.PutTilesAt(tilesArray, tileX, tileY, recalculateFaces, this.layer);
  65343. return this;
  65344. },
  65345. /**
  65346. * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
  65347. * specified layer. Each tile will receive a new index. If an array of indexes is passed in, then
  65348. * those will be used for randomly assigning new tile indexes. If an array is not provided, the
  65349. * indexes found within the region (excluding -1) will be used for randomly assigning new tile
  65350. * indexes. This method only modifies tile indexes and does not change collision information.
  65351. *
  65352. * @method Phaser.Tilemaps.DynamicTilemapLayer#randomize
  65353. * @since 3.0.0
  65354. *
  65355. * @param {integer} [tileX=0] - [description]
  65356. * @param {integer} [tileY=0] - [description]
  65357. * @param {integer} [width=max width based on tileX] - [description]
  65358. * @param {integer} [height=max height based on tileY] - [description]
  65359. * @param {integer[]} [indexes] - An array of indexes to randomly draw from during randomization.
  65360. *
  65361. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65362. */
  65363. randomize: function (tileX, tileY, width, height, indexes)
  65364. {
  65365. TilemapComponents.Randomize(tileX, tileY, width, height, indexes, this.layer);
  65366. return this;
  65367. },
  65368. /**
  65369. * Removes the tile at the given tile coordinates in the specified layer and updates the layer's
  65370. * collision information.
  65371. *
  65372. * @method Phaser.Tilemaps.DynamicTilemapLayer#removeTileAt
  65373. * @since 3.0.0
  65374. *
  65375. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  65376. * @param {integer} tileX - [description]
  65377. * @param {integer} tileY - [description]
  65378. * @param {boolean} [replaceWithNull=true] - If true, this will replace the tile at the specified
  65379. * location with null instead of a Tile with an index of -1.
  65380. * @param {boolean} [recalculateFaces=true] - [description]
  65381. *
  65382. * @return {Phaser.Tilemaps.Tile} A Tile object.
  65383. */
  65384. removeTileAt: function (tileX, tileY, replaceWithNull, recalculateFaces)
  65385. {
  65386. return TilemapComponents.RemoveTileAt(tileX, tileY, replaceWithNull, recalculateFaces, this.layer);
  65387. },
  65388. /**
  65389. * Removes the tile at the given world coordinates in the specified layer and updates the layer's
  65390. * collision information.
  65391. *
  65392. * @method Phaser.Tilemaps.DynamicTilemapLayer#removeTileAtWorldXY
  65393. * @since 3.0.0
  65394. *
  65395. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  65396. * @param {number} worldX - [description]
  65397. * @param {number} worldY - [description]
  65398. * @param {boolean} [replaceWithNull=true] - If true, this will replace the tile at the specified
  65399. * location with null instead of a Tile with an index of -1.
  65400. * @param {boolean} [recalculateFaces=true] - [description]
  65401. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  65402. *
  65403. * @return {Phaser.Tilemaps.Tile} A Tile object.
  65404. */
  65405. removeTileAtWorldXY: function (worldX, worldY, replaceWithNull, recalculateFaces, camera)
  65406. {
  65407. return TilemapComponents.RemoveTileAtWorldXY(worldX, worldY, replaceWithNull, recalculateFaces, camera, this.layer);
  65408. },
  65409. /**
  65410. * Draws a debug representation of the layer to the given Graphics. This is helpful when you want to
  65411. * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles
  65412. * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation
  65413. * wherever you want on the screen.
  65414. *
  65415. * @method Phaser.Tilemaps.DynamicTilemapLayer#renderDebug
  65416. * @since 3.0.0
  65417. *
  65418. * @param {Phaser.GameObjects.Graphics} graphics - The target Graphics object to draw upon.
  65419. * @param {object} styleConfig - An object specifying the colors to use for the debug drawing.
  65420. * @param {?Color} [styleConfig.tileColor=blue] - Color to use for drawing a filled rectangle at
  65421. * non-colliding tile locations. If set to null, non-colliding tiles will not be drawn.
  65422. * @param {?Color} [styleConfig.collidingTileColor=orange] - Color to use for drawing a filled
  65423. * rectangle at colliding tile locations. If set to null, colliding tiles will not be drawn.
  65424. * @param {?Color} [styleConfig.faceColor=grey] - Color to use for drawing a line at interesting
  65425. * tile faces. If set to null, interesting tile faces will not be drawn.
  65426. *
  65427. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65428. */
  65429. renderDebug: function (graphics, styleConfig)
  65430. {
  65431. TilemapComponents.RenderDebug(graphics, styleConfig, this.layer);
  65432. return this;
  65433. },
  65434. /**
  65435. * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching
  65436. * `findIndex` and updates their index to match `newIndex`. This only modifies the index and does
  65437. * not change collision information.
  65438. *
  65439. * @method Phaser.Tilemaps.DynamicTilemapLayer#replaceByIndex
  65440. * @since 3.0.0
  65441. *
  65442. * @param {integer} findIndex - [description]
  65443. * @param {integer} newIndex - [description]
  65444. * @param {integer} [tileX=0] - [description]
  65445. * @param {integer} [tileY=0] - [description]
  65446. * @param {integer} [width=max width based on tileX] - [description]
  65447. * @param {integer} [height=max height based on tileY] - [description]
  65448. *
  65449. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65450. */
  65451. replaceByIndex: function (findIndex, newIndex, tileX, tileY, width, height)
  65452. {
  65453. TilemapComponents.ReplaceByIndex(findIndex, newIndex, tileX, tileY, width, height, this.layer);
  65454. return this;
  65455. },
  65456. /**
  65457. * You can control if the Cameras should cull tiles before rendering them or not.
  65458. * By default the camera will try to cull the tiles in this layer, to avoid over-drawing to the renderer.
  65459. *
  65460. * However, there are some instances when you may wish to disable this.
  65461. *
  65462. * @method Phaser.Tilemaps.DynamicTilemapLayer#setSkipCull
  65463. * @since 3.11.0
  65464. *
  65465. * @param {boolean} [value=true] - Set to `true` to stop culling tiles. Set to `false` to enable culling again.
  65466. *
  65467. * @return {this} This Tilemap Layer object.
  65468. */
  65469. setSkipCull: function (value)
  65470. {
  65471. if (value === undefined) { value = true; }
  65472. this.skipCull = value;
  65473. return this;
  65474. },
  65475. /**
  65476. * When a Camera culls the tiles in this layer it does so using its view into the world, building up a
  65477. * rectangle inside which the tiles must exist or they will be culled. Sometimes you may need to expand the size
  65478. * of this 'cull rectangle', especially if you plan on rotating the Camera viewing the layer. Do so
  65479. * by providing the padding values. The values given are in tiles, not pixels. So if the tile width was 32px
  65480. * and you set `paddingX` to be 4, it would add 32px x 4 to the cull rectangle (adjusted for scale)
  65481. *
  65482. * @method Phaser.Tilemaps.DynamicTilemapLayer#setCullPadding
  65483. * @since 3.11.0
  65484. *
  65485. * @param {number} [paddingX=1] - The amount of extra horizontal tiles to add to the cull check padding.
  65486. * @param {number} [paddingY=1] - The amount of extra vertical tiles to add to the cull check padding.
  65487. *
  65488. * @return {this} This Tilemap Layer object.
  65489. */
  65490. setCullPadding: function (paddingX, paddingY)
  65491. {
  65492. if (paddingX === undefined) { paddingX = 1; }
  65493. if (paddingY === undefined) { paddingY = 1; }
  65494. this.cullPaddingX = paddingX;
  65495. this.cullPaddingY = paddingY;
  65496. return this;
  65497. },
  65498. /**
  65499. * Sets collision on the given tile or tiles within a layer by index. You can pass in either a
  65500. * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if
  65501. * collision will be enabled (true) or disabled (false).
  65502. *
  65503. * @method Phaser.Tilemaps.DynamicTilemapLayer#setCollision
  65504. * @since 3.0.0
  65505. *
  65506. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes.
  65507. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  65508. * collision.
  65509. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  65510. * update.
  65511. *
  65512. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65513. */
  65514. setCollision: function (indexes, collides, recalculateFaces)
  65515. {
  65516. TilemapComponents.SetCollision(indexes, collides, recalculateFaces, this.layer);
  65517. return this;
  65518. },
  65519. /**
  65520. * Sets collision on a range of tiles in a layer whose index is between the specified `start` and
  65521. * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set
  65522. * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be
  65523. * enabled (true) or disabled (false).
  65524. *
  65525. * @method Phaser.Tilemaps.DynamicTilemapLayer#setCollisionBetween
  65526. * @since 3.0.0
  65527. *
  65528. * @param {integer} start - The first index of the tile to be set for collision.
  65529. * @param {integer} stop - The last index of the tile to be set for collision.
  65530. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  65531. * collision.
  65532. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  65533. * update.
  65534. *
  65535. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65536. */
  65537. setCollisionBetween: function (start, stop, collides, recalculateFaces)
  65538. {
  65539. TilemapComponents.SetCollisionBetween(start, stop, collides, recalculateFaces, this.layer);
  65540. return this;
  65541. },
  65542. /**
  65543. * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property
  65544. * that matches the given properties object, its collision flag will be set. The `collides`
  65545. * parameter controls if collision will be enabled (true) or disabled (false). Passing in
  65546. * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that
  65547. * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can
  65548. * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a
  65549. * "types" property that matches any of those values, its collision flag will be updated.
  65550. *
  65551. * @method Phaser.Tilemaps.DynamicTilemapLayer#setCollisionByProperty
  65552. * @since 3.0.0
  65553. *
  65554. * @param {object} properties - An object with tile properties and corresponding values that should
  65555. * be checked.
  65556. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  65557. * collision.
  65558. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  65559. * update.
  65560. *
  65561. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65562. */
  65563. setCollisionByProperty: function (properties, collides, recalculateFaces)
  65564. {
  65565. TilemapComponents.SetCollisionByProperty(properties, collides, recalculateFaces, this.layer);
  65566. return this;
  65567. },
  65568. /**
  65569. * Sets collision on all tiles in the given layer, except for tiles that have an index specified in
  65570. * the given array. The `collides` parameter controls if collision will be enabled (true) or
  65571. * disabled (false).
  65572. *
  65573. * @method Phaser.Tilemaps.DynamicTilemapLayer#setCollisionByExclusion
  65574. * @since 3.0.0
  65575. *
  65576. * @param {integer[]} indexes - An array of the tile indexes to not be counted for collision.
  65577. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  65578. * collision.
  65579. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  65580. * update.
  65581. *
  65582. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65583. */
  65584. setCollisionByExclusion: function (indexes, collides, recalculateFaces)
  65585. {
  65586. TilemapComponents.SetCollisionByExclusion(indexes, collides, recalculateFaces, this.layer);
  65587. return this;
  65588. },
  65589. /**
  65590. * Sets collision on the tiles within a layer by checking each tiles collision group data
  65591. * (typically defined in Tiled within the tileset collision editor). If any objects are found within
  65592. * a tiles collision group, the tile's colliding information will be set. The `collides` parameter
  65593. * controls if collision will be enabled (true) or disabled (false).
  65594. *
  65595. * @method Phaser.Tilemaps.DynamicTilemapLayer#setCollisionFromCollisionGroup
  65596. * @since 3.0.0
  65597. *
  65598. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  65599. * collision.
  65600. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  65601. * update.
  65602. *
  65603. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65604. */
  65605. setCollisionFromCollisionGroup: function (collides, recalculateFaces)
  65606. {
  65607. TilemapComponents.SetCollisionFromCollisionGroup(collides, recalculateFaces, this.layer);
  65608. return this;
  65609. },
  65610. /**
  65611. * Sets a global collision callback for the given tile index within the layer. This will affect all
  65612. * tiles on this layer that have the same index. If a callback is already set for the tile index it
  65613. * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile
  65614. * at a specific location on the map then see setTileLocationCallback.
  65615. *
  65616. * @method Phaser.Tilemaps.DynamicTilemapLayer#setTileIndexCallback
  65617. * @since 3.0.0
  65618. *
  65619. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes to have a
  65620. * collision callback set for.
  65621. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  65622. * @param {object} callbackContext - The context under which the callback is called.
  65623. *
  65624. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65625. */
  65626. setTileIndexCallback: function (indexes, callback, callbackContext)
  65627. {
  65628. TilemapComponents.SetTileIndexCallback(indexes, callback, callbackContext, this.layer);
  65629. return this;
  65630. },
  65631. /**
  65632. * Sets a collision callback for the given rectangular area (in tile coordinates) within the layer.
  65633. * If a callback is already set for the tile index it will be replaced. Set the callback to null to
  65634. * remove it.
  65635. *
  65636. * @method Phaser.Tilemaps.DynamicTilemapLayer#setTileLocationCallback
  65637. * @since 3.0.0
  65638. *
  65639. * @param {integer} tileX - [description]
  65640. * @param {integer} tileY - [description]
  65641. * @param {integer} width - [description]
  65642. * @param {integer} height - [description]
  65643. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  65644. * @param {object} [callbackContext] - The context under which the callback is called.
  65645. *
  65646. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65647. */
  65648. setTileLocationCallback: function (tileX, tileY, width, height, callback, callbackContext)
  65649. {
  65650. TilemapComponents.SetTileLocationCallback(tileX, tileY, width, height, callback, callbackContext, this.layer);
  65651. return this;
  65652. },
  65653. /**
  65654. * Shuffles the tiles in a rectangular region (specified in tile coordinates) within the given
  65655. * layer. It will only randomize the tiles in that area, so if they're all the same nothing will
  65656. * appear to have changed! This method only modifies tile indexes and does not change collision
  65657. * information.
  65658. *
  65659. * @method Phaser.Tilemaps.DynamicTilemapLayer#shuffle
  65660. * @since 3.0.0
  65661. *
  65662. * @param {integer} [tileX=0] - [description]
  65663. * @param {integer} [tileY=0] - [description]
  65664. * @param {integer} [width=max width based on tileX] - [description]
  65665. * @param {integer} [height=max height based on tileY] - [description]
  65666. *
  65667. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65668. */
  65669. shuffle: function (tileX, tileY, width, height)
  65670. {
  65671. TilemapComponents.Shuffle(tileX, tileY, width, height, this.layer);
  65672. return this;
  65673. },
  65674. /**
  65675. * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching
  65676. * `indexA` and swaps then with `indexB`. This only modifies the index and does not change collision
  65677. * information.
  65678. *
  65679. * @method Phaser.Tilemaps.DynamicTilemapLayer#swapByIndex
  65680. * @since 3.0.0
  65681. *
  65682. * @param {integer} tileA - First tile index.
  65683. * @param {integer} tileB - Second tile index.
  65684. * @param {integer} [tileX=0] - [description]
  65685. * @param {integer} [tileY=0] - [description]
  65686. * @param {integer} [width=max width based on tileX] - [description]
  65687. * @param {integer} [height=max height based on tileY] - [description]
  65688. *
  65689. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65690. */
  65691. swapByIndex: function (indexA, indexB, tileX, tileY, width, height)
  65692. {
  65693. TilemapComponents.SwapByIndex(indexA, indexB, tileX, tileY, width, height, this.layer);
  65694. return this;
  65695. },
  65696. /**
  65697. * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the
  65698. * layers position, scale and scroll.
  65699. *
  65700. * @method Phaser.Tilemaps.DynamicTilemapLayer#tileToWorldX
  65701. * @since 3.0.0
  65702. *
  65703. * @param {integer} tileX - [description]
  65704. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  65705. *
  65706. * @return {number}
  65707. */
  65708. tileToWorldX: function (tileX, camera)
  65709. {
  65710. return TilemapComponents.TileToWorldX(tileX, camera, this.layer);
  65711. },
  65712. /**
  65713. * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the
  65714. * layers position, scale and scroll.
  65715. *
  65716. * @method Phaser.Tilemaps.DynamicTilemapLayer#tileToWorldY
  65717. * @since 3.0.0
  65718. *
  65719. * @param {integer} tileY - [description]
  65720. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  65721. *
  65722. * @return {number}
  65723. */
  65724. tileToWorldY: function (tileY, camera)
  65725. {
  65726. return TilemapComponents.TileToWorldY(tileY, camera, this.layer);
  65727. },
  65728. /**
  65729. * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the
  65730. * layers position, scale and scroll. This will return a new Vector2 object or update the given
  65731. * `point` object.
  65732. *
  65733. * @method Phaser.Tilemaps.DynamicTilemapLayer#tileToWorldXY
  65734. * @since 3.0.0
  65735. *
  65736. * @param {integer} tileX - [description]
  65737. * @param {integer} tileY - [description]
  65738. * @param {Phaser.Math.Vector2} [point] - [description]
  65739. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  65740. *
  65741. * @return {Phaser.Math.Vector2}
  65742. */
  65743. tileToWorldXY: function (tileX, tileY, point, camera)
  65744. {
  65745. return TilemapComponents.TileToWorldXY(tileX, tileY, point, camera, this.layer);
  65746. },
  65747. /**
  65748. * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
  65749. * specified layer. Each tile will recieve a new index. New indexes are drawn from the given
  65750. * weightedIndexes array. An example weighted array:
  65751. *
  65752. * [
  65753. * { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8
  65754. * { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8
  65755. * { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8
  65756. * { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8
  65757. * ]
  65758. *
  65759. * The probability of any index being choose is (the index's weight) / (sum of all weights). This
  65760. * method only modifies tile indexes and does not change collision information.
  65761. *
  65762. * @method Phaser.Tilemaps.DynamicTilemapLayer#weightedRandomize
  65763. * @since 3.0.0
  65764. *
  65765. * @param {integer} [tileX=0] - [description]
  65766. * @param {integer} [tileY=0] - [description]
  65767. * @param {integer} [width=max width based on tileX] - [description]
  65768. * @param {integer} [height=max height based on tileY] - [description]
  65769. * @param {object[]} [weightedIndexes] - An array of objects to randomly draw from during
  65770. * randomization. They should be in the form: { index: 0, weight: 4 } or
  65771. * { index: [0, 1], weight: 4 } if you wish to draw from multiple tile indexes.
  65772. *
  65773. * @return {Phaser.Tilemaps.DynamicTilemapLayer} This Tilemap Layer object.
  65774. */
  65775. weightedRandomize: function (tileX, tileY, width, height, weightedIndexes)
  65776. {
  65777. TilemapComponents.WeightedRandomize(tileX, tileY, width, height, weightedIndexes, this.layer);
  65778. return this;
  65779. },
  65780. /**
  65781. * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the
  65782. * layers position, scale and scroll.
  65783. *
  65784. * @method Phaser.Tilemaps.DynamicTilemapLayer#worldToTileX
  65785. * @since 3.0.0
  65786. *
  65787. * @param {number} worldX - [description]
  65788. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  65789. * nearest integer.
  65790. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  65791. *
  65792. * @return {number}
  65793. */
  65794. worldToTileX: function (worldX, snapToFloor, camera)
  65795. {
  65796. return TilemapComponents.WorldToTileX(worldX, snapToFloor, camera, this.layer);
  65797. },
  65798. /**
  65799. * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the
  65800. * layers position, scale and scroll.
  65801. *
  65802. * @method Phaser.Tilemaps.DynamicTilemapLayer#worldToTileY
  65803. * @since 3.0.0
  65804. *
  65805. * @param {number} worldY - [description]
  65806. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  65807. * nearest integer.
  65808. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  65809. *
  65810. * @return {number}
  65811. */
  65812. worldToTileY: function (worldY, snapToFloor, camera)
  65813. {
  65814. return TilemapComponents.WorldToTileY(worldY, snapToFloor, camera, this.layer);
  65815. },
  65816. /**
  65817. * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the
  65818. * layers position, scale and scroll. This will return a new Vector2 object or update the given
  65819. * `point` object.
  65820. *
  65821. * @method Phaser.Tilemaps.DynamicTilemapLayer#worldToTileXY
  65822. * @since 3.0.0
  65823. *
  65824. * @param {number} worldX - [description]
  65825. * @param {number} worldY - [description]
  65826. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  65827. * nearest integer.
  65828. * @param {Phaser.Math.Vector2} [point] - [description]
  65829. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  65830. *
  65831. * @return {Phaser.Math.Vector2}
  65832. */
  65833. worldToTileXY: function (worldX, worldY, snapToFloor, point, camera)
  65834. {
  65835. return TilemapComponents.WorldToTileXY(worldX, worldY, snapToFloor, point, camera, this.layer);
  65836. }
  65837. });
  65838. module.exports = DynamicTilemapLayer;
  65839. /***/ }),
  65840. /* 316 */
  65841. /***/ (function(module, exports, __webpack_require__) {
  65842. /**
  65843. * @author Richard Davey <rich@photonstorm.com>
  65844. * @copyright 2018 Photon Storm Ltd.
  65845. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  65846. */
  65847. var Class = __webpack_require__(0);
  65848. var DegToRad = __webpack_require__(39);
  65849. var DynamicTilemapLayer = __webpack_require__(315);
  65850. var Extend = __webpack_require__(16);
  65851. var Formats = __webpack_require__(27);
  65852. var LayerData = __webpack_require__(104);
  65853. var Rotate = __webpack_require__(351);
  65854. var StaticTilemapLayer = __webpack_require__(314);
  65855. var Tile = __webpack_require__(65);
  65856. var TilemapComponents = __webpack_require__(142);
  65857. var Tileset = __webpack_require__(138);
  65858. /**
  65859. * @callback TilemapFilterCallback
  65860. *
  65861. * @param {Phaser.GameObjects.GameObject} value - [description]
  65862. * @param {number} index - [description]
  65863. * @param {Phaser.GameObjects.GameObject[]} array - [description]
  65864. *
  65865. * @return {Phaser.GameObjects.GameObject} [description]
  65866. */
  65867. /**
  65868. * @callback TilemapFindCallback
  65869. *
  65870. * @param {Phaser.GameObjects.GameObject} value - [description]
  65871. * @param {number} index - [description]
  65872. * @param {Phaser.GameObjects.GameObject[]} array - [description]
  65873. *
  65874. * @return {boolean} [description]
  65875. */
  65876. /**
  65877. * @classdesc
  65878. * A Tilemap is a container for Tilemap data. This isn't a display object, rather, it holds data
  65879. * about the map and allows you to add tilesets and tilemap layers to it. A map can have one or
  65880. * more tilemap layers (StaticTilemapLayer or DynamicTilemapLayer), which are the display
  65881. * objects that actually render tiles.
  65882. *
  65883. * The Tilemap data be parsed from a Tiled JSON file, a CSV file or a 2D array. Tiled is a free
  65884. * software package specifically for creating tile maps, and is available from:
  65885. * http://www.mapeditor.org
  65886. *
  65887. * A Tilemap has handy methods for getting & manipulating the tiles within a layer. You can only
  65888. * use the methods that change tiles (e.g. removeTileAt) on a DynamicTilemapLayer.
  65889. *
  65890. * Note that all Tilemaps use a base tile size to calculate dimensions from, but that a
  65891. * StaticTilemapLayer or DynamicTilemapLayer may have its own unique tile size that overrides
  65892. * it.
  65893. *
  65894. * @class Tilemap
  65895. * @memberOf Phaser.Tilemaps
  65896. * @constructor
  65897. * @since 3.0.0
  65898. *
  65899. * @param {Phaser.Scene} scene - The Scene to which this Tilemap belongs.
  65900. * @param {Phaser.Tilemaps.MapData} mapData - A MapData instance containing Tilemap data.
  65901. */
  65902. var Tilemap = new Class({
  65903. initialize:
  65904. function Tilemap (scene, mapData)
  65905. {
  65906. /**
  65907. * @name Phaser.Tilemaps.Tilemap#scene
  65908. * @type {Phaser.Scene}
  65909. * @since 3.0.0
  65910. */
  65911. this.scene = scene;
  65912. /**
  65913. * The base width of a tile in pixels. Note that individual layers may have a different tile
  65914. * width.
  65915. *
  65916. * @name Phaser.Tilemaps.Tilemap#tileWidth
  65917. * @type {integer}
  65918. * @since 3.0.0
  65919. */
  65920. this.tileWidth = mapData.tileWidth;
  65921. /**
  65922. * The base height of a tile in pixels. Note that individual layers may have a different
  65923. * tile height.
  65924. *
  65925. * @name Phaser.Tilemaps.Tilemap#tileHeight
  65926. * @type {integer}
  65927. * @since 3.0.0
  65928. */
  65929. this.tileHeight = mapData.tileHeight;
  65930. /**
  65931. * The width of the map (in tiles).
  65932. *
  65933. * @name Phaser.Tilemaps.Tilemap#width
  65934. * @type {number}
  65935. * @since 3.0.0
  65936. */
  65937. this.width = mapData.width;
  65938. /**
  65939. * The height of the map (in tiles).
  65940. *
  65941. * @name Phaser.Tilemaps.Tilemap#height
  65942. * @type {number}
  65943. * @since 3.0.0
  65944. */
  65945. this.height = mapData.height;
  65946. /**
  65947. * The orientation of the map data (as specified in Tiled), usually 'orthogonal'.
  65948. *
  65949. * @name Phaser.Tilemaps.Tilemap#orientation
  65950. * @type {string}
  65951. * @since 3.0.0
  65952. */
  65953. this.orientation = mapData.orientation;
  65954. /**
  65955. * The format of the map data.
  65956. *
  65957. * @name Phaser.Tilemaps.Tilemap#format
  65958. * @type {number}
  65959. * @since 3.0.0
  65960. */
  65961. this.format = mapData.format;
  65962. /**
  65963. * The version of the map data (as specified in Tiled, usually 1).
  65964. *
  65965. * @name Phaser.Tilemaps.Tilemap#version
  65966. * @type {number}
  65967. * @since 3.0.0
  65968. */
  65969. this.version = mapData.version;
  65970. /**
  65971. * Map specific properties as specified in Tiled.
  65972. *
  65973. * @name Phaser.Tilemaps.Tilemap#properties
  65974. * @type {object}
  65975. * @since 3.0.0
  65976. */
  65977. this.properties = mapData.properties;
  65978. /**
  65979. * The width of the map in pixels based on width * tileWidth.
  65980. *
  65981. * @name Phaser.Tilemaps.Tilemap#widthInPixels
  65982. * @type {number}
  65983. * @since 3.0.0
  65984. */
  65985. this.widthInPixels = mapData.widthInPixels;
  65986. /**
  65987. * The height of the map in pixels based on height * tileHeight.
  65988. *
  65989. * @name Phaser.Tilemaps.Tilemap#heightInPixels
  65990. * @type {number}
  65991. * @since 3.0.0
  65992. */
  65993. this.heightInPixels = mapData.heightInPixels;
  65994. /**
  65995. *
  65996. * @name Phaser.Tilemaps.Tilemap#imageCollections
  65997. * @type {Phaser.Tilemaps.ImageCollection[]}
  65998. * @since 3.0.0
  65999. */
  66000. this.imageCollections = mapData.imageCollections;
  66001. /**
  66002. * An array of Tiled Image Layers.
  66003. *
  66004. * @name Phaser.Tilemaps.Tilemap#images
  66005. * @type {array}
  66006. * @since 3.0.0
  66007. */
  66008. this.images = mapData.images;
  66009. /**
  66010. * An array of Tilemap layer data.
  66011. *
  66012. * @name Phaser.Tilemaps.Tilemap#layers
  66013. * @type {Phaser.Tilemaps.LayerData[]}
  66014. * @since 3.0.0
  66015. */
  66016. this.layers = mapData.layers;
  66017. /**
  66018. * An array of Tilesets used in the map.
  66019. *
  66020. * @name Phaser.Tilemaps.Tilemap#tilesets
  66021. * @type {Phaser.Tilemaps.Tileset[]}
  66022. * @since 3.0.0
  66023. */
  66024. this.tilesets = mapData.tilesets;
  66025. /**
  66026. * An array of ObjectLayer instances parsed from Tiled object layers.
  66027. *
  66028. * @name Phaser.Tilemaps.Tilemap#objects
  66029. * @type {Phaser.Tilemaps.ObjectLayer[]}
  66030. * @since 3.0.0
  66031. */
  66032. this.objects = mapData.objects;
  66033. /**
  66034. * The index of the currently selected LayerData object.
  66035. *
  66036. * @name Phaser.Tilemaps.Tilemap#currentLayerIndex
  66037. * @type {integer}
  66038. * @since 3.0.0
  66039. */
  66040. this.currentLayerIndex = 0;
  66041. },
  66042. /**
  66043. * Adds an image to the map to be used as a tileset. A single map may use multiple tilesets.
  66044. * Note that the tileset name can be found in the JSON file exported from Tiled, or in the Tiled
  66045. * editor.
  66046. *
  66047. * @method Phaser.Tilemaps.Tilemap#addTilesetImage
  66048. * @since 3.0.0
  66049. *
  66050. * @param {string} tilesetName - The name of the tileset as specified in the map data.
  66051. * @param {string} [key] - The key of the Phaser.Cache image used for this tileset. If
  66052. * `undefined` or `null` it will look for an image with a key matching the tilesetName parameter.
  66053. * @param {integer} [tileWidth] - The width of the tile (in pixels) in the Tileset Image. If not
  66054. * given it will default to the map's tileWidth value, or the tileWidth specified in the Tiled
  66055. * JSON file.
  66056. * @param {integer} [tileHeight] - The height of the tiles (in pixels) in the Tileset Image. If
  66057. * not given it will default to the map's tileHeight value, or the tileHeight specified in the
  66058. * Tiled JSON file.
  66059. * @param {integer} [tileMargin] - The margin around the tiles in the sheet (in pixels). If not
  66060. * specified, it will default to 0 or the value specified in the Tiled JSON file.
  66061. * @param {integer} [tileSpacing] - The spacing between each the tile in the sheet (in pixels).
  66062. * If not specified, it will default to 0 or the value specified in the Tiled JSON file.
  66063. * @param {integer} [gid=0] - If adding multiple tilesets to a blank map, specify the starting
  66064. * GID this set will use here.
  66065. *
  66066. * @return {?Phaser.Tilemaps.Tileset} Returns the Tileset object that was created or updated, or null if it
  66067. * failed.
  66068. */
  66069. addTilesetImage: function (tilesetName, key, tileWidth, tileHeight, tileMargin, tileSpacing, gid)
  66070. {
  66071. if (tilesetName === undefined) { return null; }
  66072. if (key === undefined || key === null) { key = tilesetName; }
  66073. if (!this.scene.sys.textures.exists(key))
  66074. {
  66075. console.warn('Invalid image key given for tileset: "' + key + '"');
  66076. return null;
  66077. }
  66078. var texture = this.scene.sys.textures.get(key);
  66079. var index = this.getTilesetIndex(tilesetName);
  66080. if (index === null && this.format === Formats.TILED_JSON)
  66081. {
  66082. console.warn('No data found in the JSON tilemap from Tiled matching the tileset name: "' + tilesetName + '"');
  66083. return null;
  66084. }
  66085. if (this.tilesets[index])
  66086. {
  66087. this.tilesets[index].setTileSize(tileWidth, tileHeight);
  66088. this.tilesets[index].setSpacing(tileMargin, tileSpacing);
  66089. this.tilesets[index].setImage(texture);
  66090. return this.tilesets[index];
  66091. }
  66092. if (tileWidth === undefined) { tileWidth = this.tileWidth; }
  66093. if (tileHeight === undefined) { tileHeight = this.tileHeight; }
  66094. if (tileMargin === undefined) { tileMargin = 0; }
  66095. if (tileSpacing === undefined) { tileSpacing = 0; }
  66096. if (gid === undefined) { gid = 0; }
  66097. var tileset = new Tileset(tilesetName, gid, tileWidth, tileHeight, tileMargin, tileSpacing);
  66098. tileset.setImage(texture);
  66099. this.tilesets.push(tileset);
  66100. return tileset;
  66101. },
  66102. /**
  66103. * Turns the StaticTilemapLayer associated with the given layer into a DynamicTilemapLayer. If
  66104. * no layer specified, the map's current layer is used. This is useful if you want to manipulate
  66105. * a map at the start of a scene, but then make it non-manipulable and optimize it for speed.
  66106. * Note: the DynamicTilemapLayer passed in is destroyed, so make sure to store the value
  66107. * returned from this method if you want to manipulate the new StaticTilemapLayer.
  66108. *
  66109. * @method Phaser.Tilemaps.Tilemap#convertLayerToStatic
  66110. * @since 3.0.0
  66111. *
  66112. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer)} [layer] - The name of the layer from Tiled, the
  66113. * index of the layer in the map, or a DynamicTilemapLayer.
  66114. *
  66115. * @return {?Phaser.Tilemaps.StaticTilemapLayer} Returns the new layer that was created, or null if it
  66116. * failed.
  66117. */
  66118. convertLayerToStatic: function (layer)
  66119. {
  66120. layer = this.getLayer(layer);
  66121. if (layer === null) { return null; }
  66122. var dynamicLayer = layer.tilemapLayer;
  66123. if (!dynamicLayer || !(dynamicLayer instanceof DynamicTilemapLayer))
  66124. {
  66125. return null;
  66126. }
  66127. var staticLayer = new StaticTilemapLayer(
  66128. dynamicLayer.scene,
  66129. dynamicLayer.tilemap,
  66130. dynamicLayer.layerIndex,
  66131. dynamicLayer.tileset,
  66132. dynamicLayer.x,
  66133. dynamicLayer.y
  66134. );
  66135. this.scene.sys.displayList.add(staticLayer);
  66136. dynamicLayer.destroy();
  66137. return staticLayer;
  66138. },
  66139. /**
  66140. * See component documentation. If no layer specified, the map's current layer is used. This
  66141. * cannot be applied to StaticTilemapLayers.
  66142. *
  66143. * @method Phaser.Tilemaps.Tilemap#copy
  66144. * @since 3.0.0
  66145. *
  66146. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  66147. */
  66148. copy: function (srcTileX, srcTileY, width, height, destTileX, destTileY, recalculateFaces, layer)
  66149. {
  66150. layer = this.getLayer(layer);
  66151. if (this._isStaticCall(layer, 'copy')) { return this; }
  66152. if (layer !== null)
  66153. {
  66154. TilemapComponents.Copy(
  66155. srcTileX, srcTileY,
  66156. width, height,
  66157. destTileX, destTileY,
  66158. recalculateFaces, layer
  66159. );
  66160. }
  66161. return this;
  66162. },
  66163. /**
  66164. * Creates a new and empty DynamicTilemapLayer. The currently selected layer in the map is set
  66165. * to this new layer.
  66166. *
  66167. * @method Phaser.Tilemaps.Tilemap#createBlankDynamicLayer
  66168. * @since 3.0.0
  66169. *
  66170. * @param {string} name - The name of this layer. Must be unique within the map.
  66171. * @param {Phaser.Tilemaps.Tileset} tileset - The tileset the new layer will use.
  66172. * @param {number} [x=0] - The world x position where the top left of this layer will be placed.
  66173. * @param {number} [y=0] - The world y position where the top left of this layer will be placed.
  66174. * @param {integer} [width] - The width of the layer in tiles. If not specified, it will default
  66175. * to the map's width.
  66176. * @param {integer} [height] - The height of the layer in tiles. If not specified, it will default
  66177. * to the map's height.
  66178. * @param {integer} [tileWidth] - The width of the tiles the layer uses for calculations. If not
  66179. * specified, it will default to the map's tileWidth.
  66180. * @param {integer} [tileHeight] - The height of the tiles the layer uses for calculations. If not
  66181. * specified, it will default to the map's tileHeight.
  66182. * @return {?Phaser.Tilemaps.DynamicTilemapLayer} Returns the new layer was created, or null if it failed.
  66183. */
  66184. createBlankDynamicLayer: function (name, tileset, x, y, width, height, tileWidth, tileHeight)
  66185. {
  66186. if (tileWidth === undefined) { tileWidth = tileset.tileWidth; }
  66187. if (tileHeight === undefined) { tileHeight = tileset.tileHeight; }
  66188. if (width === undefined) { width = this.width; }
  66189. if (height === undefined) { height = this.height; }
  66190. if (x === undefined) { x = 0; }
  66191. if (y === undefined) { y = 0; }
  66192. var index = this.getLayerIndex(name);
  66193. if (index !== null)
  66194. {
  66195. console.warn('Cannot create blank layer: layer with matching name already exists ' + name);
  66196. return null;
  66197. }
  66198. var layerData = new LayerData({
  66199. name: name,
  66200. tileWidth: tileWidth,
  66201. tileHeight: tileHeight,
  66202. width: width,
  66203. height: height
  66204. });
  66205. var row;
  66206. for (var tileY = 0; tileY < height; tileY++)
  66207. {
  66208. row = [];
  66209. for (var tileX = 0; tileX < width; tileX++)
  66210. {
  66211. row.push(new Tile(layerData, -1, tileX, tileY, tileWidth, tileHeight, this.tileWidth, this.tileHeight));
  66212. }
  66213. layerData.data.push(row);
  66214. }
  66215. this.layers.push(layerData);
  66216. this.currentLayerIndex = this.layers.length - 1;
  66217. var dynamicLayer = new DynamicTilemapLayer(this.scene, this, this.currentLayerIndex, tileset, x, y);
  66218. this.scene.sys.displayList.add(dynamicLayer);
  66219. return dynamicLayer;
  66220. },
  66221. /**
  66222. * Creates a new DynamicTilemapLayer that renders the LayerData associated with the given
  66223. * `layerID`. The currently selected layer in the map is set to this new layer.
  66224. *
  66225. * The `layerID` is important. If you've created your map in Tiled then you can get this by
  66226. * looking in Tiled and looking at the layer name. Or you can open the JSON file it exports and
  66227. * look at the layers[].name value. Either way it must match.
  66228. *
  66229. * Unlike a static layer, a dynamic layer can be modified. See DynamicTilemapLayer for more
  66230. * information.
  66231. *
  66232. * @method Phaser.Tilemaps.Tilemap#createDynamicLayer
  66233. * @since 3.0.0
  66234. *
  66235. * @param {(integer|string)} layerID - The layer array index value, or if a string is given, the
  66236. * layer name from Tiled.
  66237. * @param {Phaser.Tilemaps.Tileset} tileset - The tileset the new layer will use.
  66238. * @param {number} x - The x position to place the layer in the world. If not specified, it will
  66239. * default to the layer offset from Tiled or 0.
  66240. * @param {number} y - The y position to place the layer in the world. If not specified, it will
  66241. * default to the layer offset from Tiled or 0.
  66242. *
  66243. * @return {?Phaser.Tilemaps.DynamicTilemapLayer} Returns the new layer was created, or null if it failed.
  66244. */
  66245. createDynamicLayer: function (layerID, tileset, x, y)
  66246. {
  66247. var index = this.getLayerIndex(layerID);
  66248. if (index === null)
  66249. {
  66250. console.warn('Cannot create tilemap layer, invalid layer ID given: ' + layerID);
  66251. return null;
  66252. }
  66253. var layerData = this.layers[index];
  66254. // Check for an associated static or dynamic tilemap layer
  66255. if (layerData.tilemapLayer)
  66256. {
  66257. console.warn('Cannot create dynamic tilemap layer since a static or dynamic tilemap layer exists for layer ID:' + layerID);
  66258. return null;
  66259. }
  66260. this.currentLayerIndex = index;
  66261. // Make sure that all the LayerData & the tiles have the correct tile size. They usually
  66262. // are, but wouldn't match if you try to load a 2x or 4x res tileset when the map was made
  66263. // with a 1x res tileset.
  66264. if (layerData.tileWidth !== tileset.tileWidth || layerData.tileHeight !== tileset.tileHeight)
  66265. {
  66266. this.setLayerTileSize(tileset.tileWidth, tileset.tileHeight, index);
  66267. }
  66268. // Default the x/y position to match Tiled layer offset, if it exists.
  66269. if (x === undefined && this.layers[index].x) { x = this.layers[index].x; }
  66270. if (y === undefined && this.layers[index].y) { y = this.layers[index].y; }
  66271. var layer = new DynamicTilemapLayer(this.scene, this, index, tileset, x, y);
  66272. this.scene.sys.displayList.add(layer);
  66273. return layer;
  66274. },
  66275. /**
  66276. * Creates a Sprite for every object matching the given gid in the map data. All properties from
  66277. * the map data objectgroup are copied into the `spriteConfig`, so you can use this as an easy
  66278. * way to configure Sprite properties from within the map editor. For example giving an object a
  66279. * property of alpha: 0.5 in the map editor will duplicate that when the Sprite is created.
  66280. *
  66281. * @method Phaser.Tilemaps.Tilemap#createFromObjects
  66282. * @since 3.0.0
  66283. *
  66284. * @param {string} name - The name of the object layer (from Tiled) to create Sprites from.
  66285. * @param {(integer|string)} id - Either the id (object), gid (tile object) or name (object or
  66286. * tile object) from Tiled. Ids are unique in Tiled, but a gid is shared by all tile objects
  66287. * with the same graphic. The same name can be used on multiple objects.
  66288. * @param {object} spriteConfig - The config object to pass into the Sprite creator (i.e.
  66289. * scene.make.sprite).
  66290. * @param {Phaser.Scene} [scene=the scene the map is within] - The Scene to create the Sprites within.
  66291. *
  66292. * @return {Phaser.GameObjects.Sprite[]} An array of the Sprites that were created.
  66293. */
  66294. createFromObjects: function (name, id, spriteConfig, scene)
  66295. {
  66296. if (spriteConfig === undefined) { spriteConfig = {}; }
  66297. if (scene === undefined) { scene = this.scene; }
  66298. var objectLayer = this.getObjectLayer(name);
  66299. if (!objectLayer)
  66300. {
  66301. console.warn('Cannot create from object. Invalid objectgroup name given: ' + name);
  66302. return;
  66303. }
  66304. var objects = objectLayer.objects;
  66305. var sprites = [];
  66306. for (var i = 0; i < objects.length; i++)
  66307. {
  66308. var found = false;
  66309. var obj = objects[i];
  66310. if (obj.gid !== undefined && typeof id === 'number' && obj.gid === id ||
  66311. obj.id !== undefined && typeof id === 'number' && obj.id === id ||
  66312. obj.name !== undefined && typeof id === 'string' && obj.name === id)
  66313. {
  66314. found = true;
  66315. }
  66316. if (found)
  66317. {
  66318. var config = Extend({}, spriteConfig, obj.properties);
  66319. config.x = obj.x;
  66320. config.y = obj.y;
  66321. var sprite = this.scene.make.sprite(config);
  66322. sprite.name = obj.name;
  66323. if (obj.width) { sprite.displayWidth = obj.width; }
  66324. if (obj.height) { sprite.displayHeight = obj.height; }
  66325. // Origin is (0, 1) in Tiled, so find the offset that matches the Sprite's origin.
  66326. var offset = {
  66327. x: sprite.originX * sprite.displayWidth,
  66328. y: (sprite.originY - 1) * sprite.displayHeight
  66329. };
  66330. // If the object is rotated, then the origin offset also needs to be rotated.
  66331. if (obj.rotation)
  66332. {
  66333. var angle = DegToRad(obj.rotation);
  66334. Rotate(offset, angle);
  66335. sprite.rotation = angle;
  66336. }
  66337. sprite.x += offset.x;
  66338. sprite.y += offset.y;
  66339. if (obj.flippedHorizontal !== undefined || obj.flippedVertical !== undefined)
  66340. {
  66341. sprite.setFlip(obj.flippedHorizontal, obj.flippedVertical);
  66342. }
  66343. if (!obj.visible) { sprite.visible = false; }
  66344. sprites.push(sprite);
  66345. }
  66346. }
  66347. return sprites;
  66348. },
  66349. /**
  66350. * Creates a Sprite for every object matching the given tile indexes in the layer. You can
  66351. * optionally specify if each tile will be replaced with a new tile after the Sprite has been
  66352. * created. This is useful if you want to lay down special tiles in a level that are converted to
  66353. * Sprites, but want to replace the tile itself with a floor tile or similar once converted.
  66354. *
  66355. * @method Phaser.Tilemaps.Tilemap#createFromTiles
  66356. * @since 3.0.0
  66357. *
  66358. * @param {(integer|array)} indexes - The tile index, or array of indexes, to create Sprites from.
  66359. * @param {(integer|array)} replacements - The tile index, or array of indexes, to change a converted
  66360. * tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a
  66361. * one-to-one mapping with the indexes array.
  66362. * @param {object} spriteConfig - The config object to pass into the Sprite creator (i.e.
  66363. * scene.make.sprite).
  66364. * @param {Phaser.Scene} [scene=scene the map is within] - The Scene to create the Sprites within.
  66365. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when determining the world XY
  66366. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  66367. *
  66368. * @return {?Phaser.GameObjects.Sprite[]} Returns an array of Tiles, or null if the layer given was invalid.
  66369. */
  66370. createFromTiles: function (indexes, replacements, spriteConfig, scene, camera, layer)
  66371. {
  66372. layer = this.getLayer(layer);
  66373. if (layer === null) { return null; }
  66374. return TilemapComponents.CreateFromTiles(indexes, replacements, spriteConfig, scene, camera, layer);
  66375. },
  66376. /**
  66377. * Creates a new StaticTilemapLayer that renders the LayerData associated with the given
  66378. * `layerID`. The currently selected layer in the map is set to this new layer.
  66379. *
  66380. * The `layerID` is important. If you've created your map in Tiled then you can get this by
  66381. * looking in Tiled and looking at the layer name. Or you can open the JSON file it exports and
  66382. * look at the layers[].name value. Either way it must match.
  66383. *
  66384. * It's important to remember that a static layer cannot be modified. See StaticTilemapLayer for
  66385. * more information.
  66386. *
  66387. * @method Phaser.Tilemaps.Tilemap#createStaticLayer
  66388. * @since 3.0.0
  66389. *
  66390. * @param {(integer|string)} layerID - The layer array index value, or if a string is given, the
  66391. * layer name from Tiled.
  66392. * @param {Phaser.Tilemaps.Tileset} tileset - The tileset the new layer will use.
  66393. * @param {number} x - The x position to place the layer in the world. If not specified, it will
  66394. * default to the layer offset from Tiled or 0.
  66395. * @param {number} y - The y position to place the layer in the world. If not specified, it will
  66396. * default to the layer offset from Tiled or 0.
  66397. *
  66398. * @return {?Phaser.Tilemaps.StaticTilemapLayer} Returns the new layer was created, or null if it failed.
  66399. */
  66400. createStaticLayer: function (layerID, tileset, x, y)
  66401. {
  66402. var index = this.getLayerIndex(layerID);
  66403. if (index === null)
  66404. {
  66405. console.warn('Cannot create tilemap layer, invalid layer ID given: ' + layerID);
  66406. return null;
  66407. }
  66408. var layerData = this.layers[index];
  66409. // Check for an associated static or dynamic tilemap layer
  66410. if (layerData.tilemapLayer)
  66411. {
  66412. console.warn('Cannot create static tilemap layer since a static or dynamic tilemap layer exists for layer ID:' + layerID);
  66413. return null;
  66414. }
  66415. this.currentLayerIndex = index;
  66416. // Make sure that all the LayerData & the tiles have the correct tile size. They usually
  66417. // are, but wouldn't match if you try to load a 2x or 4x res tileset when the map was made
  66418. // with a 1x res tileset.
  66419. if (layerData.tileWidth !== tileset.tileWidth || layerData.tileHeight !== tileset.tileHeight)
  66420. {
  66421. this.setLayerTileSize(tileset.tileWidth, tileset.tileHeight, index);
  66422. }
  66423. // Default the x/y position to match Tiled layer offset, if it exists.
  66424. if (x === undefined && this.layers[index].x) { x = this.layers[index].x; }
  66425. if (y === undefined && this.layers[index].y) { y = this.layers[index].y; }
  66426. var layer = new StaticTilemapLayer(this.scene, this, index, tileset, x, y);
  66427. this.scene.sys.displayList.add(layer);
  66428. return layer;
  66429. },
  66430. /**
  66431. * Removes all layer data from this Tilemap and nulls the scene reference. This will destroy any
  66432. * StaticTilemapLayers or DynamicTilemapLayers that have been linked to LayerData.
  66433. *
  66434. * @method Phaser.Tilemaps.Tilemap#destroy
  66435. * @since 3.0.0
  66436. */
  66437. destroy: function ()
  66438. {
  66439. this.removeAllLayers();
  66440. this.tilesets.length = 0;
  66441. this.objects.length = 0;
  66442. this.scene = undefined;
  66443. },
  66444. /**
  66445. * Sets the tiles in the given rectangular area (in tile coordinates) of the layer with the
  66446. * specified index. Tiles will be set to collide if the given index is a colliding index.
  66447. * Collision information in the region will be recalculated.
  66448. *
  66449. * If no layer specified, the map's current layer is used.
  66450. * This cannot be applied to StaticTilemapLayers.
  66451. *
  66452. * @method Phaser.Tilemaps.Tilemap#fill
  66453. * @since 3.0.0
  66454. *
  66455. * @param {integer} index - [description]
  66456. * @param {integer} [tileX=0] - [description]
  66457. * @param {integer} [tileY=0] - [description]
  66458. * @param {integer} [width=max width based on tileX] - [description]
  66459. * @param {integer} [height=max height based on tileY] - [description]
  66460. * @param {boolean} [recalculateFaces=true] - [description]
  66461. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  66462. *
  66463. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  66464. */
  66465. fill: function (index, tileX, tileY, width, height, recalculateFaces, layer)
  66466. {
  66467. layer = this.getLayer(layer);
  66468. if (this._isStaticCall(layer, 'fill')) { return this; }
  66469. if (layer !== null)
  66470. {
  66471. TilemapComponents.Fill(index, tileX, tileY, width, height, recalculateFaces, layer);
  66472. }
  66473. return this;
  66474. },
  66475. /**
  66476. * For each object in the given object layer, run the given filter callback function. Any
  66477. * objects that pass the filter test (i.e. where the callback returns true) will returned as a
  66478. * new array. Similar to Array.prototype.Filter in vanilla JS.
  66479. *
  66480. * @method Phaser.Tilemaps.Tilemap#filterObjects
  66481. * @since 3.0.0
  66482. *
  66483. * @param {(Phaser.Tilemaps.ObjectLayer|string)} objectLayer - The name of an object layer (from Tiled) or an ObjectLayer instance.
  66484. * @param {TilemapFilterCallback} callback - The callback. Each object in the given area will be passed to this callback as the first and only parameter.
  66485. * @param {object} [context] - The context under which the callback should be run.
  66486. *
  66487. * @return {?Phaser.GameObjects.GameObject[]} An array of object that match the search, or null if the objectLayer given was invalid.
  66488. */
  66489. filterObjects: function (objectLayer, callback, context)
  66490. {
  66491. if (typeof objectLayer === 'string')
  66492. {
  66493. var name = objectLayer;
  66494. objectLayer = this.getObjectLayer(objectLayer);
  66495. if (!objectLayer)
  66496. {
  66497. console.warn('No object layer found with the name: ' + name);
  66498. return null;
  66499. }
  66500. }
  66501. return objectLayer.objects.filter(callback, context);
  66502. },
  66503. /**
  66504. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  66505. * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns
  66506. * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS.
  66507. * If no layer specified, the map's current layer is used.
  66508. *
  66509. * @method Phaser.Tilemaps.Tilemap#filterTiles
  66510. * @since 3.0.0
  66511. *
  66512. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  66513. * callback as the first and only parameter. The callback should return true for tiles that pass the
  66514. * filter.
  66515. * @param {object} [context] - The context under which the callback should be run.
  66516. * @param {integer} [tileX=0] - [description]
  66517. * @param {integer} [tileY=0] - [description]
  66518. * @param {integer} [width=max width based on tileX] - [description]
  66519. * @param {integer} [height=max height based on tileY] - [description]
  66520. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  66521. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  66522. * -1 for an index.
  66523. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide
  66524. * on at least one side.
  66525. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  66526. * have at least one interesting face.
  66527. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  66528. *
  66529. * @return {?Phaser.Tilemaps.Tile[]} Returns an array of Tiles, or null if the layer given was invalid.
  66530. */
  66531. filterTiles: function (callback, context, tileX, tileY, width, height, filteringOptions, layer)
  66532. {
  66533. layer = this.getLayer(layer);
  66534. if (layer === null) { return null; }
  66535. return TilemapComponents.FilterTiles(callback, context, tileX, tileY, width, height, filteringOptions, layer);
  66536. },
  66537. /**
  66538. * Searches the entire map layer for the first tile matching the given index, then returns that Tile
  66539. * object. If no match is found, it returns null. The search starts from the top-left tile and
  66540. * continues horizontally until it hits the end of the row, then it drops down to the next column.
  66541. * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to
  66542. * the top-left.
  66543. * If no layer specified, the map's current layer is used.
  66544. *
  66545. * @method Phaser.Tilemaps.Tilemap#findByIndex
  66546. * @since 3.0.0
  66547. *
  66548. * @param {integer} index - The tile index value to search for.
  66549. * @param {integer} [skip=0] - The number of times to skip a matching tile before returning.
  66550. * @param {boolean} [reverse=false] - If true it will scan the layer in reverse, starting at the
  66551. * bottom-right. Otherwise it scans from the top-left.
  66552. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  66553. *
  66554. * @return {?Phaser.Tilemaps.Tile} Returns a Tiles, or null if the layer given was invalid.
  66555. */
  66556. findByIndex: function (findIndex, skip, reverse, layer)
  66557. {
  66558. layer = this.getLayer(layer);
  66559. if (layer === null) { return null; }
  66560. return TilemapComponents.FindByIndex(findIndex, skip, reverse, layer);
  66561. },
  66562. /**
  66563. * Find the first object in the given object layer that satisfies the provided testing function.
  66564. * I.e. finds the first object for which `callback` returns true. Similar to
  66565. * Array.prototype.find in vanilla JS.
  66566. *
  66567. * @method Phaser.Tilemaps.Tilemap#findObject
  66568. * @since 3.0.0
  66569. *
  66570. * @param {(Phaser.Tilemaps.ObjectLayer|string)} objectLayer - The name of an object layer (from Tiled) or an ObjectLayer instance.
  66571. * @param {TilemapFindCallback} callback - The callback. Each object in the given area will be passed to this callback as the first and only parameter.
  66572. * @param {object} [context] - The context under which the callback should be run.
  66573. *
  66574. * @return {?Phaser.GameObjects.GameObject} An object that matches the search, or null if no object found.
  66575. */
  66576. findObject: function (objectLayer, callback, context)
  66577. {
  66578. if (typeof objectLayer === 'string')
  66579. {
  66580. var name = objectLayer;
  66581. objectLayer = this.getObjectLayer(objectLayer);
  66582. if (!objectLayer)
  66583. {
  66584. console.warn('No object layer found with the name: ' + name);
  66585. return null;
  66586. }
  66587. }
  66588. return objectLayer.objects.find(callback, context) || null;
  66589. },
  66590. /**
  66591. * Find the first tile in the given rectangular area (in tile coordinates) of the layer that
  66592. * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns
  66593. * true. Similar to Array.prototype.find in vanilla JS.
  66594. * If no layer specified, the maps current layer is used.
  66595. *
  66596. * @method Phaser.Tilemaps.Tilemap#findTile
  66597. * @since 3.0.0
  66598. *
  66599. * @param {FindTileCallback} callback - The callback. Each tile in the given area will be passed to this
  66600. * callback as the first and only parameter.
  66601. * @param {object} [context] - The context under which the callback should be run.
  66602. * @param {integer} [tileX=0] - [description]
  66603. * @param {integer} [tileY=0] - [description]
  66604. * @param {integer} [width=max width based on tileX] - [description]
  66605. * @param {integer} [height=max height based on tileY] - [description]
  66606. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  66607. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  66608. * -1 for an index.
  66609. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide
  66610. * on at least one side.
  66611. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  66612. * have at least one interesting face.
  66613. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  66614. *
  66615. * @return {?Phaser.Tilemaps.Tile} Returns a Tiles, or null if the layer given was invalid.
  66616. */
  66617. findTile: function (callback, context, tileX, tileY, width, height, filteringOptions, layer)
  66618. {
  66619. layer = this.getLayer(layer);
  66620. if (layer === null) { return null; }
  66621. return TilemapComponents.FindTile(callback, context, tileX, tileY, width, height, filteringOptions, layer);
  66622. },
  66623. /**
  66624. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  66625. * callback. Similar to Array.prototype.forEach in vanilla JS.
  66626. *
  66627. * If no layer specified, the map's current layer is used.
  66628. *
  66629. * @method Phaser.Tilemaps.Tilemap#forEachTile
  66630. * @since 3.0.0
  66631. *
  66632. * @param {EachTileCallback} callback - The callback. Each tile in the given area will be passed to this
  66633. * callback as the first and only parameter.
  66634. * @param {object} [context] - The context under which the callback should be run.
  66635. * @param {integer} [tileX=0] - [description]
  66636. * @param {integer} [tileY=0] - [description]
  66637. * @param {integer} [width=max width based on tileX] - [description]
  66638. * @param {integer} [height=max height based on tileY] - [description]
  66639. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  66640. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  66641. * -1 for an index.
  66642. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide
  66643. * on at least one side.
  66644. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  66645. * have at least one interesting face.
  66646. * @param {LayerData} [layer] - [description]
  66647. *
  66648. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  66649. */
  66650. forEachTile: function (callback, context, tileX, tileY, width, height, filteringOptions, layer)
  66651. {
  66652. layer = this.getLayer(layer);
  66653. if (layer !== null)
  66654. {
  66655. TilemapComponents.ForEachTile(callback, context, tileX, tileY, width, height, filteringOptions, layer);
  66656. }
  66657. return this;
  66658. },
  66659. /**
  66660. * Gets the image layer index based on its name.
  66661. *
  66662. * @method Phaser.Tilemaps.Tilemap#getImageIndex
  66663. * @since 3.0.0
  66664. *
  66665. * @param {string} name - The name of the image to get.
  66666. *
  66667. * @return {integer} The index of the image in this tilemap, or null if not found.
  66668. */
  66669. getImageIndex: function (name)
  66670. {
  66671. return this.getIndex(this.images, name);
  66672. },
  66673. /**
  66674. * Internally used. Returns the index of the object in one of the Tilemaps arrays whose name
  66675. * property matches the given `name`.
  66676. *
  66677. * @method Phaser.Tilemaps.Tilemap#getIndex
  66678. * @since 3.0.0
  66679. *
  66680. * @param {array} location - The Tilemap array to search.
  66681. * @param {string} name - The name of the array element to get.
  66682. *
  66683. * @return {number} The index of the element in the array, or null if not found.
  66684. */
  66685. getIndex: function (location, name)
  66686. {
  66687. for (var i = 0; i < location.length; i++)
  66688. {
  66689. if (location[i].name === name)
  66690. {
  66691. return i;
  66692. }
  66693. }
  66694. return null;
  66695. },
  66696. /**
  66697. * Gets the LayerData from this.layers that is associated with `layer`, or null if an invalid
  66698. * `layer` is given.
  66699. *
  66700. * @method Phaser.Tilemaps.Tilemap#getLayer
  66701. * @since 3.0.0
  66702. *
  66703. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The name of the
  66704. * layer from Tiled, the index of the layer in the map, a DynamicTilemapLayer or a
  66705. * StaticTilemapLayer. If not given will default to the maps current layer index.
  66706. *
  66707. * @return {Phaser.Tilemaps.LayerData} The corresponding LayerData within this.layers.
  66708. */
  66709. getLayer: function (layer)
  66710. {
  66711. var index = this.getLayerIndex(layer);
  66712. return index !== null ? this.layers[index] : null;
  66713. },
  66714. /**
  66715. * Gets the ObjectLayer from this.objects that has the given `name`, or null if no ObjectLayer
  66716. * is found with that name.
  66717. *
  66718. * @method Phaser.Tilemaps.Tilemap#getObjectLayer
  66719. * @since 3.0.0
  66720. *
  66721. * @param {string} [name] - The name of the object layer from Tiled.
  66722. *
  66723. * @return {?Phaser.Tilemaps.ObjectLayer} The corresponding ObjectLayer within this.objects or null.
  66724. */
  66725. getObjectLayer: function (name)
  66726. {
  66727. var index = this.getIndex(this.objects, name);
  66728. return index !== null ? this.objects[index] : null;
  66729. },
  66730. /**
  66731. * Gets the LayerData index of the given `layer` within this.layers, or null if an invalid
  66732. * `layer` is given.
  66733. *
  66734. * @method Phaser.Tilemaps.Tilemap#getLayerIndex
  66735. * @since 3.0.0
  66736. *
  66737. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The name of the
  66738. * layer from Tiled, the index of the layer in the map, a DynamicTilemapLayer or a
  66739. * StaticTilemapLayer. If not given will default to the map's current layer index.
  66740. *
  66741. * @return {integer} The LayerData index within this.layers.
  66742. */
  66743. getLayerIndex: function (layer)
  66744. {
  66745. if (layer === undefined)
  66746. {
  66747. return this.currentLayerIndex;
  66748. }
  66749. else if (typeof layer === 'string')
  66750. {
  66751. return this.getLayerIndexByName(layer);
  66752. }
  66753. else if (typeof layer === 'number' && layer < this.layers.length)
  66754. {
  66755. return layer;
  66756. }
  66757. else if (layer instanceof StaticTilemapLayer || layer instanceof DynamicTilemapLayer)
  66758. {
  66759. return layer.layerIndex;
  66760. }
  66761. else
  66762. {
  66763. return null;
  66764. }
  66765. },
  66766. /**
  66767. * Gets the index of the LayerData within this.layers that has the given `name`, or null if an
  66768. * invalid `name` is given.
  66769. *
  66770. * @method Phaser.Tilemaps.Tilemap#getLayerIndexByName
  66771. * @since 3.0.0
  66772. *
  66773. * @param {string} name - The name of the layer to get.
  66774. *
  66775. * @return {integer} The LayerData index within this.layers.
  66776. */
  66777. getLayerIndexByName: function (name)
  66778. {
  66779. return this.getIndex(this.layers, name);
  66780. },
  66781. /**
  66782. * Gets a tile at the given tile coordinates from the given layer.
  66783. * If no layer specified, the map's current layer is used.
  66784. *
  66785. * @method Phaser.Tilemaps.Tilemap#getTileAt
  66786. * @since 3.0.0
  66787. *
  66788. * @param {integer} tileX - X position to get the tile from (given in tile units, not pixels).
  66789. * @param {integer} tileY - Y position to get the tile from (given in tile units, not pixels).
  66790. * @param {boolean} [nonNull=false] - If true getTile won't return null for empty tiles, but a Tile
  66791. * object with an index of -1.
  66792. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  66793. *
  66794. * @return {?Phaser.Tilemaps.Tile} Returns a Tile, or null if the layer given was invalid.
  66795. */
  66796. getTileAt: function (tileX, tileY, nonNull, layer)
  66797. {
  66798. layer = this.getLayer(layer);
  66799. if (layer === null) { return null; }
  66800. return TilemapComponents.GetTileAt(tileX, tileY, nonNull, layer);
  66801. },
  66802. /**
  66803. * Gets a tile at the given world coordinates from the given layer.
  66804. * If no layer specified, the map's current layer is used.
  66805. *
  66806. * @method Phaser.Tilemaps.Tilemap#getTileAtWorldXY
  66807. * @since 3.0.0
  66808. *
  66809. * @param {number} worldX - X position to get the tile from (given in pixels)
  66810. * @param {number} worldY - Y position to get the tile from (given in pixels)
  66811. * @param {boolean} [nonNull=false] - If true, function won't return null for empty tiles, but a Tile
  66812. * object with an index of -1.
  66813. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  66814. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  66815. *
  66816. * @return {?Phaser.Tilemaps.Tile} Returns a Tile, or null if the layer given was invalid.
  66817. */
  66818. getTileAtWorldXY: function (worldX, worldY, nonNull, camera, layer)
  66819. {
  66820. layer = this.getLayer(layer);
  66821. if (layer === null)
  66822. {
  66823. return null;
  66824. }
  66825. else
  66826. {
  66827. return TilemapComponents.GetTileAtWorldXY(worldX, worldY, nonNull, camera, layer);
  66828. }
  66829. },
  66830. /**
  66831. * Gets the tiles in the given rectangular area (in tile coordinates) of the layer.
  66832. * If no layer specified, the maps current layer is used.
  66833. *
  66834. * @method Phaser.Tilemaps.Tilemap#getTilesWithin
  66835. * @since 3.0.0
  66836. *
  66837. * @param {integer} [tileX=0] - [description]
  66838. * @param {integer} [tileY=0] - [description]
  66839. * @param {integer} [width=max width based on tileX] - [description]
  66840. * @param {integer} [height=max height based on tileY] - [description]
  66841. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  66842. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  66843. * -1 for an index.
  66844. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on
  66845. * at least one side.
  66846. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  66847. * have at least one interesting face.
  66848. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  66849. *
  66850. * @return {?Phaser.Tilemaps.Tile[]} Returns an array of Tiles, or null if the layer given was invalid.
  66851. */
  66852. getTilesWithin: function (tileX, tileY, width, height, filteringOptions, layer)
  66853. {
  66854. layer = this.getLayer(layer);
  66855. if (layer === null) { return null; }
  66856. return TilemapComponents.GetTilesWithin(tileX, tileY, width, height, filteringOptions, layer);
  66857. },
  66858. /**
  66859. * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle,
  66860. * Line, Rectangle or Triangle. The shape should be in world coordinates.
  66861. * If no layer specified, the maps current layer is used.
  66862. *
  66863. * @method Phaser.Tilemaps.Tilemap#getTilesWithinShape
  66864. * @since 3.0.0
  66865. *
  66866. * @param {(Phaser.Geom.Circle|Phaser.Geom.Line|Phaser.Geom.Rectangle|Phaser.Geom.Triangle)} shape - A shape in world (pixel) coordinates
  66867. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  66868. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  66869. * -1 for an index.
  66870. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on
  66871. * at least one side.
  66872. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  66873. * have at least one interesting face.
  66874. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  66875. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  66876. *
  66877. * @return {?Phaser.Tilemaps.Tile[]} Returns an array of Tiles, or null if the layer given was invalid.
  66878. */
  66879. getTilesWithinShape: function (shape, filteringOptions, camera, layer)
  66880. {
  66881. layer = this.getLayer(layer);
  66882. if (layer === null) { return null; }
  66883. return TilemapComponents.GetTilesWithinShape(shape, filteringOptions, camera, layer);
  66884. },
  66885. /**
  66886. * Gets the tiles in the given rectangular area (in world coordinates) of the layer.
  66887. * If no layer specified, the maps current layer is used.
  66888. *
  66889. * @method Phaser.Tilemaps.Tilemap#getTilesWithinWorldXY
  66890. * @since 3.0.0
  66891. *
  66892. * @param {number} worldX - [description]
  66893. * @param {number} worldY - [description]
  66894. * @param {number} width - [description]
  66895. * @param {number} height - [description]
  66896. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  66897. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  66898. * -1 for an index.
  66899. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on
  66900. * at least one side.
  66901. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  66902. * have at least one interesting face.
  66903. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  66904. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  66905. *
  66906. * @return {?Phaser.Tilemaps.Tile[]} Returns an array of Tiles, or null if the layer given was invalid.
  66907. */
  66908. getTilesWithinWorldXY: function (worldX, worldY, width, height, filteringOptions, camera, layer)
  66909. {
  66910. layer = this.getLayer(layer);
  66911. if (layer === null) { return null; }
  66912. return TilemapComponents.GetTilesWithinWorldXY(worldX, worldY, width, height, filteringOptions, camera, layer);
  66913. },
  66914. /**
  66915. * Gets the index of the Tileset within this.tilesets that has the given `name`, or null if an
  66916. * invalid `name` is given.
  66917. *
  66918. * @method Phaser.Tilemaps.Tilemap#getTilesetIndex
  66919. * @since 3.0.0
  66920. *
  66921. * @param {string} name - The name of the Tileset to get.
  66922. *
  66923. * @return {integer} The Tileset index within this.tilesets.
  66924. */
  66925. getTilesetIndex: function (name)
  66926. {
  66927. return this.getIndex(this.tilesets, name);
  66928. },
  66929. /**
  66930. * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns
  66931. * false if there is no tile or if the tile at that location has an index of -1.
  66932. *
  66933. * If no layer specified, the map's current layer is used.
  66934. *
  66935. * @method Phaser.Tilemaps.Tilemap#hasTileAt
  66936. * @since 3.0.0
  66937. *
  66938. * @param {integer} tileX - [description]
  66939. * @param {integer} tileY - [description]
  66940. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  66941. *
  66942. * @return {?boolean} Returns a boolean, or null if the layer given was invalid.
  66943. */
  66944. hasTileAt: function (tileX, tileY, layer)
  66945. {
  66946. layer = this.getLayer(layer);
  66947. if (layer === null) { return null; }
  66948. return TilemapComponents.HasTileAt(tileX, tileY, layer);
  66949. },
  66950. /**
  66951. * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns
  66952. * false if there is no tile or if the tile at that location has an index of -1.
  66953. *
  66954. * If no layer specified, the maps current layer is used.
  66955. *
  66956. * @method Phaser.Tilemaps.Tilemap#hasTileAtWorldXY
  66957. * @since 3.0.0
  66958. *
  66959. * @param {number} worldX - [description]
  66960. * @param {number} worldY - [description]
  66961. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  66962. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  66963. *
  66964. * @return {?boolean} Returns a boolean, or null if the layer given was invalid.
  66965. */
  66966. hasTileAtWorldXY: function (worldX, worldY, camera, layer)
  66967. {
  66968. layer = this.getLayer(layer);
  66969. if (layer === null) { return null; }
  66970. return TilemapComponents.HasTileAtWorldXY(worldX, worldY, camera, layer);
  66971. },
  66972. /**
  66973. * The LayerData object that is currently selected in the map. You can set this property using
  66974. * any type supported by setLayer.
  66975. *
  66976. * @name Phaser.Tilemaps.Tilemap#layer
  66977. * @type {Phaser.Tilemaps.LayerData}
  66978. * @since 3.0.0
  66979. */
  66980. layer: {
  66981. get: function ()
  66982. {
  66983. return this.layers[this.currentLayerIndex];
  66984. },
  66985. set: function (layer)
  66986. {
  66987. this.setLayer(layer);
  66988. }
  66989. },
  66990. /**
  66991. * Puts a tile at the given tile coordinates in the specified layer. You can pass in either an index
  66992. * or a Tile object. If you pass in a Tile, all attributes will be copied over to the specified
  66993. * location. If you pass in an index, only the index at the specified location will be changed.
  66994. * Collision information will be recalculated at the specified location.
  66995. *
  66996. * If no layer specified, the maps current layer is used.
  66997. *
  66998. * This cannot be applied to StaticTilemapLayers.
  66999. *
  67000. * @method Phaser.Tilemaps.Tilemap#putTileAt
  67001. * @since 3.0.0
  67002. *
  67003. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  67004. * @param {integer} tileX - [description]
  67005. * @param {integer} tileY - [description]
  67006. * @param {boolean} [recalculateFaces=true] - [description]
  67007. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67008. *
  67009. * @return {?Phaser.Tilemaps.Tile} Returns a Tile, or null if the layer given was invalid.
  67010. */
  67011. putTileAt: function (tile, tileX, tileY, recalculateFaces, layer)
  67012. {
  67013. layer = this.getLayer(layer);
  67014. if (this._isStaticCall(layer, 'putTileAt')) { return null; }
  67015. if (layer === null) { return null; }
  67016. return TilemapComponents.PutTileAt(tile, tileX, tileY, recalculateFaces, layer);
  67017. },
  67018. /**
  67019. * Puts a tile at the given world coordinates (pixels) in the specified layer. You can pass in either
  67020. * an index or a Tile object. If you pass in a Tile, all attributes will be copied over to the
  67021. * specified location. If you pass in an index, only the index at the specified location will be
  67022. * changed. Collision information will be recalculated at the specified location.
  67023. *
  67024. * If no layer specified, the maps current layer is used. This
  67025. * cannot be applied to StaticTilemapLayers.
  67026. *
  67027. * @method Phaser.Tilemaps.Tilemap#putTileAtWorldXY
  67028. * @since 3.0.0
  67029. *
  67030. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  67031. * @param {integer} worldX - [description]
  67032. * @param {integer} worldY - [description]
  67033. * @param {boolean} [recalculateFaces=true] - [description]
  67034. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  67035. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67036. *
  67037. * @return {?Phaser.Tilemaps.Tile} Returns a Tile, or null if the layer given was invalid.
  67038. */
  67039. putTileAtWorldXY: function (tile, worldX, worldY, recalculateFaces, camera, layer)
  67040. {
  67041. layer = this.getLayer(layer);
  67042. if (this._isStaticCall(layer, 'putTileAtWorldXY')) { return null; }
  67043. if (layer === null) { return null; }
  67044. return TilemapComponents.PutTileAtWorldXY(tile, worldX, worldY, recalculateFaces, camera, layer);
  67045. },
  67046. /**
  67047. * Puts an array of tiles or a 2D array of tiles at the given tile coordinates in the specified
  67048. * layer. The array can be composed of either tile indexes or Tile objects. If you pass in a Tile,
  67049. * all attributes will be copied over to the specified location. If you pass in an index, only the
  67050. * index at the specified location will be changed. Collision information will be recalculated
  67051. * within the region tiles were changed.
  67052. *
  67053. * If no layer specified, the maps current layer is used.
  67054. * This cannot be applied to StaticTilemapLayers.
  67055. *
  67056. * @method Phaser.Tilemaps.Tilemap#putTilesAt
  67057. * @since 3.0.0
  67058. *
  67059. * @param {(integer[]|integer[][]|Phaser.Tilemaps.Tile[]|Phaser.Tilemaps.Tile[][])} tile - A row (array) or grid (2D array) of Tiles
  67060. * or tile indexes to place.
  67061. * @param {integer} tileX - [description]
  67062. * @param {integer} tileY - [description]
  67063. * @param {boolean} [recalculateFaces=true] - [description]
  67064. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67065. *
  67066. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  67067. */
  67068. putTilesAt: function (tilesArray, tileX, tileY, recalculateFaces, layer)
  67069. {
  67070. layer = this.getLayer(layer);
  67071. if (this._isStaticCall(layer, 'putTilesAt')) { return this; }
  67072. if (layer !== null)
  67073. {
  67074. TilemapComponents.PutTilesAt(tilesArray, tileX, tileY, recalculateFaces, layer);
  67075. }
  67076. return this;
  67077. },
  67078. /**
  67079. * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
  67080. * specified layer. Each tile will recieve a new index. If an array of indexes is passed in, then
  67081. * those will be used for randomly assigning new tile indexes. If an array is not provided, the
  67082. * indexes found within the region (excluding -1) will be used for randomly assigning new tile
  67083. * indexes. This method only modifies tile indexes and does not change collision information.
  67084. *
  67085. * If no layer specified, the maps current layer is used.
  67086. * This cannot be applied to StaticTilemapLayers.
  67087. *
  67088. * @method Phaser.Tilemaps.Tilemap#randomize
  67089. * @since 3.0.0
  67090. *
  67091. * @param {integer} [tileX=0] - [description]
  67092. * @param {integer} [tileY=0] - [description]
  67093. * @param {integer} [width=max width based on tileX] - [description]
  67094. * @param {integer} [height=max height based on tileY] - [description]
  67095. * @param {integer[]} [indexes] - An array of indexes to randomly draw from during randomization.
  67096. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67097. *
  67098. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  67099. */
  67100. randomize: function (tileX, tileY, width, height, indexes, layer)
  67101. {
  67102. layer = this.getLayer(layer);
  67103. if (this._isStaticCall(layer, 'randomize')) { return this; }
  67104. if (layer !== null)
  67105. {
  67106. TilemapComponents.Randomize(tileX, tileY, width, height, indexes, layer);
  67107. }
  67108. return this;
  67109. },
  67110. /**
  67111. * Calculates interesting faces at the given tile coordinates of the specified layer. Interesting
  67112. * faces are used internally for optimizing collisions against tiles. This method is mostly used
  67113. * internally to optimize recalculating faces when only one tile has been changed.
  67114. *
  67115. * If no layer specified, the maps current layer is used.
  67116. *
  67117. * @method Phaser.Tilemaps.Tilemap#calculateFacesAt
  67118. * @since 3.0.0
  67119. *
  67120. * @param {integer} tileX - [description]
  67121. * @param {integer} tileY - [description]
  67122. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67123. *
  67124. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  67125. */
  67126. calculateFacesAt: function (tileX, tileY, layer)
  67127. {
  67128. layer = this.getLayer(layer);
  67129. if (layer === null) { return this; }
  67130. TilemapComponents.CalculateFacesAt(tileX, tileY, layer);
  67131. return this;
  67132. },
  67133. /**
  67134. * Calculates interesting faces within the rectangular area specified (in tile coordinates) of the
  67135. * layer. Interesting faces are used internally for optimizing collisions against tiles. This method
  67136. * is mostly used internally.
  67137. *
  67138. * If no layer specified, the map's current layer is used.
  67139. *
  67140. * @method Phaser.Tilemaps.Tilemap#calculateFacesWithin
  67141. * @since 3.0.0
  67142. *
  67143. * @param {integer} [tileX=0] - [description]
  67144. * @param {integer} [tileY=0] - [description]
  67145. * @param {integer} [width=max width based on tileX] - [description]
  67146. * @param {integer} [height=max height based on tileY] - [description]
  67147. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67148. *
  67149. * @return {?Phaser.Tilemaps.Tilemap} Returns this, or null if the layer given was invalid.
  67150. */
  67151. calculateFacesWithin: function (tileX, tileY, width, height, layer)
  67152. {
  67153. layer = this.getLayer(layer);
  67154. if (layer === null) { return this; }
  67155. TilemapComponents.CalculateFacesWithin(tileX, tileY, width, height, layer);
  67156. return this;
  67157. },
  67158. /**
  67159. * Removes all layers from this Tilemap and destroys any associated StaticTilemapLayers or
  67160. * DynamicTilemapLayers.
  67161. *
  67162. * @method Phaser.Tilemaps.Tilemap#removeAllLayers
  67163. * @since 3.0.0
  67164. *
  67165. * @return {Phaser.Tilemaps.Tilemap} This Tilemap object.
  67166. */
  67167. removeAllLayers: function ()
  67168. {
  67169. // Destroy any StaticTilemapLayers or DynamicTilemapLayers that are stored in LayerData
  67170. for (var i = 0; i < this.layers.length; i++)
  67171. {
  67172. if (this.layers[i].tilemapLayer)
  67173. {
  67174. this.layers[i].tilemapLayer.destroy();
  67175. }
  67176. }
  67177. this.layers.length = 0;
  67178. this.currentLayerIndex = 0;
  67179. return this;
  67180. },
  67181. /**
  67182. * Removes the tile at the given tile coordinates in the specified layer and updates the layer's
  67183. * collision information.
  67184. *
  67185. * If no layer specified, the maps current layer is used.
  67186. * This cannot be applied to StaticTilemapLayers.
  67187. *
  67188. * @method Phaser.Tilemaps.Tilemap#removeTileAt
  67189. * @since 3.0.0
  67190. *
  67191. * @param {integer} tileX - [description]
  67192. * @param {integer} tileY - [description]
  67193. * @param {boolean} [replaceWithNull=true] - If true, this will replace the tile at the specified
  67194. * location with null instead of a Tile with an index of -1.
  67195. * @param {boolean} [recalculateFaces=true] - [description]
  67196. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67197. *
  67198. * @return {?Phaser.Tilemaps.Tile} Returns a Tile, or null if the layer given was invalid.
  67199. */
  67200. removeTileAt: function (tileX, tileY, replaceWithNull, recalculateFaces, layer)
  67201. {
  67202. layer = this.getLayer(layer);
  67203. if (this._isStaticCall(layer, 'removeTileAt')) { return null; }
  67204. if (layer === null) { return null; }
  67205. return TilemapComponents.RemoveTileAt(tileX, tileY, replaceWithNull, recalculateFaces, layer);
  67206. },
  67207. /**
  67208. * Removes the tile at the given world coordinates in the specified layer and updates the layer's
  67209. * collision information.
  67210. *
  67211. * If no layer specified, the maps current layer is used.
  67212. * This cannot be applied to StaticTilemapLayers.
  67213. *
  67214. * @method Phaser.Tilemaps.Tilemap#removeTileAtWorldXY
  67215. * @since 3.0.0
  67216. *
  67217. * @param {number} worldX - [description]
  67218. * @param {number} worldY - [description]
  67219. * @param {boolean} [replaceWithNull=true] - If true, this will replace the tile at the specified
  67220. * location with null instead of a Tile with an index of -1.
  67221. * @param {boolean} [recalculateFaces=true] - [description]
  67222. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  67223. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67224. *
  67225. * @return {?Phaser.Tilemaps.Tile} Returns a Tile, or null if the layer given was invalid.
  67226. */
  67227. removeTileAtWorldXY: function (worldX, worldY, replaceWithNull, recalculateFaces, camera, layer)
  67228. {
  67229. layer = this.getLayer(layer);
  67230. if (this._isStaticCall(layer, 'removeTileAtWorldXY')) { return null; }
  67231. if (layer === null) { return null; }
  67232. return TilemapComponents.RemoveTileAtWorldXY(worldX, worldY, replaceWithNull, recalculateFaces, camera, layer);
  67233. },
  67234. /**
  67235. * Draws a debug representation of the layer to the given Graphics. This is helpful when you want to
  67236. * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles
  67237. * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation
  67238. * wherever you want on the screen.
  67239. *
  67240. * If no layer specified, the maps current layer is used.
  67241. *
  67242. * @method Phaser.Tilemaps.Tilemap#renderDebug
  67243. * @since 3.0.0
  67244. *
  67245. * @param {Phaser.GameObjects.Graphics} graphics - The target Graphics object to draw upon.
  67246. * @param {object} styleConfig - An object specifying the colors to use for the debug drawing.
  67247. * @param {?Color} [styleConfig.tileColor=blue] - Color to use for drawing a filled rectangle at
  67248. * non-colliding tile locations. If set to null, non-colliding tiles will not be drawn.
  67249. * @param {?Color} [styleConfig.collidingTileColor=orange] - Color to use for drawing a filled
  67250. * rectangle at colliding tile locations. If set to null, colliding tiles will not be drawn.
  67251. * @param {?Color} [styleConfig.faceColor=grey] - Color to use for drawing a line at interesting
  67252. * tile faces. If set to null, interesting tile faces will not be drawn.
  67253. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67254. *
  67255. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  67256. */
  67257. renderDebug: function (graphics, styleConfig, layer)
  67258. {
  67259. layer = this.getLayer(layer);
  67260. if (layer === null) { return this; }
  67261. TilemapComponents.RenderDebug(graphics, styleConfig, layer);
  67262. return this;
  67263. },
  67264. /**
  67265. * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching
  67266. * `findIndex` and updates their index to match `newIndex`. This only modifies the index and does
  67267. * not change collision information.
  67268. *
  67269. * If no layer specified, the maps current layer is used.
  67270. * This cannot be applied to StaticTilemapLayers.
  67271. *
  67272. * @method Phaser.Tilemaps.Tilemap#replaceByIndex
  67273. * @since 3.0.0
  67274. *
  67275. * @param {integer} findIndex - [description]
  67276. * @param {integer} newIndex - [description]
  67277. * @param {integer} [tileX=0] - [description]
  67278. * @param {integer} [tileY=0] - [description]
  67279. * @param {integer} [width=max width based on tileX] - [description]
  67280. * @param {integer} [height=max height based on tileY] - [description]
  67281. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67282. *
  67283. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  67284. */
  67285. replaceByIndex: function (findIndex, newIndex, tileX, tileY, width, height, layer)
  67286. {
  67287. layer = this.getLayer(layer);
  67288. if (this._isStaticCall(layer, 'replaceByIndex')) { return this; }
  67289. if (layer !== null)
  67290. {
  67291. TilemapComponents.ReplaceByIndex(findIndex, newIndex, tileX, tileY, width, height, layer);
  67292. }
  67293. return this;
  67294. },
  67295. /**
  67296. * Sets collision on the given tile or tiles within a layer by index. You can pass in either a
  67297. * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if
  67298. * collision will be enabled (true) or disabled (false).
  67299. *
  67300. * If no layer specified, the map's current layer is used.
  67301. *
  67302. * @method Phaser.Tilemaps.Tilemap#setCollision
  67303. * @since 3.0.0
  67304. *
  67305. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes.
  67306. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  67307. * collision.
  67308. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  67309. * update.
  67310. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67311. *
  67312. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  67313. */
  67314. setCollision: function (indexes, collides, recalculateFaces, layer)
  67315. {
  67316. layer = this.getLayer(layer);
  67317. if (layer === null) { return this; }
  67318. TilemapComponents.SetCollision(indexes, collides, recalculateFaces, layer);
  67319. return this;
  67320. },
  67321. /**
  67322. * Sets collision on a range of tiles in a layer whose index is between the specified `start` and
  67323. * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set
  67324. * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be
  67325. * enabled (true) or disabled (false).
  67326. *
  67327. * If no layer specified, the map's current layer is used.
  67328. *
  67329. * @method Phaser.Tilemaps.Tilemap#setCollisionBetween
  67330. * @since 3.0.0
  67331. *
  67332. * @param {integer} start - The first index of the tile to be set for collision.
  67333. * @param {integer} stop - The last index of the tile to be set for collision.
  67334. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  67335. * collision.
  67336. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  67337. * update.
  67338. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67339. *
  67340. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  67341. */
  67342. setCollisionBetween: function (start, stop, collides, recalculateFaces, layer)
  67343. {
  67344. layer = this.getLayer(layer);
  67345. if (layer === null) { return this; }
  67346. TilemapComponents.SetCollisionBetween(start, stop, collides, recalculateFaces, layer);
  67347. return this;
  67348. },
  67349. /**
  67350. * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property
  67351. * that matches the given properties object, its collision flag will be set. The `collides`
  67352. * parameter controls if collision will be enabled (true) or disabled (false). Passing in
  67353. * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that
  67354. * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can
  67355. * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a
  67356. * "types" property that matches any of those values, its collision flag will be updated.
  67357. *
  67358. * If no layer specified, the map's current layer is used.
  67359. *
  67360. * @method Phaser.Tilemaps.Tilemap#setCollisionByProperty
  67361. * @since 3.0.0
  67362. *
  67363. * @param {object} properties - An object with tile properties and corresponding values that should
  67364. * be checked.
  67365. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  67366. * collision.
  67367. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  67368. * update.
  67369. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67370. *
  67371. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  67372. */
  67373. setCollisionByProperty: function (properties, collides, recalculateFaces, layer)
  67374. {
  67375. layer = this.getLayer(layer);
  67376. if (layer === null) { return this; }
  67377. TilemapComponents.SetCollisionByProperty(properties, collides, recalculateFaces, layer);
  67378. return this;
  67379. },
  67380. /**
  67381. * Sets collision on all tiles in the given layer, except for tiles that have an index specified in
  67382. * the given array. The `collides` parameter controls if collision will be enabled (true) or
  67383. * disabled (false).
  67384. *
  67385. * If no layer specified, the map's current layer is used.
  67386. *
  67387. * @method Phaser.Tilemaps.Tilemap#setCollisionByExclusion
  67388. * @since 3.0.0
  67389. *
  67390. * @param {integer[]} indexes - An array of the tile indexes to not be counted for collision.
  67391. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  67392. * collision.
  67393. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  67394. * update.
  67395. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67396. *
  67397. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  67398. */
  67399. setCollisionByExclusion: function (indexes, collides, recalculateFaces, layer)
  67400. {
  67401. layer = this.getLayer(layer);
  67402. if (layer === null) { return this; }
  67403. TilemapComponents.SetCollisionByExclusion(indexes, collides, recalculateFaces, layer);
  67404. return this;
  67405. },
  67406. /**
  67407. * Sets collision on the tiles within a layer by checking each tile's collision group data
  67408. * (typically defined in Tiled within the tileset collision editor). If any objects are found within
  67409. * a tile's collision group, the tile's colliding information will be set. The `collides` parameter
  67410. * controls if collision will be enabled (true) or disabled (false).
  67411. *
  67412. * If no layer specified, the map's current layer is used.
  67413. *
  67414. * @method Phaser.Tilemaps.Tilemap#setCollisionFromCollisionGroup
  67415. * @since 3.0.0
  67416. *
  67417. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  67418. * collision.
  67419. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  67420. * update.
  67421. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67422. *
  67423. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  67424. */
  67425. setCollisionFromCollisionGroup: function (collides, recalculateFaces, layer)
  67426. {
  67427. layer = this.getLayer(layer);
  67428. if (layer === null) { return this; }
  67429. TilemapComponents.SetCollisionFromCollisionGroup(collides, recalculateFaces, layer);
  67430. return this;
  67431. },
  67432. /**
  67433. * Sets a global collision callback for the given tile index within the layer. This will affect all
  67434. * tiles on this layer that have the same index. If a callback is already set for the tile index it
  67435. * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile
  67436. * at a specific location on the map then see setTileLocationCallback.
  67437. *
  67438. * If no layer specified, the map's current layer is used.
  67439. *
  67440. * @method Phaser.Tilemaps.Tilemap#setTileIndexCallback
  67441. * @since 3.0.0
  67442. *
  67443. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes to have a
  67444. * collision callback set for.
  67445. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  67446. * @param {object} callbackContext - The context under which the callback is called.
  67447. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67448. *
  67449. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  67450. */
  67451. setTileIndexCallback: function (indexes, callback, callbackContext, layer)
  67452. {
  67453. layer = this.getLayer(layer);
  67454. if (layer === null) { return this; }
  67455. TilemapComponents.SetTileIndexCallback(indexes, callback, callbackContext, layer);
  67456. return this;
  67457. },
  67458. /**
  67459. * Sets a collision callback for the given rectangular area (in tile coordindates) within the layer.
  67460. * If a callback is already set for the tile index it will be replaced. Set the callback to null to
  67461. * remove it.
  67462. *
  67463. * If no layer specified, the map's current layer is used.
  67464. *
  67465. * @method Phaser.Tilemaps.Tilemap#setTileLocationCallback
  67466. * @since 3.0.0
  67467. *
  67468. * @param {integer} tileX - [description]
  67469. * @param {integer} tileY - [description]
  67470. * @param {integer} width - [description]
  67471. * @param {integer} height - [description]
  67472. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  67473. * @param {object} [callbackContext] - The context under which the callback is called.
  67474. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67475. *
  67476. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  67477. */
  67478. setTileLocationCallback: function (tileX, tileY, width, height, callback, callbackContext, layer)
  67479. {
  67480. layer = this.getLayer(layer);
  67481. if (layer === null) { return this; }
  67482. TilemapComponents.SetTileLocationCallback(tileX, tileY, width, height, callback, callbackContext, layer);
  67483. return this;
  67484. },
  67485. /**
  67486. * Sets the current layer to the LayerData associated with `layer`.
  67487. *
  67488. * @method Phaser.Tilemaps.Tilemap#setLayer
  67489. * @since 3.0.0
  67490. *
  67491. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The name of the
  67492. * layer from Tiled, the index of the layer in the map, a DynamicTilemapLayer or a
  67493. * StaticTilemapLayer. If not given will default to the map's current layer index.
  67494. *
  67495. * @return {Phaser.Tilemaps.Tilemap} This Tilemap object.
  67496. */
  67497. setLayer: function (layer)
  67498. {
  67499. var index = this.getLayerIndex(layer);
  67500. if (index !== null)
  67501. {
  67502. this.currentLayerIndex = index;
  67503. }
  67504. return this;
  67505. },
  67506. /**
  67507. * Sets the base tile size for the map. Note: this does not necessarily match the tileWidth and
  67508. * tileHeight for all layers. This also updates the base size on all tiles across all layers.
  67509. *
  67510. * @method Phaser.Tilemaps.Tilemap#setBaseTileSize
  67511. * @since 3.0.0
  67512. *
  67513. * @param {integer} tileWidth - The width of the tiles the map uses for calculations.
  67514. * @param {integer} tileHeight - The height of the tiles the map uses for calculations.
  67515. *
  67516. * @return {Phaser.Tilemaps.Tilemap} This Tilemap object.
  67517. */
  67518. setBaseTileSize: function (tileWidth, tileHeight)
  67519. {
  67520. this.tileWidth = tileWidth;
  67521. this.tileHeight = tileHeight;
  67522. this.widthInPixels = this.width * tileWidth;
  67523. this.heightInPixels = this.height * tileHeight;
  67524. // Update the base tile size on all layers & tiles
  67525. for (var i = 0; i < this.layers.length; i++)
  67526. {
  67527. this.layers[i].baseWidth = tileWidth;
  67528. this.layers[i].baseHeight = tileHeight;
  67529. var mapData = this.layers[i].data;
  67530. var mapWidth = this.layers[i].width;
  67531. var mapHeight = this.layers[i].height;
  67532. for (var row = 0; row < mapHeight; ++row)
  67533. {
  67534. for (var col = 0; col < mapWidth; ++col)
  67535. {
  67536. var tile = mapData[row][col];
  67537. if (tile !== null)
  67538. {
  67539. tile.setSize(undefined, undefined, tileWidth, tileHeight);
  67540. }
  67541. }
  67542. }
  67543. }
  67544. return this;
  67545. },
  67546. /**
  67547. * Sets the tile size for a specific `layer`. Note: this does not necessarily match the map's
  67548. * tileWidth and tileHeight for all layers. This will set the tile size for the layer and any
  67549. * tiles the layer has.
  67550. *
  67551. * @method Phaser.Tilemaps.Tilemap#setLayerTileSize
  67552. * @since 3.0.0
  67553. *
  67554. * @param {integer} tileWidth - The width of the tiles (in pixels) in the layer.
  67555. * @param {integer} tileHeight - The height of the tiles (in pixels) in the layer.
  67556. * @param {(string|integer|Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} [layer] - The name of the
  67557. * layer from Tiled, the index of the layer in the map, a DynamicTilemapLayer or a
  67558. * StaticTilemapLayer. If not given will default to the map's current layer index.
  67559. *
  67560. * @return {Phaser.Tilemaps.Tilemap} This Tilemap object.
  67561. */
  67562. setLayerTileSize: function (tileWidth, tileHeight, layer)
  67563. {
  67564. layer = this.getLayer(layer);
  67565. if (layer === null) { return this; }
  67566. layer.tileWidth = tileWidth;
  67567. layer.tileHeight = tileHeight;
  67568. var mapData = layer.data;
  67569. var mapWidth = layer.width;
  67570. var mapHeight = layer.height;
  67571. for (var row = 0; row < mapHeight; ++row)
  67572. {
  67573. for (var col = 0; col < mapWidth; ++col)
  67574. {
  67575. var tile = mapData[row][col];
  67576. if (tile !== null) { tile.setSize(tileWidth, tileHeight); }
  67577. }
  67578. }
  67579. return this;
  67580. },
  67581. /**
  67582. * Shuffles the tiles in a rectangular region (specified in tile coordinates) within the given
  67583. * layer. It will only randomize the tiles in that area, so if they're all the same nothing will
  67584. * appear to have changed! This method only modifies tile indexes and does not change collision
  67585. * information.
  67586. *
  67587. * If no layer specified, the maps current layer is used.
  67588. * This cannot be applied to StaticTilemapLayers.
  67589. *
  67590. * @method Phaser.Tilemaps.Tilemap#shuffle
  67591. * @since 3.0.0
  67592. *
  67593. * @param {integer} [tileX=0] - [description]
  67594. * @param {integer} [tileY=0] - [description]
  67595. * @param {integer} [width=max width based on tileX] - [description]
  67596. * @param {integer} [height=max height based on tileY] - [description]
  67597. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67598. *
  67599. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  67600. */
  67601. shuffle: function (tileX, tileY, width, height, layer)
  67602. {
  67603. layer = this.getLayer(layer);
  67604. if (this._isStaticCall(layer, 'shuffle')) { return this; }
  67605. if (layer !== null)
  67606. {
  67607. TilemapComponents.Shuffle(tileX, tileY, width, height, layer);
  67608. }
  67609. return this;
  67610. },
  67611. /**
  67612. * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching
  67613. * `indexA` and swaps then with `indexB`. This only modifies the index and does not change collision
  67614. * information.
  67615. *
  67616. * If no layer specified, the maps current layer is used.
  67617. * This cannot be applied to StaticTilemapLayers.
  67618. *
  67619. * @method Phaser.Tilemaps.Tilemap#swapByIndex
  67620. * @since 3.0.0
  67621. *
  67622. * @param {integer} tileA - First tile index.
  67623. * @param {integer} tileB - Second tile index.
  67624. * @param {integer} [tileX=0] - [description]
  67625. * @param {integer} [tileY=0] - [description]
  67626. * @param {integer} [width=max width based on tileX] - [description]
  67627. * @param {integer} [height=max height based on tileY] - [description]
  67628. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67629. *
  67630. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  67631. */
  67632. swapByIndex: function (indexA, indexB, tileX, tileY, width, height, layer)
  67633. {
  67634. layer = this.getLayer(layer);
  67635. if (this._isStaticCall(layer, 'swapByIndex')) { return this; }
  67636. if (layer !== null)
  67637. {
  67638. TilemapComponents.SwapByIndex(indexA, indexB, tileX, tileY, width, height, layer);
  67639. }
  67640. return this;
  67641. },
  67642. /**
  67643. * Converts from tile X coordinates (tile units) to world X coordinates (pixels), factoring in the
  67644. * layers position, scale and scroll.
  67645. *
  67646. * If no layer specified, the maps current layer is used.
  67647. *
  67648. * @method Phaser.Tilemaps.Tilemap#tileToWorldX
  67649. * @since 3.0.0
  67650. *
  67651. * @param {integer} tileX - [description]
  67652. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  67653. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67654. *
  67655. * @return {?number} Returns a number, or null if the layer given was invalid.
  67656. */
  67657. tileToWorldX: function (tileX, camera, layer)
  67658. {
  67659. layer = this.getLayer(layer);
  67660. if (layer === null) { return null; }
  67661. return TilemapComponents.TileToWorldX(tileX, camera, layer);
  67662. },
  67663. /**
  67664. * Converts from tile Y coordinates (tile units) to world Y coordinates (pixels), factoring in the
  67665. * layers position, scale and scroll.
  67666. *
  67667. * If no layer specified, the maps current layer is used.
  67668. *
  67669. * @method Phaser.Tilemaps.Tilemap#tileToWorldY
  67670. * @since 3.0.0
  67671. *
  67672. * @param {integer} tileY - [description]
  67673. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  67674. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67675. *
  67676. * @return {?number} Returns a number, or null if the layer given was invalid.
  67677. */
  67678. tileToWorldY: function (tileX, camera, layer)
  67679. {
  67680. layer = this.getLayer(layer);
  67681. if (layer === null) { return null; }
  67682. return TilemapComponents.TileToWorldY(tileX, camera, layer);
  67683. },
  67684. /**
  67685. * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the
  67686. * layers position, scale and scroll. This will return a new Vector2 object or update the given
  67687. * `point` object.
  67688. *
  67689. * If no layer specified, the maps current layer is used.
  67690. *
  67691. * @method Phaser.Tilemaps.Tilemap#tileToWorldXY
  67692. * @since 3.0.0
  67693. *
  67694. * @param {integer} tileX - [description]
  67695. * @param {integer} tileY - [description]
  67696. * @param {Phaser.Math.Vector2} [point] - [description]
  67697. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  67698. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67699. *
  67700. * @return {?Phaser.Math.Vector2} Returns a point, or null if the layer given was invalid.
  67701. */
  67702. tileToWorldXY: function (tileX, tileY, point, camera, layer)
  67703. {
  67704. layer = this.getLayer(layer);
  67705. if (layer === null) { return null; }
  67706. return TilemapComponents.TileToWorldXY(tileX, tileY, point, camera, layer);
  67707. },
  67708. /**
  67709. * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
  67710. * specified layer. Each tile will receive a new index. New indexes are drawn from the given
  67711. * weightedIndexes array. An example weighted array:
  67712. *
  67713. * [
  67714. * { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8
  67715. * { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8
  67716. * { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8
  67717. * { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8
  67718. * ]
  67719. *
  67720. * The probability of any index being choose is (the index's weight) / (sum of all weights). This
  67721. * method only modifies tile indexes and does not change collision information.
  67722. *
  67723. * If no layer specified, the map's current layer is used. This
  67724. * cannot be applied to StaticTilemapLayers.
  67725. *
  67726. * @method Phaser.Tilemaps.Tilemap#weightedRandomize
  67727. * @since 3.0.0
  67728. *
  67729. * @param {integer} [tileX=0] - [description]
  67730. * @param {integer} [tileY=0] - [description]
  67731. * @param {integer} [width=max width based on tileX] - [description]
  67732. * @param {integer} [height=max height based on tileY] - [description]
  67733. * @param {object[]} [weightedIndexes] - An array of objects to randomly draw from during
  67734. * randomization. They should be in the form: { index: 0, weight: 4 } or
  67735. * { index: [0, 1], weight: 4 } if you wish to draw from multiple tile indexes.
  67736. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67737. *
  67738. * @return {?Phaser.Tilemaps.Tilemap} Return this Tilemap object, or null if the layer given was invalid.
  67739. */
  67740. weightedRandomize: function (tileX, tileY, width, height, weightedIndexes, layer)
  67741. {
  67742. layer = this.getLayer(layer);
  67743. if (this._isStaticCall(layer, 'weightedRandomize')) { return this; }
  67744. if (layer !== null)
  67745. {
  67746. TilemapComponents.WeightedRandomize(tileX, tileY, width, height, weightedIndexes, layer);
  67747. }
  67748. return this;
  67749. },
  67750. /**
  67751. * Converts from world X coordinates (pixels) to tile X coordinates (tile units), factoring in the
  67752. * layers position, scale and scroll.
  67753. *
  67754. * If no layer specified, the maps current layer is used.
  67755. *
  67756. * @method Phaser.Tilemaps.Tilemap#worldToTileX
  67757. * @since 3.0.0
  67758. *
  67759. * @param {number} worldX - [description]
  67760. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  67761. * nearest integer.
  67762. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  67763. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67764. *
  67765. * @return {?number} Returns a number, or null if the layer given was invalid.
  67766. */
  67767. worldToTileX: function (worldX, snapToFloor, camera, layer)
  67768. {
  67769. layer = this.getLayer(layer);
  67770. if (layer === null) { return null; }
  67771. return TilemapComponents.WorldToTileX(worldX, snapToFloor, camera, layer);
  67772. },
  67773. /**
  67774. * Converts from world Y coordinates (pixels) to tile Y coordinates (tile units), factoring in the
  67775. * layers position, scale and scroll.
  67776. *
  67777. * If no layer specified, the maps current layer is used.
  67778. *
  67779. * @method Phaser.Tilemaps.Tilemap#worldToTileY
  67780. * @since 3.0.0
  67781. *
  67782. * @param {number} worldY - [description]
  67783. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  67784. * nearest integer.
  67785. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  67786. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67787. *
  67788. * @return {?number} Returns a number, or null if the layer given was invalid.
  67789. */
  67790. worldToTileY: function (worldY, snapToFloor, camera, layer)
  67791. {
  67792. layer = this.getLayer(layer);
  67793. if (layer === null) { return null; }
  67794. return TilemapComponents.WorldToTileY(worldY, snapToFloor, camera, layer);
  67795. },
  67796. /**
  67797. * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the
  67798. * layers position, scale and scroll. This will return a new Vector2 object or update the given
  67799. * `point` object.
  67800. *
  67801. * If no layer specified, the maps current layer is used.
  67802. *
  67803. * @method Phaser.Tilemaps.Tilemap#worldToTileXY
  67804. * @since 3.0.0
  67805. *
  67806. * @param {number} worldX - [description]
  67807. * @param {number} worldY - [description]
  67808. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  67809. * nearest integer.
  67810. * @param {Phaser.Math.Vector2} [point] - [description]
  67811. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  67812. * @param {Phaser.Tilemaps.LayerData} [layer] - [description]
  67813. *
  67814. * @return {?Phaser.Math.Vector2} Returns a point, or null if the layer given was invalid.
  67815. */
  67816. worldToTileXY: function (worldX, worldY, snapToFloor, point, camera, layer)
  67817. {
  67818. layer = this.getLayer(layer);
  67819. if (layer === null) { return null; }
  67820. return TilemapComponents.WorldToTileXY(worldX, worldY, snapToFloor, point, camera, layer);
  67821. },
  67822. /**
  67823. * Used internally to check if a layer is static and prints out a warning.
  67824. *
  67825. * @method Phaser.Tilemaps.Tilemap#_isStaticCall
  67826. * @private
  67827. * @since 3.0.0
  67828. *
  67829. * @return {boolean}
  67830. */
  67831. _isStaticCall: function (layer, functionName)
  67832. {
  67833. if (layer.tilemapLayer instanceof StaticTilemapLayer)
  67834. {
  67835. console.warn(functionName + ': You cannot change the tiles in a static tilemap layer');
  67836. return true;
  67837. }
  67838. else
  67839. {
  67840. return false;
  67841. }
  67842. }
  67843. });
  67844. module.exports = Tilemap;
  67845. /***/ }),
  67846. /* 317 */
  67847. /***/ (function(module, exports, __webpack_require__) {
  67848. /**
  67849. * @author Richard Davey <rich@photonstorm.com>
  67850. * @copyright 2018 Photon Storm Ltd.
  67851. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  67852. */
  67853. var Formats = __webpack_require__(27);
  67854. var MapData = __webpack_require__(103);
  67855. var ParseTileLayers = __webpack_require__(634);
  67856. var ParseTilesets = __webpack_require__(633);
  67857. /**
  67858. * @namespace Phaser.Tilemaps.Parsers.Impact
  67859. */
  67860. /**
  67861. * Parses a Weltmeister JSON object into a new MapData object.
  67862. *
  67863. * @function Phaser.Tilemaps.Parsers.Impact.ParseWeltmeister
  67864. * @since 3.0.0
  67865. *
  67866. * @param {string} name - The name of the tilemap, used to set the name on the MapData.
  67867. * @param {object} json - The Weltmeister JSON object.
  67868. * @param {boolean} insertNull - Controls how empty tiles, tiles with an index of -1, in the map
  67869. * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  67870. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  67871. * the tile data doesn't need to change then setting this value to `true` will help with memory
  67872. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  67873. * the default value set.
  67874. *
  67875. * @return {?object} [description]
  67876. */
  67877. var ParseWeltmeister = function (name, json, insertNull)
  67878. {
  67879. if (json.layer.length === 0)
  67880. {
  67881. console.warn('No layers found in the Weltmeister map: ' + name);
  67882. return null;
  67883. }
  67884. var width = 0;
  67885. var height = 0;
  67886. for (var i = 0; i < json.layer.length; i++)
  67887. {
  67888. if (json.layer[i].width > width) { width = json.layer[i].width; }
  67889. if (json.layer[i].height > height) { height = json.layer[i].height; }
  67890. }
  67891. var mapData = new MapData({
  67892. width: width,
  67893. height: height,
  67894. name: name,
  67895. tileWidth: json.layer[0].tilesize,
  67896. tileHeight: json.layer[0].tilesize,
  67897. format: Formats.WELTMEISTER
  67898. });
  67899. mapData.layers = ParseTileLayers(json, insertNull);
  67900. mapData.tilesets = ParseTilesets(json);
  67901. return mapData;
  67902. };
  67903. module.exports = ParseWeltmeister;
  67904. /***/ }),
  67905. /* 318 */
  67906. /***/ (function(module, exports, __webpack_require__) {
  67907. /**
  67908. * @author Richard Davey <rich@photonstorm.com>
  67909. * @copyright 2018 Photon Storm Ltd.
  67910. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  67911. */
  67912. var Class = __webpack_require__(0);
  67913. var GetFastValue = __webpack_require__(1);
  67914. /**
  67915. * @classdesc
  67916. * A class for representing a Tiled object layer in a map. This mirrors the structure of a Tiled
  67917. * object layer, except:
  67918. * - "x" & "y" properties are ignored since these cannot be changed in Tiled.
  67919. * - "offsetx" & "offsety" are applied to the individual object coordinates directly, so they
  67920. * are ignored as well.
  67921. * - "draworder" is ignored.
  67922. *
  67923. * @class ObjectLayer
  67924. * @memberOf Phaser.Tilemaps
  67925. * @constructor
  67926. * @since 3.0.0
  67927. *
  67928. * @param {object} [config] - [description]
  67929. */
  67930. var ObjectLayer = new Class({
  67931. initialize:
  67932. function ObjectLayer (config)
  67933. {
  67934. if (config === undefined) { config = {}; }
  67935. /**
  67936. * [description]
  67937. *
  67938. * @name Phaser.Tilemaps.ObjectLayer#name
  67939. * @type {string}
  67940. * @since 3.0.0
  67941. */
  67942. this.name = GetFastValue(config, 'name', 'object layer');
  67943. /**
  67944. * [description]
  67945. *
  67946. * @name Phaser.Tilemaps.ObjectLayer#opacity
  67947. * @type {number}
  67948. * @since 3.0.0
  67949. */
  67950. this.opacity = GetFastValue(config, 'opacity', 1);
  67951. /**
  67952. * [description]
  67953. *
  67954. * @name Phaser.Tilemaps.ObjectLayer#properties
  67955. * @type {object}
  67956. * @since 3.0.0
  67957. */
  67958. this.properties = GetFastValue(config, 'properties', {});
  67959. /**
  67960. * [description]
  67961. *
  67962. * @name Phaser.Tilemaps.ObjectLayer#propertyTypes
  67963. * @type {object}
  67964. * @since 3.0.0
  67965. */
  67966. this.propertyTypes = GetFastValue(config, 'propertytypes', {});
  67967. /**
  67968. * [description]
  67969. *
  67970. * @name Phaser.Tilemaps.ObjectLayer#type
  67971. * @type {string}
  67972. * @since 3.0.0
  67973. */
  67974. this.type = GetFastValue(config, 'type', 'objectgroup');
  67975. /**
  67976. * [description]
  67977. *
  67978. * @name Phaser.Tilemaps.ObjectLayer#visible
  67979. * @type {boolean}
  67980. * @since 3.0.0
  67981. */
  67982. this.visible = GetFastValue(config, 'visible', true);
  67983. /**
  67984. * [description]
  67985. *
  67986. * @name Phaser.Tilemaps.ObjectLayer#objects
  67987. * @type {Phaser.GameObjects.GameObject[]}
  67988. * @since 3.0.0
  67989. */
  67990. this.objects = GetFastValue(config, 'objects', []);
  67991. }
  67992. });
  67993. module.exports = ObjectLayer;
  67994. /***/ }),
  67995. /* 319 */
  67996. /***/ (function(module, exports, __webpack_require__) {
  67997. /**
  67998. * @author Richard Davey <rich@photonstorm.com>
  67999. * @copyright 2018 Photon Storm Ltd.
  68000. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68001. */
  68002. var Pick = __webpack_require__(638);
  68003. var ParseGID = __webpack_require__(321);
  68004. var copyPoints = function (p) { return { x: p.x, y: p.y }; };
  68005. var commonObjectProps = [ 'id', 'name', 'type', 'rotation', 'properties', 'visible', 'x', 'y', 'width', 'height' ];
  68006. /**
  68007. * [description]
  68008. *
  68009. * @function Phaser.Tilemaps.Parsers.Tiled.ParseObject
  68010. * @since 3.0.0
  68011. *
  68012. * @param {object} tiledObject - [description]
  68013. * @param {number} [offsetX=0] - [description]
  68014. * @param {number} [offsetY=0] - [description]
  68015. *
  68016. * @return {object} [description]
  68017. */
  68018. var ParseObject = function (tiledObject, offsetX, offsetY)
  68019. {
  68020. if (offsetX === undefined) { offsetX = 0; }
  68021. if (offsetY === undefined) { offsetY = 0; }
  68022. var parsedObject = Pick(tiledObject, commonObjectProps);
  68023. parsedObject.x += offsetX;
  68024. parsedObject.y += offsetY;
  68025. if (tiledObject.gid)
  68026. {
  68027. // Object tiles
  68028. var gidInfo = ParseGID(tiledObject.gid);
  68029. parsedObject.gid = gidInfo.gid;
  68030. parsedObject.flippedHorizontal = gidInfo.flippedHorizontal;
  68031. parsedObject.flippedVertical = gidInfo.flippedVertical;
  68032. parsedObject.flippedAntiDiagonal = gidInfo.flippedAntiDiagonal;
  68033. }
  68034. else if (tiledObject.polyline)
  68035. {
  68036. parsedObject.polyline = tiledObject.polyline.map(copyPoints);
  68037. }
  68038. else if (tiledObject.polygon)
  68039. {
  68040. parsedObject.polygon = tiledObject.polygon.map(copyPoints);
  68041. }
  68042. else if (tiledObject.ellipse)
  68043. {
  68044. parsedObject.ellipse = tiledObject.ellipse;
  68045. parsedObject.width = tiledObject.width;
  68046. parsedObject.height = tiledObject.height;
  68047. }
  68048. else if (tiledObject.text)
  68049. {
  68050. parsedObject.width = tiledObject.width;
  68051. parsedObject.height = tiledObject.height;
  68052. parsedObject.text = tiledObject.text;
  68053. }
  68054. else
  68055. {
  68056. // Otherwise, assume it is a rectangle
  68057. parsedObject.rectangle = true;
  68058. parsedObject.width = tiledObject.width;
  68059. parsedObject.height = tiledObject.height;
  68060. }
  68061. return parsedObject;
  68062. };
  68063. module.exports = ParseObject;
  68064. /***/ }),
  68065. /* 320 */
  68066. /***/ (function(module, exports, __webpack_require__) {
  68067. /**
  68068. * @author Richard Davey <rich@photonstorm.com>
  68069. * @copyright 2018 Photon Storm Ltd.
  68070. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68071. */
  68072. var Class = __webpack_require__(0);
  68073. /**
  68074. * @classdesc
  68075. * An Image Collection is a special Tile Set containing multiple images, with no slicing into each image.
  68076. *
  68077. * Image Collections are normally created automatically when Tiled data is loaded.
  68078. *
  68079. * @class ImageCollection
  68080. * @memberOf Phaser.Tilemaps
  68081. * @constructor
  68082. * @since 3.0.0
  68083. *
  68084. * @param {string} name - The name of the image collection in the map data.
  68085. * @param {integer} firstgid - The first image index this image collection contains.
  68086. * @param {integer} [width=32] - Width of widest image (in pixels).
  68087. * @param {integer} [height=32] - Height of tallest image (in pixels).
  68088. * @param {integer} [margin=0] - The margin around all images in the collection (in pixels).
  68089. * @param {integer} [spacing=0] - The spacing between each image in the collection (in pixels).
  68090. * @param {object} [properties={}] - Custom Image Collection properties.
  68091. */
  68092. var ImageCollection = new Class({
  68093. initialize:
  68094. function ImageCollection (name, firstgid, width, height, margin, spacing, properties)
  68095. {
  68096. if (width === undefined || width <= 0) { width = 32; }
  68097. if (height === undefined || height <= 0) { height = 32; }
  68098. if (margin === undefined) { margin = 0; }
  68099. if (spacing === undefined) { spacing = 0; }
  68100. /**
  68101. * The name of the Image Collection.
  68102. *
  68103. * @name Phaser.Tilemaps.ImageCollection#name
  68104. * @type {string}
  68105. * @since 3.0.0
  68106. */
  68107. this.name = name;
  68108. /**
  68109. * The Tiled firstgid value.
  68110. * This is the starting index of the first image index this Image Collection contains.
  68111. *
  68112. * @name Phaser.Tilemaps.ImageCollection#firstgid
  68113. * @type {integer}
  68114. * @since 3.0.0
  68115. */
  68116. this.firstgid = firstgid | 0;
  68117. /**
  68118. * The width of the widest image (in pixels).
  68119. *
  68120. * @name Phaser.Tilemaps.ImageCollection#imageWidth
  68121. * @type {integer}
  68122. * @readOnly
  68123. * @since 3.0.0
  68124. */
  68125. this.imageWidth = width | 0;
  68126. /**
  68127. * The height of the tallest image (in pixels).
  68128. *
  68129. * @name Phaser.Tilemaps.ImageCollection#imageHeight
  68130. * @type {integer}
  68131. * @readOnly
  68132. * @since 3.0.0
  68133. */
  68134. this.imageHeight = height | 0;
  68135. /**
  68136. * The margin around the images in the collection (in pixels).
  68137. * Use `setSpacing` to change.
  68138. *
  68139. * @name Phaser.Tilemaps.ImageCollection#imageMarge
  68140. * @type {integer}
  68141. * @readOnly
  68142. * @since 3.0.0
  68143. */
  68144. this.imageMargin = margin | 0;
  68145. /**
  68146. * The spacing between each image in the collection (in pixels).
  68147. * Use `setSpacing` to change.
  68148. *
  68149. * @name Phaser.Tilemaps.ImageCollection#imageSpacing
  68150. * @type {integer}
  68151. * @readOnly
  68152. * @since 3.0.0
  68153. */
  68154. this.imageSpacing = spacing | 0;
  68155. /**
  68156. * Image Collection-specific properties that are typically defined in the Tiled editor.
  68157. *
  68158. * @name Phaser.Tilemaps.ImageCollection#properties
  68159. * @type {object}
  68160. * @since 3.0.0
  68161. */
  68162. this.properties = properties || {};
  68163. /**
  68164. * The cached images that are a part of this collection.
  68165. *
  68166. * @name Phaser.Tilemaps.ImageCollection#images
  68167. * @type {array}
  68168. * @readOnly
  68169. * @since 3.0.0
  68170. */
  68171. this.images = [];
  68172. /**
  68173. * The total number of images in the image collection.
  68174. *
  68175. * @name Phaser.Tilemaps.ImageCollection#total
  68176. * @type {integer}
  68177. * @readOnly
  68178. * @since 3.0.0
  68179. */
  68180. this.total = 0;
  68181. },
  68182. /**
  68183. * Returns true if and only if this image collection contains the given image index.
  68184. *
  68185. * @method Phaser.Tilemaps.ImageCollection#containsImageIndex
  68186. * @since 3.0.0
  68187. *
  68188. * @param {integer} imageIndex - The image index to search for.
  68189. *
  68190. * @return {boolean} True if this Image Collection contains the given index.
  68191. */
  68192. containsImageIndex: function (imageIndex)
  68193. {
  68194. return (imageIndex >= this.firstgid && imageIndex < (this.firstgid + this.total));
  68195. },
  68196. /**
  68197. * Add an image to this Image Collection.
  68198. *
  68199. * @method Phaser.Tilemaps.ImageCollection#addImage
  68200. * @since 3.0.0
  68201. *
  68202. * @param {integer} gid - The gid of the image in the Image Collection.
  68203. * @param {string} image - The the key of the image in the Image Collection and in the cache.
  68204. *
  68205. * @return {Phaser.Tilemaps.ImageCollection} This ImageCollection object.
  68206. */
  68207. addImage: function (gid, image)
  68208. {
  68209. this.images.push({ gid: gid, image: image });
  68210. this.total++;
  68211. return this;
  68212. }
  68213. });
  68214. module.exports = ImageCollection;
  68215. /***/ }),
  68216. /* 321 */
  68217. /***/ (function(module, exports) {
  68218. /**
  68219. * @author Richard Davey <rich@photonstorm.com>
  68220. * @copyright 2018 Photon Storm Ltd.
  68221. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68222. */
  68223. var FLIPPED_HORIZONTAL = 0x80000000;
  68224. var FLIPPED_VERTICAL = 0x40000000;
  68225. var FLIPPED_ANTI_DIAGONAL = 0x20000000; // Top-right is swapped with bottom-left corners
  68226. /**
  68227. * See Tiled documentation on tile flipping:
  68228. * http://docs.mapeditor.org/en/latest/reference/tmx-map-format/
  68229. *
  68230. * @function Phaser.Tilemaps.Parsers.Tiled.ParseGID
  68231. * @since 3.0.0
  68232. *
  68233. * @param {number} gid - [description]
  68234. *
  68235. * @return {object} [description]
  68236. */
  68237. var ParseGID = function (gid)
  68238. {
  68239. var flippedHorizontal = Boolean(gid & FLIPPED_HORIZONTAL);
  68240. var flippedVertical = Boolean(gid & FLIPPED_VERTICAL);
  68241. var flippedAntiDiagonal = Boolean(gid & FLIPPED_ANTI_DIAGONAL);
  68242. gid = gid & ~(FLIPPED_HORIZONTAL | FLIPPED_VERTICAL | FLIPPED_ANTI_DIAGONAL);
  68243. // Parse the flip flags into something Phaser can use
  68244. var rotation = 0;
  68245. var flipped = false;
  68246. if (flippedHorizontal && flippedVertical && flippedAntiDiagonal)
  68247. {
  68248. rotation = Math.PI / 2;
  68249. flipped = true;
  68250. }
  68251. else if (flippedHorizontal && flippedVertical && !flippedAntiDiagonal)
  68252. {
  68253. rotation = Math.PI;
  68254. flipped = false;
  68255. }
  68256. else if (flippedHorizontal && !flippedVertical && flippedAntiDiagonal)
  68257. {
  68258. rotation = Math.PI / 2;
  68259. flipped = false;
  68260. }
  68261. else if (flippedHorizontal && !flippedVertical && !flippedAntiDiagonal)
  68262. {
  68263. rotation = 0;
  68264. flipped = true;
  68265. }
  68266. else if (!flippedHorizontal && flippedVertical && flippedAntiDiagonal)
  68267. {
  68268. rotation = 3 * Math.PI / 2;
  68269. flipped = false;
  68270. }
  68271. else if (!flippedHorizontal && flippedVertical && !flippedAntiDiagonal)
  68272. {
  68273. rotation = Math.PI;
  68274. flipped = true;
  68275. }
  68276. else if (!flippedHorizontal && !flippedVertical && flippedAntiDiagonal)
  68277. {
  68278. rotation = 3 * Math.PI / 2;
  68279. flipped = true;
  68280. }
  68281. else if (!flippedHorizontal && !flippedVertical && !flippedAntiDiagonal)
  68282. {
  68283. rotation = 0;
  68284. flipped = false;
  68285. }
  68286. return {
  68287. gid: gid,
  68288. flippedHorizontal: flippedHorizontal,
  68289. flippedVertical: flippedVertical,
  68290. flippedAntiDiagonal: flippedAntiDiagonal,
  68291. rotation: rotation,
  68292. flipped: flipped
  68293. };
  68294. };
  68295. module.exports = ParseGID;
  68296. /***/ }),
  68297. /* 322 */
  68298. /***/ (function(module, exports, __webpack_require__) {
  68299. /**
  68300. * @author Richard Davey <rich@photonstorm.com>
  68301. * @copyright 2018 Photon Storm Ltd.
  68302. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68303. */
  68304. var Formats = __webpack_require__(27);
  68305. var MapData = __webpack_require__(103);
  68306. var ParseTileLayers = __webpack_require__(642);
  68307. var ParseImageLayers = __webpack_require__(640);
  68308. var ParseTilesets = __webpack_require__(639);
  68309. var ParseObjectLayers = __webpack_require__(637);
  68310. var BuildTilesetIndex = __webpack_require__(636);
  68311. var AssignTileProperties = __webpack_require__(635);
  68312. /**
  68313. * @namespace Phaser.Tilemaps.Parsers.Tiled
  68314. */
  68315. /**
  68316. * Parses a Tiled JSON object into a new MapData object.
  68317. *
  68318. * @function Phaser.Tilemaps.Parsers.Tiled.ParseJSONTiled
  68319. * @since 3.0.0
  68320. *
  68321. * @param {string} name - The name of the tilemap, used to set the name on the MapData.
  68322. * @param {object} json - The Tiled JSON object.
  68323. * @param {boolean} insertNull - Controls how empty tiles, tiles with an index of -1, in the map
  68324. * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  68325. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  68326. * the tile data doesn't need to change then setting this value to `true` will help with memory
  68327. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  68328. * the default value set.
  68329. *
  68330. * @return {?Phaser.Tilemaps.MapData} [description]
  68331. */
  68332. var ParseJSONTiled = function (name, json, insertNull)
  68333. {
  68334. if (json.orientation !== 'orthogonal')
  68335. {
  68336. console.warn('Only orthogonal map types are supported in this version of Phaser');
  68337. return null;
  68338. }
  68339. // Map data will consist of: layers, objects, images, tilesets, sizes
  68340. var mapData = new MapData({
  68341. width: json.width,
  68342. height: json.height,
  68343. name: name,
  68344. tileWidth: json.tilewidth,
  68345. tileHeight: json.tileheight,
  68346. orientation: json.orientation,
  68347. format: Formats.TILED_JSON,
  68348. version: json.version,
  68349. properties: json.properties
  68350. });
  68351. mapData.layers = ParseTileLayers(json, insertNull);
  68352. mapData.images = ParseImageLayers(json);
  68353. var sets = ParseTilesets(json);
  68354. mapData.tilesets = sets.tilesets;
  68355. mapData.imageCollections = sets.imageCollections;
  68356. mapData.objects = ParseObjectLayers(json);
  68357. mapData.tiles = BuildTilesetIndex(mapData);
  68358. AssignTileProperties(mapData);
  68359. return mapData;
  68360. };
  68361. module.exports = ParseJSONTiled;
  68362. /***/ }),
  68363. /* 323 */
  68364. /***/ (function(module, exports, __webpack_require__) {
  68365. /**
  68366. * @author Richard Davey <rich@photonstorm.com>
  68367. * @copyright 2018 Photon Storm Ltd.
  68368. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68369. */
  68370. var Formats = __webpack_require__(27);
  68371. var Parse2DArray = __webpack_require__(222);
  68372. /**
  68373. * Parses a CSV string of tile indexes into a new MapData object with a single layer.
  68374. *
  68375. * @function Phaser.Tilemaps.Parsers.ParseCSV
  68376. * @since 3.0.0
  68377. *
  68378. * @param {string} name - The name of the tilemap, used to set the name on the MapData.
  68379. * @param {string} data - CSV string of tile indexes.
  68380. * @param {integer} tileWidth - The width of a tile in pixels.
  68381. * @param {integer} tileHeight - The height of a tile in pixels.
  68382. * @param {boolean} insertNull - Controls how empty tiles, tiles with an index of -1, in the map
  68383. * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  68384. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  68385. * the tile data doesn't need to change then setting this value to `true` will help with memory
  68386. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  68387. * the default value set.
  68388. *
  68389. * @return {Phaser.Tilemaps.MapData} [description]
  68390. */
  68391. var ParseCSV = function (name, data, tileWidth, tileHeight, insertNull)
  68392. {
  68393. var array2D = data
  68394. .trim()
  68395. .split('\n')
  68396. .map(function (row) { return row.split(','); });
  68397. var map = Parse2DArray(name, array2D, tileWidth, tileHeight, insertNull);
  68398. map.format = Formats.CSV;
  68399. return map;
  68400. };
  68401. module.exports = ParseCSV;
  68402. /***/ }),
  68403. /* 324 */
  68404. /***/ (function(module, exports, __webpack_require__) {
  68405. /**
  68406. * @author Richard Davey <rich@photonstorm.com>
  68407. * @copyright 2018 Photon Storm Ltd.
  68408. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68409. */
  68410. var Formats = __webpack_require__(27);
  68411. var Parse2DArray = __webpack_require__(222);
  68412. var ParseCSV = __webpack_require__(323);
  68413. var ParseJSONTiled = __webpack_require__(322);
  68414. var ParseWeltmeister = __webpack_require__(317);
  68415. /**
  68416. * Parses raw data of a given Tilemap format into a new MapData object. If no recognized data format
  68417. * is found, returns `null`. When loading from CSV or a 2D array, you should specify the tileWidth &
  68418. * tileHeight. When parsing from a map from Tiled, the tileWidth & tileHeight will be pulled from
  68419. * the map data.
  68420. *
  68421. * @function Phaser.Tilemaps.Parsers.Parse
  68422. * @since 3.0.0
  68423. *
  68424. * @param {string} name - The name of the tilemap, used to set the name on the MapData.
  68425. * @param {integer} mapFormat - See ../Formats.js.
  68426. * @param {(integer[][]|string|object)} data - 2D array, CSV string or Tiled JSON object.
  68427. * @param {integer} tileWidth - The width of a tile in pixels. Required for 2D array and CSV, but
  68428. * ignored for Tiled JSON.
  68429. * @param {integer} tileHeight - The height of a tile in pixels. Required for 2D array and CSV, but
  68430. * ignored for Tiled JSON.
  68431. * @param {boolean} insertNull - Controls how empty tiles, tiles with an index of -1, in the map
  68432. * data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  68433. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  68434. * the tile data doesn't need to change then setting this value to `true` will help with memory
  68435. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  68436. * the default value set.
  68437. *
  68438. * @return {Phaser.Tilemaps.MapData} [description]
  68439. */
  68440. var Parse = function (name, mapFormat, data, tileWidth, tileHeight, insertNull)
  68441. {
  68442. var newMap;
  68443. switch (mapFormat)
  68444. {
  68445. case (Formats.ARRAY_2D):
  68446. newMap = Parse2DArray(name, data, tileWidth, tileHeight, insertNull);
  68447. break;
  68448. case (Formats.CSV):
  68449. newMap = ParseCSV(name, data, tileWidth, tileHeight, insertNull);
  68450. break;
  68451. case (Formats.TILED_JSON):
  68452. newMap = ParseJSONTiled(name, data, insertNull);
  68453. break;
  68454. case (Formats.WELTMEISTER):
  68455. newMap = ParseWeltmeister(name, data, insertNull);
  68456. break;
  68457. default:
  68458. console.warn('Unrecognized tilemap data format: ' + mapFormat);
  68459. newMap = null;
  68460. }
  68461. return newMap;
  68462. };
  68463. module.exports = Parse;
  68464. /***/ }),
  68465. /* 325 */
  68466. /***/ (function(module, exports, __webpack_require__) {
  68467. /**
  68468. * @author Richard Davey <rich@photonstorm.com>
  68469. * @copyright 2018 Photon Storm Ltd.
  68470. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68471. */
  68472. var Tile = __webpack_require__(65);
  68473. var IsInLayerBounds = __webpack_require__(105);
  68474. var CalculateFacesAt = __webpack_require__(225);
  68475. /**
  68476. * Removes the tile at the given tile coordinates in the specified layer and updates the layer's
  68477. * collision information.
  68478. *
  68479. * @function Phaser.Tilemaps.Components.RemoveTileAt
  68480. * @private
  68481. * @since 3.0.0
  68482. *
  68483. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  68484. * @param {integer} tileX - [description]
  68485. * @param {integer} tileY - [description]
  68486. * @param {boolean} [replaceWithNull=true] - If true, this will replace the tile at the specified
  68487. * location with null instead of a Tile with an index of -1.
  68488. * @param {boolean} [recalculateFaces=true] - [description]
  68489. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  68490. *
  68491. * @return {Phaser.Tilemaps.Tile} The Tile object that was removed.
  68492. */
  68493. var RemoveTileAt = function (tileX, tileY, replaceWithNull, recalculateFaces, layer)
  68494. {
  68495. if (replaceWithNull === undefined) { replaceWithNull = false; }
  68496. if (recalculateFaces === undefined) { recalculateFaces = true; }
  68497. if (!IsInLayerBounds(tileX, tileY, layer)) { return null; }
  68498. var tile = layer.data[tileY][tileX];
  68499. if (tile === null)
  68500. {
  68501. return null;
  68502. }
  68503. else
  68504. {
  68505. layer.data[tileY][tileX] = replaceWithNull
  68506. ? null
  68507. : new Tile(layer, -1, tileX, tileY, tile.width, tile.height);
  68508. }
  68509. // Recalculate faces only if the removed tile was a colliding tile
  68510. if (recalculateFaces && tile && tile.collides)
  68511. {
  68512. CalculateFacesAt(tileX, tileY, layer);
  68513. }
  68514. return tile;
  68515. };
  68516. module.exports = RemoveTileAt;
  68517. /***/ }),
  68518. /* 326 */
  68519. /***/ (function(module, exports, __webpack_require__) {
  68520. /**
  68521. * @author Richard Davey <rich@photonstorm.com>
  68522. * @copyright 2018 Photon Storm Ltd.
  68523. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68524. */
  68525. var IsInLayerBounds = __webpack_require__(105);
  68526. /**
  68527. * Checks if there is a tile at the given location (in tile coordinates) in the given layer. Returns
  68528. * false if there is no tile or if the tile at that location has an index of -1.
  68529. *
  68530. * @function Phaser.Tilemaps.Components.HasTileAt
  68531. * @private
  68532. * @since 3.0.0
  68533. *
  68534. * @param {integer} tileX - [description]
  68535. * @param {integer} tileY - [description]
  68536. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  68537. *
  68538. * @return {boolean}
  68539. */
  68540. var HasTileAt = function (tileX, tileY, layer)
  68541. {
  68542. if (IsInLayerBounds(tileX, tileY, layer))
  68543. {
  68544. var tile = layer.data[tileY][tileX];
  68545. return (tile !== null && tile.index > -1);
  68546. }
  68547. else
  68548. {
  68549. return false;
  68550. }
  68551. };
  68552. module.exports = HasTileAt;
  68553. /***/ }),
  68554. /* 327 */
  68555. /***/ (function(module, exports, __webpack_require__) {
  68556. /**
  68557. * @author Richard Davey <rich@photonstorm.com>
  68558. * @copyright 2018 Photon Storm Ltd.
  68559. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68560. */
  68561. var GetTilesWithin = __webpack_require__(23);
  68562. /**
  68563. * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching
  68564. * `findIndex` and updates their index to match `newIndex`. This only modifies the index and does
  68565. * not change collision information.
  68566. *
  68567. * @function Phaser.Tilemaps.Components.ReplaceByIndex
  68568. * @private
  68569. * @since 3.0.0
  68570. *
  68571. * @param {integer} findIndex - [description]
  68572. * @param {integer} newIndex - [description]
  68573. * @param {integer} [tileX=0] - [description]
  68574. * @param {integer} [tileY=0] - [description]
  68575. * @param {integer} [width=max width based on tileX] - [description]
  68576. * @param {integer} [height=max height based on tileY] - [description]
  68577. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  68578. */
  68579. var ReplaceByIndex = function (findIndex, newIndex, tileX, tileY, width, height, layer)
  68580. {
  68581. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  68582. for (var i = 0; i < tiles.length; i++)
  68583. {
  68584. if (tiles[i] && tiles[i].index === findIndex)
  68585. {
  68586. tiles[i].index = newIndex;
  68587. }
  68588. }
  68589. };
  68590. module.exports = ReplaceByIndex;
  68591. /***/ }),
  68592. /* 328 */
  68593. /***/ (function(module, exports) {
  68594. /**
  68595. * @author Richard Davey <rich@photonstorm.com>
  68596. * @copyright 2018 Photon Storm Ltd.
  68597. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68598. */
  68599. /**
  68600. * Filter Types.
  68601. *
  68602. * @name Phaser.Textures.FilterMode
  68603. * @enum {integer}
  68604. * @memberOf Phaser.Textures
  68605. * @readOnly
  68606. * @since 3.0.0
  68607. */
  68608. var CONST = {
  68609. /**
  68610. * Linear filter type.
  68611. *
  68612. * @name Phaser.Textures.FilterMode.LINEAR
  68613. */
  68614. LINEAR: 0,
  68615. /**
  68616. * Nearest neighbor filter type.
  68617. *
  68618. * @name Phaser.Textures.FilterMode.NEAREST
  68619. */
  68620. NEAREST: 1
  68621. };
  68622. module.exports = CONST;
  68623. /***/ }),
  68624. /* 329 */
  68625. /***/ (function(module, exports, __webpack_require__) {
  68626. /**
  68627. * @author Richard Davey <rich@photonstorm.com>
  68628. * @copyright 2018 Photon Storm Ltd.
  68629. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68630. */
  68631. var Extend = __webpack_require__(16);
  68632. var FilterMode = __webpack_require__(328);
  68633. /**
  68634. * @namespace Phaser.Textures
  68635. */
  68636. /**
  68637. * Linear filter type.
  68638. *
  68639. * @name Phaser.Textures.LINEAR
  68640. * @constant
  68641. */
  68642. /**
  68643. * Nearest Neighbor filter type.
  68644. *
  68645. * @name Phaser.Textures.NEAREST
  68646. * @constant
  68647. */
  68648. var Textures = {
  68649. FilterMode: FilterMode,
  68650. Frame: __webpack_require__(129),
  68651. Parsers: __webpack_require__(187),
  68652. Texture: __webpack_require__(117),
  68653. TextureManager: __webpack_require__(189),
  68654. TextureSource: __webpack_require__(188)
  68655. };
  68656. Textures = Extend(false, Textures, FilterMode);
  68657. module.exports = Textures;
  68658. /***/ }),
  68659. /* 330 */
  68660. /***/ (function(module, exports, __webpack_require__) {
  68661. /**
  68662. * @author Richard Davey <rich@photonstorm.com>
  68663. * @copyright 2018 Photon Storm Ltd.
  68664. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68665. */
  68666. /**
  68667. * @namespace Phaser.Structs
  68668. */
  68669. module.exports = {
  68670. List: __webpack_require__(93),
  68671. Map: __webpack_require__(125),
  68672. ProcessQueue: __webpack_require__(228),
  68673. RTree: __webpack_require__(227),
  68674. Set: __webpack_require__(69)
  68675. };
  68676. /***/ }),
  68677. /* 331 */
  68678. /***/ (function(module, exports, __webpack_require__) {
  68679. /**
  68680. * @author Richard Davey <rich@photonstorm.com>
  68681. * @author Pavle Goloskokovic <pgoloskokovic@gmail.com> (http://prunegames.com)
  68682. * @copyright 2018 Photon Storm Ltd.
  68683. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68684. */
  68685. /**
  68686. * @namespace Phaser.Sound
  68687. */
  68688. /**
  68689. * Config object containing various sound settings.
  68690. *
  68691. * @typedef {object} SoundConfig
  68692. *
  68693. * @property {boolean} [mute=false] - Boolean indicating whether the sound should be muted or not.
  68694. * @property {number} [volume=1] - A value between 0 (silence) and 1 (full volume).
  68695. * @property {number} [rate=1] - Defines the speed at which the sound should be played.
  68696. * @property {number} [detune=0] - Represents detuning of sound in [cents](https://en.wikipedia.org/wiki/Cent_%28music%29).
  68697. * @property {number} [seek=0] - Position of playback for this sound, in seconds.
  68698. * @property {boolean} [loop=false] - Whether or not the sound or current sound marker should loop.
  68699. * @property {number} [delay=0] - Time, in seconds, that should elapse before the sound actually starts its playback.
  68700. */
  68701. /**
  68702. * Marked section of a sound represented by name, and optionally start time, duration, and config object.
  68703. *
  68704. * @typedef {object} SoundMarker
  68705. *
  68706. * @property {string} name - Unique identifier of a sound marker.
  68707. * @property {number} [start=0] - Sound position offset at witch playback should start.
  68708. * @property {number} [duration] - Playback duration of this marker.
  68709. * @property {SoundConfig} [config] - An optional config object containing default marker settings.
  68710. */
  68711. module.exports = {
  68712. SoundManagerCreator: __webpack_require__(196),
  68713. BaseSound: __webpack_require__(77),
  68714. BaseSoundManager: __webpack_require__(78),
  68715. WebAudioSound: __webpack_require__(190),
  68716. WebAudioSoundManager: __webpack_require__(191),
  68717. HTML5AudioSound: __webpack_require__(194),
  68718. HTML5AudioSoundManager: __webpack_require__(195),
  68719. NoAudioSound: __webpack_require__(192),
  68720. NoAudioSoundManager: __webpack_require__(193)
  68721. };
  68722. /***/ }),
  68723. /* 332 */
  68724. /***/ (function(module, exports, __webpack_require__) {
  68725. /**
  68726. * @author Richard Davey <rich@photonstorm.com>
  68727. * @copyright 2018 Photon Storm Ltd.
  68728. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  68729. */
  68730. var Clamp = __webpack_require__(19);
  68731. var Class = __webpack_require__(0);
  68732. var GetFastValue = __webpack_require__(1);
  68733. var PluginCache = __webpack_require__(12);
  68734. /**
  68735. * @classdesc
  68736. * A proxy class to the Global Scene Manager.
  68737. *
  68738. * @class ScenePlugin
  68739. * @memberOf Phaser.Scenes
  68740. * @constructor
  68741. * @since 3.0.0
  68742. *
  68743. * @param {Phaser.Scene} scene - The Scene that this ScenePlugin belongs to.
  68744. */
  68745. var ScenePlugin = new Class({
  68746. initialize:
  68747. function ScenePlugin (scene)
  68748. {
  68749. /**
  68750. * The Scene that this ScenePlugin belongs to.
  68751. *
  68752. * @name Phaser.Scenes.ScenePlugin#scene
  68753. * @type {Phaser.Scene}
  68754. * @since 3.0.0
  68755. */
  68756. this.scene = scene;
  68757. /**
  68758. * The Scene Systems instance of the Scene that this ScenePlugin belongs to.
  68759. *
  68760. * @name Phaser.Scenes.ScenePlugin#systems
  68761. * @type {Phaser.Scenes.Systems}
  68762. * @since 3.0.0
  68763. */
  68764. this.systems = scene.sys;
  68765. /**
  68766. * The settings of the Scene this ScenePlugin belongs to.
  68767. *
  68768. * @name Phaser.Scenes.ScenePlugin#settings
  68769. * @type {Phaser.Scenes.Settings.Object}
  68770. * @since 3.0.0
  68771. */
  68772. this.settings = scene.sys.settings;
  68773. /**
  68774. * The key of the Scene this ScenePlugin belongs to.
  68775. *
  68776. * @name Phaser.Scenes.ScenePlugin#key
  68777. * @type {string}
  68778. * @since 3.0.0
  68779. */
  68780. this.key = scene.sys.settings.key;
  68781. /**
  68782. * The Game's SceneManager.
  68783. *
  68784. * @name Phaser.Scenes.ScenePlugin#manager
  68785. * @type {Phaser.Scenes.SceneManager}
  68786. * @since 3.0.0
  68787. */
  68788. this.manager = scene.sys.game.scene;
  68789. /**
  68790. * If this Scene is currently transitioning to another, this holds
  68791. * the current percentage of the transition progress, between 0 and 1.
  68792. *
  68793. * @name Phaser.Scenes.ScenePlugin#transitionProgress
  68794. * @type {number}
  68795. * @since 3.5.0
  68796. */
  68797. this.transitionProgress = 0;
  68798. /**
  68799. * Transition elapsed timer.
  68800. *
  68801. * @name Phaser.Scenes.ScenePlugin#_elapsed
  68802. * @type {integer}
  68803. * @private
  68804. * @since 3.5.0
  68805. */
  68806. this._elapsed = 0;
  68807. /**
  68808. * Transition elapsed timer.
  68809. *
  68810. * @name Phaser.Scenes.ScenePlugin#_target
  68811. * @type {?Phaser.Scenes.Scene}
  68812. * @private
  68813. * @since 3.5.0
  68814. */
  68815. this._target = null;
  68816. /**
  68817. * Transition duration.
  68818. *
  68819. * @name Phaser.Scenes.ScenePlugin#_duration
  68820. * @type {integer}
  68821. * @private
  68822. * @since 3.5.0
  68823. */
  68824. this._duration = 0;
  68825. /**
  68826. * Transition callback.
  68827. *
  68828. * @name Phaser.Scenes.ScenePlugin#_onUpdate
  68829. * @type {function}
  68830. * @private
  68831. * @since 3.5.0
  68832. */
  68833. this._onUpdate;
  68834. /**
  68835. * Transition callback scope.
  68836. *
  68837. * @name Phaser.Scenes.ScenePlugin#_onUpdateScope
  68838. * @type {object}
  68839. * @private
  68840. * @since 3.5.0
  68841. */
  68842. this._onUpdateScope;
  68843. /**
  68844. * Will this Scene sleep (true) after the transition, or stop (false)
  68845. *
  68846. * @name Phaser.Scenes.ScenePlugin#_willSleep
  68847. * @type {boolean}
  68848. * @private
  68849. * @since 3.5.0
  68850. */
  68851. this._willSleep = false;
  68852. /**
  68853. * Will this Scene be removed from the Scene Manager after the transition completes?
  68854. *
  68855. * @name Phaser.Scenes.ScenePlugin#_willRemove
  68856. * @type {boolean}
  68857. * @private
  68858. * @since 3.5.0
  68859. */
  68860. this._willRemove = false;
  68861. scene.sys.events.once('boot', this.boot, this);
  68862. scene.sys.events.on('start', this.pluginStart, this);
  68863. },
  68864. /**
  68865. * This method is called automatically, only once, when the Scene is first created.
  68866. * Do not invoke it directly.
  68867. *
  68868. * @method Phaser.Scenes.ScenePlugin#boot
  68869. * @private
  68870. * @since 3.0.0
  68871. */
  68872. boot: function ()
  68873. {
  68874. this.systems.events.once('destroy', this.destroy, this);
  68875. },
  68876. /**
  68877. * This method is called automatically by the Scene when it is starting up.
  68878. * It is responsible for creating local systems, properties and listening for Scene events.
  68879. * Do not invoke it directly.
  68880. *
  68881. * @method Phaser.Scenes.ScenePlugin#pluginStart
  68882. * @private
  68883. * @since 3.5.0
  68884. */
  68885. pluginStart: function ()
  68886. {
  68887. this._target = null;
  68888. this.systems.events.once('shutdown', this.shutdown, this);
  68889. },
  68890. /**
  68891. * Shutdown this Scene and run the given one.
  68892. *
  68893. * @method Phaser.Scenes.ScenePlugin#start
  68894. * @since 3.0.0
  68895. *
  68896. * @param {string} [key] - The Scene to start.
  68897. * @param {object} [data] - The Scene data.
  68898. *
  68899. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  68900. */
  68901. start: function (key, data)
  68902. {
  68903. if (key === undefined) { key = this.key; }
  68904. this.manager.queueOp('stop', this.key);
  68905. this.manager.queueOp('start', key, data);
  68906. return this;
  68907. },
  68908. /**
  68909. * Restarts this Scene.
  68910. *
  68911. * @method Phaser.Scenes.ScenePlugin#restart
  68912. * @since 3.4.0
  68913. *
  68914. * @param {object} [data] - The Scene data.
  68915. *
  68916. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  68917. */
  68918. restart: function (data)
  68919. {
  68920. var key = this.key;
  68921. this.manager.queueOp('stop', key);
  68922. this.manager.queueOp('start', key, data);
  68923. return this;
  68924. },
  68925. /**
  68926. * @typedef {object} Phaser.Scenes.ScenePlugin.SceneTransitionConfig
  68927. *
  68928. * @property {string} target - The Scene key to transition to.
  68929. * @property {integer} [duration=1000] - The duration, in ms, for the transition to last.
  68930. * @property {boolean} [sleep=false] - Will the Scene responsible for the transition be sent to sleep on completion (`true`), or stopped? (`false`)
  68931. * @property {boolean} [allowInput=false] - Will the Scenes Input system be able to process events while it is transitioning in or out?
  68932. * @property {boolean} [moveAbove] - Move the target Scene to be above this one before the transition starts.
  68933. * @property {boolean} [moveBelow] - Move the target Scene to be below this one before the transition starts.
  68934. * @property {function} [onUpdate] - This callback is invoked every frame for the duration of the transition.
  68935. * @property {any} [onUpdateScope] - The context in which the callback is invoked.
  68936. * @property {any} [data] - An object containing any data you wish to be passed to the target Scenes init / create methods.
  68937. */
  68938. /**
  68939. * This will start a transition from the current Scene to the target Scene given.
  68940. *
  68941. * The transition will last for the duration specified in milliseconds.
  68942. *
  68943. * You can have the target Scene moved above or below this one in the display list.
  68944. *
  68945. * You can specify an update callback. This callback will be invoked _every frame_ for the duration
  68946. * of the transition.
  68947. *
  68948. * This Scene can either be sent to sleep at the end of the transition, or stopped. The default is to stop.
  68949. *
  68950. * There are also 5 transition related events: This scene will emit the event `transitionto` when
  68951. * the transition begins, which is typically the frame after calling this method.
  68952. *
  68953. * The target Scene will emit the event `transitioninit` when that Scene's `init` method is called.
  68954. * It will then emit the event `transitionstart` when its `create` method is called.
  68955. * If the Scene was sleeping and has been woken up, it will emit the event `transitionwake` instead of these two,
  68956. * as the Scenes `init` and `create` methods are not invoked when a sleep wakes up.
  68957. *
  68958. * When the duration of the transition has elapsed it will emit the event `transitioncomplete`.
  68959. * These events are all cleared of listeners when the Scene shuts down, but not if it is sent to sleep.
  68960. *
  68961. * It's important to understand that the duration of the transition begins the moment you call this method.
  68962. * If the Scene you are transitioning to includes delayed processes, such as waiting for files to load, the
  68963. * time still counts down even while that is happening. If the game itself pauses, or something else causes
  68964. * this Scenes update loop to stop, then the transition will also pause for that duration. There are
  68965. * checks in place to prevent you accidentally stopping a transitioning Scene but if you've got code to
  68966. * override this understand that until the target Scene completes it might never be unlocked for input events.
  68967. *
  68968. * @method Phaser.Scenes.ScenePlugin#transition
  68969. * @since 3.5.0
  68970. *
  68971. * @param {Phaser.Scenes.ScenePlugin.SceneTransitionConfig} config - The transition configuration object.
  68972. *
  68973. * @return {boolean} `true` is the transition was started, otherwise `false`.
  68974. */
  68975. transition: function (config)
  68976. {
  68977. if (config === undefined) { config = {}; }
  68978. var key = GetFastValue(config, 'target', false);
  68979. var target = this.manager.getScene(key);
  68980. if (!key || !this.checkValidTransition(target))
  68981. {
  68982. return false;
  68983. }
  68984. var duration = GetFastValue(config, 'duration', 1000);
  68985. this._elapsed = 0;
  68986. this._target = target;
  68987. this._duration = duration;
  68988. this._willSleep = GetFastValue(config, 'sleep', false);
  68989. this._willRemove = GetFastValue(config, 'remove', false);
  68990. var callback = GetFastValue(config, 'onUpdate', null);
  68991. if (callback)
  68992. {
  68993. this._onUpdate = callback;
  68994. this._onUpdateScope = GetFastValue(config, 'onUpdateScope', this.scene);
  68995. }
  68996. var allowInput = GetFastValue(config, 'allowInput', false);
  68997. this.settings.transitionAllowInput = allowInput;
  68998. var targetSettings = target.sys.settings;
  68999. targetSettings.isTransition = true;
  69000. targetSettings.transitionFrom = this.scene;
  69001. targetSettings.transitionDuration = duration;
  69002. targetSettings.transitionAllowInput = allowInput;
  69003. if (GetFastValue(config, 'moveAbove', false))
  69004. {
  69005. this.manager.moveAbove(this.key, key);
  69006. }
  69007. else if (GetFastValue(config, 'moveBelow', false))
  69008. {
  69009. this.manager.moveBelow(this.key, key);
  69010. }
  69011. if (target.sys.isSleeping())
  69012. {
  69013. target.sys.wake();
  69014. }
  69015. else
  69016. {
  69017. this.manager.start(key, GetFastValue(config, 'data'));
  69018. }
  69019. this.systems.events.emit('transitionout', target, duration);
  69020. this.systems.events.on('update', this.step, this);
  69021. return true;
  69022. },
  69023. /**
  69024. * Checks to see if this Scene can transition to the target Scene or not.
  69025. *
  69026. * @method Phaser.Scenes.ScenePlugin#checkValidTransition
  69027. * @private
  69028. * @since 3.5.0
  69029. *
  69030. * @param {Phaser.Scene} target - The Scene to test against.
  69031. *
  69032. * @return {boolean} `true` if this Scene can transition, otherwise `false`.
  69033. */
  69034. checkValidTransition: function (target)
  69035. {
  69036. // Not a valid target if it doesn't exist, isn't active or is already transitioning in or out
  69037. if (!target || target.sys.isActive() || target.sys.isTransitioning() || target === this.scene || this.systems.isTransitioning())
  69038. {
  69039. return false;
  69040. }
  69041. return true;
  69042. },
  69043. /**
  69044. * A single game step. This is only called if the parent Scene is transitioning
  69045. * out to another Scene.
  69046. *
  69047. * @method Phaser.Scenes.ScenePlugin#step
  69048. * @private
  69049. * @since 3.5.0
  69050. *
  69051. * @param {number} time - [description]
  69052. * @param {number} delta - [description]
  69053. */
  69054. step: function (time, delta)
  69055. {
  69056. this._elapsed += delta;
  69057. this.transitionProgress = Clamp(this._elapsed / this._duration, 0, 1);
  69058. if (this._onUpdate)
  69059. {
  69060. this._onUpdate.call(this._onUpdateScope, this.transitionProgress);
  69061. }
  69062. if (this._elapsed >= this._duration)
  69063. {
  69064. this.transitionComplete();
  69065. }
  69066. },
  69067. /**
  69068. * Called by `step` when the transition out of this scene to another is over.
  69069. *
  69070. * @method Phaser.Scenes.ScenePlugin#transitionComplete
  69071. * @private
  69072. * @since 3.5.0
  69073. */
  69074. transitionComplete: function ()
  69075. {
  69076. var targetSys = this._target.sys;
  69077. var targetSettings = this._target.sys.settings;
  69078. // Stop the step
  69079. this.systems.events.off('update', this.step, this);
  69080. // Notify target scene
  69081. targetSys.events.emit('transitioncomplete', this.scene);
  69082. // Clear target scene settings
  69083. targetSettings.isTransition = false;
  69084. targetSettings.transitionFrom = null;
  69085. // Clear local settings
  69086. this._duration = 0;
  69087. this._target = null;
  69088. this._onUpdate = null;
  69089. this._onUpdateScope = null;
  69090. // Now everything is clear we can handle what happens to this Scene
  69091. if (this._willRemove)
  69092. {
  69093. this.manager.remove(this.key);
  69094. }
  69095. else if (this._willSleep)
  69096. {
  69097. this.systems.sleep();
  69098. }
  69099. else
  69100. {
  69101. this.manager.stop(this.key);
  69102. }
  69103. },
  69104. /**
  69105. * Add the Scene into the Scene Manager and start it if 'autoStart' is true or the Scene config 'active' property is set.
  69106. *
  69107. * @method Phaser.Scenes.ScenePlugin#add
  69108. * @since 3.0.0
  69109. *
  69110. * @param {string} key - The Scene key.
  69111. * @param {(Phaser.Scene|Phaser.Scenes.Settings.Config|function)} sceneConfig - The config for the Scene.
  69112. * @param {boolean} autoStart - Whether to start the Scene after it's added.
  69113. *
  69114. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69115. */
  69116. add: function (key, sceneConfig, autoStart)
  69117. {
  69118. this.manager.add(key, sceneConfig, autoStart);
  69119. return this;
  69120. },
  69121. /**
  69122. * Launch the given Scene and run it in parallel with this one.
  69123. *
  69124. * @method Phaser.Scenes.ScenePlugin#launch
  69125. * @since 3.0.0
  69126. *
  69127. * @param {string} key - The Scene to launch.
  69128. * @param {object} [data] - The Scene data.
  69129. *
  69130. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69131. */
  69132. launch: function (key, data)
  69133. {
  69134. if (key && key !== this.key)
  69135. {
  69136. this.manager.queueOp('start', key, data);
  69137. }
  69138. return this;
  69139. },
  69140. /**
  69141. * Runs the given Scene, but does not change the state of this Scene.
  69142. *
  69143. * If the given Scene is paused, it will resume it. If sleeping, it will wake it.
  69144. * If not running at all, it will be started.
  69145. *
  69146. * Use this if you wish to open a modal Scene by calling `pause` on the current
  69147. * Scene, then `run` on the modal Scene.
  69148. *
  69149. * @method Phaser.Scenes.ScenePlugin#run
  69150. * @since 3.10.0
  69151. *
  69152. * @param {string} key - The Scene to run.
  69153. * @param {object} [data] - A data object that will be passed to the Scene and emitted in its ready, wake, or resume events.
  69154. *
  69155. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69156. */
  69157. run: function (key, data)
  69158. {
  69159. if (key && key !== this.key)
  69160. {
  69161. this.manager.queueOp('run', key, data);
  69162. }
  69163. return this;
  69164. },
  69165. /**
  69166. * Pause the Scene - this stops the update step from happening but it still renders.
  69167. *
  69168. * @method Phaser.Scenes.ScenePlugin#pause
  69169. * @since 3.0.0
  69170. *
  69171. * @param {string} [key] - The Scene to pause.
  69172. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted in its pause event.
  69173. *
  69174. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69175. */
  69176. pause: function (key, data)
  69177. {
  69178. if (key === undefined) { key = this.key; }
  69179. this.manager.queueOp('pause', key, data);
  69180. return this;
  69181. },
  69182. /**
  69183. * Resume the Scene - starts the update loop again.
  69184. *
  69185. * @method Phaser.Scenes.ScenePlugin#resume
  69186. * @since 3.0.0
  69187. *
  69188. * @param {string} [key] - The Scene to resume.
  69189. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted in its resume event.
  69190. *
  69191. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69192. */
  69193. resume: function (key, data)
  69194. {
  69195. if (key === undefined) { key = this.key; }
  69196. this.manager.queueOp('resume', key, data);
  69197. return this;
  69198. },
  69199. /**
  69200. * Makes the Scene sleep (no update, no render) but doesn't shutdown.
  69201. *
  69202. * @method Phaser.Scenes.ScenePlugin#sleep
  69203. * @since 3.0.0
  69204. *
  69205. * @param {string} [key] - The Scene to put to sleep.
  69206. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted in its sleep event.
  69207. *
  69208. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69209. */
  69210. sleep: function (key, data)
  69211. {
  69212. if (key === undefined) { key = this.key; }
  69213. this.manager.queueOp('sleep', key, data);
  69214. return this;
  69215. },
  69216. /**
  69217. * Makes the Scene wake-up (starts update and render)
  69218. *
  69219. * @method Phaser.Scenes.ScenePlugin#wake
  69220. * @since 3.0.0
  69221. *
  69222. * @param {string} [key] - The Scene to wake up.
  69223. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted in its wake event.
  69224. *
  69225. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69226. */
  69227. wake: function (key, data)
  69228. {
  69229. if (key === undefined) { key = this.key; }
  69230. this.manager.queueOp('wake', key, data);
  69231. return this;
  69232. },
  69233. /**
  69234. * Makes this Scene sleep then starts the Scene given.
  69235. *
  69236. * @method Phaser.Scenes.ScenePlugin#switch
  69237. * @since 3.0.0
  69238. *
  69239. * @param {string} key - The Scene to start.
  69240. *
  69241. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69242. */
  69243. switch: function (key)
  69244. {
  69245. if (key !== this.key)
  69246. {
  69247. this.manager.queueOp('switch', this.key, key);
  69248. }
  69249. return this;
  69250. },
  69251. /**
  69252. * Shutdown the Scene, clearing display list, timers, etc.
  69253. *
  69254. * @method Phaser.Scenes.ScenePlugin#stop
  69255. * @since 3.0.0
  69256. *
  69257. * @param {string} key - The Scene to stop.
  69258. *
  69259. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69260. */
  69261. stop: function (key)
  69262. {
  69263. if (key === undefined) { key = this.key; }
  69264. this.manager.queueOp('stop', key);
  69265. return this;
  69266. },
  69267. /**
  69268. * Sets the active state of the given Scene.
  69269. *
  69270. * @method Phaser.Scenes.ScenePlugin#setActive
  69271. * @since 3.0.0
  69272. *
  69273. * @param {boolean} value - If `true` the Scene will be resumed. If `false` it will be paused.
  69274. * @param {string} [key] - The Scene to set the active state of.
  69275. * @param {object} [data] - An optional data object that will be passed to the Scene and emitted with its events.
  69276. *
  69277. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69278. */
  69279. setActive: function (value, key, data)
  69280. {
  69281. if (key === undefined) { key = this.key; }
  69282. var scene = this.manager.getScene(key);
  69283. if (scene)
  69284. {
  69285. scene.sys.setActive(value, data);
  69286. }
  69287. return this;
  69288. },
  69289. /**
  69290. * Sets the visible state of the given Scene.
  69291. *
  69292. * @method Phaser.Scenes.ScenePlugin#setVisible
  69293. * @since 3.0.0
  69294. *
  69295. * @param {boolean} value - The visible value.
  69296. * @param {string} [key] - The Scene to set the visible state for.
  69297. *
  69298. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69299. */
  69300. setVisible: function (value, key)
  69301. {
  69302. if (key === undefined) { key = this.key; }
  69303. var scene = this.manager.getScene(key);
  69304. if (scene)
  69305. {
  69306. scene.sys.setVisible(value);
  69307. }
  69308. return this;
  69309. },
  69310. /**
  69311. * Checks if the given Scene is sleeping or not?
  69312. *
  69313. * @method Phaser.Scenes.ScenePlugin#isSleeping
  69314. * @since 3.0.0
  69315. *
  69316. * @param {string} key - The Scene to check.
  69317. *
  69318. * @return {boolean} Whether the Scene is sleeping.
  69319. */
  69320. isSleeping: function (key)
  69321. {
  69322. if (key === undefined) { key = this.key; }
  69323. return this.manager.isSleeping(key);
  69324. },
  69325. /**
  69326. * Checks if the given Scene is active or not?
  69327. *
  69328. * @method Phaser.Scenes.ScenePlugin#isActive
  69329. * @since 3.0.0
  69330. *
  69331. * @param {string} key - The Scene to check.
  69332. *
  69333. * @return {boolean} Whether the Scene is active.
  69334. */
  69335. isActive: function (key)
  69336. {
  69337. if (key === undefined) { key = this.key; }
  69338. return this.manager.isActive(key);
  69339. },
  69340. /**
  69341. * Checks if the given Scene is visible or not?
  69342. *
  69343. * @method Phaser.Scenes.ScenePlugin#isVisible
  69344. * @since 3.0.0
  69345. *
  69346. * @param {string} key - The Scene to check.
  69347. *
  69348. * @return {boolean} Whether the Scene is visible.
  69349. */
  69350. isVisible: function (key)
  69351. {
  69352. if (key === undefined) { key = this.key; }
  69353. return this.manager.isVisible(key);
  69354. },
  69355. /**
  69356. * Swaps the position of two scenes in the Scenes list.
  69357. *
  69358. * This controls the order in which they are rendered and updated.
  69359. *
  69360. * @method Phaser.Scenes.ScenePlugin#swapPosition
  69361. * @since 3.2.0
  69362. *
  69363. * @param {string} keyA - The first Scene to swap.
  69364. * @param {string} [keyB] - The second Scene to swap. If none is given it defaults to this Scene.
  69365. *
  69366. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69367. */
  69368. swapPosition: function (keyA, keyB)
  69369. {
  69370. if (keyB === undefined) { keyB = this.key; }
  69371. if (keyA !== keyB)
  69372. {
  69373. this.manager.swapPosition(keyA, keyB);
  69374. }
  69375. return this;
  69376. },
  69377. /**
  69378. * Swaps the position of two scenes in the Scenes list, so that Scene B is directly above Scene A.
  69379. *
  69380. * This controls the order in which they are rendered and updated.
  69381. *
  69382. * @method Phaser.Scenes.ScenePlugin#moveAbove
  69383. * @since 3.2.0
  69384. *
  69385. * @param {string} keyA - The Scene that Scene B will be moved to be above.
  69386. * @param {string} [keyB] - The Scene to be moved. If none is given it defaults to this Scene.
  69387. *
  69388. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69389. */
  69390. moveAbove: function (keyA, keyB)
  69391. {
  69392. if (keyB === undefined) { keyB = this.key; }
  69393. if (keyA !== keyB)
  69394. {
  69395. this.manager.moveAbove(keyA, keyB);
  69396. }
  69397. return this;
  69398. },
  69399. /**
  69400. * Swaps the position of two scenes in the Scenes list, so that Scene B is directly below Scene A.
  69401. *
  69402. * This controls the order in which they are rendered and updated.
  69403. *
  69404. * @method Phaser.Scenes.ScenePlugin#moveBelow
  69405. * @since 3.2.0
  69406. *
  69407. * @param {string} keyA - The Scene that Scene B will be moved to be below.
  69408. * @param {string} [keyB] - The Scene to be moved. If none is given it defaults to this Scene.
  69409. *
  69410. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69411. */
  69412. moveBelow: function (keyA, keyB)
  69413. {
  69414. if (keyB === undefined) { keyB = this.key; }
  69415. if (keyA !== keyB)
  69416. {
  69417. this.manager.moveBelow(keyA, keyB);
  69418. }
  69419. return this;
  69420. },
  69421. /**
  69422. * Removes a Scene from the SceneManager.
  69423. *
  69424. * The Scene is removed from the local scenes array, it's key is cleared from the keys
  69425. * cache and Scene.Systems.destroy is then called on it.
  69426. *
  69427. * If the SceneManager is processing the Scenes when this method is called it wil
  69428. * queue the operation for the next update sequence.
  69429. *
  69430. * @method Phaser.Scenes.ScenePlugin#remove
  69431. * @since 3.2.0
  69432. *
  69433. * @param {(string|Phaser.Scene)} key - The Scene to be removed.
  69434. *
  69435. * @return {Phaser.Scenes.SceneManager} This SceneManager.
  69436. */
  69437. remove: function (key)
  69438. {
  69439. if (key === undefined) { key = this.key; }
  69440. this.manager.remove(key);
  69441. return this;
  69442. },
  69443. /**
  69444. * Moves a Scene up one position in the Scenes list.
  69445. *
  69446. * @method Phaser.Scenes.ScenePlugin#moveUp
  69447. * @since 3.0.0
  69448. *
  69449. * @param {string} key - The Scene to move.
  69450. *
  69451. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69452. */
  69453. moveUp: function (key)
  69454. {
  69455. if (key === undefined) { key = this.key; }
  69456. this.manager.moveUp(key);
  69457. return this;
  69458. },
  69459. /**
  69460. * Moves a Scene down one position in the Scenes list.
  69461. *
  69462. * @method Phaser.Scenes.ScenePlugin#moveDown
  69463. * @since 3.0.0
  69464. *
  69465. * @param {string} key - The Scene to move.
  69466. *
  69467. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69468. */
  69469. moveDown: function (key)
  69470. {
  69471. if (key === undefined) { key = this.key; }
  69472. this.manager.moveDown(key);
  69473. return this;
  69474. },
  69475. /**
  69476. * Brings a Scene to the top of the Scenes list.
  69477. *
  69478. * This means it will render above all other Scenes.
  69479. *
  69480. * @method Phaser.Scenes.ScenePlugin#bringToTop
  69481. * @since 3.0.0
  69482. *
  69483. * @param {string} key - The Scene to move.
  69484. *
  69485. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69486. */
  69487. bringToTop: function (key)
  69488. {
  69489. if (key === undefined) { key = this.key; }
  69490. this.manager.bringToTop(key);
  69491. return this;
  69492. },
  69493. /**
  69494. * Sends a Scene to the back of the Scenes list.
  69495. *
  69496. * This means it will render below all other Scenes.
  69497. *
  69498. * @method Phaser.Scenes.ScenePlugin#sendToBack
  69499. * @since 3.0.0
  69500. *
  69501. * @param {string} key - The Scene to move.
  69502. *
  69503. * @return {Phaser.Scenes.ScenePlugin} This ScenePlugin object.
  69504. */
  69505. sendToBack: function (key)
  69506. {
  69507. if (key === undefined) { key = this.key; }
  69508. this.manager.sendToBack(key);
  69509. return this;
  69510. },
  69511. /**
  69512. * Retrieve a Scene.
  69513. *
  69514. * @method Phaser.Scenes.ScenePlugin#get
  69515. * @since 3.0.0
  69516. *
  69517. * @param {string} key - The Scene to retrieve.
  69518. *
  69519. * @return {Phaser.Scene} The Scene.
  69520. */
  69521. get: function (key)
  69522. {
  69523. return this.manager.getScene(key);
  69524. },
  69525. /**
  69526. * Retrieves the numeric index of a Scene in the Scenes list.
  69527. *
  69528. * @method Phaser.Scenes.ScenePlugin#getIndex
  69529. * @since 3.7.0
  69530. *
  69531. * @param {(string|Phaser.Scene)} [key] - The Scene to get the index of.
  69532. *
  69533. * @return {integer} The index of the Scene.
  69534. */
  69535. getIndex: function (key)
  69536. {
  69537. if (key === undefined) { key = this.key; }
  69538. return this.manager.getIndex(key);
  69539. },
  69540. /**
  69541. * The Scene that owns this plugin is shutting down.
  69542. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  69543. *
  69544. * @method Phaser.Scenes.ScenePlugin#shutdown
  69545. * @private
  69546. * @since 3.0.0
  69547. */
  69548. shutdown: function ()
  69549. {
  69550. var eventEmitter = this.systems.events;
  69551. eventEmitter.off('shutdown', this.shutdown, this);
  69552. eventEmitter.off('postupdate', this.step, this);
  69553. eventEmitter.off('transitionout');
  69554. },
  69555. /**
  69556. * The Scene that owns this plugin is being destroyed.
  69557. * We need to shutdown and then kill off all external references.
  69558. *
  69559. * @method Phaser.Scenes.ScenePlugin#destroy
  69560. * @private
  69561. * @since 3.0.0
  69562. */
  69563. destroy: function ()
  69564. {
  69565. this.shutdown();
  69566. this.scene.sys.events.off('start', this.start, this);
  69567. this.scene = null;
  69568. this.systems = null;
  69569. this.settings = null;
  69570. this.manager = null;
  69571. }
  69572. });
  69573. PluginCache.register('ScenePlugin', ScenePlugin, 'scenePlugin');
  69574. module.exports = ScenePlugin;
  69575. /***/ }),
  69576. /* 333 */
  69577. /***/ (function(module, exports, __webpack_require__) {
  69578. /**
  69579. * @author Richard Davey <rich@photonstorm.com>
  69580. * @copyright 2018 Photon Storm Ltd.
  69581. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  69582. */
  69583. var CONST = __webpack_require__(79);
  69584. var Extend = __webpack_require__(16);
  69585. /**
  69586. * @namespace Phaser.Scenes
  69587. */
  69588. var Scene = {
  69589. SceneManager: __webpack_require__(199),
  69590. ScenePlugin: __webpack_require__(332),
  69591. Settings: __webpack_require__(197),
  69592. Systems: __webpack_require__(118)
  69593. };
  69594. // Merge in the consts
  69595. Scene = Extend(false, Scene, CONST);
  69596. module.exports = Scene;
  69597. /***/ }),
  69598. /* 334 */
  69599. /***/ (function(module, exports, __webpack_require__) {
  69600. /**
  69601. * @author Richard Davey <rich@photonstorm.com>
  69602. * @copyright 2018 Photon Storm Ltd.
  69603. * @license {@link https://github.com/photonstorm/phaser3-plugin-template/blob/master/LICENSE|MIT License}
  69604. */
  69605. var BasePlugin = __webpack_require__(170);
  69606. var Class = __webpack_require__(0);
  69607. /**
  69608. * @classdesc
  69609. * A Scene Level Plugin is installed into every Scene and belongs to that Scene.
  69610. * It can listen for Scene events and respond to them.
  69611. * It can map itself to a Scene property, or into the Scene Systems, or both.
  69612. *
  69613. * @class ScenePlugin
  69614. * @memberOf Phaser.Plugins
  69615. * @extends Phaser.Plugins.BasePlugin
  69616. * @constructor
  69617. * @since 3.8.0
  69618. *
  69619. * @param {Phaser.Scene} scene - A reference to the Scene that has installed this plugin.
  69620. * @param {Phaser.Plugins.PluginManager} pluginManager - A reference to the Plugin Manager.
  69621. */
  69622. var ScenePlugin = new Class({
  69623. Extends: BasePlugin,
  69624. initialize:
  69625. function ScenePlugin (scene, pluginManager)
  69626. {
  69627. BasePlugin.call(this, pluginManager);
  69628. /**
  69629. * A reference to the Scene that has installed this plugin.
  69630. * This property is only set when the plugin is instantiated and added to the Scene, not before.
  69631. *
  69632. * @name Phaser.Plugins.ScenePlugin#scene
  69633. * @type {?Phaser.Scene}
  69634. * @protected
  69635. * @since 3.8.0
  69636. */
  69637. this.scene = scene;
  69638. /**
  69639. * A reference to the Scene Systems of the Scene that has installed this plugin.
  69640. * This property is only set when the plugin is instantiated and added to the Scene, not before.
  69641. *
  69642. * @name Phaser.Plugins.ScenePlugin#systems
  69643. * @type {?Phaser.Scenes.Systems}
  69644. * @protected
  69645. * @since 3.8.0
  69646. */
  69647. this.systems = scene.sys;
  69648. scene.sys.events.once('boot', this.boot, this);
  69649. },
  69650. /**
  69651. * This method is called when the Scene boots. It is only ever called once.
  69652. *
  69653. * By this point the plugin properties `scene` and `systems` will have already been set.
  69654. *
  69655. * In here you can listen for Scene events and set-up whatever you need for this plugin to run.
  69656. * Here are the Scene events you can listen to:
  69657. *
  69658. * start
  69659. * ready
  69660. * preupdate
  69661. * update
  69662. * postupdate
  69663. * resize
  69664. * pause
  69665. * resume
  69666. * sleep
  69667. * wake
  69668. * transitioninit
  69669. * transitionstart
  69670. * transitioncomplete
  69671. * transitionout
  69672. * shutdown
  69673. * destroy
  69674. *
  69675. * At the very least you should offer a destroy handler for when the Scene closes down, i.e:
  69676. *
  69677. * ```javascript
  69678. * var eventEmitter = this.systems.events;
  69679. * eventEmitter.once('destroy', this.sceneDestroy, this);
  69680. * ```
  69681. *
  69682. * @method Phaser.Plugins.ScenePlugin#boot
  69683. * @since 3.8.0
  69684. */
  69685. boot: function ()
  69686. {
  69687. }
  69688. });
  69689. module.exports = ScenePlugin;
  69690. /***/ }),
  69691. /* 335 */
  69692. /***/ (function(module, exports, __webpack_require__) {
  69693. /**
  69694. * @author Richard Davey <rich@photonstorm.com>
  69695. * @copyright 2018 Photon Storm Ltd.
  69696. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  69697. */
  69698. /**
  69699. * @namespace Phaser.Plugins
  69700. */
  69701. module.exports = {
  69702. BasePlugin: __webpack_require__(170),
  69703. DefaultPlugins: __webpack_require__(121),
  69704. PluginCache: __webpack_require__(12),
  69705. PluginManager: __webpack_require__(201),
  69706. ScenePlugin: __webpack_require__(334)
  69707. };
  69708. /***/ }),
  69709. /* 336 */
  69710. /***/ (function(module, exports, __webpack_require__) {
  69711. /**
  69712. * The `Matter.Sleeping` module contains methods to manage the sleeping state of bodies.
  69713. *
  69714. * @class Sleeping
  69715. */
  69716. var Sleeping = {};
  69717. module.exports = Sleeping;
  69718. var Events = __webpack_require__(306);
  69719. (function() {
  69720. Sleeping._motionWakeThreshold = 0.18;
  69721. Sleeping._motionSleepThreshold = 0.08;
  69722. Sleeping._minBias = 0.9;
  69723. /**
  69724. * Puts bodies to sleep or wakes them up depending on their motion.
  69725. * @method update
  69726. * @param {body[]} bodies
  69727. * @param {number} timeScale
  69728. */
  69729. Sleeping.update = function(bodies, timeScale) {
  69730. var timeFactor = timeScale * timeScale * timeScale;
  69731. // update bodies sleeping status
  69732. for (var i = 0; i < bodies.length; i++) {
  69733. var body = bodies[i],
  69734. motion = body.speed * body.speed + body.angularSpeed * body.angularSpeed;
  69735. // wake up bodies if they have a force applied
  69736. if (body.force.x !== 0 || body.force.y !== 0) {
  69737. Sleeping.set(body, false);
  69738. continue;
  69739. }
  69740. var minMotion = Math.min(body.motion, motion),
  69741. maxMotion = Math.max(body.motion, motion);
  69742. // biased average motion estimation between frames
  69743. body.motion = Sleeping._minBias * minMotion + (1 - Sleeping._minBias) * maxMotion;
  69744. if (body.sleepThreshold > 0 && body.motion < Sleeping._motionSleepThreshold * timeFactor) {
  69745. body.sleepCounter += 1;
  69746. if (body.sleepCounter >= body.sleepThreshold)
  69747. Sleeping.set(body, true);
  69748. } else if (body.sleepCounter > 0) {
  69749. body.sleepCounter -= 1;
  69750. }
  69751. }
  69752. };
  69753. /**
  69754. * Given a set of colliding pairs, wakes the sleeping bodies involved.
  69755. * @method afterCollisions
  69756. * @param {pair[]} pairs
  69757. * @param {number} timeScale
  69758. */
  69759. Sleeping.afterCollisions = function(pairs, timeScale) {
  69760. var timeFactor = timeScale * timeScale * timeScale;
  69761. // wake up bodies involved in collisions
  69762. for (var i = 0; i < pairs.length; i++) {
  69763. var pair = pairs[i];
  69764. // don't wake inactive pairs
  69765. if (!pair.isActive)
  69766. continue;
  69767. var collision = pair.collision,
  69768. bodyA = collision.bodyA.parent,
  69769. bodyB = collision.bodyB.parent;
  69770. // don't wake if at least one body is static
  69771. if ((bodyA.isSleeping && bodyB.isSleeping) || bodyA.isStatic || bodyB.isStatic)
  69772. continue;
  69773. if (bodyA.isSleeping || bodyB.isSleeping) {
  69774. var sleepingBody = (bodyA.isSleeping && !bodyA.isStatic) ? bodyA : bodyB,
  69775. movingBody = sleepingBody === bodyA ? bodyB : bodyA;
  69776. if (!sleepingBody.isStatic && movingBody.motion > Sleeping._motionWakeThreshold * timeFactor) {
  69777. Sleeping.set(sleepingBody, false);
  69778. }
  69779. }
  69780. }
  69781. };
  69782. /**
  69783. * Set a body as sleeping or awake.
  69784. * @method set
  69785. * @param {body} body
  69786. * @param {boolean} isSleeping
  69787. */
  69788. Sleeping.set = function(body, isSleeping) {
  69789. var wasSleeping = body.isSleeping;
  69790. if (isSleeping) {
  69791. body.isSleeping = true;
  69792. body.sleepCounter = body.sleepThreshold;
  69793. body.positionImpulse.x = 0;
  69794. body.positionImpulse.y = 0;
  69795. body.positionPrev.x = body.position.x;
  69796. body.positionPrev.y = body.position.y;
  69797. body.anglePrev = body.angle;
  69798. body.speed = 0;
  69799. body.angularSpeed = 0;
  69800. body.motion = 0;
  69801. if (!wasSleeping) {
  69802. Events.trigger(body, 'sleepStart');
  69803. }
  69804. } else {
  69805. body.isSleeping = false;
  69806. body.sleepCounter = 0;
  69807. if (wasSleeping) {
  69808. Events.trigger(body, 'sleepEnd');
  69809. }
  69810. }
  69811. };
  69812. })();
  69813. /***/ }),
  69814. /* 337 */
  69815. /***/ (function(module, exports) {
  69816. /**
  69817. * @author Richard Davey <rich@photonstorm.com>
  69818. * @copyright 2018 Photon Storm Ltd.
  69819. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  69820. */
  69821. /**
  69822. * Collision Types - Determine if and how entities collide with each other.
  69823. *
  69824. * In ACTIVE vs. LITE or FIXED vs. ANY collisions, only the "weak" entity moves,
  69825. * while the other one stays fixed. In ACTIVE vs. ACTIVE and ACTIVE vs. PASSIVE
  69826. * collisions, both entities are moved. LITE or PASSIVE entities don't collide
  69827. * with other LITE or PASSIVE entities at all. The behavior for FIXED vs.
  69828. * FIXED collisions is undefined.
  69829. *
  69830. * @name Phaser.Physics.Impact.TYPE
  69831. * @enum {integer}
  69832. * @memberOf Phaser.Physics.Impact
  69833. * @readOnly
  69834. * @since 3.0.0
  69835. */
  69836. module.exports = {
  69837. /**
  69838. * Collides with nothing.
  69839. *
  69840. * @name Phaser.Physics.Impact.TYPE.NONE
  69841. */
  69842. NONE: 0,
  69843. /**
  69844. * Type A. Collides with Type B.
  69845. *
  69846. * @name Phaser.Physics.Impact.TYPE.A
  69847. */
  69848. A: 1,
  69849. /**
  69850. * Type B. Collides with Type A.
  69851. *
  69852. * @name Phaser.Physics.Impact.TYPE.B
  69853. */
  69854. B: 2,
  69855. /**
  69856. * Collides with both types A and B.
  69857. *
  69858. * @name Phaser.Physics.Impact.TYPE.BOTH
  69859. */
  69860. BOTH: 3
  69861. };
  69862. /***/ }),
  69863. /* 338 */
  69864. /***/ (function(module, exports) {
  69865. /**
  69866. * @author Richard Davey <rich@photonstorm.com>
  69867. * @copyright 2018 Photon Storm Ltd.
  69868. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  69869. */
  69870. /**
  69871. * Collision Types - Determine if and how entities collide with each other.
  69872. *
  69873. * In ACTIVE vs. LITE or FIXED vs. ANY collisions, only the "weak" entity moves,
  69874. * while the other one stays fixed. In ACTIVE vs. ACTIVE and ACTIVE vs. PASSIVE
  69875. * collisions, both entities are moved. LITE or PASSIVE entities don't collide
  69876. * with other LITE or PASSIVE entities at all. The behavior for FIXED vs.
  69877. * FIXED collisions is undefined.
  69878. *
  69879. * @name Phaser.Physics.Impact.COLLIDES
  69880. * @enum {integer}
  69881. * @memberOf Phaser.Physics.Impact
  69882. * @readOnly
  69883. * @since 3.0.0
  69884. */
  69885. module.exports = {
  69886. /**
  69887. * Never collides.
  69888. *
  69889. * @name Phaser.Physics.Impact.COLLIDES.NEVER
  69890. */
  69891. NEVER: 0,
  69892. /**
  69893. * Lite collision.
  69894. *
  69895. * @name Phaser.Physics.Impact.COLLIDES.LITE
  69896. */
  69897. LITE: 1,
  69898. /**
  69899. * Passive collision.
  69900. *
  69901. * @name Phaser.Physics.Impact.COLLIDES.PASSIVE
  69902. */
  69903. PASSIVE: 2,
  69904. /**
  69905. * Active collision.
  69906. *
  69907. * @name Phaser.Physics.Impact.COLLIDES.ACTIVE
  69908. */
  69909. ACTIVE: 4,
  69910. /**
  69911. * Fixed collision.
  69912. *
  69913. * @name Phaser.Physics.Impact.COLLIDES.FIXED
  69914. */
  69915. FIXED: 8
  69916. };
  69917. /***/ }),
  69918. /* 339 */
  69919. /***/ (function(module, exports, __webpack_require__) {
  69920. /**
  69921. * @author Richard Davey <rich@photonstorm.com>
  69922. * @copyright 2018 Photon Storm Ltd.
  69923. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  69924. */
  69925. var CircleContains = __webpack_require__(33);
  69926. var Class = __webpack_require__(0);
  69927. var CONST = __webpack_require__(43);
  69928. var RectangleContains = __webpack_require__(31);
  69929. var Vector2 = __webpack_require__(6);
  69930. /**
  69931. * @classdesc
  69932. * [description]
  69933. *
  69934. * @class StaticBody
  69935. * @memberOf Phaser.Physics.Arcade
  69936. * @constructor
  69937. * @since 3.0.0
  69938. *
  69939. * @param {Phaser.Physics.Arcade.World} world - [description]
  69940. * @param {Phaser.GameObjects.GameObject} gameObject - [description]
  69941. */
  69942. var StaticBody = new Class({
  69943. initialize:
  69944. function StaticBody (world, gameObject)
  69945. {
  69946. var width = (gameObject.width) ? gameObject.width : 64;
  69947. var height = (gameObject.height) ? gameObject.height : 64;
  69948. /**
  69949. * [description]
  69950. *
  69951. * @name Phaser.Physics.Arcade.StaticBody#world
  69952. * @type {Phaser.Physics.Arcade.World}
  69953. * @since 3.0.0
  69954. */
  69955. this.world = world;
  69956. /**
  69957. * [description]
  69958. *
  69959. * @name Phaser.Physics.Arcade.StaticBody#gameObject
  69960. * @type {Phaser.GameObjects.GameObject}
  69961. * @since 3.0.0
  69962. */
  69963. this.gameObject = gameObject;
  69964. /**
  69965. * [description]
  69966. *
  69967. * @name Phaser.Physics.Arcade.StaticBody#debugShowBody
  69968. * @type {boolean}
  69969. * @since 3.0.0
  69970. */
  69971. this.debugShowBody = world.defaults.debugShowStaticBody;
  69972. /**
  69973. * [description]
  69974. *
  69975. * @name Phaser.Physics.Arcade.StaticBody#debugBodyColor
  69976. * @type {integer}
  69977. * @since 3.0.0
  69978. */
  69979. this.debugBodyColor = world.defaults.staticBodyDebugColor;
  69980. /**
  69981. * [description]
  69982. *
  69983. * @name Phaser.Physics.Arcade.StaticBody#enable
  69984. * @type {boolean}
  69985. * @default true
  69986. * @since 3.0.0
  69987. */
  69988. this.enable = true;
  69989. /**
  69990. * [description]
  69991. *
  69992. * @name Phaser.Physics.Arcade.StaticBody#isCircle
  69993. * @type {boolean}
  69994. * @default false
  69995. * @since 3.0.0
  69996. */
  69997. this.isCircle = false;
  69998. /**
  69999. * [description]
  70000. *
  70001. * @name Phaser.Physics.Arcade.StaticBody#radius
  70002. * @type {number}
  70003. * @default 0
  70004. * @since 3.0.0
  70005. */
  70006. this.radius = 0;
  70007. /**
  70008. * [description]
  70009. *
  70010. * @name Phaser.Physics.Arcade.StaticBody#offset
  70011. * @type {Phaser.Math.Vector2}
  70012. * @since 3.0.0
  70013. */
  70014. this.offset = new Vector2();
  70015. /**
  70016. * [description]
  70017. *
  70018. * @name Phaser.Physics.Arcade.StaticBody#position
  70019. * @type {Phaser.Math.Vector2}
  70020. * @since 3.0.0
  70021. */
  70022. this.position = new Vector2(gameObject.x - gameObject.displayOriginX, gameObject.y - gameObject.displayOriginY);
  70023. /**
  70024. * [description]
  70025. *
  70026. * @name Phaser.Physics.Arcade.StaticBody#width
  70027. * @type {number}
  70028. * @since 3.0.0
  70029. */
  70030. this.width = width;
  70031. /**
  70032. * [description]
  70033. *
  70034. * @name Phaser.Physics.Arcade.StaticBody#height
  70035. * @type {number}
  70036. * @since 3.0.0
  70037. */
  70038. this.height = height;
  70039. /**
  70040. * [description]
  70041. *
  70042. * @name Phaser.Physics.Arcade.StaticBody#halfWidth
  70043. * @type {number}
  70044. * @since 3.0.0
  70045. */
  70046. this.halfWidth = Math.abs(this.width / 2);
  70047. /**
  70048. * [description]
  70049. *
  70050. * @name Phaser.Physics.Arcade.StaticBody#halfHeight
  70051. * @type {number}
  70052. * @since 3.0.0
  70053. */
  70054. this.halfHeight = Math.abs(this.height / 2);
  70055. /**
  70056. * [description]
  70057. *
  70058. * @name Phaser.Physics.Arcade.StaticBody#center
  70059. * @type {Phaser.Math.Vector2}
  70060. * @since 3.0.0
  70061. */
  70062. this.center = new Vector2(gameObject.x + this.halfWidth, gameObject.y + this.halfHeight);
  70063. /**
  70064. * [description]
  70065. *
  70066. * @name Phaser.Physics.Arcade.StaticBody#velocity
  70067. * @type {Phaser.Math.Vector2}
  70068. * @since 3.0.0
  70069. */
  70070. this.velocity = Vector2.ZERO;
  70071. /**
  70072. * [description]
  70073. *
  70074. * @name Phaser.Physics.Arcade.StaticBody#allowGravity
  70075. * @type {boolean}
  70076. * @default false
  70077. * @since 3.0.0
  70078. */
  70079. this.allowGravity = false;
  70080. /**
  70081. * [description]
  70082. *
  70083. * @name Phaser.Physics.Arcade.StaticBody#gravity
  70084. * @type {Phaser.Math.Vector2}
  70085. * @since 3.0.0
  70086. */
  70087. this.gravity = Vector2.ZERO;
  70088. /**
  70089. * [description]
  70090. *
  70091. * @name Phaser.Physics.Arcade.StaticBody#bounce
  70092. * @type {Phaser.Math.Vector2}
  70093. * @since 3.0.0
  70094. */
  70095. this.bounce = Vector2.ZERO;
  70096. // If true this Body will dispatch events
  70097. /**
  70098. * [description]
  70099. *
  70100. * @name Phaser.Physics.Arcade.StaticBody#onWorldBounds
  70101. * @type {boolean}
  70102. * @default false
  70103. * @since 3.0.0
  70104. */
  70105. this.onWorldBounds = false;
  70106. /**
  70107. * [description]
  70108. *
  70109. * @name Phaser.Physics.Arcade.StaticBody#onCollide
  70110. * @type {boolean}
  70111. * @default false
  70112. * @since 3.0.0
  70113. */
  70114. this.onCollide = false;
  70115. /**
  70116. * [description]
  70117. *
  70118. * @name Phaser.Physics.Arcade.StaticBody#onOverlap
  70119. * @type {boolean}
  70120. * @default false
  70121. * @since 3.0.0
  70122. */
  70123. this.onOverlap = false;
  70124. /**
  70125. * [description]
  70126. *
  70127. * @name Phaser.Physics.Arcade.StaticBody#mass
  70128. * @type {number}
  70129. * @default 1
  70130. * @since 3.0.0
  70131. */
  70132. this.mass = 1;
  70133. /**
  70134. * [description]
  70135. *
  70136. * @name Phaser.Physics.Arcade.StaticBody#immovable
  70137. * @type {boolean}
  70138. * @default true
  70139. * @since 3.0.0
  70140. */
  70141. this.immovable = true;
  70142. /**
  70143. * [description]
  70144. *
  70145. * @name Phaser.Physics.Arcade.StaticBody#customSeparateX
  70146. * @type {boolean}
  70147. * @default false
  70148. * @since 3.0.0
  70149. */
  70150. this.customSeparateX = false;
  70151. /**
  70152. * [description]
  70153. *
  70154. * @name Phaser.Physics.Arcade.StaticBody#customSeparateY
  70155. * @type {boolean}
  70156. * @default false
  70157. * @since 3.0.0
  70158. */
  70159. this.customSeparateY = false;
  70160. /**
  70161. * [description]
  70162. *
  70163. * @name Phaser.Physics.Arcade.StaticBody#overlapX
  70164. * @type {number}
  70165. * @default 0
  70166. * @since 3.0.0
  70167. */
  70168. this.overlapX = 0;
  70169. /**
  70170. * [description]
  70171. *
  70172. * @name Phaser.Physics.Arcade.StaticBody#overlapY
  70173. * @type {number}
  70174. * @default 0
  70175. * @since 3.0.0
  70176. */
  70177. this.overlapY = 0;
  70178. /**
  70179. * [description]
  70180. *
  70181. * @name Phaser.Physics.Arcade.StaticBody#overlapR
  70182. * @type {number}
  70183. * @default 0
  70184. * @since 3.0.0
  70185. */
  70186. this.overlapR = 0;
  70187. /**
  70188. * [description]
  70189. *
  70190. * @name Phaser.Physics.Arcade.StaticBody#embedded
  70191. * @type {boolean}
  70192. * @default false
  70193. * @since 3.0.0
  70194. */
  70195. this.embedded = false;
  70196. /**
  70197. * [description]
  70198. *
  70199. * @name Phaser.Physics.Arcade.StaticBody#collideWorldBounds
  70200. * @type {boolean}
  70201. * @default false
  70202. * @since 3.0.0
  70203. */
  70204. this.collideWorldBounds = false;
  70205. /**
  70206. * [description]
  70207. *
  70208. * @name Phaser.Physics.Arcade.StaticBody#checkCollision
  70209. * @type {ArcadeBodyCollision}
  70210. * @since 3.0.0
  70211. */
  70212. this.checkCollision = { none: false, up: true, down: true, left: true, right: true };
  70213. /**
  70214. * [description]
  70215. *
  70216. * @name Phaser.Physics.Arcade.StaticBody#touching
  70217. * @type {ArcadeBodyCollision}
  70218. * @since 3.0.0
  70219. */
  70220. this.touching = { none: true, up: false, down: false, left: false, right: false };
  70221. /**
  70222. * [description]
  70223. *
  70224. * @name Phaser.Physics.Arcade.StaticBody#wasTouching
  70225. * @type {ArcadeBodyCollision}
  70226. * @since 3.0.0
  70227. */
  70228. this.wasTouching = { none: true, up: false, down: false, left: false, right: false };
  70229. /**
  70230. * [description]
  70231. *
  70232. * @name Phaser.Physics.Arcade.StaticBody#blocked
  70233. * @type {ArcadeBodyCollision}
  70234. * @since 3.0.0
  70235. */
  70236. this.blocked = { none: true, up: false, down: false, left: false, right: false };
  70237. /**
  70238. * [description]
  70239. *
  70240. * @name Phaser.Physics.Arcade.StaticBody#physicsType
  70241. * @type {integer}
  70242. * @since 3.0.0
  70243. */
  70244. this.physicsType = CONST.STATIC_BODY;
  70245. /**
  70246. * The calculated change in the Body's horizontal position during the current step.
  70247. * For a static body this is always zero.
  70248. *
  70249. * @name Phaser.Physics.Arcade.StaticBody#_dx
  70250. * @type {number}
  70251. * @private
  70252. * @default 0
  70253. * @since 3.10.0
  70254. */
  70255. this._dx = 0;
  70256. /**
  70257. * The calculated change in the Body's vertical position during the current step.
  70258. * For a static body this is always zero.
  70259. *
  70260. * @name Phaser.Physics.Arcade.StaticBody#_dy
  70261. * @type {number}
  70262. * @private
  70263. * @default 0
  70264. * @since 3.10.0
  70265. */
  70266. this._dy = 0;
  70267. },
  70268. /**
  70269. * Changes the Game Object this Body is bound to.
  70270. * First it removes its reference from the old Game Object, then sets the new one.
  70271. * You can optionally update the position and dimensions of this Body to reflect that of the new Game Object.
  70272. *
  70273. * @method Phaser.Physics.Arcade.StaticBody#setGameObject
  70274. * @since 3.1.0
  70275. *
  70276. * @param {Phaser.GameObjects.GameObject} gameObject - The new Game Object that will own this Body.
  70277. * @param {boolean} [update=true] - Reposition and resize this Body to match the new Game Object?
  70278. *
  70279. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  70280. */
  70281. setGameObject: function (gameObject, update)
  70282. {
  70283. if (gameObject && gameObject !== this.gameObject)
  70284. {
  70285. // Remove this body from the old game object
  70286. this.gameObject.body = null;
  70287. gameObject.body = this;
  70288. // Update our reference
  70289. this.gameObject = gameObject;
  70290. }
  70291. if (update)
  70292. {
  70293. this.updateFromGameObject();
  70294. }
  70295. return this;
  70296. },
  70297. /**
  70298. * Updates this Static Body so that its position and dimensions are updated
  70299. * based on the current Game Object it is bound to.
  70300. *
  70301. * @method Phaser.Physics.Arcade.StaticBody#updateFromGameObject
  70302. * @since 3.1.0
  70303. *
  70304. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  70305. */
  70306. updateFromGameObject: function ()
  70307. {
  70308. this.world.staticTree.remove(this);
  70309. var gameObject = this.gameObject;
  70310. gameObject.getTopLeft(this.position);
  70311. this.width = gameObject.displayWidth;
  70312. this.height = gameObject.displayHeight;
  70313. this.halfWidth = Math.abs(this.width / 2);
  70314. this.halfHeight = Math.abs(this.height / 2);
  70315. this.center.set(this.position.x + this.halfWidth, this.position.y + this.halfHeight);
  70316. this.world.staticTree.insert(this);
  70317. return this;
  70318. },
  70319. /**
  70320. * [description]
  70321. *
  70322. * @method Phaser.Physics.Arcade.StaticBody#setOffset
  70323. * @since 3.4.0
  70324. *
  70325. * @param {number} x - [description]
  70326. * @param {number} y - [description]
  70327. *
  70328. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  70329. */
  70330. setOffset: function (x, y)
  70331. {
  70332. if (y === undefined) { y = x; }
  70333. this.world.staticTree.remove(this);
  70334. this.position.x -= this.offset.x;
  70335. this.position.y -= this.offset.y;
  70336. this.offset.set(x, y);
  70337. this.position.x += this.offset.x;
  70338. this.position.y += this.offset.y;
  70339. this.updateCenter();
  70340. this.world.staticTree.insert(this);
  70341. return this;
  70342. },
  70343. /**
  70344. * [description]
  70345. *
  70346. * @method Phaser.Physics.Arcade.StaticBody#setSize
  70347. * @since 3.0.0
  70348. *
  70349. * @param {number} width - [description]
  70350. * @param {number} height - [description]
  70351. * @param {number} [offsetX] - [description]
  70352. * @param {number} [offsetY] - [description]
  70353. *
  70354. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  70355. */
  70356. setSize: function (width, height, offsetX, offsetY)
  70357. {
  70358. if (offsetX === undefined) { offsetX = this.offset.x; }
  70359. if (offsetY === undefined) { offsetY = this.offset.y; }
  70360. this.world.staticTree.remove(this);
  70361. this.width = width;
  70362. this.height = height;
  70363. this.halfWidth = Math.floor(width / 2);
  70364. this.halfHeight = Math.floor(height / 2);
  70365. this.offset.set(offsetX, offsetY);
  70366. this.updateCenter();
  70367. this.isCircle = false;
  70368. this.radius = 0;
  70369. this.world.staticTree.insert(this);
  70370. return this;
  70371. },
  70372. /**
  70373. * [description]
  70374. *
  70375. * @method Phaser.Physics.Arcade.StaticBody#setCircle
  70376. * @since 3.0.0
  70377. *
  70378. * @param {number} radius - [description]
  70379. * @param {number} [offsetX] - [description]
  70380. * @param {number} [offsetY] - [description]
  70381. *
  70382. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  70383. */
  70384. setCircle: function (radius, offsetX, offsetY)
  70385. {
  70386. if (offsetX === undefined) { offsetX = this.offset.x; }
  70387. if (offsetY === undefined) { offsetY = this.offset.y; }
  70388. if (radius > 0)
  70389. {
  70390. this.world.staticTree.remove(this);
  70391. this.isCircle = true;
  70392. this.radius = radius;
  70393. this.width = radius * 2;
  70394. this.height = radius * 2;
  70395. this.halfWidth = Math.floor(this.width / 2);
  70396. this.halfHeight = Math.floor(this.height / 2);
  70397. this.offset.set(offsetX, offsetY);
  70398. this.updateCenter();
  70399. this.world.staticTree.insert(this);
  70400. }
  70401. else
  70402. {
  70403. this.isCircle = false;
  70404. }
  70405. return this;
  70406. },
  70407. /**
  70408. * [description]
  70409. *
  70410. * @method Phaser.Physics.Arcade.StaticBody#updateCenter
  70411. * @since 3.0.0
  70412. */
  70413. updateCenter: function ()
  70414. {
  70415. this.center.set(this.position.x + this.halfWidth, this.position.y + this.halfHeight);
  70416. },
  70417. /**
  70418. * [description]
  70419. *
  70420. * @method Phaser.Physics.Arcade.StaticBody#reset
  70421. * @since 3.0.0
  70422. *
  70423. * @param {number} x - [description]
  70424. * @param {number} y - [description]
  70425. */
  70426. reset: function (x, y)
  70427. {
  70428. var gameObject = this.gameObject;
  70429. if (x === undefined) { x = gameObject.x; }
  70430. if (y === undefined) { y = gameObject.y; }
  70431. this.world.staticTree.remove(this);
  70432. gameObject.getTopLeft(this.position);
  70433. this.updateCenter();
  70434. this.world.staticTree.insert(this);
  70435. },
  70436. /**
  70437. * [description]
  70438. *
  70439. * @method Phaser.Physics.Arcade.StaticBody#stop
  70440. * @since 3.0.0
  70441. *
  70442. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  70443. */
  70444. stop: function ()
  70445. {
  70446. return this;
  70447. },
  70448. /**
  70449. * [description]
  70450. *
  70451. * @method Phaser.Physics.Arcade.StaticBody#getBounds
  70452. * @since 3.0.0
  70453. *
  70454. * @param {ArcadeBodyBounds} obj - [description]
  70455. *
  70456. * @return {ArcadeBodyBounds} [description]
  70457. */
  70458. getBounds: function (obj)
  70459. {
  70460. obj.x = this.x;
  70461. obj.y = this.y;
  70462. obj.right = this.right;
  70463. obj.bottom = this.bottom;
  70464. return obj;
  70465. },
  70466. /**
  70467. * [description]
  70468. *
  70469. * @method Phaser.Physics.Arcade.StaticBody#hitTest
  70470. * @since 3.0.0
  70471. *
  70472. * @param {number} x - [description]
  70473. * @param {number} y - [description]
  70474. *
  70475. * @return {boolean} [description]
  70476. */
  70477. hitTest: function (x, y)
  70478. {
  70479. return (this.isCircle) ? CircleContains(this, x, y) : RectangleContains(this, x, y);
  70480. },
  70481. /**
  70482. * [description]
  70483. *
  70484. * @method Phaser.Physics.Arcade.StaticBody#deltaAbsX
  70485. * @since 3.0.0
  70486. *
  70487. * @return {number} [description]
  70488. */
  70489. deltaAbsX: function ()
  70490. {
  70491. return 0;
  70492. },
  70493. /**
  70494. * [description]
  70495. *
  70496. * @method Phaser.Physics.Arcade.StaticBody#deltaAbsY
  70497. * @since 3.0.0
  70498. *
  70499. * @return {number} [description]
  70500. */
  70501. deltaAbsY: function ()
  70502. {
  70503. return 0;
  70504. },
  70505. /**
  70506. * [description]
  70507. *
  70508. * @method Phaser.Physics.Arcade.StaticBody#deltaX
  70509. * @since 3.0.0
  70510. *
  70511. * @return {number} [description]
  70512. */
  70513. deltaX: function ()
  70514. {
  70515. return 0;
  70516. },
  70517. /**
  70518. * [description]
  70519. *
  70520. * @method Phaser.Physics.Arcade.StaticBody#deltaY
  70521. * @since 3.0.0
  70522. *
  70523. * @return {number} [description]
  70524. */
  70525. deltaY: function ()
  70526. {
  70527. return 0;
  70528. },
  70529. /**
  70530. * [description]
  70531. *
  70532. * @method Phaser.Physics.Arcade.StaticBody#deltaZ
  70533. * @since 3.0.0
  70534. *
  70535. * @return {number} [description]
  70536. */
  70537. deltaZ: function ()
  70538. {
  70539. return 0;
  70540. },
  70541. /**
  70542. * [description]
  70543. *
  70544. * @method Phaser.Physics.Arcade.StaticBody#destroy
  70545. * @since 3.0.0
  70546. */
  70547. destroy: function ()
  70548. {
  70549. this.enable = false;
  70550. this.world.pendingDestroy.set(this);
  70551. },
  70552. /**
  70553. * [description]
  70554. *
  70555. * @method Phaser.Physics.Arcade.StaticBody#drawDebug
  70556. * @since 3.0.0
  70557. *
  70558. * @param {Phaser.GameObjects.Graphics} graphic - [description]
  70559. */
  70560. drawDebug: function (graphic)
  70561. {
  70562. var pos = this.position;
  70563. if (this.debugShowBody)
  70564. {
  70565. graphic.lineStyle(1, this.debugBodyColor, 1);
  70566. graphic.strokeRect(pos.x, pos.y, this.width, this.height);
  70567. }
  70568. },
  70569. /**
  70570. * [description]
  70571. *
  70572. * @method Phaser.Physics.Arcade.StaticBody#willDrawDebug
  70573. * @since 3.0.0
  70574. *
  70575. * @return {boolean} [description]
  70576. */
  70577. willDrawDebug: function ()
  70578. {
  70579. return this.debugShowBody;
  70580. },
  70581. /**
  70582. * [description]
  70583. *
  70584. * @method Phaser.Physics.Arcade.StaticBody#setMass
  70585. * @since 3.0.0
  70586. *
  70587. * @param {number} value - [description]
  70588. *
  70589. * @return {Phaser.Physics.Arcade.StaticBody} This Static Body object.
  70590. */
  70591. setMass: function (value)
  70592. {
  70593. if (value <= 0)
  70594. {
  70595. // Causes havoc otherwise
  70596. value = 0.1;
  70597. }
  70598. this.mass = value;
  70599. return this;
  70600. },
  70601. /**
  70602. * [description]
  70603. *
  70604. * @name Phaser.Physics.Arcade.StaticBody#x
  70605. * @type {number}
  70606. * @since 3.0.0
  70607. */
  70608. x: {
  70609. get: function ()
  70610. {
  70611. return this.position.x;
  70612. },
  70613. set: function (value)
  70614. {
  70615. this.world.staticTree.remove(this);
  70616. this.position.x = value;
  70617. this.world.staticTree.insert(this);
  70618. }
  70619. },
  70620. /**
  70621. * [description]
  70622. *
  70623. * @name Phaser.Physics.Arcade.StaticBody#y
  70624. * @type {number}
  70625. * @since 3.0.0
  70626. */
  70627. y: {
  70628. get: function ()
  70629. {
  70630. return this.position.y;
  70631. },
  70632. set: function (value)
  70633. {
  70634. this.world.staticTree.remove(this);
  70635. this.position.y = value;
  70636. this.world.staticTree.insert(this);
  70637. }
  70638. },
  70639. /**
  70640. * [description]
  70641. *
  70642. * @name Phaser.Physics.Arcade.StaticBody#left
  70643. * @type {number}
  70644. * @readOnly
  70645. * @since 3.0.0
  70646. */
  70647. left: {
  70648. get: function ()
  70649. {
  70650. return this.position.x;
  70651. }
  70652. },
  70653. /**
  70654. * [description]
  70655. *
  70656. * @name Phaser.Physics.Arcade.StaticBody#right
  70657. * @type {number}
  70658. * @readOnly
  70659. * @since 3.0.0
  70660. */
  70661. right: {
  70662. get: function ()
  70663. {
  70664. return this.position.x + this.width;
  70665. }
  70666. },
  70667. /**
  70668. * [description]
  70669. *
  70670. * @name Phaser.Physics.Arcade.StaticBody#top
  70671. * @type {number}
  70672. * @readOnly
  70673. * @since 3.0.0
  70674. */
  70675. top: {
  70676. get: function ()
  70677. {
  70678. return this.position.y;
  70679. }
  70680. },
  70681. /**
  70682. * [description]
  70683. *
  70684. * @name Phaser.Physics.Arcade.StaticBody#bottom
  70685. * @type {number}
  70686. * @readOnly
  70687. * @since 3.0.0
  70688. */
  70689. bottom: {
  70690. get: function ()
  70691. {
  70692. return this.position.y + this.height;
  70693. }
  70694. }
  70695. });
  70696. module.exports = StaticBody;
  70697. /***/ }),
  70698. /* 340 */
  70699. /***/ (function(module, exports) {
  70700. /**
  70701. * @author Richard Davey <rich@photonstorm.com>
  70702. * @copyright 2018 Photon Storm Ltd.
  70703. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  70704. */
  70705. /**
  70706. * [description]
  70707. *
  70708. * @function Phaser.Physics.Arcade.Tilemap.TileIntersectsBody
  70709. * @since 3.0.0
  70710. *
  70711. * @param {{ left: number, right: number, top: number, bottom: number }} tileWorldRect - [description]
  70712. * @param {Phaser.Physics.Arcade.Body} body - [description]
  70713. *
  70714. * @return {boolean} [description]
  70715. */
  70716. var TileIntersectsBody = function (tileWorldRect, body)
  70717. {
  70718. // Currently, all bodies are treated as rectangles when colliding with a Tile. Eventually, this
  70719. // should support circle bodies when those are less buggy in v3.
  70720. return !(
  70721. body.right <= tileWorldRect.left ||
  70722. body.bottom <= tileWorldRect.top ||
  70723. body.position.x >= tileWorldRect.right ||
  70724. body.position.y >= tileWorldRect.bottom
  70725. );
  70726. };
  70727. module.exports = TileIntersectsBody;
  70728. /***/ }),
  70729. /* 341 */
  70730. /***/ (function(module, exports, __webpack_require__) {
  70731. /**
  70732. * @author Richard Davey <rich@photonstorm.com>
  70733. * @copyright 2018 Photon Storm Ltd.
  70734. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  70735. */
  70736. var CONST = __webpack_require__(43);
  70737. /**
  70738. * [description]
  70739. *
  70740. * @function Phaser.Physics.Arcade.GetOverlapY
  70741. * @since 3.0.0
  70742. *
  70743. * @param {Phaser.Physics.Arcade.Body} body1 - [description]
  70744. * @param {Phaser.Physics.Arcade.Body} body2 - [description]
  70745. * @param {boolean} overlapOnly - [description]
  70746. * @param {number} bias - [description]
  70747. *
  70748. * @return {number} [description]
  70749. */
  70750. var GetOverlapY = function (body1, body2, overlapOnly, bias)
  70751. {
  70752. var overlap = 0;
  70753. var maxOverlap = body1.deltaAbsY() + body2.deltaAbsY() + bias;
  70754. if (body1._dy === 0 && body2._dy === 0)
  70755. {
  70756. // They overlap but neither of them are moving
  70757. body1.embedded = true;
  70758. body2.embedded = true;
  70759. }
  70760. else if (body1._dy > body2._dy)
  70761. {
  70762. // Body1 is moving down and/or Body2 is moving up
  70763. overlap = body1.bottom - body2.y;
  70764. if ((overlap > maxOverlap && !overlapOnly) || body1.checkCollision.down === false || body2.checkCollision.up === false)
  70765. {
  70766. overlap = 0;
  70767. }
  70768. else
  70769. {
  70770. body1.touching.none = false;
  70771. body1.touching.down = true;
  70772. body2.touching.none = false;
  70773. body2.touching.up = true;
  70774. if (body2.physicsType === CONST.STATIC_BODY)
  70775. {
  70776. body1.blocked.none = false;
  70777. body1.blocked.down = true;
  70778. }
  70779. if (body1.physicsType === CONST.STATIC_BODY)
  70780. {
  70781. body2.blocked.none = false;
  70782. body2.blocked.up = true;
  70783. }
  70784. }
  70785. }
  70786. else if (body1._dy < body2._dy)
  70787. {
  70788. // Body1 is moving up and/or Body2 is moving down
  70789. overlap = body1.y - body2.bottom;
  70790. if ((-overlap > maxOverlap && !overlapOnly) || body1.checkCollision.up === false || body2.checkCollision.down === false)
  70791. {
  70792. overlap = 0;
  70793. }
  70794. else
  70795. {
  70796. body1.touching.none = false;
  70797. body1.touching.up = true;
  70798. body2.touching.none = false;
  70799. body2.touching.down = true;
  70800. if (body2.physicsType === CONST.STATIC_BODY)
  70801. {
  70802. body1.blocked.none = false;
  70803. body1.blocked.up = true;
  70804. }
  70805. if (body1.physicsType === CONST.STATIC_BODY)
  70806. {
  70807. body2.blocked.none = false;
  70808. body2.blocked.down = true;
  70809. }
  70810. }
  70811. }
  70812. // Resets the overlapY to zero if there is no overlap, or to the actual pixel value if there is
  70813. body1.overlapY = overlap;
  70814. body2.overlapY = overlap;
  70815. return overlap;
  70816. };
  70817. module.exports = GetOverlapY;
  70818. /***/ }),
  70819. /* 342 */
  70820. /***/ (function(module, exports, __webpack_require__) {
  70821. /**
  70822. * @author Richard Davey <rich@photonstorm.com>
  70823. * @copyright 2018 Photon Storm Ltd.
  70824. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  70825. */
  70826. var CONST = __webpack_require__(43);
  70827. /**
  70828. * [description]
  70829. *
  70830. * @function Phaser.Physics.Arcade.GetOverlapX
  70831. * @since 3.0.0
  70832. *
  70833. * @param {Phaser.Physics.Arcade.Body} body1 - [description]
  70834. * @param {Phaser.Physics.Arcade.Body} body2 - [description]
  70835. * @param {boolean} overlapOnly - [description]
  70836. * @param {number} bias - [description]
  70837. *
  70838. * @return {number} [description]
  70839. */
  70840. var GetOverlapX = function (body1, body2, overlapOnly, bias)
  70841. {
  70842. var overlap = 0;
  70843. var maxOverlap = body1.deltaAbsX() + body2.deltaAbsX() + bias;
  70844. if (body1._dx === 0 && body2._dx === 0)
  70845. {
  70846. // They overlap but neither of them are moving
  70847. body1.embedded = true;
  70848. body2.embedded = true;
  70849. }
  70850. else if (body1._dx > body2._dx)
  70851. {
  70852. // Body1 is moving right and / or Body2 is moving left
  70853. overlap = body1.right - body2.x;
  70854. if ((overlap > maxOverlap && !overlapOnly) || body1.checkCollision.right === false || body2.checkCollision.left === false)
  70855. {
  70856. overlap = 0;
  70857. }
  70858. else
  70859. {
  70860. body1.touching.none = false;
  70861. body1.touching.right = true;
  70862. body2.touching.none = false;
  70863. body2.touching.left = true;
  70864. if (body2.physicsType === CONST.STATIC_BODY)
  70865. {
  70866. body1.blocked.none = false;
  70867. body1.blocked.right = true;
  70868. }
  70869. if (body1.physicsType === CONST.STATIC_BODY)
  70870. {
  70871. body2.blocked.none = false;
  70872. body2.blocked.left = true;
  70873. }
  70874. }
  70875. }
  70876. else if (body1._dx < body2._dx)
  70877. {
  70878. // Body1 is moving left and/or Body2 is moving right
  70879. overlap = body1.x - body2.width - body2.x;
  70880. if ((-overlap > maxOverlap && !overlapOnly) || body1.checkCollision.left === false || body2.checkCollision.right === false)
  70881. {
  70882. overlap = 0;
  70883. }
  70884. else
  70885. {
  70886. body1.touching.none = false;
  70887. body1.touching.left = true;
  70888. body2.touching.none = false;
  70889. body2.touching.right = true;
  70890. if (body2.physicsType === CONST.STATIC_BODY)
  70891. {
  70892. body1.blocked.none = false;
  70893. body1.blocked.left = true;
  70894. }
  70895. if (body1.physicsType === CONST.STATIC_BODY)
  70896. {
  70897. body2.blocked.none = false;
  70898. body2.blocked.right = true;
  70899. }
  70900. }
  70901. }
  70902. // Resets the overlapX to zero if there is no overlap, or to the actual pixel value if there is
  70903. body1.overlapX = overlap;
  70904. body2.overlapX = overlap;
  70905. return overlap;
  70906. };
  70907. module.exports = GetOverlapX;
  70908. /***/ }),
  70909. /* 343 */
  70910. /***/ (function(module, exports, __webpack_require__) {
  70911. /**
  70912. * @author Richard Davey <rich@photonstorm.com>
  70913. * @copyright 2018 Photon Storm Ltd.
  70914. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  70915. */
  70916. var Class = __webpack_require__(0);
  70917. /**
  70918. * @classdesc
  70919. * [description]
  70920. *
  70921. * @class Collider
  70922. * @memberOf Phaser.Physics.Arcade
  70923. * @constructor
  70924. * @since 3.0.0
  70925. *
  70926. * @param {Phaser.Physics.Arcade.World} world - [description]
  70927. * @param {boolean} overlapOnly - [description]
  70928. * @param {ArcadeColliderType} object1 - The first object to check for collision.
  70929. * @param {ArcadeColliderType} object2 - The second object to check for collision.
  70930. * @param {ArcadePhysicsCallback} collideCallback - The callback to invoke when the two objects collide.
  70931. * @param {ArcadePhysicsCallback} processCallback - The callback to invoke when the two objects collide. Must return a boolean.
  70932. * @param {any} callbackContext - The scope in which to call the callbacks.
  70933. */
  70934. var Collider = new Class({
  70935. initialize:
  70936. function Collider (world, overlapOnly, object1, object2, collideCallback, processCallback, callbackContext)
  70937. {
  70938. /**
  70939. * [description]
  70940. *
  70941. * @name Phaser.Physics.Arcade.Collider#world
  70942. * @type {Phaser.Physics.Arcade.World}
  70943. * @since 3.0.0
  70944. */
  70945. this.world = world;
  70946. /**
  70947. * [description]
  70948. *
  70949. * @name Phaser.Physics.Arcade.Collider#name
  70950. * @type {string}
  70951. * @since 3.1.0
  70952. */
  70953. this.name = '';
  70954. /**
  70955. * [description]
  70956. *
  70957. * @name Phaser.Physics.Arcade.Collider#active
  70958. * @type {boolean}
  70959. * @default true
  70960. * @since 3.0.0
  70961. */
  70962. this.active = true;
  70963. /**
  70964. * [description]
  70965. *
  70966. * @name Phaser.Physics.Arcade.Collider#overlapOnly
  70967. * @type {boolean}
  70968. * @since 3.0.0
  70969. */
  70970. this.overlapOnly = overlapOnly;
  70971. /**
  70972. * [description]
  70973. *
  70974. * @name Phaser.Physics.Arcade.Collider#object1
  70975. * @type {ArcadeColliderType}
  70976. * @since 3.0.0
  70977. */
  70978. this.object1 = object1;
  70979. /**
  70980. * [description]
  70981. *
  70982. * @name Phaser.Physics.Arcade.Collider#object2
  70983. * @type {ArcadeColliderType}
  70984. * @since 3.0.0
  70985. */
  70986. this.object2 = object2;
  70987. /**
  70988. * [description]
  70989. *
  70990. * @name Phaser.Physics.Arcade.Collider#collideCallback
  70991. * @type {ArcadePhysicsCallback}
  70992. * @since 3.0.0
  70993. */
  70994. this.collideCallback = collideCallback;
  70995. /**
  70996. * [description]
  70997. *
  70998. * @name Phaser.Physics.Arcade.Collider#processCallback
  70999. * @type {ArcadePhysicsCallback}
  71000. * @since 3.0.0
  71001. */
  71002. this.processCallback = processCallback;
  71003. /**
  71004. * [description]
  71005. *
  71006. * @name Phaser.Physics.Arcade.Collider#callbackContext
  71007. * @type {object}
  71008. * @since 3.0.0
  71009. */
  71010. this.callbackContext = callbackContext;
  71011. },
  71012. /**
  71013. * [description]
  71014. *
  71015. * @method Phaser.Physics.Arcade.Collider#setName
  71016. * @since 3.1.0
  71017. *
  71018. * @param {string} name - [description]
  71019. *
  71020. * @return {Phaser.Physics.Arcade.Collider} [description]
  71021. */
  71022. setName: function (name)
  71023. {
  71024. this.name = name;
  71025. return this;
  71026. },
  71027. /**
  71028. * [description]
  71029. *
  71030. * @method Phaser.Physics.Arcade.Collider#update
  71031. * @since 3.0.0
  71032. */
  71033. update: function ()
  71034. {
  71035. this.world.collideObjects(
  71036. this.object1,
  71037. this.object2,
  71038. this.collideCallback,
  71039. this.processCallback,
  71040. this.callbackContext,
  71041. this.overlapOnly
  71042. );
  71043. },
  71044. /**
  71045. * [description]
  71046. *
  71047. * @method Phaser.Physics.Arcade.Collider#destroy
  71048. * @since 3.0.0
  71049. */
  71050. destroy: function ()
  71051. {
  71052. this.world.removeCollider(this);
  71053. this.active = false;
  71054. this.world = null;
  71055. this.object1 = null;
  71056. this.object2 = null;
  71057. this.collideCallback = null;
  71058. this.processCallback = null;
  71059. this.callbackContext = null;
  71060. }
  71061. });
  71062. module.exports = Collider;
  71063. /***/ }),
  71064. /* 344 */
  71065. /***/ (function(module, exports, __webpack_require__) {
  71066. /**
  71067. * @author Richard Davey <rich@photonstorm.com>
  71068. * @copyright 2018 Photon Storm Ltd.
  71069. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  71070. */
  71071. var CircleContains = __webpack_require__(33);
  71072. var Class = __webpack_require__(0);
  71073. var CONST = __webpack_require__(43);
  71074. var RadToDeg = __webpack_require__(153);
  71075. var Rectangle = __webpack_require__(13);
  71076. var RectangleContains = __webpack_require__(31);
  71077. var TransformMatrix = __webpack_require__(32);
  71078. var Vector2 = __webpack_require__(6);
  71079. /**
  71080. * @typedef {object} ArcadeBodyBounds
  71081. *
  71082. * @property {number} x - The left edge.
  71083. * @property {number} y - The upper edge.
  71084. * @property {number} right - The right edge.
  71085. * @property {number} bottom - The lower edge.
  71086. */
  71087. /**
  71088. * @typedef {object} ArcadeBodyCollision
  71089. *
  71090. * @property {boolean} none - True if the Body is not colliding.
  71091. * @property {boolean} up - True if the Body is colliding on its upper edge.
  71092. * @property {boolean} down - True if the Body is colliding on its lower edge.
  71093. * @property {boolean} left - True if the Body is colliding on its left edge.
  71094. * @property {boolean} right - True if the Body is colliding on its right edge.
  71095. */
  71096. /**
  71097. * @classdesc
  71098. * A Dynamic Arcade Body.
  71099. *
  71100. * @class Body
  71101. * @memberOf Phaser.Physics.Arcade
  71102. * @constructor
  71103. * @since 3.0.0
  71104. *
  71105. * @param {Phaser.Physics.Arcade.World} world - The Arcade Physics simulation this Body belongs to.
  71106. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object this Body belongs to.
  71107. */
  71108. var Body = new Class({
  71109. initialize:
  71110. function Body (world, gameObject)
  71111. {
  71112. var width = (gameObject.width) ? gameObject.width : 64;
  71113. var height = (gameObject.height) ? gameObject.height : 64;
  71114. /**
  71115. * The Arcade Physics simulation this Body belongs to.
  71116. *
  71117. * @name Phaser.Physics.Arcade.Body#world
  71118. * @type {Phaser.Physics.Arcade.World}
  71119. * @since 3.0.0
  71120. */
  71121. this.world = world;
  71122. /**
  71123. * The Game Object this Body belongs to.
  71124. *
  71125. * @name Phaser.Physics.Arcade.Body#gameObject
  71126. * @type {Phaser.GameObjects.GameObject}
  71127. * @since 3.0.0
  71128. */
  71129. this.gameObject = gameObject;
  71130. /**
  71131. * Transformations applied to this Body.
  71132. *
  71133. * @name Phaser.Physics.Arcade.Body#transform
  71134. * @type {object}
  71135. * @since 3.4.0
  71136. */
  71137. this.transform = {
  71138. x: gameObject.x,
  71139. y: gameObject.y,
  71140. rotation: gameObject.angle,
  71141. scaleX: gameObject.scaleX,
  71142. scaleY: gameObject.scaleY,
  71143. displayOriginX: gameObject.displayOriginX,
  71144. displayOriginY: gameObject.displayOriginY
  71145. };
  71146. /**
  71147. * Whether the Body's boundary is drawn to the debug display.
  71148. *
  71149. * @name Phaser.Physics.Arcade.Body#debugShowBody
  71150. * @type {boolean}
  71151. * @since 3.0.0
  71152. */
  71153. this.debugShowBody = world.defaults.debugShowBody;
  71154. /**
  71155. * Whether the Body's velocity is drawn to the debug display.
  71156. *
  71157. * @name Phaser.Physics.Arcade.Body#debugShowVelocity
  71158. * @type {boolean}
  71159. * @since 3.0.0
  71160. */
  71161. this.debugShowVelocity = world.defaults.debugShowVelocity;
  71162. /**
  71163. * The color of this Body on the debug display.
  71164. *
  71165. * @name Phaser.Physics.Arcade.Body#debugBodyColor
  71166. * @type {integer}
  71167. * @since 3.0.0
  71168. */
  71169. this.debugBodyColor = world.defaults.bodyDebugColor;
  71170. /**
  71171. * Whether this Body is updated by the physics simulation.
  71172. *
  71173. * @name Phaser.Physics.Arcade.Body#enable
  71174. * @type {boolean}
  71175. * @default true
  71176. * @since 3.0.0
  71177. */
  71178. this.enable = true;
  71179. /**
  71180. * Whether this Body's boundary is circular (true) or rectangular (false).
  71181. *
  71182. * @name Phaser.Physics.Arcade.Body#isCircle
  71183. * @type {boolean}
  71184. * @default false
  71185. * @since 3.0.0
  71186. * @see Phaser.Physics.Arcade.Body#setCircle
  71187. */
  71188. this.isCircle = false;
  71189. /**
  71190. * The unscaled radius of this Body's boundary (if circular), as set by setCircle, in source pixels.
  71191. * The true radius (if circular) is equal to halfWidth.
  71192. *
  71193. * @name Phaser.Physics.Arcade.Body#radius
  71194. * @type {number}
  71195. * @default 0
  71196. * @since 3.0.0
  71197. * @see Phaser.Physics.Arcade.Body#setCircle
  71198. */
  71199. this.radius = 0;
  71200. /**
  71201. * The offset of this Body's position from its Game Object's position, in source pixels.
  71202. *
  71203. * @name Phaser.Physics.Arcade.Body#offset
  71204. * @type {Phaser.Math.Vector2}
  71205. * @since 3.0.0
  71206. * @see Phaser.Physics.Arcade.Body#setOffset
  71207. */
  71208. this.offset = new Vector2();
  71209. /**
  71210. * The position of this Body within the simulation.
  71211. *
  71212. * @name Phaser.Physics.Arcade.Body#position
  71213. * @type {Phaser.Math.Vector2}
  71214. * @since 3.0.0
  71215. */
  71216. this.position = new Vector2(gameObject.x, gameObject.y);
  71217. /**
  71218. * The position of this Body during the previous step.
  71219. *
  71220. * @name Phaser.Physics.Arcade.Body#prev
  71221. * @type {Phaser.Math.Vector2}
  71222. * @since 3.0.0
  71223. */
  71224. this.prev = new Vector2(gameObject.x, gameObject.y);
  71225. /**
  71226. * Whether this Body's rotation is affected by its angular acceleration and velocity.
  71227. *
  71228. * @name Phaser.Physics.Arcade.Body#allowRotation
  71229. * @type {boolean}
  71230. * @default true
  71231. * @since 3.0.0
  71232. */
  71233. this.allowRotation = true;
  71234. /**
  71235. * This body's rotation, in degrees, based on its angular acceleration and velocity.
  71236. * The Body's rotation controls the `angle` of its Game Object.
  71237. * It doesn't rotate the Body's boundary, which is always an axis-aligned rectangle or a circle.
  71238. *
  71239. * @name Phaser.Physics.Arcade.Body#rotation
  71240. * @type {number}
  71241. * @since 3.0.0
  71242. */
  71243. this.rotation = gameObject.angle;
  71244. /**
  71245. * The Body's rotation, in degrees, during the previous step.
  71246. *
  71247. * @name Phaser.Physics.Arcade.Body#preRotation
  71248. * @type {number}
  71249. * @since 3.0.0
  71250. */
  71251. this.preRotation = gameObject.angle;
  71252. /**
  71253. * The width of the Body's boundary. If circular, this is also the Body's diameter.
  71254. *
  71255. * @name Phaser.Physics.Arcade.Body#width
  71256. * @type {number}
  71257. * @default 64
  71258. * @since 3.0.0
  71259. */
  71260. this.width = width;
  71261. /**
  71262. * The height of the Body's boundary. If circular, this is also the Body's diameter.
  71263. *
  71264. * @name Phaser.Physics.Arcade.Body#height
  71265. * @type {number}
  71266. * @default 64
  71267. * @since 3.0.0
  71268. */
  71269. this.height = height;
  71270. /**
  71271. * The unscaled width of the Body, in source pixels. The default is the width of the Body's Game Object's texture frame.
  71272. *
  71273. * @name Phaser.Physics.Arcade.Body#sourceWidth
  71274. * @type {number}
  71275. * @since 3.0.0
  71276. * @see Phaser.Physics.Arcade.Body#setSize
  71277. */
  71278. this.sourceWidth = width;
  71279. /**
  71280. * The unscaled height of the Body, in source pixels. The default is the height of the Body's Game Object's texture frame.
  71281. *
  71282. * @name Phaser.Physics.Arcade.Body#sourceHeight
  71283. * @type {number}
  71284. * @since 3.0.0
  71285. * @see Phaser.Physics.Arcade.Body#setSize
  71286. */
  71287. this.sourceHeight = height;
  71288. if (gameObject.frame)
  71289. {
  71290. this.sourceWidth = gameObject.frame.realWidth;
  71291. this.sourceHeight = gameObject.frame.realHeight;
  71292. }
  71293. /**
  71294. * Half the Body's width.
  71295. *
  71296. * @name Phaser.Physics.Arcade.Body#halfWidth
  71297. * @type {number}
  71298. * @since 3.0.0
  71299. */
  71300. this.halfWidth = Math.abs(width / 2);
  71301. /**
  71302. * Half the Body's height.
  71303. *
  71304. * @name Phaser.Physics.Arcade.Body#halfHeight
  71305. * @type {number}
  71306. * @since 3.0.0
  71307. */
  71308. this.halfHeight = Math.abs(height / 2);
  71309. /**
  71310. * The center of the Body's boundary. The midpoint of its `position` (top-left corner) and its bottom-right corner.
  71311. *
  71312. * @name Phaser.Physics.Arcade.Body#center
  71313. * @type {Phaser.Math.Vector2}
  71314. * @since 3.0.0
  71315. */
  71316. this.center = new Vector2(gameObject.x + this.halfWidth, gameObject.y + this.halfHeight);
  71317. /**
  71318. * The Body's change in position, in pixels per second.
  71319. *
  71320. * @name Phaser.Physics.Arcade.Body#velocity
  71321. * @type {Phaser.Math.Vector2}
  71322. * @since 3.0.0
  71323. */
  71324. this.velocity = new Vector2();
  71325. /**
  71326. * The Body's calculated change in position, in pixels, at the last step.
  71327. *
  71328. * @name Phaser.Physics.Arcade.Body#newVelocity
  71329. * @type {Phaser.Math.Vector2}
  71330. * @readOnly
  71331. * @since 3.0.0
  71332. */
  71333. this.newVelocity = new Vector2();
  71334. /**
  71335. * The Body's absolute maximum change in position, in pixels per step.
  71336. *
  71337. * @name Phaser.Physics.Arcade.Body#deltaMax
  71338. * @type {Phaser.Math.Vector2}
  71339. * @since 3.0.0
  71340. */
  71341. this.deltaMax = new Vector2();
  71342. /**
  71343. * The Body's change in velocity, in pixels per second squared.
  71344. *
  71345. * @name Phaser.Physics.Arcade.Body#acceleration
  71346. * @type {Phaser.Math.Vector2}
  71347. * @since 3.0.0
  71348. */
  71349. this.acceleration = new Vector2();
  71350. /**
  71351. * Whether this Body's velocity is affected by its drag vector.
  71352. *
  71353. * @name Phaser.Physics.Arcade.Body#allowDrag
  71354. * @type {boolean}
  71355. * @default true
  71356. * @since 3.0.0
  71357. */
  71358. this.allowDrag = true;
  71359. /**
  71360. * Absolute loss of velocity due to movement, in pixels per second squared.
  71361. *
  71362. * @name Phaser.Physics.Arcade.Body#drag
  71363. * @type {Phaser.Math.Vector2}
  71364. * @since 3.0.0
  71365. */
  71366. this.drag = new Vector2();
  71367. /**
  71368. * Whether this Body's position is affected by its gravity vector.
  71369. *
  71370. * @name Phaser.Physics.Arcade.Body#allowGravity
  71371. * @type {boolean}
  71372. * @default true
  71373. * @since 3.0.0
  71374. */
  71375. this.allowGravity = true;
  71376. /**
  71377. * Acceleration due to gravity (specific to this Body), in pixels per second squared.
  71378. * Total gravity is the sum of this vector and the simulation's `gravity`.
  71379. *
  71380. * @name Phaser.Physics.Arcade.Body#gravity
  71381. * @type {Phaser.Math.Vector2}
  71382. * @since 3.0.0
  71383. */
  71384. this.gravity = new Vector2();
  71385. /**
  71386. * Rebound following a collision, relative to 1.
  71387. *
  71388. * @name Phaser.Physics.Arcade.Body#bounce
  71389. * @type {Phaser.Math.Vector2}
  71390. * @since 3.0.0
  71391. */
  71392. this.bounce = new Vector2();
  71393. /**
  71394. * Rebound following a collision with the world boundary, relative to 1.
  71395. * If empty, `bounce` is used instead.
  71396. *
  71397. * @name Phaser.Physics.Arcade.Body#worldBounce
  71398. * @type {?Phaser.Math.Vector2}
  71399. * @default null
  71400. * @since 3.0.0
  71401. */
  71402. this.worldBounce = null;
  71403. // If true this Body will dispatch events
  71404. /**
  71405. * Whether the simulation emits a `worldbounds` event when this Body collides with the world boundary (and `collideWorldBounds` is also true).
  71406. *
  71407. * @name Phaser.Physics.Arcade.Body#onWorldBounds
  71408. * @type {boolean}
  71409. * @default false
  71410. * @since 3.0.0
  71411. * @see Phaser.Physics.Arcade.World#event:worldbounds
  71412. */
  71413. this.onWorldBounds = false;
  71414. /**
  71415. * Whether the simulation emits a `collide` event when this Body collides with another.
  71416. *
  71417. * @name Phaser.Physics.Arcade.Body#onCollide
  71418. * @type {boolean}
  71419. * @default false
  71420. * @since 3.0.0
  71421. * @see Phaser.Physics.Arcade.World#event:collide
  71422. */
  71423. this.onCollide = false;
  71424. /**
  71425. * Whether the simulation emits an `overlap` event when this Body overlaps with another.
  71426. *
  71427. * @name Phaser.Physics.Arcade.Body#onOverlap
  71428. * @type {boolean}
  71429. * @default false
  71430. * @since 3.0.0
  71431. * @see Phaser.Physics.Arcade.World#event:overlap
  71432. */
  71433. this.onOverlap = false;
  71434. /**
  71435. * The Body's absolute maximum velocity.
  71436. *
  71437. * This limits the Body's rate of movement but not its `velocity` values (which can still exceed `maxVelocity`).
  71438. *
  71439. * @name Phaser.Physics.Arcade.Body#maxVelocity
  71440. * @type {Phaser.Math.Vector2}
  71441. * @since 3.0.0
  71442. */
  71443. this.maxVelocity = new Vector2(10000, 10000);
  71444. /**
  71445. * If this Body is `immovable` and in motion, this the proportion of this Body's movement received by the riding body on each axis, relative to 1.
  71446. * The default value (1, 0) moves the riding body horizontally in equal proportion and vertically not at all.
  71447. *
  71448. * @name Phaser.Physics.Arcade.Body#friction
  71449. * @type {Phaser.Math.Vector2}
  71450. * @since 3.0.0
  71451. */
  71452. this.friction = new Vector2(1, 0);
  71453. /**
  71454. * If this Body is using `drag` for deceleration this property controls how the drag is applied.
  71455. * If set to `true` drag will use a damping effect rather than a linear approach. If you are
  71456. * creating a game where the Body moves freely at any angle (i.e. like the way the ship moves in
  71457. * the game Asteroids) then you will get a far smoother and more visually correct deceleration
  71458. * by using damping, avoiding the axis-drift that is prone with linear deceleration.
  71459. *
  71460. * If you enable this property then you should use far smaller `drag` values than with linear, as
  71461. * they are used as a multiplier on the velocity. Values such as 0.95 will give a nice slow
  71462. * deceleration, where-as smaller values, such as 0.5 will stop an object almost immediately.
  71463. *
  71464. * @name Phaser.Physics.Arcade.Body#useDamping
  71465. * @type {boolean}
  71466. * @default false
  71467. * @since 3.10.0
  71468. */
  71469. this.useDamping = false;
  71470. /**
  71471. * The rate of change of this Body's rotation, in degrees per second.
  71472. *
  71473. * @name Phaser.Physics.Arcade.Body#angularVelocity
  71474. * @type {number}
  71475. * @default 0
  71476. * @since 3.0.0
  71477. */
  71478. this.angularVelocity = 0;
  71479. /**
  71480. * The rate of change of this Body's angular velocity, in degrees per second squared.
  71481. *
  71482. * @name Phaser.Physics.Arcade.Body#angularAcceleration
  71483. * @type {number}
  71484. * @default 0
  71485. * @since 3.0.0
  71486. */
  71487. this.angularAcceleration = 0;
  71488. /**
  71489. * Loss of angular velocity due to angular movement, in degrees per second.
  71490. *
  71491. * @name Phaser.Physics.Arcade.Body#angularDrag
  71492. * @type {number}
  71493. * @default 0
  71494. * @since 3.0.0
  71495. */
  71496. this.angularDrag = 0;
  71497. /**
  71498. * The Body's maximum angular velocity, in degrees per second.
  71499. *
  71500. * @name Phaser.Physics.Arcade.Body#maxAngular
  71501. * @type {number}
  71502. * @default 1000
  71503. * @since 3.0.0
  71504. */
  71505. this.maxAngular = 1000;
  71506. /**
  71507. * The Body's inertia, relative to a default unit (1).
  71508. * With `bounce`, this affects the exchange of momentum (velocities) during collisions.
  71509. *
  71510. * @name Phaser.Physics.Arcade.Body#mass
  71511. * @type {number}
  71512. * @default 1
  71513. * @since 3.0.0
  71514. */
  71515. this.mass = 1;
  71516. /**
  71517. * The angle of this Body's velocity vector, in degrees.
  71518. *
  71519. * @name Phaser.Physics.Arcade.Body#angle
  71520. * @type {number}
  71521. * @default 0
  71522. * @since 3.0.0
  71523. */
  71524. this.angle = 0;
  71525. /**
  71526. * The magnitude of the Body's velocity, as calculated during the last update.
  71527. *
  71528. * @name Phaser.Physics.Arcade.Body#speed
  71529. * @type {number}
  71530. * @default 0
  71531. * @since 3.0.0
  71532. */
  71533. this.speed = 0;
  71534. /**
  71535. * The calculated direction of the Body's velocity.
  71536. *
  71537. * @name Phaser.Physics.Arcade.Body#facing
  71538. * @type {integer}
  71539. * @since 3.0.0
  71540. */
  71541. this.facing = CONST.FACING_NONE;
  71542. /**
  71543. * Whether this object can be moved by collisions with another body.
  71544. *
  71545. * @name Phaser.Physics.Arcade.Body#immovable
  71546. * @type {boolean}
  71547. * @default false
  71548. * @since 3.0.0
  71549. */
  71550. this.immovable = false;
  71551. /**
  71552. * Whether the Body's position and rotation are affected by its velocity, acceleration, drag, and gravity.
  71553. *
  71554. * @name Phaser.Physics.Arcade.Body#moves
  71555. * @type {boolean}
  71556. * @default true
  71557. * @since 3.0.0
  71558. */
  71559. this.moves = true;
  71560. /**
  71561. * A flag disabling the default horizontal separation of colliding bodies. Pass your own `processHandler` to the collider.
  71562. *
  71563. * @name Phaser.Physics.Arcade.Body#customSeparateX
  71564. * @type {boolean}
  71565. * @default false
  71566. * @since 3.0.0
  71567. */
  71568. this.customSeparateX = false;
  71569. /**
  71570. * A flag disabling the default vertical separation of colliding bodies. Pass your own `processHandler` to the collider.
  71571. *
  71572. * @name Phaser.Physics.Arcade.Body#customSeparateY
  71573. * @type {boolean}
  71574. * @default false
  71575. * @since 3.0.0
  71576. */
  71577. this.customSeparateY = false;
  71578. /**
  71579. * The amount of horizontal overlap (before separation), if this Body is colliding with another.
  71580. *
  71581. * @name Phaser.Physics.Arcade.Body#overlapX
  71582. * @type {number}
  71583. * @default 0
  71584. * @since 3.0.0
  71585. */
  71586. this.overlapX = 0;
  71587. /**
  71588. * The amount of vertical overlap (before separation), if this Body is colliding with another.
  71589. *
  71590. * @name Phaser.Physics.Arcade.Body#overlapY
  71591. * @type {number}
  71592. * @default 0
  71593. * @since 3.0.0
  71594. */
  71595. this.overlapY = 0;
  71596. /**
  71597. * The amount of overlap (before separation), if this Body is circular and colliding with another circular body.
  71598. *
  71599. * @name Phaser.Physics.Arcade.Body#overlapR
  71600. * @type {number}
  71601. * @default 0
  71602. * @since 3.0.0
  71603. */
  71604. this.overlapR = 0;
  71605. /**
  71606. * Whether this Body is overlapped with another and both have zero velocity.
  71607. *
  71608. * @name Phaser.Physics.Arcade.Body#embedded
  71609. * @type {boolean}
  71610. * @default false
  71611. * @since 3.0.0
  71612. */
  71613. this.embedded = false;
  71614. /**
  71615. * Whether this Body interacts with the world boundary.
  71616. *
  71617. * @name Phaser.Physics.Arcade.Body#collideWorldBounds
  71618. * @type {boolean}
  71619. * @default false
  71620. * @since 3.0.0
  71621. */
  71622. this.collideWorldBounds = false;
  71623. /**
  71624. * Whether this Body is checked for collisions and for which directions.
  71625. * You can set `checkCollision.none = false` to disable collision checks.
  71626. *
  71627. * @name Phaser.Physics.Arcade.Body#checkCollision
  71628. * @type {ArcadeBodyCollision}
  71629. * @since 3.0.0
  71630. */
  71631. this.checkCollision = { none: false, up: true, down: true, left: true, right: true };
  71632. /**
  71633. * Whether this Body is colliding with another and in which direction.
  71634. *
  71635. * @name Phaser.Physics.Arcade.Body#touching
  71636. * @type {ArcadeBodyCollision}
  71637. * @since 3.0.0
  71638. */
  71639. this.touching = { none: true, up: false, down: false, left: false, right: false };
  71640. /**
  71641. * Whether this Body was colliding with another during the last step, and in which direction.
  71642. *
  71643. * @name Phaser.Physics.Arcade.Body#wasTouching
  71644. * @type {ArcadeBodyCollision}
  71645. * @since 3.0.0
  71646. */
  71647. this.wasTouching = { none: true, up: false, down: false, left: false, right: false };
  71648. /**
  71649. * Whether this Body is colliding with a tile or the world boundary.
  71650. *
  71651. * @name Phaser.Physics.Arcade.Body#blocked
  71652. * @type {ArcadeBodyCollision}
  71653. * @since 3.0.0
  71654. */
  71655. this.blocked = { none: true, up: false, down: false, left: false, right: false };
  71656. /**
  71657. * Whether to automatically synchronize this Body's dimensions to the dimensions of its Game Object's visual bounds.
  71658. *
  71659. * @name Phaser.Physics.Arcade.Body#syncBounds
  71660. * @type {boolean}
  71661. * @default false
  71662. * @since 3.0.0
  71663. * @see Phaser.GameObjects.Components.GetBounds#getBounds
  71664. */
  71665. this.syncBounds = false;
  71666. /**
  71667. * Whether this Body is being moved by the `moveTo` or `moveFrom` methods.
  71668. *
  71669. * @name Phaser.Physics.Arcade.Body#isMoving
  71670. * @type {boolean}
  71671. * @default false
  71672. * @since 3.0.0
  71673. */
  71674. this.isMoving = false;
  71675. /**
  71676. * Whether this Body's movement by `moveTo` or `moveFrom` will be stopped by collisions with other bodies.
  71677. *
  71678. * @name Phaser.Physics.Arcade.Body#stopVelocityOnCollide
  71679. * @type {boolean}
  71680. * @default true
  71681. * @since 3.0.0
  71682. */
  71683. this.stopVelocityOnCollide = true;
  71684. // read-only
  71685. /**
  71686. * The Body's physics type (dynamic or static).
  71687. *
  71688. * @name Phaser.Physics.Arcade.Body#physicsType
  71689. * @type {integer}
  71690. * @readOnly
  71691. * @since 3.0.0
  71692. */
  71693. this.physicsType = CONST.DYNAMIC_BODY;
  71694. /**
  71695. * Whether the Body's position needs updating from its Game Object.
  71696. *
  71697. * @name Phaser.Physics.Arcade.Body#_reset
  71698. * @type {boolean}
  71699. * @private
  71700. * @default true
  71701. * @since 3.0.0
  71702. */
  71703. this._reset = true;
  71704. /**
  71705. * Cached horizontal scale of the Body's Game Object.
  71706. *
  71707. * @name Phaser.Physics.Arcade.Body#_sx
  71708. * @type {number}
  71709. * @private
  71710. * @since 3.0.0
  71711. */
  71712. this._sx = gameObject.scaleX;
  71713. /**
  71714. * Cached vertical scale of the Body's Game Object.
  71715. *
  71716. * @name Phaser.Physics.Arcade.Body#_sy
  71717. * @type {number}
  71718. * @private
  71719. * @since 3.0.0
  71720. */
  71721. this._sy = gameObject.scaleY;
  71722. /**
  71723. * The calculated change in the Body's horizontal position during the current step.
  71724. *
  71725. * @name Phaser.Physics.Arcade.Body#_dx
  71726. * @type {number}
  71727. * @private
  71728. * @default 0
  71729. * @since 3.0.0
  71730. */
  71731. this._dx = 0;
  71732. /**
  71733. * The calculated change in the Body's vertical position during the current step.
  71734. *
  71735. * @name Phaser.Physics.Arcade.Body#_dy
  71736. * @type {number}
  71737. * @private
  71738. * @default 0
  71739. * @since 3.0.0
  71740. */
  71741. this._dy = 0;
  71742. /**
  71743. * Stores the Game Object's bounds.
  71744. *
  71745. * @name Phaser.Physics.Arcade.Body#_bounds
  71746. * @type {Phaser.Geom.Rectangle}
  71747. * @private
  71748. * @since 3.0.0
  71749. */
  71750. this._bounds = new Rectangle();
  71751. this._tempMatrix = new TransformMatrix();
  71752. },
  71753. /**
  71754. * Updates this Body's transform, dimensions, and position from its Game Object.
  71755. *
  71756. * @method Phaser.Physics.Arcade.Body#updateBounds
  71757. * @since 3.0.0
  71758. */
  71759. updateBounds: function ()
  71760. {
  71761. var sprite = this.gameObject;
  71762. // Container?
  71763. var transform = this.transform;
  71764. if (sprite.parentContainer)
  71765. {
  71766. var matrix = sprite.getWorldTransformMatrix(this._tempMatrix);
  71767. transform.x = matrix.tx;
  71768. transform.y = matrix.ty;
  71769. transform.rotation = RadToDeg(matrix.rotation);
  71770. transform.scaleX = matrix.scaleX;
  71771. transform.scaleY = matrix.scaleY;
  71772. }
  71773. else
  71774. {
  71775. transform.x = sprite.x;
  71776. transform.y = sprite.y;
  71777. transform.rotation = sprite.angle;
  71778. transform.scaleX = sprite.scaleX;
  71779. transform.scaleY = sprite.scaleY;
  71780. }
  71781. var recalc = false;
  71782. if (this.syncBounds)
  71783. {
  71784. var b = sprite.getBounds(this._bounds);
  71785. this.width = b.width;
  71786. this.height = b.height;
  71787. recalc = true;
  71788. }
  71789. else
  71790. {
  71791. var asx = Math.abs(transform.scaleX);
  71792. var asy = Math.abs(transform.scaleY);
  71793. if (this._sx !== asx || this._sy !== asy)
  71794. {
  71795. this.width = this.sourceWidth * asx;
  71796. this.height = this.sourceHeight * asy;
  71797. this._sx = asx;
  71798. this._sy = asy;
  71799. recalc = true;
  71800. }
  71801. }
  71802. if (recalc)
  71803. {
  71804. this.halfWidth = Math.floor(this.width / 2);
  71805. this.halfHeight = Math.floor(this.height / 2);
  71806. this.updateCenter();
  71807. }
  71808. },
  71809. /**
  71810. * Updates the Body's `center` from its `position` and dimensions.
  71811. *
  71812. * @method Phaser.Physics.Arcade.Body#updateCenter
  71813. * @since 3.0.0
  71814. */
  71815. updateCenter: function ()
  71816. {
  71817. this.center.set(this.position.x + this.halfWidth, this.position.y + this.halfHeight);
  71818. },
  71819. /**
  71820. * Updates the Body.
  71821. *
  71822. * @method Phaser.Physics.Arcade.Body#update
  71823. * @fires Phaser.Physics.Arcade.World#worldbounds
  71824. * @since 3.0.0
  71825. *
  71826. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  71827. */
  71828. update: function (delta)
  71829. {
  71830. // Store and reset collision flags
  71831. this.wasTouching.none = this.touching.none;
  71832. this.wasTouching.up = this.touching.up;
  71833. this.wasTouching.down = this.touching.down;
  71834. this.wasTouching.left = this.touching.left;
  71835. this.wasTouching.right = this.touching.right;
  71836. this.touching.none = true;
  71837. this.touching.up = false;
  71838. this.touching.down = false;
  71839. this.touching.left = false;
  71840. this.touching.right = false;
  71841. this.blocked.none = true;
  71842. this.blocked.up = false;
  71843. this.blocked.down = false;
  71844. this.blocked.left = false;
  71845. this.blocked.right = false;
  71846. this.overlapR = 0;
  71847. this.overlapX = 0;
  71848. this.overlapY = 0;
  71849. this.embedded = false;
  71850. // Updates the transform values
  71851. this.updateBounds();
  71852. var sprite = this.transform;
  71853. this.position.x = sprite.x + sprite.scaleX * (this.offset.x - sprite.displayOriginX);
  71854. this.position.y = sprite.y + sprite.scaleY * (this.offset.y - sprite.displayOriginY);
  71855. this.updateCenter();
  71856. this.rotation = sprite.rotation;
  71857. this.preRotation = this.rotation;
  71858. if (this._reset)
  71859. {
  71860. this.prev.x = this.position.x;
  71861. this.prev.y = this.position.y;
  71862. }
  71863. if (this.moves)
  71864. {
  71865. this.world.updateMotion(this, delta);
  71866. var vx = this.velocity.x;
  71867. var vy = this.velocity.y;
  71868. this.newVelocity.set(vx * delta, vy * delta);
  71869. this.position.add(this.newVelocity);
  71870. this.updateCenter();
  71871. this.angle = Math.atan2(vy, vx);
  71872. this.speed = Math.sqrt(vx * vx + vy * vy);
  71873. // Now the State update will throw collision checks at the Body
  71874. // And finally we'll integrate the new position back to the Sprite in postUpdate
  71875. if (this.collideWorldBounds && this.checkWorldBounds() && this.onWorldBounds)
  71876. {
  71877. this.world.emit('worldbounds', this, this.blocked.up, this.blocked.down, this.blocked.left, this.blocked.right);
  71878. }
  71879. }
  71880. this._dx = this.deltaX();
  71881. this._dy = this.deltaY();
  71882. },
  71883. /**
  71884. * Feeds the Body results back into the parent Game Object.
  71885. *
  71886. * @method Phaser.Physics.Arcade.Body#postUpdate
  71887. * @since 3.0.0
  71888. *
  71889. * @param {boolean} resetDelta - Reset the delta properties?
  71890. */
  71891. postUpdate: function ()
  71892. {
  71893. this._dx = this.deltaX();
  71894. this._dy = this.deltaY();
  71895. if (this.moves)
  71896. {
  71897. if (this.deltaMax.x !== 0 && this._dx !== 0)
  71898. {
  71899. if (this._dx < 0 && this._dx < -this.deltaMax.x)
  71900. {
  71901. this._dx = -this.deltaMax.x;
  71902. }
  71903. else if (this._dx > 0 && this._dx > this.deltaMax.x)
  71904. {
  71905. this._dx = this.deltaMax.x;
  71906. }
  71907. }
  71908. if (this.deltaMax.y !== 0 && this._dy !== 0)
  71909. {
  71910. if (this._dy < 0 && this._dy < -this.deltaMax.y)
  71911. {
  71912. this._dy = -this.deltaMax.y;
  71913. }
  71914. else if (this._dy > 0 && this._dy > this.deltaMax.y)
  71915. {
  71916. this._dy = this.deltaMax.y;
  71917. }
  71918. }
  71919. this.gameObject.x += this._dx;
  71920. this.gameObject.y += this._dy;
  71921. this._reset = true;
  71922. }
  71923. if (this._dx < 0)
  71924. {
  71925. this.facing = CONST.FACING_LEFT;
  71926. }
  71927. else if (this._dx > 0)
  71928. {
  71929. this.facing = CONST.FACING_RIGHT;
  71930. }
  71931. if (this._dy < 0)
  71932. {
  71933. this.facing = CONST.FACING_UP;
  71934. }
  71935. else if (this._dy > 0)
  71936. {
  71937. this.facing = CONST.FACING_DOWN;
  71938. }
  71939. if (this.allowRotation)
  71940. {
  71941. this.gameObject.angle += this.deltaZ();
  71942. }
  71943. this.prev.x = this.position.x;
  71944. this.prev.y = this.position.y;
  71945. },
  71946. /**
  71947. * Checks for collisions between this Body and the world boundary and separates them.
  71948. *
  71949. * @method Phaser.Physics.Arcade.Body#checkWorldBounds
  71950. * @since 3.0.0
  71951. *
  71952. * @return {boolean} True if this Body is colliding with the world boundary.
  71953. */
  71954. checkWorldBounds: function ()
  71955. {
  71956. var pos = this.position;
  71957. var bounds = this.world.bounds;
  71958. var check = this.world.checkCollision;
  71959. var bx = (this.worldBounce) ? -this.worldBounce.x : -this.bounce.x;
  71960. var by = (this.worldBounce) ? -this.worldBounce.y : -this.bounce.y;
  71961. if (pos.x < bounds.x && check.left)
  71962. {
  71963. pos.x = bounds.x;
  71964. this.velocity.x *= bx;
  71965. this.blocked.left = true;
  71966. this.blocked.none = false;
  71967. }
  71968. else if (this.right > bounds.right && check.right)
  71969. {
  71970. pos.x = bounds.right - this.width;
  71971. this.velocity.x *= bx;
  71972. this.blocked.right = true;
  71973. this.blocked.none = false;
  71974. }
  71975. if (pos.y < bounds.y && check.up)
  71976. {
  71977. pos.y = bounds.y;
  71978. this.velocity.y *= by;
  71979. this.blocked.up = true;
  71980. this.blocked.none = false;
  71981. }
  71982. else if (this.bottom > bounds.bottom && check.down)
  71983. {
  71984. pos.y = bounds.bottom - this.height;
  71985. this.velocity.y *= by;
  71986. this.blocked.down = true;
  71987. this.blocked.none = false;
  71988. }
  71989. return !this.blocked.none;
  71990. },
  71991. /**
  71992. * Sets the offset of the Body's position from its Game Object's position.
  71993. *
  71994. * @method Phaser.Physics.Arcade.Body#setOffset
  71995. * @since 3.0.0
  71996. *
  71997. * @param {number} x - The horizontal offset, in source pixels.
  71998. * @param {number} [y=x] - The vertical offset, in source pixels.
  71999. *
  72000. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72001. */
  72002. setOffset: function (x, y)
  72003. {
  72004. if (y === undefined) { y = x; }
  72005. this.offset.set(x, y);
  72006. return this;
  72007. },
  72008. /**
  72009. * Sizes and positions this Body's boundary, as a rectangle.
  72010. * Modifies the Body's `offset` if `center` is true (the default).
  72011. *
  72012. * @method Phaser.Physics.Arcade.Body#setSize
  72013. * @since 3.0.0
  72014. *
  72015. * @param {number} width - The width of the Body, in source pixels.
  72016. * @param {number} height - The height of the Body, in source pixels.
  72017. * @param {boolean} [center=true] - Modify the Body's `offset`, placing the Body's center on its Game Object's center.
  72018. *
  72019. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72020. */
  72021. setSize: function (width, height, center)
  72022. {
  72023. if (center === undefined) { center = true; }
  72024. var gameObject = this.gameObject;
  72025. this.sourceWidth = width;
  72026. this.sourceHeight = height;
  72027. this.width = this.sourceWidth * this._sx;
  72028. this.height = this.sourceHeight * this._sy;
  72029. this.halfWidth = Math.floor(this.width / 2);
  72030. this.halfHeight = Math.floor(this.height / 2);
  72031. this.updateCenter();
  72032. if (center && gameObject.getCenter)
  72033. {
  72034. var ox = gameObject.displayWidth / 2;
  72035. var oy = gameObject.displayHeight / 2;
  72036. this.offset.set(ox - this.halfWidth, oy - this.halfHeight);
  72037. }
  72038. this.isCircle = false;
  72039. this.radius = 0;
  72040. return this;
  72041. },
  72042. /**
  72043. * Sizes and positions this Body's boundary, as a circle.
  72044. *
  72045. * @method Phaser.Physics.Arcade.Body#setCircle
  72046. * @since 3.0.0
  72047. *
  72048. * @param {number} radius - The radius of the Body, in source pixels.
  72049. * @param {number} [offsetX] - The horizontal offset of the Body from its Game Object, in source pixels.
  72050. * @param {number} [offsetY] - The vertical offset of the Body from its Game Object, in source pixels.
  72051. *
  72052. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72053. */
  72054. setCircle: function (radius, offsetX, offsetY)
  72055. {
  72056. if (offsetX === undefined) { offsetX = this.offset.x; }
  72057. if (offsetY === undefined) { offsetY = this.offset.y; }
  72058. if (radius > 0)
  72059. {
  72060. this.isCircle = true;
  72061. this.radius = radius;
  72062. this.sourceWidth = radius * 2;
  72063. this.sourceHeight = radius * 2;
  72064. this.width = this.sourceWidth * this._sx;
  72065. this.height = this.sourceHeight * this._sy;
  72066. this.halfWidth = Math.floor(this.width / 2);
  72067. this.halfHeight = Math.floor(this.height / 2);
  72068. this.offset.set(offsetX, offsetY);
  72069. this.updateCenter();
  72070. }
  72071. else
  72072. {
  72073. this.isCircle = false;
  72074. }
  72075. return this;
  72076. },
  72077. /**
  72078. * Resets this Body to the given coordinates. Also positions its parent Game Object to the same coordinates.
  72079. * If the Body had any velocity or acceleration it is lost as a result of calling this.
  72080. *
  72081. * @method Phaser.Physics.Arcade.Body#reset
  72082. * @since 3.0.0
  72083. *
  72084. * @param {number} x - The horizontal position to place the Game Object and Body.
  72085. * @param {number} y - The vertical position to place the Game Object and Body.
  72086. */
  72087. reset: function (x, y)
  72088. {
  72089. this.stop();
  72090. var gameObject = this.gameObject;
  72091. gameObject.setPosition(x, y);
  72092. gameObject.getTopLeft(this.position);
  72093. this.prev.copy(this.position);
  72094. this.rotation = gameObject.angle;
  72095. this.preRotation = gameObject.angle;
  72096. this.updateBounds();
  72097. this.updateCenter();
  72098. },
  72099. /**
  72100. * Sets acceleration, velocity, and speed to zero.
  72101. *
  72102. * @method Phaser.Physics.Arcade.Body#stop
  72103. * @since 3.0.0
  72104. *
  72105. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72106. */
  72107. stop: function ()
  72108. {
  72109. this.velocity.set(0);
  72110. this.acceleration.set(0);
  72111. this.speed = 0;
  72112. this.angularVelocity = 0;
  72113. this.angularAcceleration = 0;
  72114. return this;
  72115. },
  72116. /**
  72117. * Copies the coordinates of this Body's edges into an object.
  72118. *
  72119. * @method Phaser.Physics.Arcade.Body#getBounds
  72120. * @since 3.0.0
  72121. *
  72122. * @param {ArcadeBodyBounds} obj - An object to copy the values into.
  72123. *
  72124. * @return {ArcadeBodyBounds} - An object with {x, y, right, bottom}.
  72125. */
  72126. getBounds: function (obj)
  72127. {
  72128. obj.x = this.x;
  72129. obj.y = this.y;
  72130. obj.right = this.right;
  72131. obj.bottom = this.bottom;
  72132. return obj;
  72133. },
  72134. /**
  72135. * Tests if the coordinates are within this Body's boundary.
  72136. *
  72137. * @method Phaser.Physics.Arcade.Body#hitTest
  72138. * @since 3.0.0
  72139. *
  72140. * @param {number} x - The horizontal coordinate.
  72141. * @param {number} y - The vertical coordinate.
  72142. *
  72143. * @return {boolean} True if (x, y) is within this Body.
  72144. */
  72145. hitTest: function (x, y)
  72146. {
  72147. return (this.isCircle) ? CircleContains(this, x, y) : RectangleContains(this, x, y);
  72148. },
  72149. /**
  72150. * Whether this Body is touching a tile or the world boundary while moving down.
  72151. *
  72152. * @method Phaser.Physics.Arcade.Body#onFloor
  72153. * @since 3.0.0
  72154. * @see Phaser.Physics.Arcade.Body#blocked
  72155. *
  72156. * @return {boolean} True if touching.
  72157. */
  72158. onFloor: function ()
  72159. {
  72160. return this.blocked.down;
  72161. },
  72162. /**
  72163. * Whether this Body is touching a tile or the world boundary while moving up.
  72164. *
  72165. * @method Phaser.Physics.Arcade.Body#onCeiling
  72166. * @since 3.0.0
  72167. * @see Phaser.Physics.Arcade.Body#blocked
  72168. *
  72169. * @return {boolean} True if touching.
  72170. */
  72171. onCeiling: function ()
  72172. {
  72173. return this.blocked.up;
  72174. },
  72175. /**
  72176. * Whether this Body is touching a tile or the world boundary while moving left or right.
  72177. *
  72178. * @method Phaser.Physics.Arcade.Body#onWall
  72179. * @since 3.0.0
  72180. * @see Phaser.Physics.Arcade.Body#blocked
  72181. *
  72182. * @return {boolean} True if touching.
  72183. */
  72184. onWall: function ()
  72185. {
  72186. return (this.blocked.left || this.blocked.right);
  72187. },
  72188. /**
  72189. * The absolute (non-negative) change in this Body's horizontal position from the previous step.
  72190. *
  72191. * @method Phaser.Physics.Arcade.Body#deltaAbsX
  72192. * @since 3.0.0
  72193. *
  72194. * @return {number} The delta value.
  72195. */
  72196. deltaAbsX: function ()
  72197. {
  72198. return (this._dx > 0) ? this._dx : -this._dx;
  72199. },
  72200. /**
  72201. * The absolute (non-negative) change in this Body's vertical position from the previous step.
  72202. *
  72203. * @method Phaser.Physics.Arcade.Body#deltaAbsY
  72204. * @since 3.0.0
  72205. *
  72206. * @return {number} The delta value.
  72207. */
  72208. deltaAbsY: function ()
  72209. {
  72210. return (this._dy > 0) ? this._dy : -this._dy;
  72211. },
  72212. /**
  72213. * The change in this Body's horizontal position from the previous step.
  72214. * This value is set during the Body's update phase.
  72215. *
  72216. * @method Phaser.Physics.Arcade.Body#deltaX
  72217. * @since 3.0.0
  72218. *
  72219. * @return {number} The delta value.
  72220. */
  72221. deltaX: function ()
  72222. {
  72223. return this.position.x - this.prev.x;
  72224. },
  72225. /**
  72226. * The change in this Body's vertical position from the previous step.
  72227. * This value is set during the Body's update phase.
  72228. *
  72229. * @method Phaser.Physics.Arcade.Body#deltaY
  72230. * @since 3.0.0
  72231. *
  72232. * @return {number} The delta value.
  72233. */
  72234. deltaY: function ()
  72235. {
  72236. return this.position.y - this.prev.y;
  72237. },
  72238. /**
  72239. * The change in this Body's rotation from the previous step, in degrees.
  72240. *
  72241. * @method Phaser.Physics.Arcade.Body#deltaZ
  72242. * @since 3.0.0
  72243. *
  72244. * @return {number} The delta value.
  72245. */
  72246. deltaZ: function ()
  72247. {
  72248. return this.rotation - this.preRotation;
  72249. },
  72250. /**
  72251. * Disables this Body and marks it for deletion by the simulation.
  72252. *
  72253. * @method Phaser.Physics.Arcade.Body#destroy
  72254. * @since 3.0.0
  72255. */
  72256. destroy: function ()
  72257. {
  72258. this.enable = false;
  72259. this.world.pendingDestroy.set(this);
  72260. },
  72261. /**
  72262. * Draws this Body's boundary and velocity, if enabled.
  72263. *
  72264. * @method Phaser.Physics.Arcade.Body#drawDebug
  72265. * @since 3.0.0
  72266. *
  72267. * @param {Phaser.GameObjects.Graphics} graphic - The Graphics object to draw on.
  72268. */
  72269. drawDebug: function (graphic)
  72270. {
  72271. var pos = this.position;
  72272. var x = pos.x + this.halfWidth;
  72273. var y = pos.y + this.halfHeight;
  72274. if (this.debugShowBody)
  72275. {
  72276. graphic.lineStyle(1, this.debugBodyColor);
  72277. if (this.isCircle)
  72278. {
  72279. graphic.strokeCircle(x, y, this.width / 2);
  72280. }
  72281. else
  72282. {
  72283. graphic.strokeRect(pos.x, pos.y, this.width, this.height);
  72284. }
  72285. }
  72286. if (this.debugShowVelocity)
  72287. {
  72288. graphic.lineStyle(1, this.world.defaults.velocityDebugColor, 1);
  72289. graphic.lineBetween(x, y, x + this.velocity.x / 2, y + this.velocity.y / 2);
  72290. }
  72291. },
  72292. /**
  72293. * Whether this Body will be drawn to the debug display.
  72294. *
  72295. * @method Phaser.Physics.Arcade.Body#willDrawDebug
  72296. * @since 3.0.0
  72297. *
  72298. * @return {boolean} True if either `debugShowBody` or `debugShowVelocity` are enabled.
  72299. */
  72300. willDrawDebug: function ()
  72301. {
  72302. return (this.debugShowBody || this.debugShowVelocity);
  72303. },
  72304. /**
  72305. * Sets whether this Body collides with the world boundary.
  72306. *
  72307. * @method Phaser.Physics.Arcade.Body#setCollideWorldBounds
  72308. * @since 3.0.0
  72309. *
  72310. * @param {boolean} [value=true] - True (collisions) or false (no collisions).
  72311. *
  72312. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72313. */
  72314. setCollideWorldBounds: function (value)
  72315. {
  72316. if (value === undefined) { value = true; }
  72317. this.collideWorldBounds = value;
  72318. return this;
  72319. },
  72320. /**
  72321. * Sets the Body's velocity.
  72322. *
  72323. * @method Phaser.Physics.Arcade.Body#setVelocity
  72324. * @since 3.0.0
  72325. *
  72326. * @param {number} x - The horizontal velocity, in pixels per second.
  72327. * @param {number} [y=x] - The vertical velocity, in pixels per second.
  72328. *
  72329. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72330. */
  72331. setVelocity: function (x, y)
  72332. {
  72333. this.velocity.set(x, y);
  72334. return this;
  72335. },
  72336. /**
  72337. * Sets the Body's horizontal velocity.
  72338. *
  72339. * @method Phaser.Physics.Arcade.Body#setVelocityX
  72340. * @since 3.0.0
  72341. *
  72342. * @param {number} value - The velocity, in pixels per second.
  72343. *
  72344. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72345. */
  72346. setVelocityX: function (value)
  72347. {
  72348. this.velocity.x = value;
  72349. return this;
  72350. },
  72351. /**
  72352. * Sets the Body's vertical velocity.
  72353. *
  72354. * @method Phaser.Physics.Arcade.Body#setVelocityY
  72355. * @since 3.0.0
  72356. *
  72357. * @param {number} value - The velocity, in pixels per second.
  72358. *
  72359. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72360. */
  72361. setVelocityY: function (value)
  72362. {
  72363. this.velocity.y = value;
  72364. return this;
  72365. },
  72366. /**
  72367. * Sets the Body's maximum velocity.
  72368. *
  72369. * @method Phaser.Physics.Arcade.Body#setMaxVelocity
  72370. * @since 3.10.0
  72371. *
  72372. * @param {number} x - The horizontal velocity, in pixels per second.
  72373. * @param {number} [y=x] - The vertical velocity, in pixels per second.
  72374. *
  72375. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72376. */
  72377. setMaxVelocity: function (x, y)
  72378. {
  72379. this.maxVelocity.set(x, y);
  72380. return this;
  72381. },
  72382. /**
  72383. * Sets the Body's bounce.
  72384. *
  72385. * @method Phaser.Physics.Arcade.Body#setBounce
  72386. * @since 3.0.0
  72387. *
  72388. * @param {number} x - The horizontal bounce, relative to 1.
  72389. * @param {number} y - The vertical bounce, relative to 1.
  72390. *
  72391. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72392. */
  72393. setBounce: function (x, y)
  72394. {
  72395. this.bounce.set(x, y);
  72396. return this;
  72397. },
  72398. /**
  72399. * Sets the Body's horizontal bounce.
  72400. *
  72401. * @method Phaser.Physics.Arcade.Body#setBounceX
  72402. * @since 3.0.0
  72403. *
  72404. * @param {number} value - The bounce, relative to 1.
  72405. *
  72406. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72407. */
  72408. setBounceX: function (value)
  72409. {
  72410. this.bounce.x = value;
  72411. return this;
  72412. },
  72413. /**
  72414. * Sets the Body's vertical bounce.
  72415. *
  72416. * @method Phaser.Physics.Arcade.Body#setBounceY
  72417. * @since 3.0.0
  72418. *
  72419. * @param {number} value - The bounce, relative to 1.
  72420. *
  72421. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72422. */
  72423. setBounceY: function (value)
  72424. {
  72425. this.bounce.y = value;
  72426. return this;
  72427. },
  72428. /**
  72429. * Sets the Body's acceleration.
  72430. *
  72431. * @method Phaser.Physics.Arcade.Body#setAcceleration
  72432. * @since 3.0.0
  72433. *
  72434. * @param {number} x - The horizontal component, in pixels per second squared.
  72435. * @param {number} y - The vertical component, in pixels per second squared.
  72436. *
  72437. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72438. */
  72439. setAcceleration: function (x, y)
  72440. {
  72441. this.acceleration.set(x, y);
  72442. return this;
  72443. },
  72444. /**
  72445. * Sets the Body's horizontal acceleration.
  72446. *
  72447. * @method Phaser.Physics.Arcade.Body#setAccelerationX
  72448. * @since 3.0.0
  72449. *
  72450. * @param {number} value - The acceleration, in pixels per second squared.
  72451. *
  72452. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72453. */
  72454. setAccelerationX: function (value)
  72455. {
  72456. this.acceleration.x = value;
  72457. return this;
  72458. },
  72459. /**
  72460. * Sets the Body's vertical acceleration.
  72461. *
  72462. * @method Phaser.Physics.Arcade.Body#setAccelerationY
  72463. * @since 3.0.0
  72464. *
  72465. * @param {number} value - The acceleration, in pixels per second squared.
  72466. *
  72467. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72468. */
  72469. setAccelerationY: function (value)
  72470. {
  72471. this.acceleration.y = value;
  72472. return this;
  72473. },
  72474. /**
  72475. * Enables or disables drag.
  72476. *
  72477. * @method Phaser.Physics.Arcade.Body#setAllowDrag
  72478. * @since 3.9.0
  72479. * @see Phaser.Physics.Arcade.Body#allowDrag
  72480. *
  72481. * @param {boolean} [value=true] - `true` to allow drag on this body, or `false` to disable it.
  72482. *
  72483. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72484. */
  72485. setAllowDrag: function (value)
  72486. {
  72487. if (value === undefined) { value = true; }
  72488. this.allowDrag = value;
  72489. return this;
  72490. },
  72491. /**
  72492. * Enables or disables gravity's effect on this Body.
  72493. *
  72494. * @method Phaser.Physics.Arcade.Body#setAllowGravity
  72495. * @since 3.9.0
  72496. * @see Phaser.Physics.Arcade.Body#allowGravity
  72497. *
  72498. * @param {boolean} [value=true] - `true` to allow gravity on this body, or `false` to disable it.
  72499. *
  72500. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72501. */
  72502. setAllowGravity: function (value)
  72503. {
  72504. if (value === undefined) { value = true; }
  72505. this.allowGravity = value;
  72506. return this;
  72507. },
  72508. /**
  72509. * Enables or disables rotation.
  72510. *
  72511. * @method Phaser.Physics.Arcade.Body#setAllowRotation
  72512. * @since 3.9.0
  72513. * @see Phaser.Physics.Arcade.Body#allowRotation
  72514. *
  72515. * @param {boolean} [value=true] - `true` to allow rotation on this body, or `false` to disable it.
  72516. *
  72517. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72518. */
  72519. setAllowRotation: function (value)
  72520. {
  72521. if (value === undefined) { value = true; }
  72522. this.allowRotation = value;
  72523. return this;
  72524. },
  72525. /**
  72526. * Sets the Body's drag.
  72527. *
  72528. * @method Phaser.Physics.Arcade.Body#setDrag
  72529. * @since 3.0.0
  72530. *
  72531. * @param {number} x - The horizontal component, in pixels per second squared.
  72532. * @param {number} y - The vertical component, in pixels per second squared.
  72533. *
  72534. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72535. */
  72536. setDrag: function (x, y)
  72537. {
  72538. this.drag.set(x, y);
  72539. return this;
  72540. },
  72541. /**
  72542. * Sets the Body's horizontal drag.
  72543. *
  72544. * @method Phaser.Physics.Arcade.Body#setDragX
  72545. * @since 3.0.0
  72546. *
  72547. * @param {number} value - The drag, in pixels per second squared.
  72548. *
  72549. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72550. */
  72551. setDragX: function (value)
  72552. {
  72553. this.drag.x = value;
  72554. return this;
  72555. },
  72556. /**
  72557. * Sets the Body's vertical drag.
  72558. *
  72559. * @method Phaser.Physics.Arcade.Body#setDragY
  72560. * @since 3.0.0
  72561. *
  72562. * @param {number} value - The drag, in pixels per second squared.
  72563. *
  72564. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72565. */
  72566. setDragY: function (value)
  72567. {
  72568. this.drag.y = value;
  72569. return this;
  72570. },
  72571. /**
  72572. * Sets the Body's gravity.
  72573. *
  72574. * @method Phaser.Physics.Arcade.Body#setGravity
  72575. * @since 3.0.0
  72576. *
  72577. * @param {number} x - The horizontal component, in pixels per second squared.
  72578. * @param {number} y - The vertical component, in pixels per second squared.
  72579. *
  72580. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72581. */
  72582. setGravity: function (x, y)
  72583. {
  72584. this.gravity.set(x, y);
  72585. return this;
  72586. },
  72587. /**
  72588. * Sets the Body's horizontal gravity.
  72589. *
  72590. * @method Phaser.Physics.Arcade.Body#setGravityX
  72591. * @since 3.0.0
  72592. *
  72593. * @param {number} value - The gravity, in pixels per second squared.
  72594. *
  72595. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72596. */
  72597. setGravityX: function (value)
  72598. {
  72599. this.gravity.x = value;
  72600. return this;
  72601. },
  72602. /**
  72603. * Sets the Body's vertical gravity.
  72604. *
  72605. * @method Phaser.Physics.Arcade.Body#setGravityY
  72606. * @since 3.0.0
  72607. *
  72608. * @param {number} value - The gravity, in pixels per second squared.
  72609. *
  72610. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72611. */
  72612. setGravityY: function (value)
  72613. {
  72614. this.gravity.y = value;
  72615. return this;
  72616. },
  72617. /**
  72618. * Sets the Body's friction.
  72619. *
  72620. * @method Phaser.Physics.Arcade.Body#setFriction
  72621. * @since 3.0.0
  72622. *
  72623. * @param {number} x - The horizontal component, relative to 1.
  72624. * @param {number} y - The vertical component, relative to 1.
  72625. *
  72626. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72627. */
  72628. setFriction: function (x, y)
  72629. {
  72630. this.friction.set(x, y);
  72631. return this;
  72632. },
  72633. /**
  72634. * Sets the Body's horizontal friction.
  72635. *
  72636. * @method Phaser.Physics.Arcade.Body#setFrictionX
  72637. * @since 3.0.0
  72638. *
  72639. * @param {number} value - The friction value, relative to 1.
  72640. *
  72641. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72642. */
  72643. setFrictionX: function (value)
  72644. {
  72645. this.friction.x = value;
  72646. return this;
  72647. },
  72648. /**
  72649. * Sets the Body's vertical friction.
  72650. *
  72651. * @method Phaser.Physics.Arcade.Body#setFrictionY
  72652. * @since 3.0.0
  72653. *
  72654. * @param {number} value - The friction value, relative to 1.
  72655. *
  72656. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72657. */
  72658. setFrictionY: function (value)
  72659. {
  72660. this.friction.y = value;
  72661. return this;
  72662. },
  72663. /**
  72664. * Sets the Body's angular velocity.
  72665. *
  72666. * @method Phaser.Physics.Arcade.Body#setAngularVelocity
  72667. * @since 3.0.0
  72668. *
  72669. * @param {number} value - The velocity, in degrees per second.
  72670. *
  72671. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72672. */
  72673. setAngularVelocity: function (value)
  72674. {
  72675. this.angularVelocity = value;
  72676. return this;
  72677. },
  72678. /**
  72679. * Sets the Body's angular acceleration.
  72680. *
  72681. * @method Phaser.Physics.Arcade.Body#setAngularAcceleration
  72682. * @since 3.0.0
  72683. *
  72684. * @param {number} value - The acceleration, in degrees per second squared.
  72685. *
  72686. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72687. */
  72688. setAngularAcceleration: function (value)
  72689. {
  72690. this.angularAcceleration = value;
  72691. return this;
  72692. },
  72693. /**
  72694. * Sets the Body's angular drag.
  72695. *
  72696. * @method Phaser.Physics.Arcade.Body#setAngularDrag
  72697. * @since 3.0.0
  72698. *
  72699. * @param {number} value - The drag, in degrees per second squared.
  72700. *
  72701. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72702. */
  72703. setAngularDrag: function (value)
  72704. {
  72705. this.angularDrag = value;
  72706. return this;
  72707. },
  72708. /**
  72709. * Sets the Body's mass.
  72710. *
  72711. * @method Phaser.Physics.Arcade.Body#setMass
  72712. * @since 3.0.0
  72713. *
  72714. * @param {number} value - The mass value, relative to 1.
  72715. *
  72716. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72717. */
  72718. setMass: function (value)
  72719. {
  72720. this.mass = value;
  72721. return this;
  72722. },
  72723. /**
  72724. * Sets the Body's `immovable` property.
  72725. *
  72726. * @method Phaser.Physics.Arcade.Body#setImmovable
  72727. * @since 3.0.0
  72728. *
  72729. * @param {boolean} [value=true] - The value to assign to `immovable`.
  72730. *
  72731. * @return {Phaser.Physics.Arcade.Body} This Body object.
  72732. */
  72733. setImmovable: function (value)
  72734. {
  72735. if (value === undefined) { value = true; }
  72736. this.immovable = value;
  72737. return this;
  72738. },
  72739. /**
  72740. * The Body's horizontal position (left edge).
  72741. *
  72742. * @name Phaser.Physics.Arcade.Body#x
  72743. * @type {number}
  72744. * @since 3.0.0
  72745. */
  72746. x: {
  72747. get: function ()
  72748. {
  72749. return this.position.x;
  72750. },
  72751. set: function (value)
  72752. {
  72753. this.position.x = value;
  72754. }
  72755. },
  72756. /**
  72757. * The Body's vertical position (top edge).
  72758. *
  72759. * @name Phaser.Physics.Arcade.Body#y
  72760. * @type {number}
  72761. * @since 3.0.0
  72762. */
  72763. y: {
  72764. get: function ()
  72765. {
  72766. return this.position.y;
  72767. },
  72768. set: function (value)
  72769. {
  72770. this.position.y = value;
  72771. }
  72772. },
  72773. /**
  72774. * The left edge of the Body's boundary. Identical to x.
  72775. *
  72776. * @name Phaser.Physics.Arcade.Body#left
  72777. * @type {number}
  72778. * @readOnly
  72779. * @since 3.0.0
  72780. */
  72781. left: {
  72782. get: function ()
  72783. {
  72784. return this.position.x;
  72785. }
  72786. },
  72787. /**
  72788. * The right edge of the Body's boundary.
  72789. *
  72790. * @name Phaser.Physics.Arcade.Body#right
  72791. * @type {number}
  72792. * @readOnly
  72793. * @since 3.0.0
  72794. */
  72795. right: {
  72796. get: function ()
  72797. {
  72798. return this.position.x + this.width;
  72799. }
  72800. },
  72801. /**
  72802. * The top edge of the Body's boundary. Identical to y.
  72803. *
  72804. * @name Phaser.Physics.Arcade.Body#top
  72805. * @type {number}
  72806. * @readOnly
  72807. * @since 3.0.0
  72808. */
  72809. top: {
  72810. get: function ()
  72811. {
  72812. return this.position.y;
  72813. }
  72814. },
  72815. /**
  72816. * The bottom edge of this Body's boundary.
  72817. *
  72818. * @name Phaser.Physics.Arcade.Body#bottom
  72819. * @type {number}
  72820. * @readOnly
  72821. * @since 3.0.0
  72822. */
  72823. bottom: {
  72824. get: function ()
  72825. {
  72826. return this.position.y + this.height;
  72827. }
  72828. }
  72829. });
  72830. module.exports = Body;
  72831. /***/ }),
  72832. /* 345 */
  72833. /***/ (function(module, exports, __webpack_require__) {
  72834. /**
  72835. * @author Richard Davey <rich@photonstorm.com>
  72836. * @copyright 2018 Photon Storm Ltd.
  72837. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  72838. */
  72839. var Body = __webpack_require__(344);
  72840. var Clamp = __webpack_require__(19);
  72841. var Class = __webpack_require__(0);
  72842. var Collider = __webpack_require__(343);
  72843. var CONST = __webpack_require__(43);
  72844. var DistanceBetween = __webpack_require__(58);
  72845. var EventEmitter = __webpack_require__(9);
  72846. var FuzzyEqual = __webpack_require__(357);
  72847. var FuzzyGreaterThan = __webpack_require__(356);
  72848. var FuzzyLessThan = __webpack_require__(355);
  72849. var GetOverlapX = __webpack_require__(342);
  72850. var GetOverlapY = __webpack_require__(341);
  72851. var GetValue = __webpack_require__(4);
  72852. var ProcessQueue = __webpack_require__(228);
  72853. var ProcessTileCallbacks = __webpack_require__(694);
  72854. var Rectangle = __webpack_require__(13);
  72855. var RTree = __webpack_require__(227);
  72856. var SeparateTile = __webpack_require__(693);
  72857. var SeparateX = __webpack_require__(688);
  72858. var SeparateY = __webpack_require__(687);
  72859. var Set = __webpack_require__(69);
  72860. var StaticBody = __webpack_require__(339);
  72861. var TileIntersectsBody = __webpack_require__(340);
  72862. var Vector2 = __webpack_require__(6);
  72863. var Wrap = __webpack_require__(40);
  72864. /**
  72865. * @event Phaser.Physics.Arcade.World#pause
  72866. */
  72867. /**
  72868. * @event Phaser.Physics.Arcade.World#resume
  72869. */
  72870. /**
  72871. * @event Phaser.Physics.Arcade.World#collide
  72872. * @param {Phaser.GameObjects.GameObject} gameObject1
  72873. * @param {Phaser.GameObjects.GameObject} gameObject2
  72874. * @param {Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody} body1
  72875. * @param {Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody} body2
  72876. */
  72877. /**
  72878. * @event Phaser.Physics.Arcade.World#overlap
  72879. * @param {Phaser.GameObjects.GameObject} gameObject1
  72880. * @param {Phaser.GameObjects.GameObject} gameObject2
  72881. * @param {Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody} body1
  72882. * @param {Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody} body2
  72883. */
  72884. /**
  72885. * @event Phaser.Physics.Arcade.World#worldbounds
  72886. * @param {Phaser.Physics.Arcade.Body} body
  72887. * @param {boolean} up
  72888. * @param {boolean} down
  72889. * @param {boolean} left
  72890. * @param {boolean} right
  72891. */
  72892. /**
  72893. * @typedef {object} ArcadeWorldConfig
  72894. *
  72895. * @property {number} [fps=60] - Sets {@link Phaser.Physics.Arcade.World#fps}.
  72896. * @property {number} [timeScale=1] - Sets {@link Phaser.Physics.Arcade.World#timeScale}.
  72897. * @property {object} [gravity] - Sets {@link Phaser.Physics.Arcade.World#gravity}.
  72898. * @property {number} [gravity.x=0] - The horizontal world gravity value.
  72899. * @property {number} [gravity.y=0] - The vertical world gravity value.
  72900. * @property {number} [x=0] - Sets {@link Phaser.Physics.Arcade.World#bounds bounds.x}.
  72901. * @property {number} [y=0] - Sets {@link Phaser.Physics.Arcade.World#bounds bounds.y}.
  72902. * @property {number} [width=0] - Sets {@link Phaser.Physics.Arcade.World#bounds bounds.width}.
  72903. * @property {number} [height=0] - Sets {@link Phaser.Physics.Arcade.World#bounds bounds.height}.
  72904. * @property {object} [checkCollision] - Sets {@link Phaser.Physics.Arcade.World#checkCollision}.
  72905. * @property {boolean} [checkCollision.up=true] - Should bodies collide with the top of the world bounds?
  72906. * @property {boolean} [checkCollision.down=true] - Should bodies collide with the bottom of the world bounds?
  72907. * @property {boolean} [checkCollision.left=true] - Should bodies collide with the left of the world bounds?
  72908. * @property {boolean} [checkCollision.right=true] - Should bodies collide with the right of the world bounds?
  72909. * @property {number} [overlapBias=4] - Sets {@link Phaser.Physics.Arcade.World#OVERLAP_BIAS}.
  72910. * @property {number} [tileBias=16] - Sets {@link Phaser.Physics.Arcade.World#TILE_BIAS}.
  72911. * @property {boolean} [forceX=false] - Sets {@link Phaser.Physics.Arcade.World#forceX}.
  72912. * @property {boolean} [isPaused=false] - Sets {@link Phaser.Physics.Arcade.World#isPaused}.
  72913. * @property {boolean} [debug=false] - Sets {@link Phaser.Physics.Arcade.World#debug}.
  72914. * @property {boolean} [debugShowBody=true] - Sets {@link Phaser.Physics.Arcade.World#defaults debugShowBody}.
  72915. * @property {boolean} [debugShowStaticBody=true] - Sets {@link Phaser.Physics.Arcade.World#defaults debugShowStaticBody}.
  72916. * @property {boolean} [debugShowVelocity=true] - Sets {@link Phaser.Physics.Arcade.World#defaults debugShowStaticBody}.
  72917. * @property {number} [debugBodyColor=0xff00ff] - Sets {@link Phaser.Physics.Arcade.World#defaults debugBodyColor}.
  72918. * @property {number} [debugStaticBodyColor=0x0000ff] - Sets {@link Phaser.Physics.Arcade.World#defaults debugStaticBodyColor}.
  72919. * @property {number} [debugVelocityColor=0x00ff00] - Sets {@link Phaser.Physics.Arcade.World#defaults debugVelocityColor}.
  72920. * @property {number} [maxEntries=16] - Sets {@link Phaser.Physics.Arcade.World#maxEntries}.
  72921. * @property {boolean} [useTree=true] - Sets {@link Phaser.Physics.Arcade.World#useTree}.
  72922. */
  72923. /**
  72924. * @typedef {object} CheckCollisionObject
  72925. *
  72926. * @property {boolean} up - [description]
  72927. * @property {boolean} down - [description]
  72928. * @property {boolean} left - [description]
  72929. * @property {boolean} right - [description]
  72930. */
  72931. /**
  72932. * @typedef {object} ArcadeWorldDefaults
  72933. *
  72934. * @property {boolean} debugShowBody - [description]
  72935. * @property {boolean} debugShowStaticBody - [description]
  72936. * @property {boolean} debugShowVelocity - [description]
  72937. * @property {number} bodyDebugColor - [description]
  72938. * @property {number} staticBodyDebugColor - [description]
  72939. * @property {number} velocityDebugColor - [description]
  72940. */
  72941. /**
  72942. * @typedef {object} ArcadeWorldTreeMinMax
  72943. *
  72944. * @property {number} minX - [description]
  72945. * @property {number} minY - [description]
  72946. * @property {number} maxX - [description]
  72947. * @property {number} maxY - [description]
  72948. */
  72949. /**
  72950. * An Arcade Physics Collider Type.
  72951. *
  72952. * @typedef {(
  72953. * Phaser.GameObjects.GameObject|
  72954. * Phaser.GameObjects.Group|
  72955. * Phaser.Physics.Arcade.Sprite|
  72956. * Phaser.Physics.Arcade.Image|
  72957. * Phaser.Physics.Arcade.StaticGroup|
  72958. * Phaser.Physics.Arcade.Group|
  72959. * Phaser.Tilemaps.DynamicTilemapLayer|
  72960. * Phaser.Tilemaps.StaticTilemapLayer|
  72961. * Phaser.GameObjects.GameObject[]|
  72962. * Phaser.Physics.Arcade.Sprite[]|
  72963. * Phaser.Physics.Arcade.Image[]|
  72964. * Phaser.Physics.Arcade.StaticGroup[]|
  72965. * Phaser.Physics.Arcade.Group[]|
  72966. * Phaser.Tilemaps.DynamicTilemapLayer[]|
  72967. * Phaser.Tilemaps.StaticTilemapLayer[]
  72968. * )} ArcadeColliderType
  72969. */
  72970. /**
  72971. * @classdesc
  72972. * The Arcade Physics World.
  72973. *
  72974. * The World is responsible for creating, managing, colliding and updating all of the bodies within it.
  72975. *
  72976. * An instance of the World belongs to a Phaser.Scene and is accessed via the property `physics.world`.
  72977. *
  72978. * @class World
  72979. * @extends Phaser.Events.EventEmitter
  72980. * @memberOf Phaser.Physics.Arcade
  72981. * @constructor
  72982. * @since 3.0.0
  72983. *
  72984. * @param {Phaser.Scene} scene - The Scene to which this World instance belongs.
  72985. * @param {ArcadeWorldConfig} config - An Arcade Physics Configuration object.
  72986. */
  72987. var World = new Class({
  72988. Extends: EventEmitter,
  72989. initialize:
  72990. function World (scene, config)
  72991. {
  72992. EventEmitter.call(this);
  72993. /**
  72994. * The Scene this simulation belongs to.
  72995. *
  72996. * @name Phaser.Physics.Arcade.World#scene
  72997. * @type {Phaser.Scene}
  72998. * @since 3.0.0
  72999. */
  73000. this.scene = scene;
  73001. /**
  73002. * Dynamic Bodies in this simulation.
  73003. *
  73004. * @name Phaser.Physics.Arcade.World#bodies
  73005. * @type {Phaser.Structs.Set.<Phaser.Physics.Arcade.Body>}
  73006. * @since 3.0.0
  73007. */
  73008. this.bodies = new Set();
  73009. /**
  73010. * Static Bodies in this simulation.
  73011. *
  73012. * @name Phaser.Physics.Arcade.World#staticBodies
  73013. * @type {Phaser.Structs.Set.<Phaser.Physics.Arcade.StaticBody>}
  73014. * @since 3.0.0
  73015. */
  73016. this.staticBodies = new Set();
  73017. /**
  73018. * Static Bodies marked for deletion.
  73019. *
  73020. * @name Phaser.Physics.Arcade.World#pendingDestroy
  73021. * @type {Phaser.Structs.Set.<(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)>}
  73022. * @since 3.1.0
  73023. */
  73024. this.pendingDestroy = new Set();
  73025. /**
  73026. * This simulation's collision processors.
  73027. *
  73028. * @name Phaser.Physics.Arcade.World#colliders
  73029. * @type {Phaser.Structs.ProcessQueue.<Phaser.Physics.Arcade.Collider>}
  73030. * @since 3.0.0
  73031. */
  73032. this.colliders = new ProcessQueue();
  73033. /**
  73034. * Acceleration of Bodies due to gravity, in pixels per second.
  73035. *
  73036. * @name Phaser.Physics.Arcade.World#gravity
  73037. * @type {Phaser.Math.Vector2}
  73038. * @since 3.0.0
  73039. */
  73040. this.gravity = new Vector2(GetValue(config, 'gravity.x', 0), GetValue(config, 'gravity.y', 0));
  73041. /**
  73042. * A boundary constraining Bodies.
  73043. *
  73044. * @name Phaser.Physics.Arcade.World#bounds
  73045. * @type {Phaser.Geom.Rectangle}
  73046. * @since 3.0.0
  73047. */
  73048. this.bounds = new Rectangle(
  73049. GetValue(config, 'x', 0),
  73050. GetValue(config, 'y', 0),
  73051. GetValue(config, 'width', scene.sys.game.config.width),
  73052. GetValue(config, 'height', scene.sys.game.config.height)
  73053. );
  73054. /**
  73055. * The boundary edges that Bodies can collide with.
  73056. *
  73057. * @name Phaser.Physics.Arcade.World#checkCollision
  73058. * @type {CheckCollisionObject}
  73059. * @since 3.0.0
  73060. */
  73061. this.checkCollision = {
  73062. up: GetValue(config, 'checkCollision.up', true),
  73063. down: GetValue(config, 'checkCollision.down', true),
  73064. left: GetValue(config, 'checkCollision.left', true),
  73065. right: GetValue(config, 'checkCollision.right', true)
  73066. };
  73067. /**
  73068. * The number of physics steps to be taken per second.
  73069. *
  73070. * This property is read-only. Use the `setFPS` method to modify it at run-time.
  73071. *
  73072. * @name Phaser.Physics.Arcade.World#fps
  73073. * @readOnly
  73074. * @type {number}
  73075. * @default 60
  73076. * @since 3.10.0
  73077. */
  73078. this.fps = GetValue(config, 'fps', 60);
  73079. /**
  73080. * The amount of elapsed ms since the last frame.
  73081. *
  73082. * @name Phaser.Physics.Arcade.World#_elapsed
  73083. * @private
  73084. * @type {number}
  73085. * @since 3.10.0
  73086. */
  73087. this._elapsed = 0;
  73088. /**
  73089. * Internal frame time value.
  73090. *
  73091. * @name Phaser.Physics.Arcade.World#_frameTime
  73092. * @private
  73093. * @type {number}
  73094. * @since 3.10.0
  73095. */
  73096. this._frameTime = 1 / this.fps;
  73097. /**
  73098. * Internal frame time ms value.
  73099. *
  73100. * @name Phaser.Physics.Arcade.World#_frameTimeMS
  73101. * @private
  73102. * @type {number}
  73103. * @since 3.10.0
  73104. */
  73105. this._frameTimeMS = 1000 * this._frameTime;
  73106. /**
  73107. * The number of steps that took place in the last frame.
  73108. *
  73109. * @name Phaser.Physics.Arcade.World#stepsLastFrame
  73110. * @readOnly
  73111. * @type {number}
  73112. * @since 3.10.0
  73113. */
  73114. this.stepsLastFrame = 0;
  73115. /**
  73116. * Scaling factor applied to the frame rate.
  73117. *
  73118. * - 1.0 = normal speed
  73119. * - 2.0 = half speed
  73120. * - 0.5 = double speed
  73121. *
  73122. * @name Phaser.Physics.Arcade.World#timeScale
  73123. * @property {number}
  73124. * @default 1
  73125. * @since 3.10.0
  73126. */
  73127. this.timeScale = GetValue(config, 'timeScale', 1);
  73128. /**
  73129. * 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*.
  73130. * Larger values favor separation.
  73131. * Smaller values favor no separation.
  73132. *
  73133. * @name Phaser.Physics.Arcade.World#OVERLAP_BIAS
  73134. * @type {number}
  73135. * @default 4
  73136. * @since 3.0.0
  73137. */
  73138. this.OVERLAP_BIAS = GetValue(config, 'overlapBias', 4);
  73139. /**
  73140. * The maximum absolute value of a Body's overlap with a tile that will result in separation on *each axis*.
  73141. * Larger values favor separation.
  73142. * Smaller values favor no separation.
  73143. * The optimum value may be similar to the tile size.
  73144. *
  73145. * @name Phaser.Physics.Arcade.World#TILE_BIAS
  73146. * @type {number}
  73147. * @default 16
  73148. * @since 3.0.0
  73149. */
  73150. this.TILE_BIAS = GetValue(config, 'tileBias', 16);
  73151. /**
  73152. * Always separate overlapping Bodies horizontally before vertically.
  73153. * False (the default) means Bodies are first separated on the axis of greater gravity, or the vertical axis if neither is greater.
  73154. *
  73155. * @name Phaser.Physics.Arcade.World#forceX
  73156. * @type {boolean}
  73157. * @default false
  73158. * @since 3.0.0
  73159. */
  73160. this.forceX = GetValue(config, 'forceX', false);
  73161. /**
  73162. * Whether the simulation advances with the game loop.
  73163. *
  73164. * @name Phaser.Physics.Arcade.World#isPaused
  73165. * @type {boolean}
  73166. * @default false
  73167. * @since 3.0.0
  73168. */
  73169. this.isPaused = GetValue(config, 'isPaused', false);
  73170. /**
  73171. * Temporary total of colliding Bodies.
  73172. *
  73173. * @name Phaser.Physics.Arcade.World#_total
  73174. * @type {number}
  73175. * @private
  73176. * @default 0
  73177. * @since 3.0.0
  73178. */
  73179. this._total = 0;
  73180. /**
  73181. * Enables the debug display.
  73182. *
  73183. * @name Phaser.Physics.Arcade.World#drawDebug
  73184. * @type {boolean}
  73185. * @default false
  73186. * @since 3.0.0
  73187. */
  73188. this.drawDebug = GetValue(config, 'debug', false);
  73189. /**
  73190. * The graphics object drawing the debug display.
  73191. *
  73192. * @name Phaser.Physics.Arcade.World#debugGraphic
  73193. * @type {Phaser.GameObjects.Graphics}
  73194. * @since 3.0.0
  73195. */
  73196. this.debugGraphic;
  73197. /**
  73198. * Default debug display settings for new Bodies.
  73199. *
  73200. * @name Phaser.Physics.Arcade.World#defaults
  73201. * @type {ArcadeWorldDefaults}
  73202. * @since 3.0.0
  73203. */
  73204. this.defaults = {
  73205. debugShowBody: GetValue(config, 'debugShowBody', true),
  73206. debugShowStaticBody: GetValue(config, 'debugShowStaticBody', true),
  73207. debugShowVelocity: GetValue(config, 'debugShowVelocity', true),
  73208. bodyDebugColor: GetValue(config, 'debugBodyColor', 0xff00ff),
  73209. staticBodyDebugColor: GetValue(config, 'debugStaticBodyColor', 0x0000ff),
  73210. velocityDebugColor: GetValue(config, 'debugVelocityColor', 0x00ff00)
  73211. };
  73212. /**
  73213. * The maximum number of items per node on the RTree.
  73214. *
  73215. * This is ignored if `useTree` is `false`. If you have a large number of bodies in
  73216. * your world then you may find search performance improves by increasing this value,
  73217. * to allow more items per node and less node division.
  73218. *
  73219. * @name Phaser.Physics.Arcade.World#maxEntries
  73220. * @type {integer}
  73221. * @default 16
  73222. * @since 3.0.0
  73223. */
  73224. this.maxEntries = GetValue(config, 'maxEntries', 16);
  73225. /**
  73226. * Should this Arcade Physics World use an RTree for Dynamic Physics bodies or not?
  73227. *
  73228. * An RTree is a fast way of spatially sorting of all the moving bodies in the world.
  73229. * However, at certain limits, the cost of clearing and inserting the bodies into the
  73230. * tree every frame becomes more expensive than the search speed gains it provides.
  73231. *
  73232. * If you have a large number of dynamic bodies in your world then it may be best to
  73233. * disable the use of the RTree by setting this property to `true`.
  73234. * The number it can cope with depends on browser and device, but a conservative estimate
  73235. * of around 5,000 bodies should be considered the max before disabling it.
  73236. *
  73237. * Note this only applies to dynamic bodies. Static bodies are always kept in an RTree,
  73238. * because they don't have to be cleared every frame, so you benefit from the
  73239. * massive search speeds all the time.
  73240. *
  73241. * @name Phaser.Physics.Arcade.World#useTree
  73242. * @type {boolean}
  73243. * @default true
  73244. * @since 3.10.0
  73245. */
  73246. this.useTree = GetValue(config, 'useTree', true);
  73247. /**
  73248. * The spatial index of Dynamic Bodies.
  73249. *
  73250. * @name Phaser.Physics.Arcade.World#tree
  73251. * @type {Phaser.Structs.RTree}
  73252. * @since 3.0.0
  73253. */
  73254. this.tree = new RTree(this.maxEntries);
  73255. /**
  73256. * The spatial index of Static Bodies.
  73257. *
  73258. * @name Phaser.Physics.Arcade.World#staticTree
  73259. * @type {Phaser.Structs.RTree}
  73260. * @since 3.0.0
  73261. */
  73262. this.staticTree = new RTree(this.maxEntries);
  73263. /**
  73264. * Recycled input for tree searches.
  73265. *
  73266. * @name Phaser.Physics.Arcade.World#treeMinMax
  73267. * @type {ArcadeWorldTreeMinMax}
  73268. * @since 3.0.0
  73269. */
  73270. this.treeMinMax = { minX: 0, minY: 0, maxX: 0, maxY: 0 };
  73271. if (this.drawDebug)
  73272. {
  73273. this.createDebugGraphic();
  73274. }
  73275. },
  73276. /**
  73277. * Adds an Arcade Physics Body to a Game Object, an array of Game Objects, or the children of a Group.
  73278. *
  73279. * The difference between this and the `enableBody` method is that you can pass arrays or Groups
  73280. * to this method.
  73281. *
  73282. * You can specify if the bodies are to be Dynamic or Static. A dynamic body can move via velocity and
  73283. * acceleration. A static body remains fixed in place and as such is able to use an optimized search
  73284. * tree, making it ideal for static elements such as level objects. You can still collide and overlap
  73285. * with static bodies.
  73286. *
  73287. * Normally, rather than calling this method directly, you'd use the helper methods available in the
  73288. * Arcade Physics Factory, such as:
  73289. *
  73290. * ```javascript
  73291. * this.physics.add.image(x, y, textureKey);
  73292. * this.physics.add.sprite(x, y, textureKey);
  73293. * ```
  73294. *
  73295. * Calling factory methods encapsulates the creation of a Game Object and the creation of its
  73296. * body at the same time. If you are creating custom classes then you can pass them to this
  73297. * method to have their bodies created.
  73298. *
  73299. * @method Phaser.Physics.Arcade.World#enable
  73300. * @since 3.0.0
  73301. *
  73302. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group|Phaser.GameObjects.Group[])} object - The object, or objects, on which to create the bodies.
  73303. * @param {integer} [bodyType] - The type of Body to create. Either `DYNAMIC_BODY` or `STATIC_BODY`.
  73304. */
  73305. enable: function (object, bodyType)
  73306. {
  73307. if (bodyType === undefined) { bodyType = CONST.DYNAMIC_BODY; }
  73308. if (!Array.isArray(object))
  73309. {
  73310. object = [ object ];
  73311. }
  73312. for (var i = 0; i < object.length; i++)
  73313. {
  73314. var entry = object[i];
  73315. if (entry.isParent)
  73316. {
  73317. var children = entry.getChildren();
  73318. for (var c = 0; c < children.length; c++)
  73319. {
  73320. var child = children[c];
  73321. if (child.isParent)
  73322. {
  73323. // Handle Groups nested inside of Groups
  73324. this.enable(child, bodyType);
  73325. }
  73326. else
  73327. {
  73328. this.enableBody(child, bodyType);
  73329. }
  73330. }
  73331. }
  73332. else
  73333. {
  73334. this.enableBody(entry, bodyType);
  73335. }
  73336. }
  73337. },
  73338. /**
  73339. * Creates an Arcade Physics Body on a single Game Object.
  73340. *
  73341. * If the Game Object already has a body, this method will simply add it back into the simulation.
  73342. *
  73343. * You can specify if the body is Dynamic or Static. A dynamic body can move via velocity and
  73344. * acceleration. A static body remains fixed in place and as such is able to use an optimized search
  73345. * tree, making it ideal for static elements such as level objects. You can still collide and overlap
  73346. * with static bodies.
  73347. *
  73348. * Normally, rather than calling this method directly, you'd use the helper methods available in the
  73349. * Arcade Physics Factory, such as:
  73350. *
  73351. * ```javascript
  73352. * this.physics.add.image(x, y, textureKey);
  73353. * this.physics.add.sprite(x, y, textureKey);
  73354. * ```
  73355. *
  73356. * Calling factory methods encapsulates the creation of a Game Object and the creation of its
  73357. * body at the same time. If you are creating custom classes then you can pass them to this
  73358. * method to have their bodies created.
  73359. *
  73360. * @method Phaser.Physics.Arcade.World#enableBody
  73361. * @since 3.0.0
  73362. *
  73363. * @param {Phaser.GameObjects.GameObject} object - The Game Object on which to create the body.
  73364. * @param {integer} [bodyType] - The type of Body to create. Either `DYNAMIC_BODY` or `STATIC_BODY`.
  73365. *
  73366. * @return {Phaser.GameObjects.GameObject} The Game Object on which the body was created.
  73367. */
  73368. enableBody: function (object, bodyType)
  73369. {
  73370. if (bodyType === undefined) { bodyType = CONST.DYNAMIC_BODY; }
  73371. if (!object.body)
  73372. {
  73373. if (bodyType === CONST.DYNAMIC_BODY)
  73374. {
  73375. object.body = new Body(this, object);
  73376. }
  73377. else if (bodyType === CONST.STATIC_BODY)
  73378. {
  73379. object.body = new StaticBody(this, object);
  73380. }
  73381. }
  73382. this.add(object.body);
  73383. return object;
  73384. },
  73385. /**
  73386. * Adds an existing Arcade Physics Body or StaticBody to the simulation.
  73387. *
  73388. * The body is enabled and added to the local search trees.
  73389. *
  73390. * @method Phaser.Physics.Arcade.World#add
  73391. * @since 3.10.0
  73392. *
  73393. * @param {(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)} body - The Body to be added to the simulation.
  73394. *
  73395. * @return {(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)} The Body that was added to the simulation.
  73396. */
  73397. add: function (body)
  73398. {
  73399. if (body.physicsType === CONST.DYNAMIC_BODY)
  73400. {
  73401. this.bodies.set(body);
  73402. }
  73403. else if (body.physicsType === CONST.STATIC_BODY)
  73404. {
  73405. this.staticBodies.set(body);
  73406. this.staticTree.insert(body);
  73407. }
  73408. body.enable = true;
  73409. return body;
  73410. },
  73411. /**
  73412. * Disables the Arcade Physics Body of a Game Object, an array of Game Objects, or the children of a Group.
  73413. *
  73414. * The difference between this and the `disableBody` method is that you can pass arrays or Groups
  73415. * to this method.
  73416. *
  73417. * The body itself is not deleted, it just has its `enable` property set to false, which
  73418. * means you can re-enable it again at any point by passing it to enable `World.enable` or `World.add`.
  73419. *
  73420. * @method Phaser.Physics.Arcade.World#disable
  73421. * @since 3.0.0
  73422. *
  73423. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group|Phaser.GameObjects.Group[])} object - The object, or objects, on which to disable the bodies.
  73424. */
  73425. disable: function (object)
  73426. {
  73427. if (!Array.isArray(object))
  73428. {
  73429. object = [ object ];
  73430. }
  73431. for (var i = 0; i < object.length; i++)
  73432. {
  73433. var entry = object[i];
  73434. if (entry.isParent)
  73435. {
  73436. var children = entry.getChildren();
  73437. for (var c = 0; c < children.length; c++)
  73438. {
  73439. var child = children[c];
  73440. if (child.isParent)
  73441. {
  73442. // Handle Groups nested inside of Groups
  73443. this.disable(child);
  73444. }
  73445. else
  73446. {
  73447. this.disableBody(child);
  73448. }
  73449. }
  73450. }
  73451. else
  73452. {
  73453. this.disableBody(entry);
  73454. }
  73455. }
  73456. },
  73457. /**
  73458. * Disables an existing Arcade Physics Body or StaticBody and removes it from the simulation.
  73459. *
  73460. * The body is disabled and removed from the local search trees.
  73461. *
  73462. * The body itself is not deleted, it just has its `enable` property set to false, which
  73463. * means you can re-enable it again at any point by passing it to enable `World.enable` or `World.add`.
  73464. *
  73465. * @method Phaser.Physics.Arcade.World#disableBody
  73466. * @since 3.0.0
  73467. *
  73468. * @param {(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)} body - The Body to be disabled.
  73469. */
  73470. disableBody: function (body)
  73471. {
  73472. this.remove(body);
  73473. body.enable = false;
  73474. },
  73475. /**
  73476. * Removes an existing Arcade Physics Body or StaticBody from the simulation.
  73477. *
  73478. * The body is disabled and removed from the local search trees.
  73479. *
  73480. * The body itself is not deleted, it just has its `enabled` property set to false, which
  73481. * means you can re-enable it again at any point by passing it to enable `enable` or `add`.
  73482. *
  73483. * @method Phaser.Physics.Arcade.World#remove
  73484. * @since 3.0.0
  73485. *
  73486. * @param {(Phaser.Physics.Arcade.Body|Phaser.Physics.Arcade.StaticBody)} body - The body to be removed from the simulation.
  73487. */
  73488. remove: function (body)
  73489. {
  73490. if (body.physicsType === CONST.DYNAMIC_BODY)
  73491. {
  73492. this.tree.remove(body);
  73493. this.bodies.delete(body);
  73494. }
  73495. else if (body.physicsType === CONST.STATIC_BODY)
  73496. {
  73497. this.staticBodies.delete(body);
  73498. this.staticTree.remove(body);
  73499. }
  73500. },
  73501. /**
  73502. * Creates a Graphics Game Object that the world will use to render the debug display to.
  73503. *
  73504. * This is called automatically when the World is instantiated if the `debug` config property
  73505. * was set to `true`. However, you can call it at any point should you need to display the
  73506. * debug Graphic from a fixed point.
  73507. *
  73508. * You can control which objects are drawn to the Graphics object, and the colors they use,
  73509. * by setting the debug properties in the physics config.
  73510. *
  73511. * You should not typically use this in a production game. Use it to aid during debugging.
  73512. *
  73513. * @method Phaser.Physics.Arcade.World#createDebugGraphic
  73514. * @since 3.0.0
  73515. *
  73516. * @return {Phaser.GameObjects.Graphics} The Graphics object that was created for use by the World.
  73517. */
  73518. createDebugGraphic: function ()
  73519. {
  73520. var graphic = this.scene.sys.add.graphics({ x: 0, y: 0 });
  73521. graphic.setDepth(Number.MAX_VALUE);
  73522. this.debugGraphic = graphic;
  73523. this.drawDebug = true;
  73524. return graphic;
  73525. },
  73526. /**
  73527. * Sets the position, size and properties of the World boundary.
  73528. *
  73529. * The World boundary is an invisible rectangle that defines the edges of the World.
  73530. * If a Body is set to collide with the world bounds then it will automatically stop
  73531. * when it reaches any of the edges. You can optionally set which edges of the boundary
  73532. * should be checked against.
  73533. *
  73534. * @method Phaser.Physics.Arcade.World#setBounds
  73535. * @since 3.0.0
  73536. *
  73537. * @param {number} x - The top-left x coordinate of the boundary.
  73538. * @param {number} y - The top-left y coordinate of the boundary.
  73539. * @param {number} width - The width of the boundary.
  73540. * @param {number} height - The height of the boundary.
  73541. * @param {boolean} [checkLeft] - Should bodies check against the left edge of the boundary?
  73542. * @param {boolean} [checkRight] - Should bodies check against the right edge of the boundary?
  73543. * @param {boolean} [checkUp] - Should bodies check against the top edge of the boundary?
  73544. * @param {boolean} [checkDown] - Should bodies check against the bottom edge of the boundary?
  73545. *
  73546. * @return {Phaser.Physics.Arcade.World} This World object.
  73547. */
  73548. setBounds: function (x, y, width, height, checkLeft, checkRight, checkUp, checkDown)
  73549. {
  73550. this.bounds.setTo(x, y, width, height);
  73551. if (checkLeft !== undefined)
  73552. {
  73553. this.setBoundsCollision(checkLeft, checkRight, checkUp, checkDown);
  73554. }
  73555. return this;
  73556. },
  73557. /**
  73558. * Enables or disables collisions on each edge of the World boundary.
  73559. *
  73560. * @method Phaser.Physics.Arcade.World#setBoundsCollision
  73561. * @since 3.0.0
  73562. *
  73563. * @param {boolean} [left=true] - Should bodies check against the left edge of the boundary?
  73564. * @param {boolean} [right=true] - Should bodies check against the right edge of the boundary?
  73565. * @param {boolean} [up=true] - Should bodies check against the top edge of the boundary?
  73566. * @param {boolean} [down=true] - Should bodies check against the bottom edge of the boundary?
  73567. *
  73568. * @return {Phaser.Physics.Arcade.World} This World object.
  73569. */
  73570. setBoundsCollision: function (left, right, up, down)
  73571. {
  73572. if (left === undefined) { left = true; }
  73573. if (right === undefined) { right = true; }
  73574. if (up === undefined) { up = true; }
  73575. if (down === undefined) { down = true; }
  73576. this.checkCollision.left = left;
  73577. this.checkCollision.right = right;
  73578. this.checkCollision.up = up;
  73579. this.checkCollision.down = down;
  73580. return this;
  73581. },
  73582. /**
  73583. * Pauses the simulation.
  73584. *
  73585. * A paused simulation does not update any existing bodies, or run any Colliders.
  73586. *
  73587. * However, you can still enable and disable bodies within it, or manually run collide or overlap
  73588. * checks.
  73589. *
  73590. * @method Phaser.Physics.Arcade.World#pause
  73591. * @fires Phaser.Physics.Arcade.World#pause
  73592. * @since 3.0.0
  73593. *
  73594. * @return {Phaser.Physics.Arcade.World} This World object.
  73595. */
  73596. pause: function ()
  73597. {
  73598. this.isPaused = true;
  73599. this.emit('pause');
  73600. return this;
  73601. },
  73602. /**
  73603. * Resumes the simulation, if paused.
  73604. *
  73605. * @method Phaser.Physics.Arcade.World#resume
  73606. * @fires Phaser.Physics.Arcade.World#resume
  73607. * @since 3.0.0
  73608. *
  73609. * @return {Phaser.Physics.Arcade.World} This World object.
  73610. */
  73611. resume: function ()
  73612. {
  73613. this.isPaused = false;
  73614. this.emit('resume');
  73615. return this;
  73616. },
  73617. /**
  73618. * Creates a new Collider object and adds it to the simulation.
  73619. *
  73620. * A Collider is a way to automatically perform collision checks between two objects,
  73621. * calling the collide and process callbacks if they occur.
  73622. *
  73623. * Colliders are run as part of the World update, after all of the Bodies have updated.
  73624. *
  73625. * By creating a Collider you don't need then call `World.collide` in your `update` loop,
  73626. * as it will be handled for you automatically.
  73627. *
  73628. * @method Phaser.Physics.Arcade.World#addCollider
  73629. * @since 3.0.0
  73630. * @see Phaser.Physics.Arcade.World#collide
  73631. *
  73632. * @param {ArcadeColliderType} object1 - The first object to check for collision.
  73633. * @param {ArcadeColliderType} object2 - The second object to check for collision.
  73634. * @param {ArcadePhysicsCallback} [collideCallback] - The callback to invoke when the two objects collide.
  73635. * @param {ArcadePhysicsCallback} [processCallback] - The callback to invoke when the two objects collide. Must return a boolean.
  73636. * @param {*} [callbackContext] - The scope in which to call the callbacks.
  73637. *
  73638. * @return {Phaser.Physics.Arcade.Collider} The Collider that was created.
  73639. */
  73640. addCollider: function (object1, object2, collideCallback, processCallback, callbackContext)
  73641. {
  73642. if (collideCallback === undefined) { collideCallback = null; }
  73643. if (processCallback === undefined) { processCallback = null; }
  73644. if (callbackContext === undefined) { callbackContext = collideCallback; }
  73645. var collider = new Collider(this, false, object1, object2, collideCallback, processCallback, callbackContext);
  73646. this.colliders.add(collider);
  73647. return collider;
  73648. },
  73649. /**
  73650. * Creates a new Overlap Collider object and adds it to the simulation.
  73651. *
  73652. * A Collider is a way to automatically perform overlap checks between two objects,
  73653. * calling the collide and process callbacks if they occur.
  73654. *
  73655. * Colliders are run as part of the World update, after all of the Bodies have updated.
  73656. *
  73657. * By creating a Collider you don't need then call `World.overlap` in your `update` loop,
  73658. * as it will be handled for you automatically.
  73659. *
  73660. * @method Phaser.Physics.Arcade.World#addOverlap
  73661. * @since 3.0.0
  73662. *
  73663. * @param {ArcadeColliderType} object1 - The first object to check for overlap.
  73664. * @param {ArcadeColliderType} object2 - The second object to check for overlap.
  73665. * @param {ArcadePhysicsCallback} [collideCallback] - The callback to invoke when the two objects overlap.
  73666. * @param {ArcadePhysicsCallback} [processCallback] - The callback to invoke when the two objects overlap. Must return a boolean.
  73667. * @param {*} [callbackContext] - The scope in which to call the callbacks.
  73668. *
  73669. * @return {Phaser.Physics.Arcade.Collider} The Collider that was created.
  73670. */
  73671. addOverlap: function (object1, object2, collideCallback, processCallback, callbackContext)
  73672. {
  73673. if (collideCallback === undefined) { collideCallback = null; }
  73674. if (processCallback === undefined) { processCallback = null; }
  73675. if (callbackContext === undefined) { callbackContext = collideCallback; }
  73676. var collider = new Collider(this, true, object1, object2, collideCallback, processCallback, callbackContext);
  73677. this.colliders.add(collider);
  73678. return collider;
  73679. },
  73680. /**
  73681. * Removes a Collider from the simulation so it is no longer processed.
  73682. *
  73683. * This method does not destroy the Collider. If you wish to add it back at a later stage you can call
  73684. * `World.colliders.add(Collider)`.
  73685. *
  73686. * If you no longer need the Collider you can call the `Collider.destroy` method instead, which will
  73687. * automatically clear all of its references and then remove it from the World. If you call destroy on
  73688. * a Collider you _don't_ need to pass it to this method too.
  73689. *
  73690. * @method Phaser.Physics.Arcade.World#removeCollider
  73691. * @since 3.0.0
  73692. *
  73693. * @param {Phaser.Physics.Arcade.Collider} collider - The Collider to remove from the simulation.
  73694. *
  73695. * @return {Phaser.Physics.Arcade.World} This World object.
  73696. */
  73697. removeCollider: function (collider)
  73698. {
  73699. this.colliders.remove(collider);
  73700. return this;
  73701. },
  73702. /**
  73703. * Sets the frame rate to run the simulation at.
  73704. *
  73705. * The frame rate value is used to simulate a fixed update time step. This fixed
  73706. * time step allows for a straightforward implementation of a deterministic game state.
  73707. *
  73708. * This frame rate is independent of the frequency at which the game is rendering. The
  73709. * higher you set the fps, the more physics simulation steps will occur per game step.
  73710. * Conversely, the lower you set it, the less will take place.
  73711. *
  73712. * You can optionally advance the simulation directly yourself by calling the `step` method.
  73713. *
  73714. * @method Phaser.Physics.Arcade.World#setFPS
  73715. * @since 3.10.0
  73716. *
  73717. * @param {integer} framerate - The frame rate to advance the simulation at.
  73718. *
  73719. * @return {this} This World object.
  73720. */
  73721. setFPS: function (framerate)
  73722. {
  73723. this.fps = framerate;
  73724. this._frameTime = 1 / this.fps;
  73725. this._frameTimeMS = 1000 * this._frameTime;
  73726. return this;
  73727. },
  73728. /**
  73729. * Advances the simulation based on the elapsed time and fps rate.
  73730. *
  73731. * This is called automatically by your Scene and does not need to be invoked directly.
  73732. *
  73733. * @method Phaser.Physics.Arcade.World#update
  73734. * @protected
  73735. * @since 3.0.0
  73736. *
  73737. * @param {number} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  73738. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  73739. */
  73740. update: function (time, delta)
  73741. {
  73742. if (this.isPaused || this.bodies.size === 0)
  73743. {
  73744. return;
  73745. }
  73746. var stepsThisFrame = 0;
  73747. var fixedDelta = this._frameTime;
  73748. var msPerFrame = this._frameTimeMS * this.timeScale;
  73749. this._elapsed += delta;
  73750. while (this._elapsed >= msPerFrame)
  73751. {
  73752. this._elapsed -= msPerFrame;
  73753. stepsThisFrame++;
  73754. this.step(fixedDelta);
  73755. }
  73756. this.stepsLastFrame = stepsThisFrame;
  73757. },
  73758. /**
  73759. * Advances the simulation by one step.
  73760. *
  73761. * @method Phaser.Physics.Arcade.World#step
  73762. * @since 3.10.0
  73763. *
  73764. * @param {number} delta - The delta time amount, in ms, by which to advance the simulation.
  73765. */
  73766. step: function (delta)
  73767. {
  73768. // Update all active bodies
  73769. var i;
  73770. var body;
  73771. var bodies = this.bodies.entries;
  73772. var len = bodies.length;
  73773. for (i = 0; i < len; i++)
  73774. {
  73775. body = bodies[i];
  73776. if (body.enable)
  73777. {
  73778. body.update(delta);
  73779. }
  73780. }
  73781. // Optionally populate our dynamic collision tree
  73782. if (this.useTree)
  73783. {
  73784. this.tree.clear();
  73785. this.tree.load(bodies);
  73786. }
  73787. // Process any colliders
  73788. var colliders = this.colliders.update();
  73789. for (i = 0; i < colliders.length; i++)
  73790. {
  73791. var collider = colliders[i];
  73792. if (collider.active)
  73793. {
  73794. collider.update();
  73795. }
  73796. }
  73797. len = bodies.length;
  73798. for (i = 0; i < len; i++)
  73799. {
  73800. body = bodies[i];
  73801. if (body.enable)
  73802. {
  73803. body.postUpdate();
  73804. }
  73805. }
  73806. },
  73807. /**
  73808. * Updates bodies, draws the debug display, and handles pending queue operations.
  73809. *
  73810. * @method Phaser.Physics.Arcade.World#postUpdate
  73811. * @since 3.0.0
  73812. */
  73813. postUpdate: function ()
  73814. {
  73815. var i;
  73816. var body;
  73817. var dynamic = this.bodies;
  73818. var staticBodies = this.staticBodies;
  73819. var pending = this.pendingDestroy;
  73820. var bodies = dynamic.entries;
  73821. var len = bodies.length;
  73822. if (this.drawDebug)
  73823. {
  73824. var graphics = this.debugGraphic;
  73825. graphics.clear();
  73826. for (i = 0; i < len; i++)
  73827. {
  73828. body = bodies[i];
  73829. if (body.willDrawDebug())
  73830. {
  73831. body.drawDebug(graphics);
  73832. }
  73833. }
  73834. bodies = staticBodies.entries;
  73835. len = bodies.length;
  73836. for (i = 0; i < len; i++)
  73837. {
  73838. body = bodies[i];
  73839. if (body.willDrawDebug())
  73840. {
  73841. body.drawDebug(graphics);
  73842. }
  73843. }
  73844. }
  73845. if (pending.size > 0)
  73846. {
  73847. var dynamicTree = this.tree;
  73848. var staticTree = this.staticTree;
  73849. bodies = pending.entries;
  73850. len = bodies.length;
  73851. for (i = 0; i < len; i++)
  73852. {
  73853. body = bodies[i];
  73854. if (body.physicsType === CONST.DYNAMIC_BODY)
  73855. {
  73856. dynamicTree.remove(body);
  73857. dynamic.delete(body);
  73858. }
  73859. else if (body.physicsType === CONST.STATIC_BODY)
  73860. {
  73861. staticTree.remove(body);
  73862. staticBodies.delete(body);
  73863. }
  73864. body.world = undefined;
  73865. body.gameObject = undefined;
  73866. }
  73867. pending.clear();
  73868. }
  73869. },
  73870. /**
  73871. * Calculates a Body's velocity and updates its position.
  73872. *
  73873. * @method Phaser.Physics.Arcade.World#updateMotion
  73874. * @since 3.0.0
  73875. *
  73876. * @param {Phaser.Physics.Arcade.Body} body - The Body to be updated.
  73877. * @param {number} delta - The delta value to be used in the motion calculations.
  73878. */
  73879. updateMotion: function (body, delta)
  73880. {
  73881. if (body.allowRotation)
  73882. {
  73883. this.computeAngularVelocity(body, delta);
  73884. }
  73885. this.computeVelocity(body, delta);
  73886. },
  73887. /**
  73888. * Calculates a Body's angular velocity.
  73889. *
  73890. * @method Phaser.Physics.Arcade.World#computeAngularVelocity
  73891. * @since 3.10.0
  73892. *
  73893. * @param {Phaser.Physics.Arcade.Body} body - The Body to compute the velocity for.
  73894. * @param {number} delta - The delta value to be used in the calculation.
  73895. */
  73896. computeAngularVelocity: function (body, delta)
  73897. {
  73898. var velocity = body.angularVelocity;
  73899. var acceleration = body.angularAcceleration;
  73900. var drag = body.angularDrag;
  73901. var max = body.maxAngular;
  73902. if (acceleration)
  73903. {
  73904. velocity += acceleration * delta;
  73905. }
  73906. else if (body.allowDrag && drag)
  73907. {
  73908. drag *= delta;
  73909. if (FuzzyGreaterThan(velocity - drag, 0, 0.1))
  73910. {
  73911. velocity -= drag;
  73912. }
  73913. else if (FuzzyLessThan(velocity + drag, 0, 0.1))
  73914. {
  73915. velocity += drag;
  73916. }
  73917. else
  73918. {
  73919. velocity = 0;
  73920. }
  73921. }
  73922. velocity = Clamp(velocity, -max, max);
  73923. var velocityDelta = velocity - body.angularVelocity;
  73924. body.angularVelocity += velocityDelta;
  73925. body.rotation += (body.angularVelocity * delta);
  73926. },
  73927. /**
  73928. * Calculates a Body's per-axis velocity.
  73929. *
  73930. * @method Phaser.Physics.Arcade.World#computeVelocity
  73931. * @since 3.0.0
  73932. *
  73933. * @param {Phaser.Physics.Arcade.Body} body - The Body to compute the velocity for.
  73934. * @param {number} delta - The delta value to be used in the calculation.
  73935. */
  73936. computeVelocity: function (body, delta)
  73937. {
  73938. var velocityX = body.velocity.x;
  73939. var accelerationX = body.acceleration.x;
  73940. var dragX = body.drag.x;
  73941. var maxX = body.maxVelocity.x;
  73942. var velocityY = body.velocity.y;
  73943. var accelerationY = body.acceleration.y;
  73944. var dragY = body.drag.y;
  73945. var maxY = body.maxVelocity.y;
  73946. var speed = body.speed;
  73947. var allowDrag = body.allowDrag;
  73948. var useDamping = body.useDamping;
  73949. if (body.allowGravity)
  73950. {
  73951. velocityX += (this.gravity.x + body.gravity.x) * delta;
  73952. velocityY += (this.gravity.y + body.gravity.y) * delta;
  73953. }
  73954. if (accelerationX)
  73955. {
  73956. velocityX += accelerationX * delta;
  73957. }
  73958. else if (allowDrag && dragX)
  73959. {
  73960. if (useDamping)
  73961. {
  73962. // Damping based deceleration
  73963. velocityX *= dragX;
  73964. if (FuzzyEqual(speed, 0, 0.001))
  73965. {
  73966. velocityX = 0;
  73967. }
  73968. }
  73969. else
  73970. {
  73971. // Linear deceleration
  73972. dragX *= delta;
  73973. if (FuzzyGreaterThan(velocityX - dragX, 0, 0.01))
  73974. {
  73975. velocityX -= dragX;
  73976. }
  73977. else if (FuzzyLessThan(velocityX + dragX, 0, 0.01))
  73978. {
  73979. velocityX += dragX;
  73980. }
  73981. else
  73982. {
  73983. velocityX = 0;
  73984. }
  73985. }
  73986. }
  73987. if (accelerationY)
  73988. {
  73989. velocityY += accelerationY * delta;
  73990. }
  73991. else if (allowDrag && dragY)
  73992. {
  73993. if (useDamping)
  73994. {
  73995. // Damping based deceleration
  73996. velocityY *= dragY;
  73997. if (FuzzyEqual(speed, 0, 0.001))
  73998. {
  73999. velocityY = 0;
  74000. }
  74001. }
  74002. else
  74003. {
  74004. // Linear deceleration
  74005. dragY *= delta;
  74006. if (FuzzyGreaterThan(velocityY - dragY, 0, 0.01))
  74007. {
  74008. velocityY -= dragY;
  74009. }
  74010. else if (FuzzyLessThan(velocityY + dragY, 0, 0.01))
  74011. {
  74012. velocityY += dragY;
  74013. }
  74014. else
  74015. {
  74016. velocityY = 0;
  74017. }
  74018. }
  74019. }
  74020. velocityX = Clamp(velocityX, -maxX, maxX);
  74021. velocityY = Clamp(velocityY, -maxY, maxY);
  74022. body.velocity.set(velocityX, velocityY);
  74023. },
  74024. /**
  74025. * Separates two Bodies.
  74026. *
  74027. * @method Phaser.Physics.Arcade.World#separate
  74028. * @fires Phaser.Physics.Arcade.World#collide
  74029. * @fires Phaser.Physics.Arcade.World#overlap
  74030. * @since 3.0.0
  74031. *
  74032. * @param {Phaser.Physics.Arcade.Body} body1 - The first Body to be separated.
  74033. * @param {Phaser.Physics.Arcade.Body} body2 - The second Body to be separated.
  74034. * @param {ArcadePhysicsCallback} [processCallback] - The process callback.
  74035. * @param {*} [callbackContext] - The context in which to invoke the callback.
  74036. * @param {boolean} [overlapOnly] - If this a collide or overlap check?
  74037. *
  74038. * @return {boolean} True if separation occurred, otherwise false.
  74039. */
  74040. separate: function (body1, body2, processCallback, callbackContext, overlapOnly)
  74041. {
  74042. if (
  74043. !body1.enable ||
  74044. !body2.enable ||
  74045. body1.checkCollision.none ||
  74046. body2.checkCollision.none ||
  74047. !this.intersects(body1, body2))
  74048. {
  74049. return false;
  74050. }
  74051. // They overlap. Is there a custom process callback? If it returns true then we can carry on, otherwise we should abort.
  74052. if (processCallback && processCallback.call(callbackContext, body1.gameObject, body2.gameObject) === false)
  74053. {
  74054. return false;
  74055. }
  74056. // Circle vs. Circle quick bail out
  74057. if (body1.isCircle && body2.isCircle)
  74058. {
  74059. return this.separateCircle(body1, body2, overlapOnly);
  74060. }
  74061. // We define the behavior of bodies in a collision circle and rectangle
  74062. // If a collision occurs in the corner points of the rectangle, the body behave like circles
  74063. // Either body1 or body2 is a circle
  74064. if (body1.isCircle !== body2.isCircle)
  74065. {
  74066. var bodyRect = (body1.isCircle) ? body2 : body1;
  74067. var bodyCircle = (body1.isCircle) ? body1 : body2;
  74068. var rect = {
  74069. x: bodyRect.x,
  74070. y: bodyRect.y,
  74071. right: bodyRect.right,
  74072. bottom: bodyRect.bottom
  74073. };
  74074. var circle = bodyCircle.center;
  74075. if (circle.y < rect.y || circle.y > rect.bottom)
  74076. {
  74077. if (circle.x < rect.x || circle.x > rect.right)
  74078. {
  74079. return this.separateCircle(body1, body2, overlapOnly);
  74080. }
  74081. }
  74082. }
  74083. var resultX = false;
  74084. var resultY = false;
  74085. // Do we separate on x or y first?
  74086. if (this.forceX || Math.abs(this.gravity.y + body1.gravity.y) < Math.abs(this.gravity.x + body1.gravity.x))
  74087. {
  74088. resultX = SeparateX(body1, body2, overlapOnly, this.OVERLAP_BIAS);
  74089. // Are they still intersecting? Let's do the other axis then
  74090. if (this.intersects(body1, body2))
  74091. {
  74092. resultY = SeparateY(body1, body2, overlapOnly, this.OVERLAP_BIAS);
  74093. }
  74094. }
  74095. else
  74096. {
  74097. resultY = SeparateY(body1, body2, overlapOnly, this.OVERLAP_BIAS);
  74098. // Are they still intersecting? Let's do the other axis then
  74099. if (this.intersects(body1, body2))
  74100. {
  74101. resultX = SeparateX(body1, body2, overlapOnly, this.OVERLAP_BIAS);
  74102. }
  74103. }
  74104. var result = (resultX || resultY);
  74105. if (result)
  74106. {
  74107. if (overlapOnly && (body1.onOverlap || body2.onOverlap))
  74108. {
  74109. this.emit('overlap', body1.gameObject, body2.gameObject, body1, body2);
  74110. }
  74111. else if (body1.onCollide || body2.onCollide)
  74112. {
  74113. this.emit('collide', body1.gameObject, body2.gameObject, body1, body2);
  74114. }
  74115. }
  74116. return result;
  74117. },
  74118. /**
  74119. * Separates two Bodies, when both are circular.
  74120. *
  74121. * @method Phaser.Physics.Arcade.World#separateCircle
  74122. * @fires Phaser.Physics.Arcade.World#collide
  74123. * @fires Phaser.Physics.Arcade.World#overlap
  74124. * @since 3.0.0
  74125. *
  74126. * @param {Phaser.Physics.Arcade.Body} body1 - The first Body to be separated.
  74127. * @param {Phaser.Physics.Arcade.Body} body2 - The second Body to be separated.
  74128. * @param {boolean} [overlapOnly] - If this a collide or overlap check?
  74129. * @param {number} bias - A small value added to the calculations.
  74130. *
  74131. * @return {boolean} True if separation occurred, otherwise false.
  74132. */
  74133. separateCircle: function (body1, body2, overlapOnly, bias)
  74134. {
  74135. // Set the bounding box overlap values into the bodies themselves (hence we don't use the return values here)
  74136. GetOverlapX(body1, body2, false, bias);
  74137. GetOverlapY(body1, body2, false, bias);
  74138. var dx = body2.center.x - body1.center.x;
  74139. var dy = body2.center.y - body1.center.y;
  74140. var angleCollision = Math.atan2(dy, dx);
  74141. var overlap = 0;
  74142. if (body1.isCircle !== body2.isCircle)
  74143. {
  74144. var rect = {
  74145. x: (body2.isCircle) ? body1.position.x : body2.position.x,
  74146. y: (body2.isCircle) ? body1.position.y : body2.position.y,
  74147. right: (body2.isCircle) ? body1.right : body2.right,
  74148. bottom: (body2.isCircle) ? body1.bottom : body2.bottom
  74149. };
  74150. var circle = {
  74151. x: (body1.isCircle) ? body1.center.x : body2.center.x,
  74152. y: (body1.isCircle) ? body1.center.y : body2.center.y,
  74153. radius: (body1.isCircle) ? body1.halfWidth : body2.halfWidth
  74154. };
  74155. if (circle.y < rect.y)
  74156. {
  74157. if (circle.x < rect.x)
  74158. {
  74159. overlap = DistanceBetween(circle.x, circle.y, rect.x, rect.y) - circle.radius;
  74160. }
  74161. else if (circle.x > rect.right)
  74162. {
  74163. overlap = DistanceBetween(circle.x, circle.y, rect.right, rect.y) - circle.radius;
  74164. }
  74165. }
  74166. else if (circle.y > rect.bottom)
  74167. {
  74168. if (circle.x < rect.x)
  74169. {
  74170. overlap = DistanceBetween(circle.x, circle.y, rect.x, rect.bottom) - circle.radius;
  74171. }
  74172. else if (circle.x > rect.right)
  74173. {
  74174. overlap = DistanceBetween(circle.x, circle.y, rect.right, rect.bottom) - circle.radius;
  74175. }
  74176. }
  74177. overlap *= -1;
  74178. }
  74179. else
  74180. {
  74181. overlap = (body1.halfWidth + body2.halfWidth) - DistanceBetween(body1.center.x, body1.center.y, body2.center.x, body2.center.y);
  74182. }
  74183. // Can't separate two immovable bodies, or a body with its own custom separation logic
  74184. if (overlapOnly || overlap === 0 || (body1.immovable && body2.immovable) || body1.customSeparateX || body2.customSeparateX)
  74185. {
  74186. if (overlap !== 0 && (body1.onOverlap || body2.onOverlap))
  74187. {
  74188. this.emit('overlap', body1.gameObject, body2.gameObject, body1, body2);
  74189. }
  74190. // return true if there was some overlap, otherwise false
  74191. return (overlap !== 0);
  74192. }
  74193. // Transform the velocity vector to the coordinate system oriented along the direction of impact.
  74194. // This is done to eliminate the vertical component of the velocity
  74195. var b1vx = body1.velocity.x;
  74196. var b1vy = body1.velocity.y;
  74197. var b1mass = body1.mass;
  74198. var b2vx = body2.velocity.x;
  74199. var b2vy = body2.velocity.y;
  74200. var b2mass = body2.mass;
  74201. var v1 = {
  74202. x: b1vx * Math.cos(angleCollision) + b1vy * Math.sin(angleCollision),
  74203. y: b1vx * Math.sin(angleCollision) - b1vy * Math.cos(angleCollision)
  74204. };
  74205. var v2 = {
  74206. x: b2vx * Math.cos(angleCollision) + b2vy * Math.sin(angleCollision),
  74207. y: b2vx * Math.sin(angleCollision) - b2vy * Math.cos(angleCollision)
  74208. };
  74209. // We expect the new velocity after impact
  74210. var tempVel1 = ((b1mass - b2mass) * v1.x + 2 * b2mass * v2.x) / (b1mass + b2mass);
  74211. var tempVel2 = (2 * b1mass * v1.x + (b2mass - b1mass) * v2.x) / (b1mass + b2mass);
  74212. // We convert the vector to the original coordinate system and multiplied by factor of rebound
  74213. if (!body1.immovable)
  74214. {
  74215. body1.velocity.x = (tempVel1 * Math.cos(angleCollision) - v1.y * Math.sin(angleCollision)) * body1.bounce.x;
  74216. body1.velocity.y = (v1.y * Math.cos(angleCollision) + tempVel1 * Math.sin(angleCollision)) * body1.bounce.y;
  74217. // Reset local var
  74218. b1vx = body1.velocity.x;
  74219. b1vy = body1.velocity.y;
  74220. }
  74221. if (!body2.immovable)
  74222. {
  74223. body2.velocity.x = (tempVel2 * Math.cos(angleCollision) - v2.y * Math.sin(angleCollision)) * body2.bounce.x;
  74224. body2.velocity.y = (v2.y * Math.cos(angleCollision) + tempVel2 * Math.sin(angleCollision)) * body2.bounce.y;
  74225. // Reset local var
  74226. b2vx = body2.velocity.x;
  74227. b2vy = body2.velocity.y;
  74228. }
  74229. // When the collision angle is almost perpendicular to the total initial velocity vector
  74230. // (collision on a tangent) vector direction can be determined incorrectly.
  74231. // This code fixes the problem
  74232. if (Math.abs(angleCollision) < Math.PI / 2)
  74233. {
  74234. if ((b1vx > 0) && !body1.immovable && (b2vx > b1vx))
  74235. {
  74236. body1.velocity.x *= -1;
  74237. }
  74238. else if ((b2vx < 0) && !body2.immovable && (b1vx < b2vx))
  74239. {
  74240. body2.velocity.x *= -1;
  74241. }
  74242. else if ((b1vy > 0) && !body1.immovable && (b2vy > b1vy))
  74243. {
  74244. body1.velocity.y *= -1;
  74245. }
  74246. else if ((b2vy < 0) && !body2.immovable && (b1vy < b2vy))
  74247. {
  74248. body2.velocity.y *= -1;
  74249. }
  74250. }
  74251. else if (Math.abs(angleCollision) > Math.PI / 2)
  74252. {
  74253. if ((b1vx < 0) && !body1.immovable && (b2vx < b1vx))
  74254. {
  74255. body1.velocity.x *= -1;
  74256. }
  74257. else if ((b2vx > 0) && !body2.immovable && (b1vx > b2vx))
  74258. {
  74259. body2.velocity.x *= -1;
  74260. }
  74261. else if ((b1vy < 0) && !body1.immovable && (b2vy < b1vy))
  74262. {
  74263. body1.velocity.y *= -1;
  74264. }
  74265. else if ((b2vy > 0) && !body2.immovable && (b1vx > b2vy))
  74266. {
  74267. body2.velocity.y *= -1;
  74268. }
  74269. }
  74270. var delta = this._frameTime;
  74271. if (!body1.immovable)
  74272. {
  74273. body1.x += (body1.velocity.x * delta) - overlap * Math.cos(angleCollision);
  74274. body1.y += (body1.velocity.y * delta) - overlap * Math.sin(angleCollision);
  74275. }
  74276. if (!body2.immovable)
  74277. {
  74278. body2.x += (body2.velocity.x * delta) + overlap * Math.cos(angleCollision);
  74279. body2.y += (body2.velocity.y * delta) + overlap * Math.sin(angleCollision);
  74280. }
  74281. if (body1.onCollide || body2.onCollide)
  74282. {
  74283. this.emit('collide', body1.gameObject, body2.gameObject, body1, body2);
  74284. }
  74285. return true;
  74286. },
  74287. /**
  74288. * Checks to see if two Bodies intersect at all.
  74289. *
  74290. * @method Phaser.Physics.Arcade.World#intersects
  74291. * @since 3.0.0
  74292. *
  74293. * @param {Phaser.Physics.Arcade.Body} body1 - The first body to check.
  74294. * @param {Phaser.Physics.Arcade.Body} body2 - The second body to check.
  74295. *
  74296. * @return {boolean} True if the two bodies intersect, otherwise false.
  74297. */
  74298. intersects: function (body1, body2)
  74299. {
  74300. if (body1 === body2)
  74301. {
  74302. return false;
  74303. }
  74304. if (!body1.isCircle && !body2.isCircle)
  74305. {
  74306. // Rect vs. Rect
  74307. return !(
  74308. body1.right <= body2.position.x ||
  74309. body1.bottom <= body2.position.y ||
  74310. body1.position.x >= body2.right ||
  74311. body1.position.y >= body2.bottom
  74312. );
  74313. }
  74314. else if (body1.isCircle)
  74315. {
  74316. if (body2.isCircle)
  74317. {
  74318. // Circle vs. Circle
  74319. return DistanceBetween(body1.center.x, body1.center.y, body2.center.x, body2.center.y) <= (body1.halfWidth + body2.halfWidth);
  74320. }
  74321. else
  74322. {
  74323. // Circle vs. Rect
  74324. return this.circleBodyIntersects(body1, body2);
  74325. }
  74326. }
  74327. else
  74328. {
  74329. // Rect vs. Circle
  74330. return this.circleBodyIntersects(body2, body1);
  74331. }
  74332. },
  74333. /**
  74334. * Tests if a circular Body intersects with another Body.
  74335. *
  74336. * @method Phaser.Physics.Arcade.World#circleBodyIntersects
  74337. * @since 3.0.0
  74338. *
  74339. * @param {Phaser.Physics.Arcade.Body} circle - The circular body to test.
  74340. * @param {Phaser.Physics.Arcade.Body} body - The rectangular body to test.
  74341. *
  74342. * @return {boolean} True if the two bodies intersect, otherwise false.
  74343. */
  74344. circleBodyIntersects: function (circle, body)
  74345. {
  74346. var x = Clamp(circle.center.x, body.left, body.right);
  74347. var y = Clamp(circle.center.y, body.top, body.bottom);
  74348. var dx = (circle.center.x - x) * (circle.center.x - x);
  74349. var dy = (circle.center.y - y) * (circle.center.y - y);
  74350. return (dx + dy) <= (circle.halfWidth * circle.halfWidth);
  74351. },
  74352. /**
  74353. * Tests if Game Objects overlap.
  74354. *
  74355. * @method Phaser.Physics.Arcade.World#overlap
  74356. * @since 3.0.0
  74357. *
  74358. * @param {ArcadeColliderType} object1 - [description]
  74359. * @param {ArcadeColliderType} [object2] - [description]
  74360. * @param {ArcadePhysicsCallback} [overlapCallback] - [description]
  74361. * @param {ArcadePhysicsCallback} [processCallback] - [description]
  74362. * @param {*} [callbackContext] - [description]
  74363. *
  74364. * @return {boolean} True if at least one Game Object overlaps another.
  74365. */
  74366. overlap: function (object1, object2, overlapCallback, processCallback, callbackContext)
  74367. {
  74368. if (overlapCallback === undefined) { overlapCallback = null; }
  74369. if (processCallback === undefined) { processCallback = null; }
  74370. if (callbackContext === undefined) { callbackContext = overlapCallback; }
  74371. return this.collideObjects(object1, object2, overlapCallback, processCallback, callbackContext, true);
  74372. },
  74373. /**
  74374. * Performs a collision check and separation between the two physics enabled objects given, which can be single
  74375. * Game Objects, arrays of Game Objects, Physics Groups, arrays of Physics Groups or normal Groups.
  74376. *
  74377. * If you don't require separation then use {@link #overlap} instead.
  74378. *
  74379. * If two Groups or arrays are passed, each member of one will be tested against each member of the other.
  74380. *
  74381. * If one Group **only** is passed (as `object1`), each member of the Group will be collided against the other members.
  74382. *
  74383. * Two callbacks can be provided. The `collideCallback` is invoked if a collision occurs and the two colliding
  74384. * objects are passed to it.
  74385. *
  74386. * Arcade Physics uses the Projection Method of collision resolution and separation. While it's fast and suitable
  74387. * for 'arcade' style games it lacks stability when multiple objects are in close proximity or resting upon each other.
  74388. * The separation that stops two objects penetrating may create a new penetration against a different object. If you
  74389. * require a high level of stability please consider using an alternative physics system, such as Matter.js.
  74390. *
  74391. * @method Phaser.Physics.Arcade.World#collide
  74392. * @since 3.0.0
  74393. *
  74394. * @param {ArcadeColliderType} object1 - [description]
  74395. * @param {ArcadeColliderType} [object2] - [description]
  74396. * @param {ArcadePhysicsCallback} [collideCallback] - [description]
  74397. * @param {ArcadePhysicsCallback} [processCallback] - [description]
  74398. * @param {*} [callbackContext] - [description]
  74399. *
  74400. * @return {boolean} True if any overlapping Game Objects were separated.
  74401. */
  74402. collide: function (object1, object2, collideCallback, processCallback, callbackContext)
  74403. {
  74404. if (collideCallback === undefined) { collideCallback = null; }
  74405. if (processCallback === undefined) { processCallback = null; }
  74406. if (callbackContext === undefined) { callbackContext = collideCallback; }
  74407. return this.collideObjects(object1, object2, collideCallback, processCallback, callbackContext, false);
  74408. },
  74409. /**
  74410. * Helper for Phaser.Physics.Arcade.World#collide.
  74411. *
  74412. * @method Phaser.Physics.Arcade.World#collideObjects
  74413. * @since 3.0.0
  74414. *
  74415. * @param {ArcadeColliderType} object1 - [description]
  74416. * @param {ArcadeColliderType} [object2] - [description]
  74417. * @param {ArcadePhysicsCallback} collideCallback - [description]
  74418. * @param {ArcadePhysicsCallback} processCallback - [description]
  74419. * @param {*} callbackContext - [description]
  74420. * @param {boolean} overlapOnly - [description]
  74421. *
  74422. * @return {boolean} True if any overlapping objects were separated.
  74423. */
  74424. collideObjects: function (object1, object2, collideCallback, processCallback, callbackContext, overlapOnly)
  74425. {
  74426. var i;
  74427. if (object1.isParent && object1.physicsType === undefined)
  74428. {
  74429. object1 = object1.children.entries;
  74430. }
  74431. if (object2 && object2.isParent && object2.physicsType === undefined)
  74432. {
  74433. object2 = object2.children.entries;
  74434. }
  74435. var object1isArray = Array.isArray(object1);
  74436. var object2isArray = Array.isArray(object2);
  74437. this._total = 0;
  74438. if (!object1isArray && !object2isArray)
  74439. {
  74440. // Neither of them are arrays - do this first as it's the most common use-case
  74441. this.collideHandler(object1, object2, collideCallback, processCallback, callbackContext, overlapOnly);
  74442. }
  74443. else if (!object1isArray && object2isArray)
  74444. {
  74445. // Object 2 is an Array
  74446. for (i = 0; i < object2.length; i++)
  74447. {
  74448. this.collideHandler(object1, object2[i], collideCallback, processCallback, callbackContext, overlapOnly);
  74449. }
  74450. }
  74451. else if (object1isArray && !object2isArray)
  74452. {
  74453. // Object 1 is an Array
  74454. for (i = 0; i < object1.length; i++)
  74455. {
  74456. this.collideHandler(object1[i], object2, collideCallback, processCallback, callbackContext, overlapOnly);
  74457. }
  74458. }
  74459. else
  74460. {
  74461. // They're both arrays
  74462. for (i = 0; i < object1.length; i++)
  74463. {
  74464. for (var j = 0; j < object2.length; j++)
  74465. {
  74466. this.collideHandler(object1[i], object2[j], collideCallback, processCallback, callbackContext, overlapOnly);
  74467. }
  74468. }
  74469. }
  74470. return (this._total > 0);
  74471. },
  74472. /**
  74473. * Helper for Phaser.Physics.Arcade.World#collide and Phaser.Physics.Arcade.World#overlap.
  74474. *
  74475. * @method Phaser.Physics.Arcade.World#collideHandler
  74476. * @since 3.0.0
  74477. *
  74478. * @param {ArcadeColliderType} object1 - [description]
  74479. * @param {ArcadeColliderType} [object2] - [description]
  74480. * @param {ArcadePhysicsCallback} collideCallback - [description]
  74481. * @param {ArcadePhysicsCallback} processCallback - [description]
  74482. * @param {*} callbackContext - [description]
  74483. * @param {boolean} overlapOnly - [description]
  74484. *
  74485. * @return {boolean} [description]
  74486. */
  74487. collideHandler: function (object1, object2, collideCallback, processCallback, callbackContext, overlapOnly)
  74488. {
  74489. // Collide Group with Self
  74490. // Only collide valid objects
  74491. if (object2 === undefined && object1.isParent)
  74492. {
  74493. return this.collideGroupVsGroup(object1, object1, collideCallback, processCallback, callbackContext, overlapOnly);
  74494. }
  74495. // If neither of the objects are set then bail out
  74496. if (!object1 || !object2)
  74497. {
  74498. return false;
  74499. }
  74500. // A Body
  74501. if (object1.body)
  74502. {
  74503. if (object2.body)
  74504. {
  74505. return this.collideSpriteVsSprite(object1, object2, collideCallback, processCallback, callbackContext, overlapOnly);
  74506. }
  74507. else if (object2.isParent)
  74508. {
  74509. return this.collideSpriteVsGroup(object1, object2, collideCallback, processCallback, callbackContext, overlapOnly);
  74510. }
  74511. else if (object2.isTilemap)
  74512. {
  74513. return this.collideSpriteVsTilemapLayer(object1, object2, collideCallback, processCallback, callbackContext, overlapOnly);
  74514. }
  74515. }
  74516. // GROUPS
  74517. else if (object1.isParent)
  74518. {
  74519. if (object2.body)
  74520. {
  74521. return this.collideSpriteVsGroup(object2, object1, collideCallback, processCallback, callbackContext, overlapOnly);
  74522. }
  74523. else if (object2.isParent)
  74524. {
  74525. return this.collideGroupVsGroup(object1, object2, collideCallback, processCallback, callbackContext, overlapOnly);
  74526. }
  74527. else if (object2.isTilemap)
  74528. {
  74529. return this.collideGroupVsTilemapLayer(object1, object2, collideCallback, processCallback, callbackContext, overlapOnly);
  74530. }
  74531. }
  74532. // TILEMAP LAYERS
  74533. else if (object1.isTilemap)
  74534. {
  74535. if (object2.body)
  74536. {
  74537. return this.collideSpriteVsTilemapLayer(object2, object1, collideCallback, processCallback, callbackContext, overlapOnly);
  74538. }
  74539. else if (object2.isParent)
  74540. {
  74541. return this.collideGroupVsTilemapLayer(object2, object1, collideCallback, processCallback, callbackContext, overlapOnly);
  74542. }
  74543. }
  74544. },
  74545. /**
  74546. * Handler for Sprite vs. Sprite collisions.
  74547. *
  74548. * @method Phaser.Physics.Arcade.World#collideSpriteVsSprite
  74549. * @since 3.0.0
  74550. *
  74551. * @param {Phaser.GameObjects.GameObject} sprite1 - [description]
  74552. * @param {Phaser.GameObjects.GameObject} sprite2 - [description]
  74553. * @param {ArcadePhysicsCallback} collideCallback - [description]
  74554. * @param {ArcadePhysicsCallback} processCallback - [description]
  74555. * @param {*} callbackContext - [description]
  74556. * @param {boolean} overlapOnly - [description]
  74557. *
  74558. * @return {boolean} [description]
  74559. */
  74560. collideSpriteVsSprite: function (sprite1, sprite2, collideCallback, processCallback, callbackContext, overlapOnly)
  74561. {
  74562. if (!sprite1.body || !sprite2.body)
  74563. {
  74564. return false;
  74565. }
  74566. if (this.separate(sprite1.body, sprite2.body, processCallback, callbackContext, overlapOnly))
  74567. {
  74568. if (collideCallback)
  74569. {
  74570. collideCallback.call(callbackContext, sprite1, sprite2);
  74571. }
  74572. this._total++;
  74573. }
  74574. return true;
  74575. },
  74576. /**
  74577. * Handler for Sprite vs. Group collisions.
  74578. *
  74579. * @method Phaser.Physics.Arcade.World#collideSpriteVsGroup
  74580. * @since 3.0.0
  74581. *
  74582. * @param {Phaser.GameObjects.GameObject} sprite - [description]
  74583. * @param {Phaser.GameObjects.Group} group - [description]
  74584. * @param {ArcadePhysicsCallback} collideCallback - [description]
  74585. * @param {ArcadePhysicsCallback} processCallback - [description]
  74586. * @param {*} callbackContext - [description]
  74587. * @param {boolean} overlapOnly - [description]
  74588. *
  74589. * @return {boolean} [description]
  74590. */
  74591. collideSpriteVsGroup: function (sprite, group, collideCallback, processCallback, callbackContext, overlapOnly)
  74592. {
  74593. var bodyA = sprite.body;
  74594. if (group.length === 0 || !bodyA || !bodyA.enable)
  74595. {
  74596. return;
  74597. }
  74598. // Does sprite collide with anything?
  74599. var i;
  74600. var len;
  74601. var bodyB;
  74602. if (this.useTree)
  74603. {
  74604. var minMax = this.treeMinMax;
  74605. minMax.minX = bodyA.left;
  74606. minMax.minY = bodyA.top;
  74607. minMax.maxX = bodyA.right;
  74608. minMax.maxY = bodyA.bottom;
  74609. var results = (group.physicsType === CONST.DYNAMIC_BODY) ? this.tree.search(minMax) : this.staticTree.search(minMax);
  74610. len = results.length;
  74611. for (i = 0; i < len; i++)
  74612. {
  74613. bodyB = results[i];
  74614. if (bodyA === bodyB || !group.contains(bodyB.gameObject))
  74615. {
  74616. // Skip if comparing against itself, or if bodyB isn't actually part of the Group
  74617. continue;
  74618. }
  74619. if (this.separate(bodyA, bodyB, processCallback, callbackContext, overlapOnly))
  74620. {
  74621. if (collideCallback)
  74622. {
  74623. collideCallback.call(callbackContext, bodyA.gameObject, bodyB.gameObject);
  74624. }
  74625. this._total++;
  74626. }
  74627. }
  74628. }
  74629. else
  74630. {
  74631. var children = group.getChildren();
  74632. var skipIndex = group.children.entries.indexOf(sprite);
  74633. len = children.length;
  74634. for (i = 0; i < len; i++)
  74635. {
  74636. bodyB = children[i].body;
  74637. if (!bodyB || i === skipIndex || !bodyB.enable)
  74638. {
  74639. continue;
  74640. }
  74641. if (this.separate(bodyA, bodyB, processCallback, callbackContext, overlapOnly))
  74642. {
  74643. if (collideCallback)
  74644. {
  74645. collideCallback.call(callbackContext, bodyA.gameObject, bodyB.gameObject);
  74646. }
  74647. this._total++;
  74648. }
  74649. }
  74650. }
  74651. },
  74652. /**
  74653. * Helper for Group vs. Tilemap collisions.
  74654. *
  74655. * @method Phaser.Physics.Arcade.World#collideGroupVsTilemapLayer
  74656. * @since 3.0.0
  74657. *
  74658. * @param {Phaser.GameObjects.Group} group - [description]
  74659. * @param {(Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} tilemapLayer - [description]
  74660. * @param {ArcadePhysicsCallback} collideCallback - [description]
  74661. * @param {ArcadePhysicsCallback} processCallback - [description]
  74662. * @param {*} callbackContext - [description]
  74663. * @param {boolean} overlapOnly - [description]
  74664. *
  74665. * @return {boolean} [description]
  74666. */
  74667. collideGroupVsTilemapLayer: function (group, tilemapLayer, collideCallback, processCallback, callbackContext, overlapOnly)
  74668. {
  74669. var children = group.getChildren();
  74670. if (children.length === 0)
  74671. {
  74672. return false;
  74673. }
  74674. var didCollide = false;
  74675. for (var i = 0; i < children.length; i++)
  74676. {
  74677. if (children[i].body)
  74678. {
  74679. if (this.collideSpriteVsTilemapLayer(children[i], tilemapLayer, collideCallback, processCallback, callbackContext, overlapOnly))
  74680. {
  74681. didCollide = true;
  74682. }
  74683. }
  74684. }
  74685. return didCollide;
  74686. },
  74687. /**
  74688. * Helper for Sprite vs. Tilemap collisions.
  74689. *
  74690. * @method Phaser.Physics.Arcade.World#collideSpriteVsTilemapLayer
  74691. * @fires Phaser.Physics.Arcade.World#collide
  74692. * @fires Phaser.Physics.Arcade.World#overlap
  74693. * @since 3.0.0
  74694. *
  74695. * @param {Phaser.GameObjects.GameObject} sprite - [description]
  74696. * @param {(Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} tilemapLayer - [description]
  74697. * @param {ArcadePhysicsCallback} collideCallback - [description]
  74698. * @param {ArcadePhysicsCallback} processCallback - [description]
  74699. * @param {*} callbackContext - [description]
  74700. * @param {boolean} overlapOnly - [description]
  74701. *
  74702. * @return {boolean} [description]
  74703. */
  74704. collideSpriteVsTilemapLayer: function (sprite, tilemapLayer, collideCallback, processCallback, callbackContext, overlapOnly)
  74705. {
  74706. var body = sprite.body;
  74707. if (!body.enable)
  74708. {
  74709. return false;
  74710. }
  74711. var x = body.position.x;
  74712. var y = body.position.y;
  74713. var w = body.width;
  74714. var h = body.height;
  74715. // TODO: this logic should be encapsulated within the Tilemap API at some point.
  74716. // If the maps base tile size differs from the layer's tile size, we need to adjust the
  74717. // selection area by the difference between the two.
  74718. var layerData = tilemapLayer.layer;
  74719. if (layerData.tileWidth > layerData.baseTileWidth)
  74720. {
  74721. // The x origin of a tile is the left side, so x and width need to be adjusted.
  74722. var xDiff = (layerData.tileWidth - layerData.baseTileWidth) * tilemapLayer.scaleX;
  74723. x -= xDiff;
  74724. w += xDiff;
  74725. }
  74726. if (layerData.tileHeight > layerData.baseTileHeight)
  74727. {
  74728. // The y origin of a tile is the bottom side, so just the height needs to be adjusted.
  74729. var yDiff = (layerData.tileHeight - layerData.baseTileHeight) * tilemapLayer.scaleY;
  74730. h += yDiff;
  74731. }
  74732. var mapData = tilemapLayer.getTilesWithinWorldXY(x, y, w, h);
  74733. if (mapData.length === 0)
  74734. {
  74735. return false;
  74736. }
  74737. var tile;
  74738. var tileWorldRect = { left: 0, right: 0, top: 0, bottom: 0 };
  74739. for (var i = 0; i < mapData.length; i++)
  74740. {
  74741. tile = mapData[i];
  74742. tileWorldRect.left = tilemapLayer.tileToWorldX(tile.x);
  74743. tileWorldRect.top = tilemapLayer.tileToWorldY(tile.y);
  74744. // If the map's base tile size differs from the layer's tile size, only the top of the rect
  74745. // needs to be adjusted since its origin is (0, 1).
  74746. if (tile.baseHeight !== tile.height)
  74747. {
  74748. tileWorldRect.top -= (tile.height - tile.baseHeight) * tilemapLayer.scaleY;
  74749. }
  74750. tileWorldRect.right = tileWorldRect.left + tile.width * tilemapLayer.scaleX;
  74751. tileWorldRect.bottom = tileWorldRect.top + tile.height * tilemapLayer.scaleY;
  74752. if (TileIntersectsBody(tileWorldRect, body)
  74753. && (!processCallback || processCallback.call(callbackContext, sprite, tile))
  74754. && ProcessTileCallbacks(tile, sprite)
  74755. && (overlapOnly || SeparateTile(i, body, tile, tileWorldRect, tilemapLayer, this.TILE_BIAS)))
  74756. {
  74757. this._total++;
  74758. if (collideCallback)
  74759. {
  74760. collideCallback.call(callbackContext, sprite, tile);
  74761. }
  74762. if (overlapOnly && body.onOverlap)
  74763. {
  74764. sprite.emit('overlap', body.gameObject, tile, body, null);
  74765. }
  74766. else if (body.onCollide)
  74767. {
  74768. sprite.emit('collide', body.gameObject, tile, body, null);
  74769. }
  74770. }
  74771. }
  74772. },
  74773. /**
  74774. * Helper for Group vs. Group collisions.
  74775. *
  74776. * @method Phaser.Physics.Arcade.World#collideGroupVsGroup
  74777. * @since 3.0.0
  74778. *
  74779. * @param {Phaser.GameObjects.Group} group1 - [description]
  74780. * @param {Phaser.GameObjects.Group} group2 - [description]
  74781. * @param {ArcadePhysicsCallback} collideCallback - [description]
  74782. * @param {ArcadePhysicsCallback} processCallback - [description]
  74783. * @param {*} callbackContext - [description]
  74784. * @param {boolean} overlapOnly - [description]
  74785. *
  74786. * @return {boolean} [description]
  74787. */
  74788. collideGroupVsGroup: function (group1, group2, collideCallback, processCallback, callbackContext, overlapOnly)
  74789. {
  74790. if (group1.length === 0 || group2.length === 0)
  74791. {
  74792. return;
  74793. }
  74794. var children = group1.getChildren();
  74795. for (var i = 0; i < children.length; i++)
  74796. {
  74797. this.collideSpriteVsGroup(children[i], group2, collideCallback, processCallback, callbackContext, overlapOnly);
  74798. }
  74799. },
  74800. /**
  74801. * Wrap an object's coordinates (or several objects' coordinates) within {@link Phaser.Physics.Arcade.World#bounds}.
  74802. *
  74803. * 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).
  74804. *
  74805. * @method Phaser.Physics.Arcade.World#wrap
  74806. * @since 3.3.0
  74807. *
  74808. * @param {*} object - A Game Object, a Group, an object with `x` and `y` coordinates, or an array of such objects.
  74809. * @param {number} [padding=0] - An amount added to each boundary edge during the operation.
  74810. */
  74811. wrap: function (object, padding)
  74812. {
  74813. if (object.body)
  74814. {
  74815. this.wrapObject(object, padding);
  74816. }
  74817. else if (object.getChildren)
  74818. {
  74819. this.wrapArray(object.getChildren(), padding);
  74820. }
  74821. else if (Array.isArray(object))
  74822. {
  74823. this.wrapArray(object, padding);
  74824. }
  74825. else
  74826. {
  74827. this.wrapObject(object, padding);
  74828. }
  74829. },
  74830. /**
  74831. * Wrap each object's coordinates within {@link Phaser.Physics.Arcade.World#bounds}.
  74832. *
  74833. * @method Phaser.Physics.Arcade.World#wrapArray
  74834. * @since 3.3.0
  74835. *
  74836. * @param {Array.<*>} objects - An array of objects to be wrapped.
  74837. * @param {number} [padding=0] - An amount added to the boundary.
  74838. */
  74839. wrapArray: function (objects, padding)
  74840. {
  74841. for (var i = 0; i < objects.length; i++)
  74842. {
  74843. this.wrapObject(objects[i], padding);
  74844. }
  74845. },
  74846. /**
  74847. * Wrap an object's coordinates within {@link Phaser.Physics.Arcade.World#bounds}.
  74848. *
  74849. * @method Phaser.Physics.Arcade.World#wrapObject
  74850. * @since 3.3.0
  74851. *
  74852. * @param {*} object - A Game Object, a Physics Body, or any object with `x` and `y` coordinates
  74853. * @param {number} [padding=0] - An amount added to the boundary.
  74854. */
  74855. wrapObject: function (object, padding)
  74856. {
  74857. if (padding === undefined) { padding = 0; }
  74858. object.x = Wrap(object.x, this.bounds.left - padding, this.bounds.right + padding);
  74859. object.y = Wrap(object.y, this.bounds.top - padding, this.bounds.bottom + padding);
  74860. },
  74861. /**
  74862. * Shuts down the simulation, clearing physics data and removing listeners.
  74863. *
  74864. * @method Phaser.Physics.Arcade.World#shutdown
  74865. * @since 3.0.0
  74866. */
  74867. shutdown: function ()
  74868. {
  74869. this.tree.clear();
  74870. this.staticTree.clear();
  74871. this.bodies.clear();
  74872. this.staticBodies.clear();
  74873. this.colliders.destroy();
  74874. this.removeAllListeners();
  74875. },
  74876. /**
  74877. * Shuts down the simulation and disconnects it from the current scene.
  74878. *
  74879. * @method Phaser.Physics.Arcade.World#destroy
  74880. * @since 3.0.0
  74881. */
  74882. destroy: function ()
  74883. {
  74884. this.shutdown();
  74885. this.scene = null;
  74886. }
  74887. });
  74888. module.exports = World;
  74889. /***/ }),
  74890. /* 346 */
  74891. /***/ (function(module, exports, __webpack_require__) {
  74892. /**
  74893. * @author Richard Davey <rich@photonstorm.com>
  74894. * @copyright 2018 Photon Storm Ltd.
  74895. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  74896. */
  74897. // Phaser.Physics.Arcade.StaticGroup
  74898. var ArcadeSprite = __webpack_require__(143);
  74899. var Class = __webpack_require__(0);
  74900. var CONST = __webpack_require__(43);
  74901. var Group = __webpack_require__(112);
  74902. /**
  74903. * @classdesc
  74904. * [description]
  74905. *
  74906. * @class StaticGroup
  74907. * @extends Phaser.GameObjects.Group
  74908. * @memberOf Phaser.Physics.Arcade
  74909. * @constructor
  74910. * @since 3.0.0
  74911. *
  74912. * @param {Phaser.Physics.Arcade.World} world - [description]
  74913. * @param {Phaser.Scene} scene - [description]
  74914. * @param {array} children - [description]
  74915. * @param {GroupConfig} config - [description]
  74916. */
  74917. var StaticPhysicsGroup = new Class({
  74918. Extends: Group,
  74919. initialize:
  74920. function StaticPhysicsGroup (world, scene, children, config)
  74921. {
  74922. if (config === undefined && !Array.isArray(children) && typeof children === 'object')
  74923. {
  74924. config = children;
  74925. children = null;
  74926. }
  74927. else if (config === undefined)
  74928. {
  74929. config = {};
  74930. }
  74931. /**
  74932. * [description]
  74933. *
  74934. * @name Phaser.Physics.Arcade.StaticGroup#world
  74935. * @type {Phaser.Physics.Arcade.World}
  74936. * @since 3.0.0
  74937. */
  74938. this.world = world;
  74939. config.createCallback = this.createCallbackHandler;
  74940. config.removeCallback = this.removeCallbackHandler;
  74941. config.createMultipleCallback = this.createMultipleCallbackHandler;
  74942. config.classType = ArcadeSprite;
  74943. /**
  74944. * [description]
  74945. *
  74946. * @name Phaser.Physics.Arcade.StaticGroup#physicsType
  74947. * @type {integer}
  74948. * @since 3.0.0
  74949. */
  74950. this.physicsType = CONST.STATIC_BODY;
  74951. Group.call(this, scene, children, config);
  74952. },
  74953. /**
  74954. * [description]
  74955. *
  74956. * @method Phaser.Physics.Arcade.StaticGroup#createCallbackHandler
  74957. * @since 3.0.0
  74958. *
  74959. * @param {Phaser.GameObjects.GameObject} child - [description]
  74960. */
  74961. createCallbackHandler: function (child)
  74962. {
  74963. if (!child.body)
  74964. {
  74965. this.world.enableBody(child, CONST.STATIC_BODY);
  74966. }
  74967. },
  74968. /**
  74969. * [description]
  74970. *
  74971. * @method Phaser.Physics.Arcade.StaticGroup#removeCallbackHandler
  74972. * @since 3.0.0
  74973. *
  74974. * @param {Phaser.GameObjects.GameObject} child - [description]
  74975. */
  74976. removeCallbackHandler: function (child)
  74977. {
  74978. if (child.body)
  74979. {
  74980. this.world.disableBody(child);
  74981. }
  74982. },
  74983. /**
  74984. * [description]
  74985. *
  74986. * @method Phaser.Physics.Arcade.StaticGroup#createMultipleCallbackHandler
  74987. * @since 3.0.0
  74988. *
  74989. * @param {object} entries - [description]
  74990. */
  74991. createMultipleCallbackHandler: function ()
  74992. {
  74993. this.refresh();
  74994. },
  74995. /**
  74996. * [description]
  74997. *
  74998. * @method Phaser.Physics.Arcade.StaticGroup#refresh
  74999. * @since 3.0.0
  75000. *
  75001. * @return {Phaser.Physics.Arcade.StaticGroup} [description]
  75002. */
  75003. refresh: function ()
  75004. {
  75005. var children = this.children.entries;
  75006. for (var i = 0; i < children.length; i++)
  75007. {
  75008. children[i].body.reset();
  75009. }
  75010. return this;
  75011. }
  75012. });
  75013. module.exports = StaticPhysicsGroup;
  75014. /***/ }),
  75015. /* 347 */
  75016. /***/ (function(module, exports, __webpack_require__) {
  75017. /**
  75018. * @author Richard Davey <rich@photonstorm.com>
  75019. * @copyright 2018 Photon Storm Ltd.
  75020. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75021. */
  75022. var ArcadeSprite = __webpack_require__(143);
  75023. var Class = __webpack_require__(0);
  75024. var CONST = __webpack_require__(43);
  75025. var GetFastValue = __webpack_require__(1);
  75026. var Group = __webpack_require__(112);
  75027. /**
  75028. * @typedef {object} PhysicsGroupConfig
  75029. * @extends GroupConfig
  75030. *
  75031. * @property {boolean} [collideWorldBounds=false] - Sets {@link Phaser.Physics.Arcade.Body#collideWorldBounds}.
  75032. * @property {number} [accelerationX=0] - Sets {@link Phaser.Physics.Arcade.Body#acceleration acceleration.x}.
  75033. * @property {number} [accelerationY=0] - Sets {@link Phaser.Physics.Arcade.Body#acceleration acceleration.y}.
  75034. * @property {boolean} [allowDrag=true] - Sets {@link Phaser.Physics.Arcade.Body#allowDrag}.
  75035. * @property {boolean} [allowGravity=true] - Sets {@link Phaser.Physics.Arcade.Body#allowGravity}.
  75036. * @property {boolean} [allowRotation=true] - Sets {@link Phaser.Physics.Arcade.Body#allowRotation}.
  75037. * @property {number} [bounceX=0] - Sets {@link Phaser.Physics.Arcade.Body#bounce bounce.x}.
  75038. * @property {number} [bounceY=0] - Sets {@link Phaser.Physics.Arcade.Body#bounce bounce.y}.
  75039. * @property {number} [dragX=0] - Sets {@link Phaser.Physics.Arcade.Body#drag drag.x}.
  75040. * @property {number} [dragY=0] - Sets {@link Phaser.Physics.Arcade.Body#drag drag.y}.
  75041. * @property {number} [gravityX=0] - Sets {@link Phaser.Physics.Arcade.Body#gravity gravity.x}.
  75042. * @property {number} [gravityY=0] - Sets {@link Phaser.Physics.Arcade.Body#gravity gravity.y}.
  75043. * @property {number} [frictionX=0] - Sets {@link Phaser.Physics.Arcade.Body#friction friction.x}.
  75044. * @property {number} [frictionY=0] - Sets {@link Phaser.Physics.Arcade.Body#friction friction.y}.
  75045. * @property {number} [velocityX=0] - Sets {@link Phaser.Physics.Arcade.Body#velocity velocity.x}.
  75046. * @property {number} [velocityY=0] - Sets {@link Phaser.Physics.Arcade.Body#velocity velocity.y}.
  75047. * @property {number} [angularVelocity=0] - Sets {@link Phaser.Physics.Arcade.Body#angularVelocity}.
  75048. * @property {number} [angularAcceleration=0] - Sets {@link Phaser.Physics.Arcade.Body#angularAcceleration}.
  75049. * @property {number} [angularDrag=0] - Sets {@link Phaser.Physics.Arcade.Body#angularDrag}.
  75050. * @property {number} [mass=0] - Sets {@link Phaser.Physics.Arcade.Body#mass}.
  75051. * @property {boolean} [immovable=false] - Sets {@link Phaser.Physics.Arcade.Body#immovable}.
  75052. */
  75053. /**
  75054. * @typedef {object} PhysicsGroupDefaults
  75055. *
  75056. * @property {boolean} setCollideWorldBounds - [description]
  75057. * @property {number} setAccelerationX - [description]
  75058. * @property {number} setAccelerationY - [description]
  75059. * @property {boolean} setAllowDrag - [description]
  75060. * @property {boolean} setAllowGravity - [description]
  75061. * @property {boolean} setAllowRotation - [description]
  75062. * @property {number} setBounceX - [description]
  75063. * @property {number} setBounceY - [description]
  75064. * @property {number} setDragX - [description]
  75065. * @property {number} setDragY - [description]
  75066. * @property {number} setGravityX - [description]
  75067. * @property {number} setGravityY - [description]
  75068. * @property {number} setFrictionX - [description]
  75069. * @property {number} setFrictionY - [description]
  75070. * @property {number} setVelocityX - [description]
  75071. * @property {number} setVelocityY - [description]
  75072. * @property {number} setAngularVelocity - [description]
  75073. * @property {number} setAngularAcceleration - [description]
  75074. * @property {number} setAngularDrag - [description]
  75075. * @property {number} setMass - [description]
  75076. * @property {boolean} setImmovable - [description]
  75077. */
  75078. /**
  75079. * @classdesc
  75080. * An Arcade Physics Group object.
  75081. *
  75082. * All Game Objects created by this Group will automatically be dynamic Arcade Physics objects.
  75083. *
  75084. * @class Group
  75085. * @extends Phaser.GameObjects.Group
  75086. * @memberOf Phaser.Physics.Arcade
  75087. * @constructor
  75088. * @since 3.0.0
  75089. *
  75090. * @param {Phaser.Physics.Arcade.World} world - [description]
  75091. * @param {Phaser.Scene} scene - [description]
  75092. * @param {array} children - [description]
  75093. * @param {PhysicsGroupConfig} [config] - [description]
  75094. */
  75095. var PhysicsGroup = new Class({
  75096. Extends: Group,
  75097. initialize:
  75098. function PhysicsGroup (world, scene, children, config)
  75099. {
  75100. if (config === undefined && !Array.isArray(children) && typeof children === 'object')
  75101. {
  75102. config = children;
  75103. children = null;
  75104. }
  75105. else if (config === undefined)
  75106. {
  75107. config = {};
  75108. }
  75109. /**
  75110. * [description]
  75111. *
  75112. * @name Phaser.Physics.Arcade.Group#world
  75113. * @type {Phaser.Physics.Arcade.World}
  75114. * @since 3.0.0
  75115. */
  75116. this.world = world;
  75117. config.createCallback = this.createCallbackHandler;
  75118. config.removeCallback = this.removeCallbackHandler;
  75119. /**
  75120. * The class to create new group members from.
  75121. *
  75122. * @name Phaser.Physics.Arcade.Group#classType
  75123. * @type {Phaser.Physics.Arcade.Sprite}
  75124. * @default ArcadeSprite
  75125. */
  75126. config.classType = GetFastValue(config, 'classType', ArcadeSprite);
  75127. /**
  75128. * [description]
  75129. *
  75130. * @name Phaser.Physics.Arcade.Group#physicsType
  75131. * @type {integer}
  75132. * @since 3.0.0
  75133. */
  75134. this.physicsType = CONST.DYNAMIC_BODY;
  75135. /**
  75136. * [description]
  75137. *
  75138. * @name Phaser.Physics.Arcade.Group#defaults
  75139. * @type {PhysicsGroupDefaults}
  75140. * @since 3.0.0
  75141. */
  75142. this.defaults = {
  75143. setCollideWorldBounds: GetFastValue(config, 'collideWorldBounds', false),
  75144. setAccelerationX: GetFastValue(config, 'accelerationX', 0),
  75145. setAccelerationY: GetFastValue(config, 'accelerationY', 0),
  75146. setAllowDrag: GetFastValue(config, 'allowDrag', true),
  75147. setAllowGravity: GetFastValue(config, 'allowGravity', true),
  75148. setAllowRotation: GetFastValue(config, 'allowRotation', true),
  75149. setBounceX: GetFastValue(config, 'bounceX', 0),
  75150. setBounceY: GetFastValue(config, 'bounceY', 0),
  75151. setDragX: GetFastValue(config, 'dragX', 0),
  75152. setDragY: GetFastValue(config, 'dragY', 0),
  75153. setGravityX: GetFastValue(config, 'gravityX', 0),
  75154. setGravityY: GetFastValue(config, 'gravityY', 0),
  75155. setFrictionX: GetFastValue(config, 'frictionX', 0),
  75156. setFrictionY: GetFastValue(config, 'frictionY', 0),
  75157. setVelocityX: GetFastValue(config, 'velocityX', 0),
  75158. setVelocityY: GetFastValue(config, 'velocityY', 0),
  75159. setAngularVelocity: GetFastValue(config, 'angularVelocity', 0),
  75160. setAngularAcceleration: GetFastValue(config, 'angularAcceleration', 0),
  75161. setAngularDrag: GetFastValue(config, 'angularDrag', 0),
  75162. setMass: GetFastValue(config, 'mass', 1),
  75163. setImmovable: GetFastValue(config, 'immovable', false)
  75164. };
  75165. Group.call(this, scene, children, config);
  75166. },
  75167. /**
  75168. * [description]
  75169. *
  75170. * @method Phaser.Physics.Arcade.Group#createCallbackHandler
  75171. * @since 3.0.0
  75172. *
  75173. * @param {Phaser.GameObjects.GameObject} child - [description]
  75174. */
  75175. createCallbackHandler: function (child)
  75176. {
  75177. if (!child.body)
  75178. {
  75179. this.world.enableBody(child, CONST.DYNAMIC_BODY);
  75180. }
  75181. var body = child.body;
  75182. for (var key in this.defaults)
  75183. {
  75184. body[key](this.defaults[key]);
  75185. }
  75186. },
  75187. /**
  75188. * [description]
  75189. *
  75190. * @method Phaser.Physics.Arcade.Group#removeCallbackHandler
  75191. * @since 3.0.0
  75192. *
  75193. * @param {Phaser.GameObjects.GameObject} child - [description]
  75194. */
  75195. removeCallbackHandler: function (child)
  75196. {
  75197. if (child.body)
  75198. {
  75199. this.world.disableBody(child);
  75200. }
  75201. },
  75202. /**
  75203. * [description]
  75204. *
  75205. * @method Phaser.Physics.Arcade.Group#setVelocity
  75206. * @since 3.0.0
  75207. *
  75208. * @param {number} x - [description]
  75209. * @param {number} y - [description]
  75210. * @param {number} step - [description]
  75211. *
  75212. * @return {Phaser.Physics.Arcade.Group} This Physics Group object.
  75213. */
  75214. setVelocity: function (x, y, step)
  75215. {
  75216. if (step === undefined) { step = 0; }
  75217. var items = this.getChildren();
  75218. for (var i = 0; i < items.length; i++)
  75219. {
  75220. items[i].body.velocity.set(x + (i * step), y + (i * step));
  75221. }
  75222. return this;
  75223. },
  75224. /**
  75225. * [description]
  75226. *
  75227. * @method Phaser.Physics.Arcade.Group#setVelocityX
  75228. * @since 3.0.0
  75229. *
  75230. * @param {number} value - [description]
  75231. * @param {number} step - [description]
  75232. *
  75233. * @return {Phaser.Physics.Arcade.Group} This Physics Group object.
  75234. */
  75235. setVelocityX: function (value, step)
  75236. {
  75237. if (step === undefined) { step = 0; }
  75238. var items = this.getChildren();
  75239. for (var i = 0; i < items.length; i++)
  75240. {
  75241. items[i].body.velocity.x = value + (i * step);
  75242. }
  75243. return this;
  75244. },
  75245. /**
  75246. * [description]
  75247. *
  75248. * @method Phaser.Physics.Arcade.Group#setVelocityY
  75249. * @since 3.0.0
  75250. *
  75251. * @param {number} value - [description]
  75252. * @param {number} step - [description]
  75253. *
  75254. * @return {Phaser.Physics.Arcade.Group} This Physics Group object.
  75255. */
  75256. setVelocityY: function (value, step)
  75257. {
  75258. if (step === undefined) { step = 0; }
  75259. var items = this.getChildren();
  75260. for (var i = 0; i < items.length; i++)
  75261. {
  75262. items[i].body.velocity.y = value + (i * step);
  75263. }
  75264. return this;
  75265. }
  75266. });
  75267. module.exports = PhysicsGroup;
  75268. /***/ }),
  75269. /* 348 */
  75270. /***/ (function(module, exports, __webpack_require__) {
  75271. /**
  75272. * @author Richard Davey <rich@photonstorm.com>
  75273. * @copyright 2018 Photon Storm Ltd.
  75274. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75275. */
  75276. /**
  75277. * @namespace Phaser.Physics.Arcade.Components
  75278. */
  75279. module.exports = {
  75280. Acceleration: __webpack_require__(706),
  75281. Angular: __webpack_require__(705),
  75282. Bounce: __webpack_require__(704),
  75283. Debug: __webpack_require__(703),
  75284. Drag: __webpack_require__(702),
  75285. Enable: __webpack_require__(701),
  75286. Friction: __webpack_require__(700),
  75287. Gravity: __webpack_require__(699),
  75288. Immovable: __webpack_require__(698),
  75289. Mass: __webpack_require__(697),
  75290. Size: __webpack_require__(696),
  75291. Velocity: __webpack_require__(695)
  75292. };
  75293. /***/ }),
  75294. /* 349 */
  75295. /***/ (function(module, exports, __webpack_require__) {
  75296. /**
  75297. * @author Richard Davey <rich@photonstorm.com>
  75298. * @copyright 2018 Photon Storm Ltd.
  75299. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75300. */
  75301. var Class = __webpack_require__(0);
  75302. var Components = __webpack_require__(348);
  75303. var Image = __webpack_require__(68);
  75304. /**
  75305. * @classdesc
  75306. * An Arcade Physics Image Game Object.
  75307. *
  75308. * An Image is a light-weight Game Object useful for the display of static images in your game,
  75309. * such as logos, backgrounds, scenery or other non-animated elements. Images can have input
  75310. * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an
  75311. * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component.
  75312. *
  75313. * @class Image
  75314. * @extends Phaser.GameObjects.Image
  75315. * @memberOf Phaser.Physics.Arcade
  75316. * @constructor
  75317. * @since 3.0.0
  75318. *
  75319. * @extends Phaser.Physics.Arcade.Components.Acceleration
  75320. * @extends Phaser.Physics.Arcade.Components.Angular
  75321. * @extends Phaser.Physics.Arcade.Components.Bounce
  75322. * @extends Phaser.Physics.Arcade.Components.Debug
  75323. * @extends Phaser.Physics.Arcade.Components.Drag
  75324. * @extends Phaser.Physics.Arcade.Components.Enable
  75325. * @extends Phaser.Physics.Arcade.Components.Friction
  75326. * @extends Phaser.Physics.Arcade.Components.Gravity
  75327. * @extends Phaser.Physics.Arcade.Components.Immovable
  75328. * @extends Phaser.Physics.Arcade.Components.Mass
  75329. * @extends Phaser.Physics.Arcade.Components.Size
  75330. * @extends Phaser.Physics.Arcade.Components.Velocity
  75331. * @extends Phaser.GameObjects.Components.Alpha
  75332. * @extends Phaser.GameObjects.Components.BlendMode
  75333. * @extends Phaser.GameObjects.Components.Depth
  75334. * @extends Phaser.GameObjects.Components.Flip
  75335. * @extends Phaser.GameObjects.Components.GetBounds
  75336. * @extends Phaser.GameObjects.Components.Origin
  75337. * @extends Phaser.GameObjects.Components.Pipeline
  75338. * @extends Phaser.GameObjects.Components.ScaleMode
  75339. * @extends Phaser.GameObjects.Components.ScrollFactor
  75340. * @extends Phaser.GameObjects.Components.Size
  75341. * @extends Phaser.GameObjects.Components.Texture
  75342. * @extends Phaser.GameObjects.Components.Tint
  75343. * @extends Phaser.GameObjects.Components.Transform
  75344. * @extends Phaser.GameObjects.Components.Visible
  75345. *
  75346. * @param {Phaser.Scene} scene - The Scene to which this Game Object belongs. A Game Object can only belong to one Scene at a time.
  75347. * @param {number} x - The horizontal position of this Game Object in the world.
  75348. * @param {number} y - The vertical position of this Game Object in the world.
  75349. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  75350. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  75351. */
  75352. var ArcadeImage = new Class({
  75353. Extends: Image,
  75354. Mixins: [
  75355. Components.Acceleration,
  75356. Components.Angular,
  75357. Components.Bounce,
  75358. Components.Debug,
  75359. Components.Drag,
  75360. Components.Enable,
  75361. Components.Friction,
  75362. Components.Gravity,
  75363. Components.Immovable,
  75364. Components.Mass,
  75365. Components.Size,
  75366. Components.Velocity
  75367. ],
  75368. initialize:
  75369. function ArcadeImage (scene, x, y, texture, frame)
  75370. {
  75371. Image.call(this, scene, x, y, texture, frame);
  75372. }
  75373. });
  75374. module.exports = ArcadeImage;
  75375. /***/ }),
  75376. /* 350 */
  75377. /***/ (function(module, exports, __webpack_require__) {
  75378. /**
  75379. * @author Richard Davey <rich@photonstorm.com>
  75380. * @copyright 2018 Photon Storm Ltd.
  75381. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75382. */
  75383. var ArcadeImage = __webpack_require__(349);
  75384. var ArcadeSprite = __webpack_require__(143);
  75385. var Class = __webpack_require__(0);
  75386. var CONST = __webpack_require__(43);
  75387. var PhysicsGroup = __webpack_require__(347);
  75388. var StaticPhysicsGroup = __webpack_require__(346);
  75389. /**
  75390. * @classdesc
  75391. * The Arcade Physics Factory allows you to easily create Arcade Physics enabled Game Objects.
  75392. * Objects that are created by this Factory are automatically added to the physics world.
  75393. *
  75394. * @class Factory
  75395. * @memberOf Phaser.Physics.Arcade
  75396. * @constructor
  75397. * @since 3.0.0
  75398. *
  75399. * @param {Phaser.Physics.Arcade.World} world - The Arcade Physics World instance.
  75400. */
  75401. var Factory = new Class({
  75402. initialize:
  75403. function Factory (world)
  75404. {
  75405. /**
  75406. * A reference to the Arcade Physics World.
  75407. *
  75408. * @name Phaser.Physics.Arcade.Factory#world
  75409. * @type {Phaser.Physics.Arcade.World}
  75410. * @since 3.0.0
  75411. */
  75412. this.world = world;
  75413. /**
  75414. * A reference to the Scene this Arcade Physics instance belongs to.
  75415. *
  75416. * @name Phaser.Physics.Arcade.Factory#scene
  75417. * @type {Phaser.Scene}
  75418. * @since 3.0.0
  75419. */
  75420. this.scene = world.scene;
  75421. /**
  75422. * A reference to the Scene.Systems this Arcade Physics instance belongs to.
  75423. *
  75424. * @name Phaser.Physics.Arcade.Factory#sys
  75425. * @type {Phaser.Scenes.Systems}
  75426. * @since 3.0.0
  75427. */
  75428. this.sys = world.scene.sys;
  75429. },
  75430. /**
  75431. * Create a new Arcade Physics Collider object.
  75432. *
  75433. * @method Phaser.Physics.Arcade.Factory#collider
  75434. * @since 3.0.0
  75435. *
  75436. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group|Phaser.GameObjects.Group[])} object1 - The first object to check for collision.
  75437. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group|Phaser.GameObjects.Group[])} object2 - The second object to check for collision.
  75438. * @param {ArcadePhysicsCallback} [collideCallback] - The callback to invoke when the two objects collide.
  75439. * @param {ArcadePhysicsCallback} [processCallback] - The callback to invoke when the two objects collide. Must return a boolean.
  75440. * @param {*} [callbackContext] - The scope in which to call the callbacks.
  75441. *
  75442. * @return {Phaser.Physics.Arcade.Collider} The Collider that was created.
  75443. */
  75444. collider: function (object1, object2, collideCallback, processCallback, callbackContext)
  75445. {
  75446. return this.world.addCollider(object1, object2, collideCallback, processCallback, callbackContext);
  75447. },
  75448. /**
  75449. * Create a new Arcade Physics Collider Overlap object.
  75450. *
  75451. * @method Phaser.Physics.Arcade.Factory#overlap
  75452. * @since 3.0.0
  75453. *
  75454. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group|Phaser.GameObjects.Group[])} object1 - The first object to check for overlap.
  75455. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]|Phaser.GameObjects.Group|Phaser.GameObjects.Group[])} object2 - The second object to check for overlap.
  75456. * @param {ArcadePhysicsCallback} [collideCallback] - The callback to invoke when the two objects collide.
  75457. * @param {ArcadePhysicsCallback} [processCallback] - The callback to invoke when the two objects collide. Must return a boolean.
  75458. * @param {*} [callbackContext] - The scope in which to call the callbacks.
  75459. *
  75460. * @return {Phaser.Physics.Arcade.Collider} The Collider that was created.
  75461. */
  75462. overlap: function (object1, object2, collideCallback, processCallback, callbackContext)
  75463. {
  75464. return this.world.addOverlap(object1, object2, collideCallback, processCallback, callbackContext);
  75465. },
  75466. /**
  75467. * Adds an Arcade Physics Body to the given Game Object.
  75468. *
  75469. * @method Phaser.Physics.Arcade.Factory#existing
  75470. * @since 3.0.0
  75471. *
  75472. * @param {Phaser.GameObjects.GameObject} gameObject - [description]
  75473. * @param {boolean} [isStatic=false] - Set to true to create a Static body, otherwise it will create a Dynamic body.
  75474. *
  75475. * @return {Phaser.GameObjects.GameObject} The Game Object.
  75476. */
  75477. existing: function (gameObject, isStatic)
  75478. {
  75479. var type = (isStatic) ? CONST.STATIC_BODY : CONST.DYNAMIC_BODY;
  75480. this.world.enableBody(gameObject, type);
  75481. return gameObject;
  75482. },
  75483. /**
  75484. * Creates a new Arcade Image object with a Static body.
  75485. *
  75486. * @method Phaser.Physics.Arcade.Factory#staticImage
  75487. * @since 3.0.0
  75488. *
  75489. * @param {number} x - The horizontal position of this Game Object in the world.
  75490. * @param {number} y - The vertical position of this Game Object in the world.
  75491. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  75492. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  75493. *
  75494. * @return {Phaser.Physics.Arcade.Image} The Image object that was created.
  75495. */
  75496. staticImage: function (x, y, key, frame)
  75497. {
  75498. var image = new ArcadeImage(this.scene, x, y, key, frame);
  75499. this.sys.displayList.add(image);
  75500. this.world.enableBody(image, CONST.STATIC_BODY);
  75501. return image;
  75502. },
  75503. /**
  75504. * Creates a new Arcade Image object with a Dynamic body.
  75505. *
  75506. * @method Phaser.Physics.Arcade.Factory#image
  75507. * @since 3.0.0
  75508. *
  75509. * @param {number} x - The horizontal position of this Game Object in the world.
  75510. * @param {number} y - The vertical position of this Game Object in the world.
  75511. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  75512. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  75513. *
  75514. * @return {Phaser.Physics.Arcade.Image} The Image object that was created.
  75515. */
  75516. image: function (x, y, key, frame)
  75517. {
  75518. var image = new ArcadeImage(this.scene, x, y, key, frame);
  75519. this.sys.displayList.add(image);
  75520. this.world.enableBody(image, CONST.DYNAMIC_BODY);
  75521. return image;
  75522. },
  75523. /**
  75524. * Creates a new Arcade Sprite object with a Static body.
  75525. *
  75526. * @method Phaser.Physics.Arcade.Factory#staticSprite
  75527. * @since 3.0.0
  75528. *
  75529. * @param {number} x - The horizontal position of this Game Object in the world.
  75530. * @param {number} y - The vertical position of this Game Object in the world.
  75531. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  75532. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  75533. *
  75534. * @return {Phaser.Physics.Arcade.Sprite} The Sprite object that was created.
  75535. */
  75536. staticSprite: function (x, y, key, frame)
  75537. {
  75538. var sprite = new ArcadeSprite(this.scene, x, y, key, frame);
  75539. this.sys.displayList.add(sprite);
  75540. this.sys.updateList.add(sprite);
  75541. this.world.enableBody(sprite, CONST.STATIC_BODY);
  75542. return sprite;
  75543. },
  75544. /**
  75545. * Creates a new Arcade Sprite object with a Dynamic body.
  75546. *
  75547. * @method Phaser.Physics.Arcade.Factory#sprite
  75548. * @since 3.0.0
  75549. *
  75550. * @param {number} x - The horizontal position of this Game Object in the world.
  75551. * @param {number} y - The vertical position of this Game Object in the world.
  75552. * @param {string} key - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  75553. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  75554. *
  75555. * @return {Phaser.Physics.Arcade.Sprite} The Sprite object that was created.
  75556. */
  75557. sprite: function (x, y, key, frame)
  75558. {
  75559. var sprite = new ArcadeSprite(this.scene, x, y, key, frame);
  75560. this.sys.displayList.add(sprite);
  75561. this.sys.updateList.add(sprite);
  75562. this.world.enableBody(sprite, CONST.DYNAMIC_BODY);
  75563. return sprite;
  75564. },
  75565. /**
  75566. * Creates a Static Physics Group object.
  75567. * All Game Objects created by this Group will automatically be static Arcade Physics objects.
  75568. *
  75569. * @method Phaser.Physics.Arcade.Factory#staticGroup
  75570. * @since 3.0.0
  75571. *
  75572. * @param {object|object[]} [children] - [description]
  75573. * @param {GroupConfig} [config] - [description]
  75574. *
  75575. * @return {Phaser.Physics.Arcade.StaticGroup} The Static Group object that was created.
  75576. */
  75577. staticGroup: function (children, config)
  75578. {
  75579. return this.sys.updateList.add(new StaticPhysicsGroup(this.world, this.world.scene, children, config));
  75580. },
  75581. /**
  75582. * Creates a Physics Group object.
  75583. * All Game Objects created by this Group will automatically be dynamic Arcade Physics objects.
  75584. *
  75585. * @method Phaser.Physics.Arcade.Factory#group
  75586. * @since 3.0.0
  75587. *
  75588. * @param {object|object[]} [children] - [description]
  75589. * @param {PhysicsGroupConfig} [config] - [description]
  75590. *
  75591. * @return {Phaser.Physics.Arcade.Group} The Group object that was created.
  75592. */
  75593. group: function (children, config)
  75594. {
  75595. return this.sys.updateList.add(new PhysicsGroup(this.world, this.world.scene, children, config));
  75596. },
  75597. /**
  75598. * Destroys this Factory.
  75599. *
  75600. * @method Phaser.Physics.Arcade.Factory#destroy
  75601. * @since 3.5.0
  75602. */
  75603. destroy: function ()
  75604. {
  75605. this.world = null;
  75606. this.scene = null;
  75607. this.sys = null;
  75608. }
  75609. });
  75610. module.exports = Factory;
  75611. /***/ }),
  75612. /* 351 */
  75613. /***/ (function(module, exports) {
  75614. /**
  75615. * @author Richard Davey <rich@photonstorm.com>
  75616. * @copyright 2018 Photon Storm Ltd.
  75617. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75618. */
  75619. /**
  75620. * Rotate a given point by a given angle around the origin (0, 0), in an anti-clockwise direction.
  75621. *
  75622. * @function Phaser.Math.Rotate
  75623. * @since 3.0.0
  75624. *
  75625. * @param {(Phaser.Geom.Point|object)} point - The point to be rotated.
  75626. * @param {number} angle - The angle to be rotated by in an anticlockwise direction.
  75627. *
  75628. * @return {Phaser.Geom.Point} The given point, rotated by the given angle in an anticlockwise direction.
  75629. */
  75630. var Rotate = function (point, angle)
  75631. {
  75632. var x = point.x;
  75633. var y = point.y;
  75634. point.x = (x * Math.cos(angle)) - (y * Math.sin(angle));
  75635. point.y = (x * Math.sin(angle)) + (y * Math.cos(angle));
  75636. return point;
  75637. };
  75638. module.exports = Rotate;
  75639. /***/ }),
  75640. /* 352 */
  75641. /***/ (function(module, exports) {
  75642. /**
  75643. * @author Richard Davey <rich@photonstorm.com>
  75644. * @copyright 2018 Photon Storm Ltd.
  75645. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75646. */
  75647. /**
  75648. * Snap a value to nearest grid slice, using ceil.
  75649. *
  75650. * Example: if you have an interval gap of `5` and a position of `12`... you will snap to `15`.
  75651. * As will `14` snap to `15`... but `16` will snap to `20`.
  75652. *
  75653. * @function Phaser.Math.Snap.Ceil
  75654. * @since 3.0.0
  75655. *
  75656. * @param {number} value - The value to snap.
  75657. * @param {number} gap - The interval gap of the grid.
  75658. * @param {number} [start=0] - Optional starting offset for gap.
  75659. *
  75660. * @return {number} The snapped value.
  75661. */
  75662. var SnapCeil = function (value, gap, start)
  75663. {
  75664. if (start === undefined) { start = 0; }
  75665. if (gap === 0)
  75666. {
  75667. return value;
  75668. }
  75669. value -= start;
  75670. value = gap * Math.ceil(value / gap);
  75671. return start + value;
  75672. };
  75673. module.exports = SnapCeil;
  75674. /***/ }),
  75675. /* 353 */
  75676. /***/ (function(module, exports) {
  75677. /**
  75678. * @author Richard Davey <rich@photonstorm.com>
  75679. * @copyright 2018 Photon Storm Ltd.
  75680. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75681. */
  75682. /**
  75683. * Calculates the factorial of a given number for integer values greater than 0.
  75684. *
  75685. * @function Phaser.Math.Factorial
  75686. * @since 3.0.0
  75687. *
  75688. * @param {number} value - A positive integer to calculate the factorial of.
  75689. *
  75690. * @return {number} The factorial of the given number.
  75691. */
  75692. var Factorial = function (value)
  75693. {
  75694. if (value === 0)
  75695. {
  75696. return 1;
  75697. }
  75698. var res = value;
  75699. while (--value)
  75700. {
  75701. res *= value;
  75702. }
  75703. return res;
  75704. };
  75705. module.exports = Factorial;
  75706. /***/ }),
  75707. /* 354 */
  75708. /***/ (function(module, exports, __webpack_require__) {
  75709. /**
  75710. * @author Richard Davey <rich@photonstorm.com>
  75711. * @copyright 2018 Photon Storm Ltd.
  75712. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75713. */
  75714. var Factorial = __webpack_require__(353);
  75715. /**
  75716. * [description]
  75717. *
  75718. * @function Phaser.Math.Bernstein
  75719. * @since 3.0.0
  75720. *
  75721. * @param {number} n - [description]
  75722. * @param {number} i - [description]
  75723. *
  75724. * @return {number} [description]
  75725. */
  75726. var Bernstein = function (n, i)
  75727. {
  75728. return Factorial(n) / Factorial(i) / Factorial(n - i);
  75729. };
  75730. module.exports = Bernstein;
  75731. /***/ }),
  75732. /* 355 */
  75733. /***/ (function(module, exports) {
  75734. /**
  75735. * @author Richard Davey <rich@photonstorm.com>
  75736. * @copyright 2018 Photon Storm Ltd.
  75737. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75738. */
  75739. /**
  75740. * Check whether `a` is fuzzily less than `b`.
  75741. *
  75742. * `a` is fuzzily less than `b` if it is less than `b + epsilon`.
  75743. *
  75744. * @function Phaser.Math.Fuzzy.LessThan
  75745. * @since 3.0.0
  75746. *
  75747. * @param {number} a - The first value.
  75748. * @param {number} b - The second value.
  75749. * @param {number} [epsilon=0.0001] - The epsilon.
  75750. *
  75751. * @return {boolean} `true` if `a` is fuzzily less than `b`, otherwise `false`.
  75752. */
  75753. var LessThan = function (a, b, epsilon)
  75754. {
  75755. if (epsilon === undefined) { epsilon = 0.0001; }
  75756. return a < b + epsilon;
  75757. };
  75758. module.exports = LessThan;
  75759. /***/ }),
  75760. /* 356 */
  75761. /***/ (function(module, exports) {
  75762. /**
  75763. * @author Richard Davey <rich@photonstorm.com>
  75764. * @copyright 2018 Photon Storm Ltd.
  75765. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75766. */
  75767. /**
  75768. * Check whether `a` is fuzzily greater than `b`.
  75769. *
  75770. * `a` is fuzzily greater than `b` if it is more than `b - epsilon`.
  75771. *
  75772. * @function Phaser.Math.Fuzzy.GreaterThan
  75773. * @since 3.0.0
  75774. *
  75775. * @param {number} a - The first value.
  75776. * @param {number} b - The second value.
  75777. * @param {number} [epsilon=0.0001] - The epsilon.
  75778. *
  75779. * @return {boolean} `true` if `a` is fuzzily greater than than `b`, otherwise `false`.
  75780. */
  75781. var GreaterThan = function (a, b, epsilon)
  75782. {
  75783. if (epsilon === undefined) { epsilon = 0.0001; }
  75784. return a > b - epsilon;
  75785. };
  75786. module.exports = GreaterThan;
  75787. /***/ }),
  75788. /* 357 */
  75789. /***/ (function(module, exports) {
  75790. /**
  75791. * @author Richard Davey <rich@photonstorm.com>
  75792. * @copyright 2018 Photon Storm Ltd.
  75793. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75794. */
  75795. /**
  75796. * Check whether the given values are fuzzily equal.
  75797. *
  75798. * Two numbers are fuzzily equal if their difference is less than `epsilon`.
  75799. *
  75800. * @function Phaser.Math.Fuzzy.Equal
  75801. * @since 3.0.0
  75802. *
  75803. * @param {number} a - The first value.
  75804. * @param {number} b - The second value.
  75805. * @param {number} [epsilon=0.0001] - The epsilon.
  75806. *
  75807. * @return {boolean} `true` if the values are fuzzily equal, otherwise `false`.
  75808. */
  75809. var Equal = function (a, b, epsilon)
  75810. {
  75811. if (epsilon === undefined) { epsilon = 0.0001; }
  75812. return Math.abs(a - b) < epsilon;
  75813. };
  75814. module.exports = Equal;
  75815. /***/ }),
  75816. /* 358 */
  75817. /***/ (function(module, exports) {
  75818. /**
  75819. * @author Richard Davey <rich@photonstorm.com>
  75820. * @copyright 2018 Photon Storm Ltd.
  75821. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75822. */
  75823. /**
  75824. * Normalize an angle to the [0, 2pi] range.
  75825. *
  75826. * @function Phaser.Math.Angle.Normalize
  75827. * @since 3.0.0
  75828. *
  75829. * @param {number} angle - The angle to normalize, in radians.
  75830. *
  75831. * @return {number} The normalized angle, in radians.
  75832. */
  75833. var Normalize = function (angle)
  75834. {
  75835. angle = angle % (2 * Math.PI);
  75836. if (angle >= 0)
  75837. {
  75838. return angle;
  75839. }
  75840. else
  75841. {
  75842. return angle + 2 * Math.PI;
  75843. }
  75844. };
  75845. module.exports = Normalize;
  75846. /***/ }),
  75847. /* 359 */
  75848. /***/ (function(module, exports, __webpack_require__) {
  75849. /**
  75850. * @author Richard Davey <rich@photonstorm.com>
  75851. * @copyright 2018 Photon Storm Ltd.
  75852. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  75853. */
  75854. var Class = __webpack_require__(0);
  75855. var CONST = __webpack_require__(18);
  75856. var CustomSet = __webpack_require__(69);
  75857. var EventEmitter = __webpack_require__(9);
  75858. var FileTypesManager = __webpack_require__(7);
  75859. var GetFastValue = __webpack_require__(1);
  75860. var PluginCache = __webpack_require__(12);
  75861. var XHRSettings = __webpack_require__(74);
  75862. /**
  75863. * @classdesc
  75864. * The Loader handles loading all external content such as Images, Sounds, Texture Atlases and data files.
  75865. * You typically interact with it via `this.load` in your Scene. Scenes can have a `preload` method, which is always
  75866. * called before the Scenes `create` method, allowing you to preload assets that the Scene may need.
  75867. *
  75868. * If you call any `this.load` methods from outside of `Scene.preload` then you need to start the Loader going
  75869. * yourself by calling `Loader.start()`. It's only automatically started during the Scene preload.
  75870. *
  75871. * The Loader uses a combination of tag loading (eg. Audio elements) and XHR and provides progress and completion events.
  75872. * Files are loaded in parallel by default. The amount of concurrent connections can be controlled in your Game Configuration.
  75873. *
  75874. * 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
  75875. * event, the type of file being loaded (such as a pack file) or other external events. As long as the Loader hasn't finished
  75876. * simply adding a new file to it, while running, will ensure it's added into the current queue.
  75877. *
  75878. * Every Scene has its own instance of the Loader and they are bound to the Scene in which they are created. However,
  75879. * assets loaded by the Loader are placed into global game-level caches. For example, loading an XML file will place that
  75880. * file inside `Game.cache.xml`, which is accessible from every Scene in your game, no matter who was responsible
  75881. * for loading it. The same is true of Textures. A texture loaded in one Scene is instantly available to all other Scenes
  75882. * in your game.
  75883. *
  75884. * The Loader works by using custom File Types. These are stored in the FileTypesManager, which injects them into the Loader
  75885. * when it's instantiated. You can create your own custom file types by extending either the File or MultiFile classes.
  75886. * See those files for more details.
  75887. *
  75888. * @class LoaderPlugin
  75889. * @extends Phaser.Events.EventEmitter
  75890. * @memberOf Phaser.Loader
  75891. * @constructor
  75892. * @since 3.0.0
  75893. *
  75894. * @param {Phaser.Scene} scene - The Scene which owns this Loader instance.
  75895. */
  75896. var LoaderPlugin = new Class({
  75897. Extends: EventEmitter,
  75898. initialize:
  75899. function LoaderPlugin (scene)
  75900. {
  75901. EventEmitter.call(this);
  75902. var gameConfig = scene.sys.game.config;
  75903. var sceneConfig = scene.sys.settings.loader;
  75904. /**
  75905. * The Scene which owns this Loader instance.
  75906. *
  75907. * @name Phaser.Loader.LoaderPlugin#scene
  75908. * @type {Phaser.Scene}
  75909. * @protected
  75910. * @since 3.0.0
  75911. */
  75912. this.scene = scene;
  75913. /**
  75914. * A reference to the Scene Systems.
  75915. *
  75916. * @name Phaser.Loader.LoaderPlugin#systems
  75917. * @type {Phaser.Scenes.Systems}
  75918. * @protected
  75919. * @since 3.0.0
  75920. */
  75921. this.systems = scene.sys;
  75922. /**
  75923. * A reference to the global Cache Manager.
  75924. *
  75925. * @name Phaser.Loader.LoaderPlugin#cacheManager
  75926. * @type {Phaser.Cache.CacheManager}
  75927. * @protected
  75928. * @since 3.7.0
  75929. */
  75930. this.cacheManager = scene.sys.cache;
  75931. /**
  75932. * A reference to the global Texture Manager.
  75933. *
  75934. * @name Phaser.Loader.LoaderPlugin#textureManager
  75935. * @type {Phaser.Textures.TextureManager}
  75936. * @protected
  75937. * @since 3.7.0
  75938. */
  75939. this.textureManager = scene.sys.textures;
  75940. // Inject the available filetypes into the Loader
  75941. FileTypesManager.install(this);
  75942. /**
  75943. * An optional prefix that is automatically prepended to the start of every file key.
  75944. * If prefix was `MENU.` and you load an image with the key 'Background' the resulting key would be `MENU.Background`.
  75945. * You can set this directly, or call `Loader.setPrefix()`. It will then affect every file added to the Loader
  75946. * from that point on. It does _not_ change any file already in the load queue.
  75947. *
  75948. * @name Phaser.Loader.LoaderPlugin#prefix
  75949. * @type {string}
  75950. * @default ''
  75951. * @since 3.7.0
  75952. */
  75953. this.prefix = '';
  75954. /**
  75955. * The value of `path`, if set, is placed before any _relative_ file path given. For example:
  75956. *
  75957. * ```javascript
  75958. * this.load.path = "images/sprites/";
  75959. * this.load.image("ball", "ball.png");
  75960. * this.load.image("tree", "level1/oaktree.png");
  75961. * this.load.image("boom", "http://server.com/explode.png");
  75962. * ```
  75963. *
  75964. * Would load the `ball` file from `images/sprites/ball.png` and the tree from
  75965. * `images/sprites/level1/oaktree.png` but the file `boom` would load from the URL
  75966. * given as it's an absolute URL.
  75967. *
  75968. * Please note that the path is added before the filename but *after* the baseURL (if set.)
  75969. *
  75970. * If you set this property directly then it _must_ end with a "/". Alternatively, call `setPath()` and it'll do it for you.
  75971. *
  75972. * @name Phaser.Loader.LoaderPlugin#path
  75973. * @type {string}
  75974. * @default ''
  75975. * @since 3.0.0
  75976. */
  75977. this.path = '';
  75978. /**
  75979. * If you want to append a URL before the path of any asset you can set this here.
  75980. *
  75981. * Useful if allowing the asset base url to be configured outside of the game code.
  75982. *
  75983. * If you set this property directly then it _must_ end with a "/". Alternatively, call `setBaseURL()` and it'll do it for you.
  75984. *
  75985. * @name Phaser.Loader.LoaderPlugin#baseURL
  75986. * @type {string}
  75987. * @default ''
  75988. * @since 3.0.0
  75989. */
  75990. this.baseURL = '';
  75991. this.setBaseURL(GetFastValue(sceneConfig, 'baseURL', gameConfig.loaderBaseURL));
  75992. this.setPath(GetFastValue(sceneConfig, 'path', gameConfig.loaderPath));
  75993. this.setPrefix(GetFastValue(sceneConfig, 'prefix', gameConfig.loaderPrefix));
  75994. /**
  75995. * The number of concurrent / parallel resources to try and fetch at once.
  75996. *
  75997. * Old browsers limit 6 requests per domain; modern ones, especially those with HTTP/2 don't limit it at all.
  75998. *
  75999. * The default is 32 but you can change this in your Game Config, or by changing this property before the Loader starts.
  76000. *
  76001. * @name Phaser.Loader.LoaderPlugin#maxParallelDownloads
  76002. * @type {integer}
  76003. * @since 3.0.0
  76004. */
  76005. this.maxParallelDownloads = GetFastValue(sceneConfig, 'maxParallelDownloads', gameConfig.loaderMaxParallelDownloads);
  76006. /**
  76007. * xhr specific global settings (can be overridden on a per-file basis)
  76008. *
  76009. * @name Phaser.Loader.LoaderPlugin#xhr
  76010. * @type {XHRSettingsObject}
  76011. * @since 3.0.0
  76012. */
  76013. this.xhr = XHRSettings(
  76014. GetFastValue(sceneConfig, 'responseType', gameConfig.loaderResponseType),
  76015. GetFastValue(sceneConfig, 'async', gameConfig.loaderAsync),
  76016. GetFastValue(sceneConfig, 'user', gameConfig.loaderUser),
  76017. GetFastValue(sceneConfig, 'password', gameConfig.loaderPassword),
  76018. GetFastValue(sceneConfig, 'timeout', gameConfig.loaderTimeout)
  76019. );
  76020. /**
  76021. * The crossOrigin value applied to loaded images. Very often this needs to be set to 'anonymous'.
  76022. *
  76023. * @name Phaser.Loader.LoaderPlugin#crossOrigin
  76024. * @type {string}
  76025. * @since 3.0.0
  76026. */
  76027. this.crossOrigin = GetFastValue(sceneConfig, 'crossOrigin', gameConfig.loaderCrossOrigin);
  76028. /**
  76029. * The total number of files to load. It may not always be accurate because you may add to the Loader during the process
  76030. * of loading, especially if you load a Pack File. Therefore this value can change, but in most cases remains static.
  76031. *
  76032. * @name Phaser.Loader.LoaderPlugin#totalToLoad
  76033. * @type {integer}
  76034. * @default 0
  76035. * @since 3.0.0
  76036. */
  76037. this.totalToLoad = 0;
  76038. /**
  76039. * The progress of the current load queue, as a float value between 0 and 1.
  76040. * This is updated automatically as files complete loading.
  76041. * Note that it is possible for this value to go down again if you add content to the current load queue during a load.
  76042. *
  76043. * @name Phaser.Loader.LoaderPlugin#progress
  76044. * @type {number}
  76045. * @default 0
  76046. * @since 3.0.0
  76047. */
  76048. this.progress = 0;
  76049. /**
  76050. * Files are placed in this Set when they're added to the Loader via `addFile`.
  76051. *
  76052. * They are moved to the `inflight` Set when they start loading, and assuming a successful
  76053. * load, to the `queue` Set for further processing.
  76054. *
  76055. * By the end of the load process this Set will be empty.
  76056. *
  76057. * @name Phaser.Loader.LoaderPlugin#list
  76058. * @type {Phaser.Structs.Set.<Phaser.Loader.File>}
  76059. * @since 3.0.0
  76060. */
  76061. this.list = new CustomSet();
  76062. /**
  76063. * Files are stored in this Set while they're in the process of being loaded.
  76064. *
  76065. * Upon a successful load they are moved to the `queue` Set.
  76066. *
  76067. * By the end of the load process this Set will be empty.
  76068. *
  76069. * @name Phaser.Loader.LoaderPlugin#inflight
  76070. * @type {Phaser.Structs.Set.<Phaser.Loader.File>}
  76071. * @since 3.0.0
  76072. */
  76073. this.inflight = new CustomSet();
  76074. /**
  76075. * Files are stored in this Set while they're being processed.
  76076. *
  76077. * If the process is successful they are moved to their final destination, which could be
  76078. * a Cache or the Texture Manager.
  76079. *
  76080. * At the end of the load process this Set will be empty.
  76081. *
  76082. * @name Phaser.Loader.LoaderPlugin#queue
  76083. * @type {Phaser.Structs.Set.<Phaser.Loader.File>}
  76084. * @since 3.0.0
  76085. */
  76086. this.queue = new CustomSet();
  76087. /**
  76088. * A temporary Set in which files are stored after processing,
  76089. * awaiting destruction at the end of the load process.
  76090. *
  76091. * @name Phaser.Loader.LoaderPlugin#_deleteQueue
  76092. * @type {Phaser.Structs.Set.<Phaser.Loader.File>}
  76093. * @private
  76094. * @since 3.7.0
  76095. */
  76096. this._deleteQueue = new CustomSet();
  76097. /**
  76098. * The total number of files that failed to load during the most recent load.
  76099. * This value is reset when you call `Loader.start`.
  76100. *
  76101. * @name Phaser.Loader.LoaderPlugin#totalFailed
  76102. * @type {integer}
  76103. * @default 0
  76104. * @since 3.7.0
  76105. */
  76106. this.totalFailed = 0;
  76107. /**
  76108. * The total number of files that successfully loaded during the most recent load.
  76109. * This value is reset when you call `Loader.start`.
  76110. *
  76111. * @name Phaser.Loader.LoaderPlugin#totalComplete
  76112. * @type {integer}
  76113. * @default 0
  76114. * @since 3.7.0
  76115. */
  76116. this.totalComplete = 0;
  76117. /**
  76118. * The current state of the Loader.
  76119. *
  76120. * @name Phaser.Loader.LoaderPlugin#state
  76121. * @type {integer}
  76122. * @readOnly
  76123. * @since 3.0.0
  76124. */
  76125. this.state = CONST.LOADER_IDLE;
  76126. scene.sys.events.once('boot', this.boot, this);
  76127. scene.sys.events.on('start', this.pluginStart, this);
  76128. },
  76129. /**
  76130. * This method is called automatically, only once, when the Scene is first created.
  76131. * Do not invoke it directly.
  76132. *
  76133. * @method Phaser.Loader.LoaderPlugin#boot
  76134. * @private
  76135. * @since 3.5.1
  76136. */
  76137. boot: function ()
  76138. {
  76139. this.systems.events.once('destroy', this.destroy, this);
  76140. },
  76141. /**
  76142. * This method is called automatically by the Scene when it is starting up.
  76143. * It is responsible for creating local systems, properties and listening for Scene events.
  76144. * Do not invoke it directly.
  76145. *
  76146. * @method Phaser.Loader.LoaderPlugin#pluginStart
  76147. * @private
  76148. * @since 3.5.1
  76149. */
  76150. pluginStart: function ()
  76151. {
  76152. this.systems.events.once('shutdown', this.shutdown, this);
  76153. },
  76154. /**
  76155. * If you want to append a URL before the path of any asset you can set this here.
  76156. *
  76157. * Useful if allowing the asset base url to be configured outside of the game code.
  76158. *
  76159. * Once a base URL is set it will affect every file loaded by the Loader from that point on. It does _not_ change any
  76160. * file _already_ being loaded. To reset it, call this method with no arguments.
  76161. *
  76162. * @method Phaser.Loader.LoaderPlugin#setBaseURL
  76163. * @since 3.0.0
  76164. *
  76165. * @param {string} [url] - The URL to use. Leave empty to reset.
  76166. *
  76167. * @return {Phaser.Loader.LoaderPlugin} This Loader object.
  76168. */
  76169. setBaseURL: function (url)
  76170. {
  76171. if (url === undefined) { url = ''; }
  76172. if (url !== '' && url.substr(-1) !== '/')
  76173. {
  76174. url = url.concat('/');
  76175. }
  76176. this.baseURL = url;
  76177. return this;
  76178. },
  76179. /**
  76180. * The value of `path`, if set, is placed before any _relative_ file path given. For example:
  76181. *
  76182. * ```javascript
  76183. * this.load.setPath("images/sprites/");
  76184. * this.load.image("ball", "ball.png");
  76185. * this.load.image("tree", "level1/oaktree.png");
  76186. * this.load.image("boom", "http://server.com/explode.png");
  76187. * ```
  76188. *
  76189. * Would load the `ball` file from `images/sprites/ball.png` and the tree from
  76190. * `images/sprites/level1/oaktree.png` but the file `boom` would load from the URL
  76191. * given as it's an absolute URL.
  76192. *
  76193. * Please note that the path is added before the filename but *after* the baseURL (if set.)
  76194. *
  76195. * Once a path is set it will then affect every file added to the Loader from that point on. It does _not_ change any
  76196. * file _already_ in the load queue. To reset it, call this method with no arguments.
  76197. *
  76198. * @method Phaser.Loader.LoaderPlugin#setPath
  76199. * @since 3.0.0
  76200. *
  76201. * @param {string} [path] - The path to use. Leave empty to reset.
  76202. *
  76203. * @return {Phaser.Loader.LoaderPlugin} This Loader object.
  76204. */
  76205. setPath: function (path)
  76206. {
  76207. if (path === undefined) { path = ''; }
  76208. if (path !== '' && path.substr(-1) !== '/')
  76209. {
  76210. path = path.concat('/');
  76211. }
  76212. this.path = path;
  76213. return this;
  76214. },
  76215. /**
  76216. * An optional prefix that is automatically prepended to the start of every file key.
  76217. *
  76218. * If prefix was `MENU.` and you load an image with the key 'Background' the resulting key would be `MENU.Background`.
  76219. *
  76220. * Once a prefix is set it will then affect every file added to the Loader from that point on. It does _not_ change any
  76221. * file _already_ in the load queue. To reset it, call this method with no arguments.
  76222. *
  76223. * @method Phaser.Loader.LoaderPlugin#setPrefix
  76224. * @since 3.7.0
  76225. *
  76226. * @param {string} [prefix] - The prefix to use. Leave empty to reset.
  76227. *
  76228. * @return {Phaser.Loader.LoaderPlugin} This Loader object.
  76229. */
  76230. setPrefix: function (prefix)
  76231. {
  76232. if (prefix === undefined) { prefix = ''; }
  76233. this.prefix = prefix;
  76234. return this;
  76235. },
  76236. /**
  76237. * Sets the Cross Origin Resource Sharing value used when loading files.
  76238. *
  76239. * Files can override this value on a per-file basis by specifying an alternative `crossOrigin` value in their file config.
  76240. *
  76241. * 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
  76242. * their own CORs setting. To reset it, call this method with no arguments.
  76243. *
  76244. * For more details about CORs see https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
  76245. *
  76246. * @method Phaser.Loader.LoaderPlugin#setCORS
  76247. * @since 3.0.0
  76248. *
  76249. * @param {string} [crossOrigin] - The value to use for the `crossOrigin` property in the load request.
  76250. *
  76251. * @return {Phaser.Loader.LoaderPlugin} This Loader object.
  76252. */
  76253. setCORS: function (crossOrigin)
  76254. {
  76255. this.crossOrigin = crossOrigin;
  76256. return this;
  76257. },
  76258. /**
  76259. * This event is fired when a Loader successfully begins to load its queue.
  76260. *
  76261. * @event Phaser.Loader.LoaderPlugin#addFileEvent
  76262. * @param {string} key - The key of the file that was added.
  76263. * @param {string} type - The type of the file that was added.
  76264. * @param {Phaser.Loader.LoaderPlugin} loader - The Loader that had the file added to it.
  76265. * @param {Phaser.Loader.File} loader - The File object that was added to the Loader.
  76266. */
  76267. /**
  76268. * Adds a file, or array of files, into the load queue.
  76269. *
  76270. * The file must be an instance of `Phaser.Loader.File`, or a class that extends it. The Loader will check that the key
  76271. * used by the file won't conflict with any other key either in the loader, the inflight queue or the target cache.
  76272. * If allowed it will then add the file into the pending list, read for the load to start. Or, if the load has already
  76273. * started, ready for the next batch of files to be pulled from the list to the inflight queue.
  76274. *
  76275. * You should not normally call this method directly, but rather use one of the Loader methods like `image` or `atlas`,
  76276. * however you can call this as long as the file given to it is well formed.
  76277. *
  76278. * @method Phaser.Loader.LoaderPlugin#addFile
  76279. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  76280. * @since 3.0.0
  76281. *
  76282. * @param {(Phaser.Loader.File|Phaser.Loader.File[])} file - The file, or array of files, to be added to the load queue.
  76283. */
  76284. addFile: function (file)
  76285. {
  76286. if (!Array.isArray(file))
  76287. {
  76288. file = [ file ];
  76289. }
  76290. for (var i = 0; i < file.length; i++)
  76291. {
  76292. var item = file[i];
  76293. // Does the file already exist in the cache or texture manager?
  76294. // Or will it conflict with a file already in the queue or inflight?
  76295. if (!this.keyExists(item))
  76296. {
  76297. this.list.set(item);
  76298. this.emit('addfile', item.key, item.type, this, item);
  76299. if (this.isLoading())
  76300. {
  76301. this.totalToLoad++;
  76302. this.updateProgress();
  76303. }
  76304. }
  76305. }
  76306. },
  76307. /**
  76308. * Checks the key and type of the given file to see if it will conflict with anything already
  76309. * in a Cache, the Texture Manager, or the list or inflight queues.
  76310. *
  76311. * @method Phaser.Loader.LoaderPlugin#keyExists
  76312. * @since 3.7.0
  76313. *
  76314. * @param {Phaser.Loader.File} file - The file to check the key of.
  76315. *
  76316. * @return {boolean} `true` if adding this file will cause a cache or queue conflict, otherwise `false`.
  76317. */
  76318. keyExists: function (file)
  76319. {
  76320. var keyConflict = file.hasCacheConflict();
  76321. if (!keyConflict)
  76322. {
  76323. this.list.iterate(function (item)
  76324. {
  76325. if (item.type === file.type && item.key === file.key)
  76326. {
  76327. keyConflict = true;
  76328. return false;
  76329. }
  76330. });
  76331. }
  76332. if (!keyConflict && this.isLoading())
  76333. {
  76334. this.inflight.iterate(function (item)
  76335. {
  76336. if (item.type === file.type && item.key === file.key)
  76337. {
  76338. keyConflict = true;
  76339. return false;
  76340. }
  76341. });
  76342. this.queue.iterate(function (item)
  76343. {
  76344. if (item.type === file.type && item.key === file.key)
  76345. {
  76346. keyConflict = true;
  76347. return false;
  76348. }
  76349. });
  76350. }
  76351. return keyConflict;
  76352. },
  76353. /**
  76354. * Takes a well formed, fully parsed pack file object and adds its entries into the load queue. Usually you do not call
  76355. * this method directly, but instead use `Loader.pack` and supply a path to a JSON file that holds the
  76356. * pack data. However, if you've got the data prepared you can pass it to this method.
  76357. *
  76358. * You can also provide an optional key. If you do then it will only add the entries from that part of the pack into
  76359. * to the load queue. If not specified it will add all entries it finds. For more details about the pack file format
  76360. * see the `LoaderPlugin.pack` method.
  76361. *
  76362. * @method Phaser.Loader.LoaderPlugin#addPack
  76363. * @since 3.7.0
  76364. *
  76365. * @param {any} data - The Pack File data to be parsed and each entry of it to added to the load queue.
  76366. * @param {string} [packKey] - An optional key to use from the pack file data.
  76367. *
  76368. * @return {boolean} `true` if any files were added to the queue, otherwise `false`.
  76369. */
  76370. addPack: function (pack, packKey)
  76371. {
  76372. // if no packKey provided we'll add everything to the queue
  76373. if (packKey && pack.hasOwnProperty(packKey))
  76374. {
  76375. pack = { packKey: pack[packKey] };
  76376. }
  76377. var total = 0;
  76378. // Store the loader settings in case this pack replaces them
  76379. var currentBaseURL = this.baseURL;
  76380. var currentPath = this.path;
  76381. var currentPrefix = this.prefix;
  76382. // Here we go ...
  76383. for (var key in pack)
  76384. {
  76385. var config = pack[key];
  76386. // Any meta data to process?
  76387. var baseURL = GetFastValue(config, 'baseURL', currentBaseURL);
  76388. var path = GetFastValue(config, 'path', currentPath);
  76389. var prefix = GetFastValue(config, 'prefix', currentPrefix);
  76390. var files = GetFastValue(config, 'files', null);
  76391. var defaultType = GetFastValue(config, 'defaultType', 'void');
  76392. if (Array.isArray(files))
  76393. {
  76394. this.setBaseURL(baseURL);
  76395. this.setPath(path);
  76396. this.setPrefix(prefix);
  76397. for (var i = 0; i < files.length; i++)
  76398. {
  76399. var file = files[i];
  76400. var type = (file.hasOwnProperty('type')) ? file.type : defaultType;
  76401. if (this[type])
  76402. {
  76403. this[type](file);
  76404. total++;
  76405. }
  76406. }
  76407. }
  76408. }
  76409. // Reset the loader settings
  76410. this.setBaseURL(currentBaseURL);
  76411. this.setPath(currentPath);
  76412. this.setPrefix(currentPrefix);
  76413. return (total > 0);
  76414. },
  76415. /**
  76416. * Is the Loader actively loading, or processing loaded files?
  76417. *
  76418. * @method Phaser.Loader.LoaderPlugin#isLoading
  76419. * @since 3.0.0
  76420. *
  76421. * @return {boolean} `true` if the Loader is busy loading or processing, otherwise `false`.
  76422. */
  76423. isLoading: function ()
  76424. {
  76425. return (this.state === CONST.LOADER_LOADING || this.state === CONST.LOADER_PROCESSING);
  76426. },
  76427. /**
  76428. * Is the Loader ready to start a new load?
  76429. *
  76430. * @method Phaser.Loader.LoaderPlugin#isReady
  76431. * @since 3.0.0
  76432. *
  76433. * @return {boolean} `true` if the Loader is ready to start a new load, otherwise `false`.
  76434. */
  76435. isReady: function ()
  76436. {
  76437. return (this.state === CONST.LOADER_IDLE || this.state === CONST.LOADER_COMPLETE);
  76438. },
  76439. /**
  76440. * This event is fired when a Loader successfully begins to load its queue.
  76441. *
  76442. * @event Phaser.Loader.LoaderPlugin#startEvent
  76443. * @param {Phaser.Loader.LoaderPlugin} loader - The Loader instance that started.
  76444. */
  76445. /**
  76446. * Starts the Loader running. This will reset the progress and totals and then emit a `start` event.
  76447. * If there is nothing in the queue the Loader will immediately complete, otherwise it will start
  76448. * loading the first batch of files.
  76449. *
  76450. * The Loader is started automatically if the queue is populated within your Scenes `preload` method.
  76451. *
  76452. * However, outside of this, you need to call this method to start it.
  76453. *
  76454. * If the Loader is already running this method will simply return.
  76455. *
  76456. * @method Phaser.Loader.LoaderPlugin#start
  76457. * @fires Phaser.Loader.LoaderPlugin#startEvent
  76458. * @since 3.0.0
  76459. */
  76460. start: function ()
  76461. {
  76462. if (!this.isReady())
  76463. {
  76464. return;
  76465. }
  76466. this.progress = 0;
  76467. this.totalFailed = 0;
  76468. this.totalComplete = 0;
  76469. this.totalToLoad = this.list.size;
  76470. this.emit('start', this);
  76471. if (this.list.size === 0)
  76472. {
  76473. this.loadComplete();
  76474. }
  76475. else
  76476. {
  76477. this.state = CONST.LOADER_LOADING;
  76478. this.inflight.clear();
  76479. this.queue.clear();
  76480. this.updateProgress();
  76481. this.checkLoadQueue();
  76482. this.systems.events.on('update', this.update, this);
  76483. }
  76484. },
  76485. /**
  76486. * This event is fired when the Loader updates its progress, typically as a result of
  76487. * a file having completed loading.
  76488. *
  76489. * @event Phaser.Loader.LoaderPlugin#progressEvent
  76490. * @param {number} progress - The current progress of the load. A value between 0 and 1.
  76491. */
  76492. /**
  76493. * Called automatically during the load process.
  76494. * It updates the `progress` value and then emits a progress event, which you can use to
  76495. * display a loading bar in your game.
  76496. *
  76497. * @method Phaser.Loader.LoaderPlugin#updateProgress
  76498. * @fires Phaser.Loader.LoaderPlugin#progressEvent
  76499. * @since 3.0.0
  76500. */
  76501. updateProgress: function ()
  76502. {
  76503. this.progress = 1 - ((this.list.size + this.inflight.size) / this.totalToLoad);
  76504. this.emit('progress', this.progress);
  76505. },
  76506. /**
  76507. * Called automatically during the load process.
  76508. *
  76509. * @method Phaser.Loader.LoaderPlugin#update
  76510. * @since 3.10.0
  76511. */
  76512. update: function ()
  76513. {
  76514. if (this.state === CONST.LOADER_LOADING && this.list.size > 0 && this.inflight.size < this.maxParallelDownloads)
  76515. {
  76516. this.checkLoadQueue();
  76517. }
  76518. },
  76519. /**
  76520. * An internal method called by the Loader.
  76521. *
  76522. * It will check to see if there are any more files in the pending list that need loading, and if so it will move
  76523. * them from the list Set into the inflight Set, set their CORs flag and start them loading.
  76524. *
  76525. * It will carrying on doing this for each file in the pending list until it runs out, or hits the max allowed parallel downloads.
  76526. *
  76527. * @method Phaser.Loader.LoaderPlugin#checkLoadQueue
  76528. * @private
  76529. * @since 3.7.0
  76530. */
  76531. checkLoadQueue: function ()
  76532. {
  76533. this.list.each(function (file)
  76534. {
  76535. if (file.state === CONST.FILE_POPULATED || (file.state === CONST.FILE_PENDING && this.inflight.size < this.maxParallelDownloads))
  76536. {
  76537. this.inflight.set(file);
  76538. this.list.delete(file);
  76539. // If the file doesn't have its own crossOrigin set, we'll use the Loaders (which is undefined by default)
  76540. if (!file.crossOrigin)
  76541. {
  76542. file.crossOrigin = this.crossOrigin;
  76543. }
  76544. file.load();
  76545. }
  76546. if (this.inflight.size === this.maxParallelDownloads)
  76547. {
  76548. // Tells the Set iterator to abort
  76549. return false;
  76550. }
  76551. }, this);
  76552. },
  76553. /**
  76554. * This event is fired when the a file successfully completes loading, _before_ it is processed.
  76555. *
  76556. * @event Phaser.Loader.LoaderPlugin#loadEvent
  76557. * @param {Phaser.Loader.File} file - The file that has completed loading.
  76558. */
  76559. /**
  76560. * This event is fired when the a file errors during load.
  76561. *
  76562. * @event Phaser.Loader.LoaderPlugin#loadErrorEvent
  76563. * @param {Phaser.Loader.File} file - The file that has failed to load.
  76564. */
  76565. /**
  76566. * An internal method called automatically by the XHRLoader belong to a File.
  76567. *
  76568. * This method will remove the given file from the inflight Set and update the load progress.
  76569. * If the file was successful its `onProcess` method is called, otherwise it is added to the delete queue.
  76570. *
  76571. * @method Phaser.Loader.LoaderPlugin#nextFile
  76572. * @fires Phaser.Loader.LoaderPlugin#loadEvent
  76573. * @fires Phaser.Loader.LoaderPlugin#loadErrorEvent
  76574. * @since 3.0.0
  76575. *
  76576. * @param {Phaser.Loader.File} file - The File that just finished loading, or errored during load.
  76577. * @param {boolean} success - `true` if the file loaded successfully, otherwise `false`.
  76578. */
  76579. nextFile: function (file, success)
  76580. {
  76581. this.inflight.delete(file);
  76582. this.updateProgress();
  76583. if (success)
  76584. {
  76585. this.totalComplete++;
  76586. this.queue.set(file);
  76587. this.emit('load', file);
  76588. file.onProcess();
  76589. }
  76590. else
  76591. {
  76592. this.totalFailed++;
  76593. this._deleteQueue.set(file);
  76594. this.emit('loaderror', file);
  76595. this.fileProcessComplete(file);
  76596. }
  76597. },
  76598. /**
  76599. * An internal method that is called automatically by the File when it has finished processing.
  76600. *
  76601. * If the process was successful, and the File isn't part of a MultiFile, its `addToCache` method is called.
  76602. *
  76603. * It this then removed from the queue. If there are no more files to load `loadComplete` is called.
  76604. *
  76605. * @method Phaser.Loader.LoaderPlugin#fileProcessComplete
  76606. * @since 3.7.0
  76607. *
  76608. * @param {Phaser.Loader.File} file - The file that has finished processing.
  76609. */
  76610. fileProcessComplete: function (file)
  76611. {
  76612. // This file has failed, so move it to the failed Set
  76613. if (file.state === CONST.FILE_ERRORED)
  76614. {
  76615. if (file.multiFile)
  76616. {
  76617. file.multiFile.onFileFailed(file);
  76618. }
  76619. }
  76620. else if (file.state === CONST.FILE_COMPLETE)
  76621. {
  76622. if (file.multiFile)
  76623. {
  76624. if (file.multiFile.isReadyToProcess())
  76625. {
  76626. // If we got here then all files the link file needs are ready to add to the cache
  76627. file.multiFile.addToCache();
  76628. }
  76629. }
  76630. else
  76631. {
  76632. // If we got here, then the file processed, so let it add itself to its cache
  76633. file.addToCache();
  76634. }
  76635. }
  76636. // Remove it from the queue
  76637. this.queue.delete(file);
  76638. // Nothing left to do?
  76639. if (this.list.size === 0 && this.inflight.size === 0 && this.queue.size === 0)
  76640. {
  76641. this.loadComplete();
  76642. }
  76643. },
  76644. /**
  76645. * This event is fired when the Loader has finished loading everything and the queue is empty.
  76646. * By this point every loaded file will now be in its associated cache and ready for use.
  76647. *
  76648. * @event Phaser.Loader.LoaderPlugin#completeEvent
  76649. * @param {Phaser.Loader.File} file - The file that has failed to load.
  76650. */
  76651. /**
  76652. * Called at the end when the load queue is exhausted and all files have either loaded or errored.
  76653. * By this point every loaded file will now be in its associated cache and ready for use.
  76654. *
  76655. * Also clears down the Sets, puts progress to 1 and clears the deletion queue.
  76656. *
  76657. * @method Phaser.Loader.LoaderPlugin#loadComplete
  76658. * @fires Phaser.Loader.LoaderPlugin#completeEvent
  76659. * @since 3.7.0
  76660. */
  76661. loadComplete: function ()
  76662. {
  76663. this.emit('loadcomplete', this);
  76664. this.list.clear();
  76665. this.inflight.clear();
  76666. this.queue.clear();
  76667. this.progress = 1;
  76668. this.state = CONST.LOADER_COMPLETE;
  76669. this.systems.events.off('update', this.update, this);
  76670. // Call 'destroy' on each file ready for deletion
  76671. this._deleteQueue.iterateLocal('destroy');
  76672. this._deleteQueue.clear();
  76673. this.emit('complete', this, this.totalComplete, this.totalFailed);
  76674. },
  76675. /**
  76676. * Adds a File into the pending-deletion queue.
  76677. *
  76678. * @method Phaser.Loader.LoaderPlugin#flagForRemoval
  76679. * @since 3.7.0
  76680. *
  76681. * @param {Phaser.Loader.File} file - The File to be queued for deletion when the Loader completes.
  76682. */
  76683. flagForRemoval: function (file)
  76684. {
  76685. this._deleteQueue.set(file);
  76686. },
  76687. /**
  76688. * Converts the given JSON data into a file that the browser then prompts you to download so you can save it locally.
  76689. *
  76690. * The data must be well formed JSON and ready-parsed, not a JavaScript object.
  76691. *
  76692. * @method Phaser.Loader.LoaderPlugin#saveJSON
  76693. * @since 3.0.0
  76694. *
  76695. * @param {*} data - The JSON data, ready parsed.
  76696. * @param {string} [filename=file.json] - The name to save the JSON file as.
  76697. *
  76698. * @return {Phaser.Loader.LoaderPlugin} This Loader plugin.
  76699. */
  76700. saveJSON: function (data, filename)
  76701. {
  76702. return this.save(JSON.stringify(data), filename);
  76703. },
  76704. /**
  76705. * Causes the browser to save the given data as a file to its default Downloads folder.
  76706. *
  76707. * Creates a DOM level anchor link, assigns it as being a `download` anchor, sets the href
  76708. * to be an ObjectURL based on the given data, and then invokes a click event.
  76709. *
  76710. * @method Phaser.Loader.LoaderPlugin#save
  76711. * @since 3.0.0
  76712. *
  76713. * @param {*} data - The data to be saved. Will be passed through URL.createObjectURL.
  76714. * @param {string} [filename=file.json] - The filename to save the file as.
  76715. * @param {string} [filetype=application/json] - The file type to use when saving the file. Defaults to JSON.
  76716. *
  76717. * @return {Phaser.Loader.LoaderPlugin} This Loader plugin.
  76718. */
  76719. save: function (data, filename, filetype)
  76720. {
  76721. if (filename === undefined) { filename = 'file.json'; }
  76722. if (filetype === undefined) { filetype = 'application/json'; }
  76723. var blob = new Blob([ data ], { type: filetype });
  76724. var url = URL.createObjectURL(blob);
  76725. var a = document.createElement('a');
  76726. a.download = filename;
  76727. a.textContent = 'Download ' + filename;
  76728. a.href = url;
  76729. a.click();
  76730. return this;
  76731. },
  76732. /**
  76733. * Resets the Loader.
  76734. *
  76735. * This will clear all lists and reset the base URL, path and prefix.
  76736. *
  76737. * Warning: If the Loader is currently downloading files, or has files in its queue, they will be aborted.
  76738. *
  76739. * @method Phaser.Loader.LoaderPlugin#reset
  76740. * @since 3.0.0
  76741. */
  76742. reset: function ()
  76743. {
  76744. this.list.clear();
  76745. this.inflight.clear();
  76746. this.queue.clear();
  76747. var gameConfig = this.systems.game.config;
  76748. var sceneConfig = this.systems.settings.loader;
  76749. this.setBaseURL(GetFastValue(sceneConfig, 'baseURL', gameConfig.loaderBaseURL));
  76750. this.setPath(GetFastValue(sceneConfig, 'path', gameConfig.loaderPath));
  76751. this.setPrefix(GetFastValue(sceneConfig, 'prefix', gameConfig.loaderPrefix));
  76752. this.state = CONST.LOADER_IDLE;
  76753. },
  76754. /**
  76755. * The Scene that owns this plugin is shutting down.
  76756. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  76757. *
  76758. * @method Phaser.Loader.LoaderPlugin#shutdown
  76759. * @private
  76760. * @since 3.0.0
  76761. */
  76762. shutdown: function ()
  76763. {
  76764. this.reset();
  76765. this.state = CONST.LOADER_SHUTDOWN;
  76766. this.systems.events.off('update', this.update, this);
  76767. this.systems.events.off('shutdown', this.shutdown, this);
  76768. },
  76769. /**
  76770. * The Scene that owns this plugin is being destroyed.
  76771. * We need to shutdown and then kill off all external references.
  76772. *
  76773. * @method Phaser.Loader.LoaderPlugin#destroy
  76774. * @private
  76775. * @since 3.0.0
  76776. */
  76777. destroy: function ()
  76778. {
  76779. this.shutdown();
  76780. this.state = CONST.LOADER_DESTROYED;
  76781. this.systems.events.off('update', this.update, this);
  76782. this.systems.events.off('start', this.pluginStart, this);
  76783. this.list = null;
  76784. this.inflight = null;
  76785. this.queue = null;
  76786. this.scene = null;
  76787. this.systems = null;
  76788. this.textureManager = null;
  76789. this.cacheManager = null;
  76790. }
  76791. });
  76792. PluginCache.register('Loader', LoaderPlugin, 'load');
  76793. module.exports = LoaderPlugin;
  76794. /***/ }),
  76795. /* 360 */
  76796. /***/ (function(module, exports, __webpack_require__) {
  76797. /**
  76798. * @author Richard Davey <rich@photonstorm.com>
  76799. * @copyright 2018 Photon Storm Ltd.
  76800. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  76801. */
  76802. var Class = __webpack_require__(0);
  76803. var FileTypesManager = __webpack_require__(7);
  76804. var ImageFile = __webpack_require__(38);
  76805. /**
  76806. * @typedef {object} Phaser.Loader.FileTypes.SpriteSheetFileConfig
  76807. *
  76808. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  76809. * @property {string} [url] - The absolute or relative URL to load the file from.
  76810. * @property {string} [extension='png'] - The default file extension to use if no url is provided.
  76811. * @property {string} [normalMap] - The filename of an associated normal map. It uses the same path and url to load as the image.
  76812. * @property {Phaser.Loader.FileTypes.ImageFrameConfig} [frameConfig] - The frame configuration object.
  76813. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  76814. */
  76815. /**
  76816. * @classdesc
  76817. * A single Sprite Sheet Image File suitable for loading by the Loader.
  76818. *
  76819. * These are created when you use the Phaser.Loader.LoaderPlugin#spritesheet method and are not typically created directly.
  76820. *
  76821. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#spritesheet.
  76822. *
  76823. * @class SpriteSheetFile
  76824. * @extends Phaser.Loader.File
  76825. * @memberOf Phaser.Loader.FileTypes
  76826. * @constructor
  76827. * @since 3.0.0
  76828. *
  76829. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  76830. * @param {(string|Phaser.Loader.FileTypes.SpriteSheetFileConfig)} key - The key to use for this file, or a file configuration object.
  76831. * @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".
  76832. * @param {Phaser.Loader.FileTypes.ImageFrameConfig} [frameConfig] - The frame configuration object.
  76833. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  76834. */
  76835. var SpriteSheetFile = new Class({
  76836. Extends: ImageFile,
  76837. initialize:
  76838. function SpriteSheetFile (loader, key, url, frameConfig, xhrSettings)
  76839. {
  76840. ImageFile.call(this, loader, key, url, xhrSettings, frameConfig);
  76841. this.type = 'spritesheet';
  76842. },
  76843. /**
  76844. * Adds this file to its target cache upon successful loading and processing.
  76845. *
  76846. * @method Phaser.Loader.FileTypes.SpriteSheetFile#addToCache
  76847. * @since 3.7.0
  76848. */
  76849. addToCache: function ()
  76850. {
  76851. var texture = this.cache.addSpriteSheet(this.key, this.data, this.config);
  76852. this.pendingDestroy(texture);
  76853. }
  76854. });
  76855. /**
  76856. * Adds a Sprite Sheet Image, or array of Sprite Sheet Images, to the current load queue.
  76857. *
  76858. * The term 'Sprite Sheet' in Phaser means a fixed-size sheet. Where every frame in the sheet is the exact same size,
  76859. * and you reference those frames using numbers, not frame names. This is not the same thing as a Texture Atlas, where
  76860. * the frames are packed in a way where they take up the least amount of space, and are referenced by their names,
  76861. * not numbers. Some articles and software use the term 'Sprite Sheet' to mean Texture Atlas, so please be aware of
  76862. * what sort of file you're actually trying to load.
  76863. *
  76864. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  76865. *
  76866. * ```javascript
  76867. * function preload ()
  76868. * {
  76869. * this.load.spritesheet('bot', 'images/robot.png', { frameWidth: 32, frameHeight: 38 });
  76870. * }
  76871. * ```
  76872. *
  76873. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  76874. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  76875. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  76876. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  76877. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  76878. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  76879. * loaded.
  76880. *
  76881. * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle.
  76882. * If you try to load an animated gif only the first frame will be rendered. Browsers do not natively support playback
  76883. * of animated gifs to Canvas elements.
  76884. *
  76885. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  76886. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  76887. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  76888. * then remove it from the Texture Manager first, before loading a new one.
  76889. *
  76890. * Instead of passing arguments you can pass a configuration object, such as:
  76891. *
  76892. * ```javascript
  76893. * this.load.spritesheet({
  76894. * key: 'bot',
  76895. * url: 'images/robot.png',
  76896. * frameConfig: {
  76897. * frameWidth: 32,
  76898. * frameHeight: 38,
  76899. * startFrame: 0,
  76900. * endFrame: 8
  76901. * }
  76902. * });
  76903. * ```
  76904. *
  76905. * See the documentation for `Phaser.Loader.FileTypes.SpriteSheetFileConfig` for more details.
  76906. *
  76907. * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key:
  76908. *
  76909. * ```javascript
  76910. * this.load.spritesheet('bot', 'images/robot.png', { frameWidth: 32, frameHeight: 38 });
  76911. * // and later in your game ...
  76912. * this.add.image(x, y, 'bot', 0);
  76913. * ```
  76914. *
  76915. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  76916. * key. For example, if the prefix was `PLAYER.` and the key was `Running` the final key will be `PLAYER.Running` and
  76917. * this is what you would use to retrieve the image from the Texture Manager.
  76918. *
  76919. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  76920. *
  76921. * 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"
  76922. * 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
  76923. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  76924. *
  76925. * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image,
  76926. * then you can specify it by providing an array as the `url` where the second element is the normal map:
  76927. *
  76928. * ```javascript
  76929. * this.load.spritesheet('logo', [ 'images/AtariLogo.png', 'images/AtariLogo-n.png' ], { frameWidth: 256, frameHeight: 80 });
  76930. * ```
  76931. *
  76932. * Or, if you are using a config object use the `normalMap` property:
  76933. *
  76934. * ```javascript
  76935. * this.load.spritesheet({
  76936. * key: 'logo',
  76937. * url: 'images/AtariLogo.png',
  76938. * normalMap: 'images/AtariLogo-n.png',
  76939. * frameConfig: {
  76940. * frameWidth: 256,
  76941. * frameHeight: 80
  76942. * }
  76943. * });
  76944. * ```
  76945. *
  76946. * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings.
  76947. * Normal maps are a WebGL only feature.
  76948. *
  76949. * Note: The ability to load this type of file will only be available if the Sprite Sheet File type has been built into Phaser.
  76950. * It is available in the default build but can be excluded from custom builds.
  76951. *
  76952. * @method Phaser.Loader.LoaderPlugin#spritesheet
  76953. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  76954. * @since 3.0.0
  76955. *
  76956. * @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.
  76957. * @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".
  76958. * @param {Phaser.Loader.FileTypes.ImageFrameConfig} [frameConfig] - The frame configuration object. At a minimum it should have a `frameWidth` property.
  76959. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  76960. *
  76961. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  76962. */
  76963. FileTypesManager.register('spritesheet', function (key, url, frameConfig, xhrSettings)
  76964. {
  76965. if (Array.isArray(key))
  76966. {
  76967. for (var i = 0; i < key.length; i++)
  76968. {
  76969. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  76970. this.addFile(new SpriteSheetFile(this, key[i]));
  76971. }
  76972. }
  76973. else
  76974. {
  76975. this.addFile(new SpriteSheetFile(this, key, url, frameConfig, xhrSettings));
  76976. }
  76977. return this;
  76978. });
  76979. module.exports = SpriteSheetFile;
  76980. /***/ }),
  76981. /* 361 */
  76982. /***/ (function(module, exports, __webpack_require__) {
  76983. /**
  76984. * @author Richard Davey <rich@photonstorm.com>
  76985. * @copyright 2018 Photon Storm Ltd.
  76986. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  76987. */
  76988. var Class = __webpack_require__(0);
  76989. var CONST = __webpack_require__(18);
  76990. var File = __webpack_require__(20);
  76991. var FileTypesManager = __webpack_require__(7);
  76992. var GetFastValue = __webpack_require__(1);
  76993. var IsPlainObject = __webpack_require__(8);
  76994. /**
  76995. * @typedef {object} Phaser.Loader.FileTypes.ScriptFileConfig
  76996. *
  76997. * @property {string} key - The key of the file. Must be unique within the Loader.
  76998. * @property {string} [url] - The absolute or relative URL to load the file from.
  76999. * @property {string} [extension='js'] - The default file extension to use if no url is provided.
  77000. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  77001. */
  77002. /**
  77003. * @classdesc
  77004. * A single Script File suitable for loading by the Loader.
  77005. *
  77006. * These are created when you use the Phaser.Loader.LoaderPlugin#script method and are not typically created directly.
  77007. *
  77008. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#script.
  77009. *
  77010. * @class ScriptFile
  77011. * @extends Phaser.Loader.File
  77012. * @memberOf Phaser.Loader.FileTypes
  77013. * @constructor
  77014. * @since 3.0.0
  77015. *
  77016. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  77017. * @param {(string|Phaser.Loader.FileTypes.ScriptFileConfig)} key - The key to use for this file, or a file configuration object.
  77018. * @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".
  77019. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  77020. */
  77021. var ScriptFile = new Class({
  77022. Extends: File,
  77023. initialize:
  77024. function ScriptFile (loader, key, url, xhrSettings)
  77025. {
  77026. var extension = 'js';
  77027. if (IsPlainObject(key))
  77028. {
  77029. var config = key;
  77030. key = GetFastValue(config, 'key');
  77031. url = GetFastValue(config, 'url');
  77032. xhrSettings = GetFastValue(config, 'xhrSettings');
  77033. extension = GetFastValue(config, 'extension', extension);
  77034. }
  77035. var fileConfig = {
  77036. type: 'script',
  77037. cache: false,
  77038. extension: extension,
  77039. responseType: 'text',
  77040. key: key,
  77041. url: url,
  77042. xhrSettings: xhrSettings
  77043. };
  77044. File.call(this, loader, fileConfig);
  77045. },
  77046. /**
  77047. * Called automatically by Loader.nextFile.
  77048. * This method controls what extra work this File does with its loaded data.
  77049. *
  77050. * @method Phaser.Loader.FileTypes.ScriptFile#onProcess
  77051. * @since 3.7.0
  77052. */
  77053. onProcess: function ()
  77054. {
  77055. this.state = CONST.FILE_PROCESSING;
  77056. this.data = document.createElement('script');
  77057. this.data.language = 'javascript';
  77058. this.data.type = 'text/javascript';
  77059. this.data.defer = false;
  77060. this.data.text = this.xhrLoader.responseText;
  77061. document.head.appendChild(this.data);
  77062. this.onProcessComplete();
  77063. }
  77064. });
  77065. /**
  77066. * Adds a Script file, or array of Script files, to the current load queue.
  77067. *
  77068. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  77069. *
  77070. * ```javascript
  77071. * function preload ()
  77072. * {
  77073. * this.load.script('aliens', 'lib/aliens.js');
  77074. * }
  77075. * ```
  77076. *
  77077. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  77078. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  77079. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  77080. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  77081. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  77082. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  77083. * loaded.
  77084. *
  77085. * The key must be a unique String and not already in-use by another file in the Loader.
  77086. *
  77087. * Instead of passing arguments you can pass a configuration object, such as:
  77088. *
  77089. * ```javascript
  77090. * this.load.script({
  77091. * key: 'aliens',
  77092. * url: 'lib/aliens.js'
  77093. * });
  77094. * ```
  77095. *
  77096. * See the documentation for `Phaser.Loader.FileTypes.ScriptFileConfig` for more details.
  77097. *
  77098. * Once the file has finished loading it will automatically be converted into a script element
  77099. * via `document.createElement('script')`. It will have its language set to JavaScript, `defer` set to
  77100. * false and then the resulting element will be appended to `document.head`. Any code then in the
  77101. * script will be executed.
  77102. *
  77103. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  77104. *
  77105. * 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"
  77106. * 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
  77107. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  77108. *
  77109. * Note: The ability to load this type of file will only be available if the Script File type has been built into Phaser.
  77110. * It is available in the default build but can be excluded from custom builds.
  77111. *
  77112. * @method Phaser.Loader.LoaderPlugin#script
  77113. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  77114. * @since 3.0.0
  77115. *
  77116. * @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.
  77117. * @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".
  77118. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  77119. *
  77120. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  77121. */
  77122. FileTypesManager.register('script', function (key, url, xhrSettings)
  77123. {
  77124. if (Array.isArray(key))
  77125. {
  77126. for (var i = 0; i < key.length; i++)
  77127. {
  77128. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  77129. this.addFile(new ScriptFile(this, key[i]));
  77130. }
  77131. }
  77132. else
  77133. {
  77134. this.addFile(new ScriptFile(this, key, url, xhrSettings));
  77135. }
  77136. return this;
  77137. });
  77138. module.exports = ScriptFile;
  77139. /***/ }),
  77140. /* 362 */
  77141. /***/ (function(module, exports, __webpack_require__) {
  77142. /**
  77143. * @author Richard Davey <rich@photonstorm.com>
  77144. * @copyright 2018 Photon Storm Ltd.
  77145. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77146. */
  77147. var Class = __webpack_require__(0);
  77148. var CONST = __webpack_require__(18);
  77149. var File = __webpack_require__(20);
  77150. var FileTypesManager = __webpack_require__(7);
  77151. var GetFastValue = __webpack_require__(1);
  77152. var IsPlainObject = __webpack_require__(8);
  77153. /**
  77154. * @typedef {object} Phaser.Loader.FileTypes.PluginFileConfig
  77155. *
  77156. * @property {string} key - The key of the file. Must be unique within the Loader.
  77157. * @property {string} [url] - The absolute or relative URL to load the file from.
  77158. * @property {string} [extension='js'] - The default file extension to use if no url is provided.
  77159. * @property {boolean} [start=false] - Automatically start the plugin after loading?
  77160. * @property {string} [mapping] - If this plugin is to be injected into the Scene, this is the property key used.
  77161. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  77162. */
  77163. /**
  77164. * @classdesc
  77165. * A single Plugin Script File suitable for loading by the Loader.
  77166. *
  77167. * These are created when you use the Phaser.Loader.LoaderPlugin#plugin method and are not typically created directly.
  77168. *
  77169. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#plugin.
  77170. *
  77171. * @class PluginFile
  77172. * @extends Phaser.Loader.File
  77173. * @memberOf Phaser.Loader.FileTypes
  77174. * @constructor
  77175. * @since 3.0.0
  77176. *
  77177. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  77178. * @param {(string|Phaser.Loader.FileTypes.PluginFileConfig)} key - The key to use for this file, or a file configuration object.
  77179. * @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".
  77180. * @param {boolean} [start=false] - Automatically start the plugin after loading?
  77181. * @param {string} [mapping] - If this plugin is to be injected into the Scene, this is the property key used.
  77182. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  77183. */
  77184. var PluginFile = new Class({
  77185. Extends: File,
  77186. initialize:
  77187. function PluginFile (loader, key, url, start, mapping, xhrSettings)
  77188. {
  77189. var extension = 'js';
  77190. if (IsPlainObject(key))
  77191. {
  77192. var config = key;
  77193. key = GetFastValue(config, 'key');
  77194. url = GetFastValue(config, 'url');
  77195. xhrSettings = GetFastValue(config, 'xhrSettings');
  77196. extension = GetFastValue(config, 'extension', extension);
  77197. start = GetFastValue(config, 'start');
  77198. mapping = GetFastValue(config, 'mapping');
  77199. }
  77200. var fileConfig = {
  77201. type: 'plugin',
  77202. cache: false,
  77203. extension: extension,
  77204. responseType: 'text',
  77205. key: key,
  77206. url: url,
  77207. xhrSettings: xhrSettings,
  77208. config: {
  77209. start: start,
  77210. mapping: mapping
  77211. }
  77212. };
  77213. File.call(this, loader, fileConfig);
  77214. // If the url variable refers to a class, add the plugin directly
  77215. if (typeof url === 'function')
  77216. {
  77217. this.data = url;
  77218. this.state = CONST.FILE_POPULATED;
  77219. }
  77220. },
  77221. /**
  77222. * Called automatically by Loader.nextFile.
  77223. * This method controls what extra work this File does with its loaded data.
  77224. *
  77225. * @method Phaser.Loader.FileTypes.PluginFile#onProcess
  77226. * @since 3.7.0
  77227. */
  77228. onProcess: function ()
  77229. {
  77230. var pluginManager = this.loader.systems.plugins;
  77231. var config = this.config;
  77232. var start = GetFastValue(config, 'start', false);
  77233. var mapping = GetFastValue(config, 'mapping', null);
  77234. if (this.state === CONST.FILE_POPULATED)
  77235. {
  77236. pluginManager.install(this.key, this.data, start, mapping);
  77237. }
  77238. else
  77239. {
  77240. // Plugin added via a js file
  77241. this.state = CONST.FILE_PROCESSING;
  77242. this.data = document.createElement('script');
  77243. this.data.language = 'javascript';
  77244. this.data.type = 'text/javascript';
  77245. this.data.defer = false;
  77246. this.data.text = this.xhrLoader.responseText;
  77247. document.head.appendChild(this.data);
  77248. pluginManager.install(this.key, window[this.key], start, mapping);
  77249. }
  77250. this.onProcessComplete();
  77251. }
  77252. });
  77253. /**
  77254. * Adds a Plugin Script file, or array of plugin files, to the current load queue.
  77255. *
  77256. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  77257. *
  77258. * ```javascript
  77259. * function preload ()
  77260. * {
  77261. * this.load.plugin('modplayer', 'plugins/ModPlayer.js');
  77262. * }
  77263. * ```
  77264. *
  77265. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  77266. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  77267. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  77268. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  77269. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  77270. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  77271. * loaded.
  77272. *
  77273. * The key must be a unique String and not already in-use by another file in the Loader.
  77274. *
  77275. * Instead of passing arguments you can pass a configuration object, such as:
  77276. *
  77277. * ```javascript
  77278. * this.load.plugin({
  77279. * key: 'modplayer',
  77280. * url: 'plugins/ModPlayer.js'
  77281. * });
  77282. * ```
  77283. *
  77284. * See the documentation for `Phaser.Loader.FileTypes.PluginFileConfig` for more details.
  77285. *
  77286. * Once the file has finished loading it will automatically be converted into a script element
  77287. * via `document.createElement('script')`. It will have its language set to JavaScript, `defer` set to
  77288. * false and then the resulting element will be appended to `document.head`. Any code then in the
  77289. * script will be executed. It will then be passed to the Phaser PluginCache.register method.
  77290. *
  77291. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  77292. *
  77293. * 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"
  77294. * 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
  77295. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  77296. *
  77297. * Note: The ability to load this type of file will only be available if the Plugin File type has been built into Phaser.
  77298. * It is available in the default build but can be excluded from custom builds.
  77299. *
  77300. * @method Phaser.Loader.LoaderPlugin#plugin
  77301. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  77302. * @since 3.0.0
  77303. *
  77304. * @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.
  77305. * @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.
  77306. * @param {boolean} [start] - The plugin mapping configuration object.
  77307. * @param {string} [mapping] - If this plugin is to be injected into the Scene, this is the property key used.
  77308. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  77309. *
  77310. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  77311. */
  77312. FileTypesManager.register('plugin', function (key, url, start, mapping, xhrSettings)
  77313. {
  77314. if (Array.isArray(key))
  77315. {
  77316. for (var i = 0; i < key.length; i++)
  77317. {
  77318. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  77319. this.addFile(new PluginFile(this, key[i]));
  77320. }
  77321. }
  77322. else
  77323. {
  77324. this.addFile(new PluginFile(this, key, url, start, mapping, xhrSettings));
  77325. }
  77326. return this;
  77327. });
  77328. module.exports = PluginFile;
  77329. /***/ }),
  77330. /* 363 */
  77331. /***/ (function(module, exports, __webpack_require__) {
  77332. /**
  77333. * @author Richard Davey <rich@photonstorm.com>
  77334. * @copyright 2018 Photon Storm Ltd.
  77335. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77336. */
  77337. var Class = __webpack_require__(0);
  77338. var FileTypesManager = __webpack_require__(7);
  77339. var GetFastValue = __webpack_require__(1);
  77340. var ImageFile = __webpack_require__(38);
  77341. var IsPlainObject = __webpack_require__(8);
  77342. var JSONFile = __webpack_require__(28);
  77343. var MultiFile = __webpack_require__(37);
  77344. /**
  77345. * @typedef {object} Phaser.Loader.FileTypes.MultiAtlasFileConfig
  77346. *
  77347. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  77348. * @property {string} [atlasURL] - The absolute or relative URL to load the multi atlas json file from. Or, a well formed JSON object.
  77349. * @property {string} [atlasExtension='json'] - The default file extension to use for the atlas json if no url is provided.
  77350. * @property {XHRSettingsObject} [atlasXhrSettings] - Extra XHR Settings specifically for the atlas json file.
  77351. * @property {string} [path] - Optional path to use when loading the textures defined in the atlas data.
  77352. * @property {string} [baseURL] - Optional Base URL to use when loading the textures defined in the atlas data.
  77353. * @property {XHRSettingsObject} [textureXhrSettings] - Extra XHR Settings specifically for the texture files.
  77354. */
  77355. /**
  77356. * @classdesc
  77357. * A single Multi Texture Atlas File suitable for loading by the Loader.
  77358. *
  77359. * These are created when you use the Phaser.Loader.LoaderPlugin#multiatlas method and are not typically created directly.
  77360. *
  77361. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#multiatlas.
  77362. *
  77363. * @class MultiAtlasFile
  77364. * @extends Phaser.Loader.MultiFile
  77365. * @memberOf Phaser.Loader.FileTypes
  77366. * @constructor
  77367. * @since 3.7.0
  77368. *
  77369. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  77370. * @param {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  77371. * @param {string} [atlasURL] - The absolute or relative URL to load the multi atlas json file from.
  77372. * @param {string} [path] - Optional path to use when loading the textures defined in the atlas data.
  77373. * @param {string} [baseURL] - Optional Base URL to use when loading the textures defined in the atlas data.
  77374. * @param {XHRSettingsObject} [atlasXhrSettings] - Extra XHR Settings specifically for the atlas json file.
  77375. * @param {XHRSettingsObject} [textureXhrSettings] - Extra XHR Settings specifically for the texture files.
  77376. */
  77377. var MultiAtlasFile = new Class({
  77378. Extends: MultiFile,
  77379. initialize:
  77380. function MultiAtlasFile (loader, key, atlasURL, path, baseURL, atlasXhrSettings, textureXhrSettings)
  77381. {
  77382. if (IsPlainObject(key))
  77383. {
  77384. var config = key;
  77385. key = GetFastValue(config, 'key');
  77386. atlasURL = GetFastValue(config, 'url');
  77387. atlasXhrSettings = GetFastValue(config, 'xhrSettings');
  77388. path = GetFastValue(config, 'path');
  77389. baseURL = GetFastValue(config, 'baseURL');
  77390. textureXhrSettings = GetFastValue(config, 'textureXhrSettings');
  77391. }
  77392. var data = new JSONFile(loader, key, atlasURL, atlasXhrSettings);
  77393. MultiFile.call(this, loader, 'multiatlas', key, [ data ]);
  77394. this.config.path = path;
  77395. this.config.baseURL = baseURL;
  77396. this.config.textureXhrSettings = textureXhrSettings;
  77397. },
  77398. /**
  77399. * Called by each File when it finishes loading.
  77400. *
  77401. * @method Phaser.Loader.MultiFile#onFileComplete
  77402. * @since 3.7.0
  77403. *
  77404. * @param {Phaser.Loader.File} file - The File that has completed processing.
  77405. */
  77406. onFileComplete: function (file)
  77407. {
  77408. var index = this.files.indexOf(file);
  77409. if (index !== -1)
  77410. {
  77411. this.pending--;
  77412. if (file.type === 'json' && file.data.hasOwnProperty('textures'))
  77413. {
  77414. // Inspect the data for the files to now load
  77415. var textures = file.data.textures;
  77416. var config = this.config;
  77417. var loader = this.loader;
  77418. var currentBaseURL = loader.baseURL;
  77419. var currentPath = loader.path;
  77420. var currentPrefix = loader.prefix;
  77421. var baseURL = GetFastValue(config, 'baseURL', currentBaseURL);
  77422. var path = GetFastValue(config, 'path', currentPath);
  77423. var prefix = GetFastValue(config, 'prefix', currentPrefix);
  77424. var textureXhrSettings = GetFastValue(config, 'textureXhrSettings');
  77425. loader.setBaseURL(baseURL);
  77426. loader.setPath(path);
  77427. loader.setPrefix(prefix);
  77428. for (var i = 0; i < textures.length; i++)
  77429. {
  77430. // "image": "texture-packer-multi-atlas-0.png",
  77431. var textureURL = textures[i].image;
  77432. var key = '_MA_' + textureURL;
  77433. var image = new ImageFile(loader, key, textureURL, textureXhrSettings);
  77434. this.addToMultiFile(image);
  77435. loader.addFile(image);
  77436. // "normalMap": "texture-packer-multi-atlas-0_n.png",
  77437. if (textures[i].normalMap)
  77438. {
  77439. var normalMap = new ImageFile(loader, key, textures[i].normalMap, textureXhrSettings);
  77440. normalMap.type = 'normalMap';
  77441. image.setLink(normalMap);
  77442. this.addToMultiFile(normalMap);
  77443. loader.addFile(normalMap);
  77444. }
  77445. }
  77446. // Reset the loader settings
  77447. loader.setBaseURL(currentBaseURL);
  77448. loader.setPath(currentPath);
  77449. loader.setPrefix(currentPrefix);
  77450. }
  77451. }
  77452. },
  77453. /**
  77454. * Adds this file to its target cache upon successful loading and processing.
  77455. *
  77456. * @method Phaser.Loader.MultiFile#addToCache
  77457. * @since 3.7.0
  77458. */
  77459. addToCache: function ()
  77460. {
  77461. if (this.isReadyToProcess())
  77462. {
  77463. var fileJSON = this.files[0];
  77464. fileJSON.addToCache();
  77465. var data = [];
  77466. var images = [];
  77467. var normalMaps = [];
  77468. for (var i = 1; i < this.files.length; i++)
  77469. {
  77470. var file = this.files[i];
  77471. if (file.type === 'normalMap')
  77472. {
  77473. continue;
  77474. }
  77475. var key = file.key.substr(4);
  77476. var image = file.data;
  77477. // Now we need to find out which json entry this mapped to
  77478. for (var t = 0; t < fileJSON.data.textures.length; t++)
  77479. {
  77480. var item = fileJSON.data.textures[t];
  77481. if (item.image === key)
  77482. {
  77483. images.push(image);
  77484. data.push(item);
  77485. if (file.linkFile)
  77486. {
  77487. normalMaps.push(file.linkFile.data);
  77488. }
  77489. break;
  77490. }
  77491. }
  77492. }
  77493. if (normalMaps.length === 0)
  77494. {
  77495. normalMaps = undefined;
  77496. }
  77497. this.loader.textureManager.addAtlasJSONArray(this.key, images, data, normalMaps);
  77498. this.complete = true;
  77499. for (i = 0; i < this.files.length; i++)
  77500. {
  77501. this.files[i].pendingDestroy();
  77502. }
  77503. }
  77504. }
  77505. });
  77506. /**
  77507. * Adds a Multi Texture Atlas, or array of multi atlases, to the current load queue.
  77508. *
  77509. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  77510. *
  77511. * ```javascript
  77512. * function preload ()
  77513. * {
  77514. * this.load.multiatlas('level1', 'images/Level1.json');
  77515. * }
  77516. * ```
  77517. *
  77518. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  77519. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  77520. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  77521. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  77522. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  77523. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  77524. * loaded.
  77525. *
  77526. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  77527. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  77528. *
  77529. * Phaser expects the atlas data to be provided in a JSON file as exported from the application Texture Packer,
  77530. * version 4.6.3 or above, where you have made sure to use the Phaser 3 Export option.
  77531. *
  77532. * The way it works internally is that you provide a URL to the JSON file. Phaser then loads this JSON, parses it and
  77533. * extracts which texture files it also needs to load to complete the process. If the JSON also defines normal maps,
  77534. * Phaser will load those as well.
  77535. *
  77536. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  77537. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  77538. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  77539. * then remove it from the Texture Manager first, before loading a new one.
  77540. *
  77541. * Instead of passing arguments you can pass a configuration object, such as:
  77542. *
  77543. * ```javascript
  77544. * this.load.multiatlas({
  77545. * key: 'level1',
  77546. * atlasURL: 'images/Level1.json'
  77547. * });
  77548. * ```
  77549. *
  77550. * See the documentation for `Phaser.Loader.FileTypes.MultiAtlasFileConfig` for more details.
  77551. *
  77552. * Instead of passing a URL for the atlas JSON data you can also pass in a well formed JSON object instead.
  77553. *
  77554. * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key:
  77555. *
  77556. * ```javascript
  77557. * this.load.multiatlas('level1', 'images/Level1.json');
  77558. * // and later in your game ...
  77559. * this.add.image(x, y, 'level1', 'background');
  77560. * ```
  77561. *
  77562. * To get a list of all available frames within an atlas please consult your Texture Atlas software.
  77563. *
  77564. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  77565. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  77566. * this is what you would use to retrieve the image from the Texture Manager.
  77567. *
  77568. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  77569. *
  77570. * 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"
  77571. * 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
  77572. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  77573. *
  77574. * Note: The ability to load this type of file will only be available if the Multi Atlas File type has been built into Phaser.
  77575. * It is available in the default build but can be excluded from custom builds.
  77576. *
  77577. * @method Phaser.Loader.LoaderPlugin#multiatlas
  77578. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  77579. * @since 3.7.0
  77580. *
  77581. * @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.
  77582. * @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".
  77583. * @param {string} [path] - Optional path to use when loading the textures defined in the atlas data.
  77584. * @param {string} [baseURL] - Optional Base URL to use when loading the textures defined in the atlas data.
  77585. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings.
  77586. *
  77587. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  77588. */
  77589. FileTypesManager.register('multiatlas', function (key, atlasURL, path, baseURL, atlasXhrSettings)
  77590. {
  77591. var multifile;
  77592. // Supports an Object file definition in the key argument
  77593. // Or an array of objects in the key argument
  77594. // Or a single entry where all arguments have been defined
  77595. if (Array.isArray(key))
  77596. {
  77597. for (var i = 0; i < key.length; i++)
  77598. {
  77599. multifile = new MultiAtlasFile(this, key[i]);
  77600. this.addFile(multifile.files);
  77601. }
  77602. }
  77603. else
  77604. {
  77605. multifile = new MultiAtlasFile(this, key, atlasURL, path, baseURL, atlasXhrSettings);
  77606. this.addFile(multifile.files);
  77607. }
  77608. return this;
  77609. });
  77610. module.exports = MultiAtlasFile;
  77611. /***/ }),
  77612. /* 364 */
  77613. /***/ (function(module, exports, __webpack_require__) {
  77614. /**
  77615. * @author Richard Davey <rich@photonstorm.com>
  77616. * @copyright 2018 Photon Storm Ltd.
  77617. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77618. */
  77619. var AudioFile = __webpack_require__(173);
  77620. var Class = __webpack_require__(0);
  77621. var FileTypesManager = __webpack_require__(7);
  77622. var GetFastValue = __webpack_require__(1);
  77623. var IsPlainObject = __webpack_require__(8);
  77624. var JSONFile = __webpack_require__(28);
  77625. var MultiFile = __webpack_require__(37);
  77626. /**
  77627. * @typedef {object} Phaser.Loader.FileTypes.AudioSpriteFileConfig
  77628. *
  77629. * @property {string} key - The key of the file. Must be unique within both the Loader and the Audio Cache.
  77630. * @property {string} jsonURL - The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead.
  77631. * @property {XHRSettingsObject} [jsonXhrSettings] - Extra XHR Settings specifically for the json file.
  77632. * @property {string} [audioURL] - The absolute or relative URL to load the audio file from.
  77633. * @property {any} [audioConfig] - The audio configuration options.
  77634. * @property {XHRSettingsObject} [audioXhrSettings] - Extra XHR Settings specifically for the audio file.
  77635. */
  77636. /**
  77637. * @classdesc
  77638. * An Audio Sprite File suitable for loading by the Loader.
  77639. *
  77640. * These are created when you use the Phaser.Loader.LoaderPlugin#audioSprite method and are not typically created directly.
  77641. *
  77642. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#audioSprite.
  77643. *
  77644. * @class AudioSpriteFile
  77645. * @extends Phaser.Loader.MultiFile
  77646. * @memberOf Phaser.Loader.FileTypes
  77647. * @constructor
  77648. * @since 3.7.0
  77649. *
  77650. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  77651. * @param {(string|Phaser.Loader.FileTypes.AudioSpriteFileConfig)} key - The key to use for this file, or a file configuration object.
  77652. * @param {string} jsonURL - The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead.
  77653. * @param {string} [audioURL] - The absolute or relative URL to load the audio file from. If empty it will be obtained by parsing the JSON file.
  77654. * @param {any} [audioConfig] - The audio configuration options.
  77655. * @param {XHRSettingsObject} [audioXhrSettings] - An XHR Settings configuration object for the audio file. Used in replacement of the Loaders default XHR Settings.
  77656. * @param {XHRSettingsObject} [jsonXhrSettings] - An XHR Settings configuration object for the json file. Used in replacement of the Loaders default XHR Settings.
  77657. */
  77658. var AudioSpriteFile = new Class({
  77659. Extends: MultiFile,
  77660. initialize:
  77661. function AudioSpriteFile (loader, key, jsonURL, audioURL, audioConfig, audioXhrSettings, jsonXhrSettings)
  77662. {
  77663. if (IsPlainObject(key))
  77664. {
  77665. var config = key;
  77666. key = GetFastValue(config, 'key');
  77667. jsonURL = GetFastValue(config, 'jsonURL');
  77668. audioURL = GetFastValue(config, 'audioURL');
  77669. audioConfig = GetFastValue(config, 'audioConfig');
  77670. audioXhrSettings = GetFastValue(config, 'audioXhrSettings');
  77671. jsonXhrSettings = GetFastValue(config, 'jsonXhrSettings');
  77672. }
  77673. var data;
  77674. // No url? then we're going to do a json load and parse it from that
  77675. if (!audioURL)
  77676. {
  77677. data = new JSONFile(loader, key, jsonURL, jsonXhrSettings);
  77678. MultiFile.call(this, loader, 'audiosprite', key, [ data ]);
  77679. this.config.resourceLoad = true;
  77680. this.config.audioConfig = audioConfig;
  77681. this.config.audioXhrSettings = audioXhrSettings;
  77682. }
  77683. else
  77684. {
  77685. var audio = AudioFile.create(loader, key, audioURL, audioConfig, audioXhrSettings);
  77686. if (audio)
  77687. {
  77688. data = new JSONFile(loader, key, jsonURL, jsonXhrSettings);
  77689. MultiFile.call(this, loader, 'audiosprite', key, [ audio, data ]);
  77690. this.config.resourceLoad = false;
  77691. }
  77692. }
  77693. },
  77694. /**
  77695. * Called by each File when it finishes loading.
  77696. *
  77697. * @method Phaser.Loader.AudioSpriteFile#onFileComplete
  77698. * @since 3.7.0
  77699. *
  77700. * @param {Phaser.Loader.File} file - The File that has completed processing.
  77701. */
  77702. onFileComplete: function (file)
  77703. {
  77704. var index = this.files.indexOf(file);
  77705. if (index !== -1)
  77706. {
  77707. this.pending--;
  77708. if (this.config.resourceLoad && file.type === 'json' && file.data.hasOwnProperty('resources'))
  77709. {
  77710. // Inspect the data for the files to now load
  77711. var urls = file.data.resources;
  77712. var audioConfig = GetFastValue(this.config, 'audioConfig');
  77713. var audioXhrSettings = GetFastValue(this.config, 'audioXhrSettings');
  77714. var audio = AudioFile.create(this.loader, file.key, urls, audioConfig, audioXhrSettings);
  77715. if (audio)
  77716. {
  77717. this.addToMultiFile(audio);
  77718. this.loader.addFile(audio);
  77719. }
  77720. }
  77721. }
  77722. },
  77723. /**
  77724. * Adds this file to its target cache upon successful loading and processing.
  77725. *
  77726. * @method Phaser.Loader.AudioSpriteFile#addToCache
  77727. * @since 3.7.0
  77728. */
  77729. addToCache: function ()
  77730. {
  77731. if (this.isReadyToProcess())
  77732. {
  77733. var fileA = this.files[0];
  77734. var fileB = this.files[1];
  77735. fileA.addToCache();
  77736. fileB.addToCache();
  77737. this.complete = true;
  77738. }
  77739. }
  77740. });
  77741. /**
  77742. * Adds a JSON based Audio Sprite, or array of audio sprites, to the current load queue.
  77743. *
  77744. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  77745. *
  77746. * ```javascript
  77747. * function preload ()
  77748. * {
  77749. * this.load.audioSprite('kyobi', 'kyobi.json', [
  77750. * 'kyobi.ogg',
  77751. * 'kyobi.mp3',
  77752. * 'kyobi.m4a'
  77753. * ]);
  77754. * }
  77755. * ```
  77756. *
  77757. * Audio Sprites are a combination of audio files and a JSON configuration.
  77758. * The JSON follows the format of that created by https://github.com/tonistiigi/audiosprite
  77759. *
  77760. * If the JSON file includes a 'resource' object then you can let Phaser parse it and load the audio
  77761. * files automatically based on its content. To do this exclude the audio URLs from the load:
  77762. *
  77763. * ```javascript
  77764. * function preload ()
  77765. * {
  77766. * this.load.audioSprite('kyobi', 'kyobi.json');
  77767. * }
  77768. * ```
  77769. *
  77770. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  77771. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  77772. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  77773. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  77774. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  77775. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  77776. * loaded.
  77777. *
  77778. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  77779. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  77780. *
  77781. * The key must be a unique String. It is used to add the file to the global Audio Cache upon a successful load.
  77782. * The key should be unique both in terms of files being loaded and files already present in the Audio Cache.
  77783. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  77784. * then remove it from the Audio Cache first, before loading a new one.
  77785. *
  77786. * Instead of passing arguments you can pass a configuration object, such as:
  77787. *
  77788. * ```javascript
  77789. * this.load.audioSprite({
  77790. * key: 'kyobi',
  77791. * jsonURL: 'audio/Kyobi.json',
  77792. * audioURL: [
  77793. * 'audio/Kyobi.ogg',
  77794. * 'audio/Kyobi.mp3',
  77795. * 'audio/Kyobi.m4a'
  77796. * ]
  77797. * });
  77798. * ```
  77799. *
  77800. * See the documentation for `Phaser.Loader.FileTypes.AudioSpriteFileConfig` for more details.
  77801. *
  77802. * Instead of passing a URL for the audio JSON data you can also pass in a well formed JSON object instead.
  77803. *
  77804. * Once the audio has finished loading you can use it create an Audio Sprite by referencing its key:
  77805. *
  77806. * ```javascript
  77807. * this.load.audioSprite('kyobi', 'kyobi.json');
  77808. * // and later in your game ...
  77809. * var music = this.sound.addAudioSprite('kyobi');
  77810. * music.play('title');
  77811. * ```
  77812. *
  77813. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  77814. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  77815. * this is what you would use to retrieve the image from the Texture Manager.
  77816. *
  77817. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  77818. *
  77819. * Due to different browsers supporting different audio file types you should usually provide your audio files in a variety of formats.
  77820. * 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
  77821. * browser support.
  77822. *
  77823. * 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.
  77824. *
  77825. * Note: The ability to load this type of file will only be available if the Audio Sprite File type has been built into Phaser.
  77826. * It is available in the default build but can be excluded from custom builds.
  77827. *
  77828. * @method Phaser.Loader.LoaderPlugin#audioSprite
  77829. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  77830. * @since 3.0.0
  77831. *
  77832. * @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.
  77833. * @param {string} jsonURL - The absolute or relative URL to load the json file from. Or a well formed JSON object to use instead.
  77834. * @param {string} [audioURL] - The absolute or relative URL to load the audio file from. If empty it will be obtained by parsing the JSON file.
  77835. * @param {any} [audioConfig] - The audio configuration options.
  77836. * @param {XHRSettingsObject} [audioXhrSettings] - An XHR Settings configuration object for the audio file. Used in replacement of the Loaders default XHR Settings.
  77837. * @param {XHRSettingsObject} [jsonXhrSettings] - An XHR Settings configuration object for the json file. Used in replacement of the Loaders default XHR Settings.
  77838. *
  77839. * @return {Phaser.Loader.LoaderPlugin} The Loader.
  77840. */
  77841. FileTypesManager.register('audioSprite', function (key, jsonURL, audioURL, audioConfig, audioXhrSettings, jsonXhrSettings)
  77842. {
  77843. var game = this.systems.game;
  77844. var gameAudioConfig = game.config.audio;
  77845. var deviceAudio = game.device.audio;
  77846. if ((gameAudioConfig && gameAudioConfig.noAudio) || (!deviceAudio.webAudio && !deviceAudio.audioData))
  77847. {
  77848. // Sounds are disabled, so skip loading audio
  77849. return this;
  77850. }
  77851. var multifile;
  77852. // Supports an Object file definition in the key argument
  77853. // Or an array of objects in the key argument
  77854. // Or a single entry where all arguments have been defined
  77855. if (Array.isArray(key))
  77856. {
  77857. for (var i = 0; i < key.length; i++)
  77858. {
  77859. multifile = new AudioSpriteFile(this, key[i]);
  77860. if (multifile.files)
  77861. {
  77862. this.addFile(multifile.files);
  77863. }
  77864. }
  77865. }
  77866. else
  77867. {
  77868. multifile = new AudioSpriteFile(this, key, jsonURL, audioURL, audioConfig, audioXhrSettings, jsonXhrSettings);
  77869. if (multifile.files)
  77870. {
  77871. this.addFile(multifile.files);
  77872. }
  77873. }
  77874. return this;
  77875. });
  77876. /***/ }),
  77877. /* 365 */
  77878. /***/ (function(module, exports, __webpack_require__) {
  77879. /**
  77880. * @author Richard Davey <rich@photonstorm.com>
  77881. * @copyright 2018 Photon Storm Ltd.
  77882. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  77883. */
  77884. var Class = __webpack_require__(0);
  77885. var FileTypesManager = __webpack_require__(7);
  77886. var GetFastValue = __webpack_require__(1);
  77887. var ImageFile = __webpack_require__(38);
  77888. var IsPlainObject = __webpack_require__(8);
  77889. var JSONFile = __webpack_require__(28);
  77890. var MultiFile = __webpack_require__(37);
  77891. /**
  77892. * @typedef {object} Phaser.Loader.FileTypes.AtlasJSONFileConfig
  77893. *
  77894. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  77895. * @property {string} [textureURL] - The absolute or relative URL to load the texture image file from.
  77896. * @property {string} [textureExtension='png'] - The default file extension to use for the image texture if no url is provided.
  77897. * @property {XHRSettingsObject} [textureXhrSettings] - Extra XHR Settings specifically for the texture image file.
  77898. * @property {string} [normalMap] - The filename of an associated normal map. It uses the same path and url to load as the texture image.
  77899. * @property {string} [atlasURL] - The absolute or relative URL to load the atlas json file from. Or a well formed JSON object to use instead.
  77900. * @property {string} [atlasExtension='json'] - The default file extension to use for the atlas json if no url is provided.
  77901. * @property {XHRSettingsObject} [atlasXhrSettings] - Extra XHR Settings specifically for the atlas json file.
  77902. */
  77903. /**
  77904. * @classdesc
  77905. * A single JSON based Texture Atlas File suitable for loading by the Loader.
  77906. *
  77907. * These are created when you use the Phaser.Loader.LoaderPlugin#atlas method and are not typically created directly.
  77908. *
  77909. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#atlas.
  77910. *
  77911. * https://www.codeandweb.com/texturepacker/tutorials/how-to-create-sprite-sheets-for-phaser3?source=photonstorm
  77912. *
  77913. * @class AtlasJSONFile
  77914. * @extends Phaser.Loader.MultiFile
  77915. * @memberOf Phaser.Loader.FileTypes
  77916. * @constructor
  77917. * @since 3.0.0
  77918. *
  77919. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  77920. * @param {(string|Phaser.Loader.FileTypes.AtlasJSONFileConfig)} key - The key to use for this file, or a file configuration object.
  77921. * @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".
  77922. * @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".
  77923. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings.
  77924. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings.
  77925. */
  77926. var AtlasJSONFile = new Class({
  77927. Extends: MultiFile,
  77928. initialize:
  77929. function AtlasJSONFile (loader, key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
  77930. {
  77931. var image;
  77932. var data;
  77933. if (IsPlainObject(key))
  77934. {
  77935. var config = key;
  77936. key = GetFastValue(config, 'key');
  77937. image = new ImageFile(loader, {
  77938. key: key,
  77939. url: GetFastValue(config, 'textureURL'),
  77940. extension: GetFastValue(config, 'textureExtension', 'png'),
  77941. normalMap: GetFastValue(config, 'normalMap'),
  77942. xhrSettings: GetFastValue(config, 'textureXhrSettings')
  77943. });
  77944. data = new JSONFile(loader, {
  77945. key: key,
  77946. url: GetFastValue(config, 'atlasURL'),
  77947. extension: GetFastValue(config, 'atlasExtension', 'json'),
  77948. xhrSettings: GetFastValue(config, 'atlasXhrSettings')
  77949. });
  77950. }
  77951. else
  77952. {
  77953. image = new ImageFile(loader, key, textureURL, textureXhrSettings);
  77954. data = new JSONFile(loader, key, atlasURL, atlasXhrSettings);
  77955. }
  77956. if (image.linkFile)
  77957. {
  77958. // Image has a normal map
  77959. MultiFile.call(this, loader, 'atlasjson', key, [ image, data, image.linkFile ]);
  77960. }
  77961. else
  77962. {
  77963. MultiFile.call(this, loader, 'atlasjson', key, [ image, data ]);
  77964. }
  77965. },
  77966. /**
  77967. * Adds this file to its target cache upon successful loading and processing.
  77968. *
  77969. * @method Phaser.Loader.FileTypes.AtlasJSONFile#addToCache
  77970. * @since 3.7.0
  77971. */
  77972. addToCache: function ()
  77973. {
  77974. if (this.isReadyToProcess())
  77975. {
  77976. var image = this.files[0];
  77977. var json = this.files[1];
  77978. var normalMap = (this.files[2]) ? this.files[2].data : null;
  77979. this.loader.textureManager.addAtlas(image.key, image.data, json.data, normalMap);
  77980. json.addToCache();
  77981. this.complete = true;
  77982. }
  77983. }
  77984. });
  77985. /**
  77986. * Adds a JSON based Texture Atlas, or array of atlases, to the current load queue.
  77987. *
  77988. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  77989. *
  77990. * ```javascript
  77991. * function preload ()
  77992. * {
  77993. * this.load.atlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.json');
  77994. * }
  77995. * ```
  77996. *
  77997. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  77998. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  77999. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  78000. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  78001. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  78002. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  78003. * loaded.
  78004. *
  78005. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  78006. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  78007. *
  78008. * Phaser expects the atlas data to be provided in a JSON file, using either the JSON Hash or JSON Array format.
  78009. * These files are created by software such as Texture Packer, Shoebox and Adobe Flash / Animate.
  78010. * If you are using Texture Packer and have enabled multi-atlas support, then please use the Phaser Multi Atlas loader
  78011. * instead of this one.
  78012. *
  78013. * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle.
  78014. *
  78015. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  78016. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  78017. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  78018. * then remove it from the Texture Manager first, before loading a new one.
  78019. *
  78020. * Instead of passing arguments you can pass a configuration object, such as:
  78021. *
  78022. * ```javascript
  78023. * this.load.atlas({
  78024. * key: 'mainmenu',
  78025. * textureURL: 'images/MainMenu.png',
  78026. * atlasURL: 'images/MainMenu.json'
  78027. * });
  78028. * ```
  78029. *
  78030. * See the documentation for `Phaser.Loader.FileTypes.AtlasJSONFileConfig` for more details.
  78031. *
  78032. * Instead of passing a URL for the atlas JSON data you can also pass in a well formed JSON object instead.
  78033. *
  78034. * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key:
  78035. *
  78036. * ```javascript
  78037. * this.load.atlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.json');
  78038. * // and later in your game ...
  78039. * this.add.image(x, y, 'mainmenu', 'background');
  78040. * ```
  78041. *
  78042. * To get a list of all available frames within an atlas please consult your Texture Atlas software.
  78043. *
  78044. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  78045. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  78046. * this is what you would use to retrieve the image from the Texture Manager.
  78047. *
  78048. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  78049. *
  78050. * 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"
  78051. * 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
  78052. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  78053. *
  78054. * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image,
  78055. * then you can specify it by providing an array as the `url` where the second element is the normal map:
  78056. *
  78057. * ```javascript
  78058. * this.load.atlas('mainmenu', [ 'images/MainMenu.png', 'images/MainMenu-n.png' ], 'images/MainMenu.json');
  78059. * ```
  78060. *
  78061. * Or, if you are using a config object use the `normalMap` property:
  78062. *
  78063. * ```javascript
  78064. * this.load.atlas({
  78065. * key: 'mainmenu',
  78066. * textureURL: 'images/MainMenu.png',
  78067. * normalMap: 'images/MainMenu-n.png',
  78068. * atlasURL: 'images/MainMenu.json'
  78069. * });
  78070. * ```
  78071. *
  78072. * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings.
  78073. * Normal maps are a WebGL only feature.
  78074. *
  78075. * Note: The ability to load this type of file will only be available if the Atlas JSON File type has been built into Phaser.
  78076. * It is available in the default build but can be excluded from custom builds.
  78077. *
  78078. * @method Phaser.Loader.LoaderPlugin#atlas
  78079. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  78080. * @since 3.0.0
  78081. *
  78082. * @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.
  78083. * @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".
  78084. * @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".
  78085. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings.
  78086. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas json file. Used in replacement of the Loaders default XHR Settings.
  78087. *
  78088. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  78089. */
  78090. FileTypesManager.register('atlas', function (key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
  78091. {
  78092. var multifile;
  78093. // Supports an Object file definition in the key argument
  78094. // Or an array of objects in the key argument
  78095. // Or a single entry where all arguments have been defined
  78096. if (Array.isArray(key))
  78097. {
  78098. for (var i = 0; i < key.length; i++)
  78099. {
  78100. multifile = new AtlasJSONFile(this, key[i]);
  78101. this.addFile(multifile.files);
  78102. }
  78103. }
  78104. else
  78105. {
  78106. multifile = new AtlasJSONFile(this, key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings);
  78107. this.addFile(multifile.files);
  78108. }
  78109. return this;
  78110. });
  78111. module.exports = AtlasJSONFile;
  78112. /***/ }),
  78113. /* 366 */
  78114. /***/ (function(module, exports, __webpack_require__) {
  78115. /**
  78116. * @author Richard Davey <rich@photonstorm.com>
  78117. * @copyright 2018 Photon Storm Ltd.
  78118. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78119. */
  78120. var Class = __webpack_require__(0);
  78121. var FileTypesManager = __webpack_require__(7);
  78122. var JSONFile = __webpack_require__(28);
  78123. /**
  78124. * @classdesc
  78125. * A single Animation JSON File suitable for loading by the Loader.
  78126. *
  78127. * These are created when you use the Phaser.Loader.LoaderPlugin#animation method and are not typically created directly.
  78128. *
  78129. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#animation.
  78130. *
  78131. * @class AnimationJSONFile
  78132. * @extends Phaser.Loader.File
  78133. * @memberOf Phaser.Loader.FileTypes
  78134. * @constructor
  78135. * @since 3.0.0
  78136. *
  78137. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  78138. * @param {(string|Phaser.Loader.FileTypes.JSONFileConfig)} key - The key to use for this file, or a file configuration object.
  78139. * @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".
  78140. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  78141. * @param {string} [dataKey] - When the JSON file loads only this property will be stored in the Cache.
  78142. */
  78143. var AnimationJSONFile = new Class({
  78144. Extends: JSONFile,
  78145. initialize:
  78146. // 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
  78147. // dataKey allows you to pluck a specific object out of the JSON and put just that into the cache, rather than the whole thing
  78148. function AnimationJSONFile (loader, key, url, xhrSettings, dataKey)
  78149. {
  78150. JSONFile.call(this, loader, key, url, xhrSettings, dataKey);
  78151. this.type = 'animationJSON';
  78152. },
  78153. /**
  78154. * Called automatically by Loader.nextFile.
  78155. * This method controls what extra work this File does with its loaded data.
  78156. *
  78157. * @method Phaser.Loader.FileTypes.AnimationJSONFile#onProcess
  78158. * @since 3.7.0
  78159. */
  78160. onProcess: function ()
  78161. {
  78162. // We need to hook into this event:
  78163. this.loader.once('loadcomplete', this.onLoadComplete, this);
  78164. // But the rest is the same as a normal JSON file
  78165. JSONFile.prototype.onProcess.call(this);
  78166. },
  78167. /**
  78168. * Called at the end of the load process, after the Loader has finished all files in its queue.
  78169. *
  78170. * @method Phaser.Loader.FileTypes.AnimationJSONFile#onLoadComplete
  78171. * @since 3.7.0
  78172. */
  78173. onLoadComplete: function ()
  78174. {
  78175. this.loader.systems.anims.fromJSON(this.data);
  78176. this.pendingDestroy();
  78177. }
  78178. });
  78179. /**
  78180. * Adds an Animation JSON Data file, or array of Animation JSON files, to the current load queue.
  78181. *
  78182. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  78183. *
  78184. * ```javascript
  78185. * function preload ()
  78186. * {
  78187. * this.load.animation('baddieAnims', 'files/BaddieAnims.json');
  78188. * }
  78189. * ```
  78190. *
  78191. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  78192. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  78193. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  78194. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  78195. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  78196. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  78197. * loaded.
  78198. *
  78199. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  78200. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  78201. *
  78202. * The key must be a unique String. It is used to add the file to the global JSON Cache upon a successful load.
  78203. * The key should be unique both in terms of files being loaded and files already present in the JSON Cache.
  78204. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  78205. * then remove it from the JSON Cache first, before loading a new one.
  78206. *
  78207. * Instead of passing arguments you can pass a configuration object, such as:
  78208. *
  78209. * ```javascript
  78210. * this.load.animation({
  78211. * key: 'baddieAnims',
  78212. * url: 'files/BaddieAnims.json'
  78213. * });
  78214. * ```
  78215. *
  78216. * See the documentation for `Phaser.Loader.FileTypes.JSONFileConfig` for more details.
  78217. *
  78218. * Once the file has finished loading it will automatically be passed to the global Animation Managers `fromJSON` method.
  78219. * This will parse all of the JSON data and create animation data from it. This process happens at the very end
  78220. * of the Loader, once every other file in the load queue has finished. The reason for this is to allow you to load
  78221. * both animation data and the images it relies upon in the same load call.
  78222. *
  78223. * Once the animation data has been parsed you will be able to play animations using that data.
  78224. * Please see the Animation Manager `fromJSON` method for more details about the format and playback.
  78225. *
  78226. * You can also access the raw animation data from its Cache using its key:
  78227. *
  78228. * ```javascript
  78229. * this.load.animation('baddieAnims', 'files/BaddieAnims.json');
  78230. * // and later in your game ...
  78231. * var data = this.cache.json.get('baddieAnims');
  78232. * ```
  78233. *
  78234. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  78235. * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and
  78236. * this is what you would use to retrieve the text from the JSON Cache.
  78237. *
  78238. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  78239. *
  78240. * 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"
  78241. * 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
  78242. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  78243. *
  78244. * 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,
  78245. * rather than the whole file. For example, if your JSON data had a structure like this:
  78246. *
  78247. * ```json
  78248. * {
  78249. * "level1": {
  78250. * "baddies": {
  78251. * "aliens": {},
  78252. * "boss": {}
  78253. * }
  78254. * },
  78255. * "level2": {},
  78256. * "level3": {}
  78257. * }
  78258. * ```
  78259. *
  78260. * And if you only wanted to create animations from the `boss` data, then you could pass `level1.baddies.boss`as the `dataKey`.
  78261. *
  78262. * Note: The ability to load this type of file will only be available if the JSON File type has been built into Phaser.
  78263. * It is available in the default build but can be excluded from custom builds.
  78264. *
  78265. * @method Phaser.Loader.LoaderPlugin#animation
  78266. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  78267. * @since 3.0.0
  78268. *
  78269. * @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.
  78270. * @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".
  78271. * @param {string} [dataKey] - When the Animation JSON file loads only this property will be stored in the Cache and used to create animation data.
  78272. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  78273. *
  78274. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  78275. */
  78276. FileTypesManager.register('animation', function (key, url, dataKey, xhrSettings)
  78277. {
  78278. // Supports an Object file definition in the key argument
  78279. // Or an array of objects in the key argument
  78280. // Or a single entry where all arguments have been defined
  78281. if (Array.isArray(key))
  78282. {
  78283. for (var i = 0; i < key.length; i++)
  78284. {
  78285. this.addFile(new AnimationJSONFile(this, key[i]));
  78286. }
  78287. }
  78288. else
  78289. {
  78290. this.addFile(new AnimationJSONFile(this, key, url, xhrSettings, dataKey));
  78291. }
  78292. return this;
  78293. });
  78294. module.exports = AnimationJSONFile;
  78295. /***/ }),
  78296. /* 367 */
  78297. /***/ (function(module, exports, __webpack_require__) {
  78298. /**
  78299. * @author Richard Davey <rich@photonstorm.com>
  78300. * @copyright 2018 Photon Storm Ltd.
  78301. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78302. */
  78303. /**
  78304. * @namespace Phaser.Input.Touch
  78305. */
  78306. /* eslint-disable */
  78307. module.exports = {
  78308. TouchManager: __webpack_require__(202)
  78309. };
  78310. /* eslint-enable */
  78311. /***/ }),
  78312. /* 368 */
  78313. /***/ (function(module, exports, __webpack_require__) {
  78314. /**
  78315. * @author Richard Davey <rich@photonstorm.com>
  78316. * @copyright 2018 Photon Storm Ltd.
  78317. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78318. */
  78319. /**
  78320. * @namespace Phaser.Input.Mouse
  78321. */
  78322. /* eslint-disable */
  78323. module.exports = {
  78324. MouseManager: __webpack_require__(204)
  78325. };
  78326. /* eslint-enable */
  78327. /***/ }),
  78328. /* 369 */
  78329. /***/ (function(module, exports) {
  78330. /**
  78331. * @author Richard Davey <rich@photonstorm.com>
  78332. * @copyright 2018 Photon Storm Ltd.
  78333. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78334. */
  78335. /**
  78336. * Returns `true` if the Key was released within the `duration` value given, or `false` if it either isn't up,
  78337. * or was released longer ago than then given duration.
  78338. *
  78339. * @function Phaser.Input.Keyboard.UpDuration
  78340. * @since 3.0.0
  78341. *
  78342. * @param {Phaser.Input.Keyboard.Key} key - The Key object to test.
  78343. * @param {integer} [duration=50] - The duration, in ms, within which the key must have been released.
  78344. *
  78345. * @return {boolean} `true` if the Key was released within `duration` ms, otherwise `false`.
  78346. */
  78347. var UpDuration = function (key, duration)
  78348. {
  78349. if (duration === undefined) { duration = 50; }
  78350. return (key.isUp && key.duration < duration);
  78351. };
  78352. module.exports = UpDuration;
  78353. /***/ }),
  78354. /* 370 */
  78355. /***/ (function(module, exports) {
  78356. /**
  78357. * @author Richard Davey <rich@photonstorm.com>
  78358. * @copyright 2018 Photon Storm Ltd.
  78359. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78360. */
  78361. /**
  78362. * Returns `true` if the Key was pressed down within the `duration` value given, or `false` if it either isn't down,
  78363. * or was pressed down longer ago than then given duration.
  78364. *
  78365. * @function Phaser.Input.Keyboard.DownDuration
  78366. * @since 3.0.0
  78367. *
  78368. * @param {Phaser.Input.Keyboard.Key} key - The Key object to test.
  78369. * @param {integer} [duration=50] - The duration, in ms, within which the key must have been pressed down.
  78370. *
  78371. * @return {boolean} `true` if the Key was pressed down within `duration` ms, otherwise `false`.
  78372. */
  78373. var DownDuration = function (key, duration)
  78374. {
  78375. if (duration === undefined) { duration = 50; }
  78376. return (key.isDown && key.duration < duration);
  78377. };
  78378. module.exports = DownDuration;
  78379. /***/ }),
  78380. /* 371 */
  78381. /***/ (function(module, exports) {
  78382. /**
  78383. * @author Richard Davey <rich@photonstorm.com>
  78384. * @copyright 2018 Photon Storm Ltd.
  78385. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78386. */
  78387. /**
  78388. * The justUp value allows you to test if this Key has just been released or not.
  78389. *
  78390. * When you check this value it will return `true` if the Key is up, otherwise `false`.
  78391. *
  78392. * You can only call JustUp once per key release. It will only return `true` once, until the Key is pressed down and released again.
  78393. * 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.
  78394. *
  78395. * @function Phaser.Input.Keyboard.JustUp
  78396. * @since 3.0.0
  78397. *
  78398. * @param {Phaser.Input.Keyboard.Key} key - The Key to check to see if it's just up or not.
  78399. *
  78400. * @return {boolean} `true` if the Key was just released, otherwise `false`.
  78401. */
  78402. var JustUp = function (key)
  78403. {
  78404. if (key._justUp)
  78405. {
  78406. key._justUp = false;
  78407. return true;
  78408. }
  78409. else
  78410. {
  78411. return false;
  78412. }
  78413. };
  78414. module.exports = JustUp;
  78415. /***/ }),
  78416. /* 372 */
  78417. /***/ (function(module, exports) {
  78418. /**
  78419. * @author Richard Davey <rich@photonstorm.com>
  78420. * @copyright 2018 Photon Storm Ltd.
  78421. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78422. */
  78423. /**
  78424. * The justDown value allows you to test if this Key has just been pressed down or not.
  78425. *
  78426. * When you check this value it will return `true` if the Key is down, otherwise `false`.
  78427. *
  78428. * You can only call justDown once per key press. It will only return `true` once, until the Key is released and pressed down again.
  78429. * 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.
  78430. *
  78431. * @function Phaser.Input.Keyboard.JustDown
  78432. * @since 3.0.0
  78433. *
  78434. * @param {Phaser.Input.Keyboard.Key} key - The Key to check to see if it's just down or not.
  78435. *
  78436. * @return {boolean} `true` if the Key was just pressed, otherwise `false`.
  78437. */
  78438. var JustDown = function (key)
  78439. {
  78440. if (key._justDown)
  78441. {
  78442. key._justDown = false;
  78443. return true;
  78444. }
  78445. else
  78446. {
  78447. return false;
  78448. }
  78449. };
  78450. module.exports = JustDown;
  78451. /***/ }),
  78452. /* 373 */
  78453. /***/ (function(module, exports) {
  78454. /**
  78455. * @author Richard Davey <rich@photonstorm.com>
  78456. * @copyright 2018 Photon Storm Ltd.
  78457. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78458. */
  78459. /**
  78460. * Used internally by the Keyboard Plugin.
  78461. *
  78462. * @function Phaser.Input.Keyboard.ProcessKeyUp
  78463. * @private
  78464. * @since 3.0.0
  78465. *
  78466. * @param {Phaser.Input.Keyboard.Key} key - The Key to process the event for.
  78467. * @param {KeyboardEvent} event - The native Keyboard event.
  78468. *
  78469. * @return {Phaser.Input.Keyboard.Key} The Key that was processed.
  78470. */
  78471. var ProcessKeyUp = function (key, event)
  78472. {
  78473. key.originalEvent = event;
  78474. if (key.preventDefault)
  78475. {
  78476. event.preventDefault();
  78477. }
  78478. if (!key.enabled)
  78479. {
  78480. return;
  78481. }
  78482. key.isDown = false;
  78483. key.isUp = true;
  78484. key.timeUp = event.timeStamp;
  78485. key.duration = key.timeUp - key.timeDown;
  78486. key.repeats = 0;
  78487. key._justDown = false;
  78488. key._justUp = true;
  78489. key._tick = -1;
  78490. return key;
  78491. };
  78492. module.exports = ProcessKeyUp;
  78493. /***/ }),
  78494. /* 374 */
  78495. /***/ (function(module, exports) {
  78496. /**
  78497. * @author Richard Davey <rich@photonstorm.com>
  78498. * @copyright 2018 Photon Storm Ltd.
  78499. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78500. */
  78501. /**
  78502. * Used internally by the Keyboard Plugin.
  78503. *
  78504. * @function Phaser.Input.Keyboard.ProcessKeyDown
  78505. * @private
  78506. * @since 3.0.0
  78507. *
  78508. * @param {Phaser.Input.Keyboard.Key} key - The Key to process the event for.
  78509. * @param {KeyboardEvent} event - The native Keyboard event.
  78510. *
  78511. * @return {Phaser.Input.Keyboard.Key} The Key that was processed.
  78512. */
  78513. var ProcessKeyDown = function (key, event)
  78514. {
  78515. key.originalEvent = event;
  78516. if (key.preventDefault)
  78517. {
  78518. event.preventDefault();
  78519. }
  78520. if (!key.enabled)
  78521. {
  78522. return;
  78523. }
  78524. key.altKey = event.altKey;
  78525. key.ctrlKey = event.ctrlKey;
  78526. key.shiftKey = event.shiftKey;
  78527. key.location = event.location;
  78528. if (key.isDown === false)
  78529. {
  78530. key.isDown = true;
  78531. key.isUp = false;
  78532. key.timeDown = event.timeStamp;
  78533. key.duration = 0;
  78534. key._justDown = true;
  78535. key._justUp = false;
  78536. }
  78537. key.repeats++;
  78538. return key;
  78539. };
  78540. module.exports = ProcessKeyDown;
  78541. /***/ }),
  78542. /* 375 */
  78543. /***/ (function(module, exports, __webpack_require__) {
  78544. /**
  78545. * @author Richard Davey <rich@photonstorm.com>
  78546. * @copyright 2018 Photon Storm Ltd.
  78547. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78548. */
  78549. var KeyCodes = __webpack_require__(109);
  78550. var KeyMap = {};
  78551. for (var key in KeyCodes)
  78552. {
  78553. KeyMap[KeyCodes[key]] = key;
  78554. }
  78555. module.exports = KeyMap;
  78556. /***/ }),
  78557. /* 376 */
  78558. /***/ (function(module, exports) {
  78559. /**
  78560. * @author Richard Davey <rich@photonstorm.com>
  78561. * @copyright 2018 Photon Storm Ltd.
  78562. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78563. */
  78564. /**
  78565. * Used internally by the KeyCombo class.
  78566. *
  78567. * @function Phaser.Input.Keyboard.KeyCombo.ResetKeyCombo
  78568. * @private
  78569. * @since 3.0.0
  78570. *
  78571. * @param {Phaser.Input.Keyboard.KeyCombo} combo - The KeyCombo to reset.
  78572. *
  78573. * @return {Phaser.Input.Keyboard.KeyCombo} The KeyCombo.
  78574. */
  78575. var ResetKeyCombo = function (combo)
  78576. {
  78577. combo.current = combo.keyCodes[0];
  78578. combo.index = 0;
  78579. combo.timeLastMatched = 0;
  78580. combo.matched = false;
  78581. combo.timeMatched = 0;
  78582. return combo;
  78583. };
  78584. module.exports = ResetKeyCombo;
  78585. /***/ }),
  78586. /* 377 */
  78587. /***/ (function(module, exports) {
  78588. /**
  78589. * @author Richard Davey <rich@photonstorm.com>
  78590. * @copyright 2018 Photon Storm Ltd.
  78591. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78592. */
  78593. /**
  78594. * Used internally by the KeyCombo class.
  78595. * Return `true` if it reached the end of the combo, `false` if not.
  78596. *
  78597. * @function Phaser.Input.Keyboard.KeyCombo.AdvanceKeyCombo
  78598. * @private
  78599. * @since 3.0.0
  78600. *
  78601. * @param {KeyboardEvent} event - The native Keyboard Event.
  78602. * @param {Phaser.Input.Keyboard.KeyCombo} combo - The KeyCombo object to advance.
  78603. *
  78604. * @return {boolean} `true` if it reached the end of the combo, `false` if not.
  78605. */
  78606. var AdvanceKeyCombo = function (event, combo)
  78607. {
  78608. combo.timeLastMatched = event.timeStamp;
  78609. combo.index++;
  78610. if (combo.index === combo.size)
  78611. {
  78612. return true;
  78613. }
  78614. else
  78615. {
  78616. combo.current = combo.keyCodes[combo.index];
  78617. return false;
  78618. }
  78619. };
  78620. module.exports = AdvanceKeyCombo;
  78621. /***/ }),
  78622. /* 378 */
  78623. /***/ (function(module, exports, __webpack_require__) {
  78624. /**
  78625. * @author Richard Davey <rich@photonstorm.com>
  78626. * @copyright 2018 Photon Storm Ltd.
  78627. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78628. */
  78629. var AdvanceKeyCombo = __webpack_require__(377);
  78630. /**
  78631. * Used internally by the KeyCombo class.
  78632. *
  78633. * @function Phaser.Input.Keyboard.KeyCombo.ProcessKeyCombo
  78634. * @private
  78635. * @since 3.0.0
  78636. *
  78637. * @param {KeyboardEvent} event - The native Keyboard Event.
  78638. * @param {Phaser.Input.Keyboard.KeyCombo} combo - The KeyCombo object to be processed.
  78639. *
  78640. * @return {boolean} `true` if the combo was matched, otherwise `false`.
  78641. */
  78642. var ProcessKeyCombo = function (event, combo)
  78643. {
  78644. if (combo.matched)
  78645. {
  78646. return true;
  78647. }
  78648. var comboMatched = false;
  78649. var keyMatched = false;
  78650. if (event.keyCode === combo.current)
  78651. {
  78652. // Key was correct
  78653. if (combo.index > 0 && combo.maxKeyDelay > 0)
  78654. {
  78655. // We have to check to see if the delay between
  78656. // the new key and the old one was too long (if enabled)
  78657. var timeLimit = combo.timeLastMatched + combo.maxKeyDelay;
  78658. // Check if they pressed it in time or not
  78659. if (event.timeStamp <= timeLimit)
  78660. {
  78661. keyMatched = true;
  78662. comboMatched = AdvanceKeyCombo(event, combo);
  78663. }
  78664. }
  78665. else
  78666. {
  78667. keyMatched = true;
  78668. // We don't check the time for the first key pressed, so just advance it
  78669. comboMatched = AdvanceKeyCombo(event, combo);
  78670. }
  78671. }
  78672. if (!keyMatched && combo.resetOnWrongKey)
  78673. {
  78674. // Wrong key was pressed
  78675. combo.index = 0;
  78676. combo.current = combo.keyCodes[0];
  78677. }
  78678. if (comboMatched)
  78679. {
  78680. combo.timeLastMatched = event.timeStamp;
  78681. combo.matched = true;
  78682. combo.timeMatched = event.timeStamp;
  78683. }
  78684. return comboMatched;
  78685. };
  78686. module.exports = ProcessKeyCombo;
  78687. /***/ }),
  78688. /* 379 */
  78689. /***/ (function(module, exports, __webpack_require__) {
  78690. /**
  78691. * @author Richard Davey <rich@photonstorm.com>
  78692. * @copyright 2018 Photon Storm Ltd.
  78693. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  78694. */
  78695. var Class = __webpack_require__(0);
  78696. var EventEmitter = __webpack_require__(9);
  78697. var GetValue = __webpack_require__(4);
  78698. var InputPluginCache = __webpack_require__(75);
  78699. var Key = __webpack_require__(176);
  78700. var KeyCodes = __webpack_require__(109);
  78701. var KeyCombo = __webpack_require__(175);
  78702. var KeyMap = __webpack_require__(375);
  78703. var ProcessKeyDown = __webpack_require__(374);
  78704. var ProcessKeyUp = __webpack_require__(373);
  78705. var SnapFloor = __webpack_require__(145);
  78706. /**
  78707. * @classdesc
  78708. * The Keyboard Plugin is an input plugin that belongs to the Scene-owned Input system.
  78709. *
  78710. * Its role is to listen for native DOM Keyboard Events and then process them.
  78711. *
  78712. * You do not need to create this class directly, the Input system will create an instance of it automatically.
  78713. *
  78714. * You can access it from within a Scene using `this.input.keyboard`. For example, you can do:
  78715. *
  78716. * ```javascript
  78717. * this.input.keyboard.on('keydown', callback, context);
  78718. * ```
  78719. *
  78720. * Or, to listen for a specific key:
  78721. *
  78722. * ```javascript
  78723. * this.input.keyboard.on('keydown_A', callback, context);
  78724. * ```
  78725. *
  78726. * You can also create Key objects, which you can then poll in your game loop:
  78727. *
  78728. * ```javascript
  78729. * var spaceBar = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE);
  78730. * ```
  78731. *
  78732. * _Note_: Many keyboards are unable to process certain combinations of keys due to hardware limitations known as ghosting.
  78733. * See http://www.html5gamedevs.com/topic/4876-impossible-to-use-more-than-2-keyboard-input-buttons-at-the-same-time/ for more details.
  78734. *
  78735. * Also please be aware that certain browser extensions can disable or override Phaser keyboard handling.
  78736. * For example the Chrome extension vimium is known to disable Phaser from using the D key, while EverNote disables the backtick key.
  78737. * And there are others. So, please check your extensions before opening Phaser issues about keys that don't work.
  78738. *
  78739. * @class KeyboardPlugin
  78740. * @extends Phaser.Events.EventEmitter
  78741. * @memberOf Phaser.Input.Keyboard
  78742. * @constructor
  78743. * @since 3.10.0
  78744. *
  78745. * @param {Phaser.Input.InputPlugin} sceneInputPlugin - A reference to the Scene Input Plugin that the KeyboardPlugin belongs to.
  78746. */
  78747. var KeyboardPlugin = new Class({
  78748. Extends: EventEmitter,
  78749. initialize:
  78750. function KeyboardPlugin (sceneInputPlugin)
  78751. {
  78752. EventEmitter.call(this);
  78753. /**
  78754. * A reference to the Scene that this Input Plugin is responsible for.
  78755. *
  78756. * @name Phaser.Input.Keyboard.KeyboardPlugin#scene
  78757. * @type {Phaser.Scene}
  78758. * @since 3.10.0
  78759. */
  78760. this.scene = sceneInputPlugin.scene;
  78761. /**
  78762. * A reference to the Scene Systems Settings.
  78763. *
  78764. * @name Phaser.Input.Keyboard.KeyboardPlugin#settings
  78765. * @type {Phaser.Scenes.Settings.Object}
  78766. * @since 3.10.0
  78767. */
  78768. this.settings = this.scene.sys.settings;
  78769. /**
  78770. * A reference to the Scene Input Plugin that created this Keyboard Plugin.
  78771. *
  78772. * @name Phaser.Input.Keyboard.KeyboardPlugin#sceneInputPlugin
  78773. * @type {Phaser.Input.InputPlugin}
  78774. * @since 3.10.0
  78775. */
  78776. this.sceneInputPlugin = sceneInputPlugin;
  78777. /**
  78778. * A boolean that controls if the Keyboard Plugin is enabled or not.
  78779. * Can be toggled on the fly.
  78780. *
  78781. * @name Phaser.Input.Keyboard.KeyboardPlugin#enabled
  78782. * @type {boolean}
  78783. * @default true
  78784. * @since 3.10.0
  78785. */
  78786. this.enabled = true;
  78787. /**
  78788. * The Keyboard Event target, as defined in the Scene or Game Config.
  78789. * Typically the browser window, but can be any interactive DOM element.
  78790. *
  78791. * @name Phaser.Input.Keyboard.KeyboardPlugin#target
  78792. * @type {any}
  78793. * @since 3.10.0
  78794. */
  78795. this.target;
  78796. /**
  78797. * An array of Key objects to process.
  78798. *
  78799. * @name Phaser.Input.Keyboard.KeyboardPlugin#keys
  78800. * @type {Phaser.Input.Keyboard.Key[]}
  78801. * @since 3.10.0
  78802. */
  78803. this.keys = [];
  78804. /**
  78805. * An array of KeyCombo objects to process.
  78806. *
  78807. * @name Phaser.Input.Keyboard.KeyboardPlugin#combos
  78808. * @type {Phaser.Input.Keyboard.KeyCombo[]}
  78809. * @since 3.10.0
  78810. */
  78811. this.combos = [];
  78812. /**
  78813. * An internal event queue.
  78814. *
  78815. * @name Phaser.Input.Keyboard.KeyboardPlugin#queue
  78816. * @type {KeyboardEvent[]}
  78817. * @private
  78818. * @since 3.10.0
  78819. */
  78820. this.queue = [];
  78821. /**
  78822. * Internal event handler.
  78823. *
  78824. * @name Phaser.Input.Keyboard.KeyboardPlugin#onKeyHandler
  78825. * @type {function}
  78826. * @private
  78827. * @since 3.10.0
  78828. */
  78829. this.onKeyHandler;
  78830. /**
  78831. * Internal time value.
  78832. *
  78833. * @name Phaser.Input.Keyboard.KeyboardPlugin#time
  78834. * @type {number}
  78835. * @private
  78836. * @since 3.11.0
  78837. */
  78838. this.time = 0;
  78839. sceneInputPlugin.pluginEvents.once('boot', this.boot, this);
  78840. sceneInputPlugin.pluginEvents.on('start', this.start, this);
  78841. },
  78842. /**
  78843. * This method is called automatically, only once, when the Scene is first created.
  78844. * Do not invoke it directly.
  78845. *
  78846. * @method Phaser.Input.Keyboard.KeyboardPlugin#boot
  78847. * @private
  78848. * @since 3.10.0
  78849. */
  78850. boot: function ()
  78851. {
  78852. var settings = this.settings.input;
  78853. var config = this.scene.sys.game.config;
  78854. this.enabled = GetValue(settings, 'keyboard', config.inputKeyboard);
  78855. this.target = GetValue(settings, 'keyboard.target', config.inputKeyboardEventTarget);
  78856. this.sceneInputPlugin.pluginEvents.once('destroy', this.destroy, this);
  78857. },
  78858. /**
  78859. * This method is called automatically by the Scene when it is starting up.
  78860. * It is responsible for creating local systems, properties and listening for Scene events.
  78861. * Do not invoke it directly.
  78862. *
  78863. * @method Phaser.Input.Keyboard.KeyboardPlugin#start
  78864. * @private
  78865. * @since 3.10.0
  78866. */
  78867. start: function ()
  78868. {
  78869. if (this.enabled)
  78870. {
  78871. this.startListeners();
  78872. }
  78873. this.sceneInputPlugin.pluginEvents.once('shutdown', this.shutdown, this);
  78874. },
  78875. /**
  78876. * Checks to see if both this plugin and the Scene to which it belongs is active.
  78877. *
  78878. * @method Phaser.Input.Keyboard.KeyboardPlugin#isActive
  78879. * @since 3.10.0
  78880. *
  78881. * @return {boolean} `true` if the plugin and the Scene it belongs to is active.
  78882. */
  78883. isActive: function ()
  78884. {
  78885. return (this.enabled && this.scene.sys.isActive());
  78886. },
  78887. /**
  78888. * Starts the Keyboard Event listeners running.
  78889. * This is called automatically and does not need to be manually invoked.
  78890. *
  78891. * @method Phaser.Input.Keyboard.KeyboardPlugin#startListeners
  78892. * @private
  78893. * @since 3.10.0
  78894. */
  78895. startListeners: function ()
  78896. {
  78897. var _this = this;
  78898. var handler = function (event)
  78899. {
  78900. if (event.defaultPrevented || !_this.isActive())
  78901. {
  78902. // Do nothing if event already handled
  78903. return;
  78904. }
  78905. _this.queue.push(event);
  78906. var key = _this.keys[event.keyCode];
  78907. if (key && key.preventDefault)
  78908. {
  78909. event.preventDefault();
  78910. }
  78911. };
  78912. this.onKeyHandler = handler;
  78913. this.target.addEventListener('keydown', handler, false);
  78914. this.target.addEventListener('keyup', handler, false);
  78915. // Finally, listen for an update event from the Input Plugin
  78916. this.sceneInputPlugin.pluginEvents.on('update', this.update, this);
  78917. },
  78918. /**
  78919. * Stops the Keyboard Event listeners.
  78920. * This is called automatically and does not need to be manually invoked.
  78921. *
  78922. * @method Phaser.Input.Keyboard.KeyboardPlugin#stopListeners
  78923. * @private
  78924. * @since 3.10.0
  78925. */
  78926. stopListeners: function ()
  78927. {
  78928. this.target.removeEventListener('keydown', this.onKeyHandler);
  78929. this.target.removeEventListener('keyup', this.onKeyHandler);
  78930. this.sceneInputPlugin.pluginEvents.off('update', this.update);
  78931. },
  78932. /**
  78933. * @typedef {object} CursorKeys
  78934. *
  78935. * @property {Phaser.Input.Keyboard.Key} [up] - A Key object mapping to the UP arrow key.
  78936. * @property {Phaser.Input.Keyboard.Key} [down] - A Key object mapping to the DOWN arrow key.
  78937. * @property {Phaser.Input.Keyboard.Key} [left] - A Key object mapping to the LEFT arrow key.
  78938. * @property {Phaser.Input.Keyboard.Key} [right] - A Key object mapping to the RIGHT arrow key.
  78939. * @property {Phaser.Input.Keyboard.Key} [space] - A Key object mapping to the SPACE BAR key.
  78940. * @property {Phaser.Input.Keyboard.Key} [shift] - A Key object mapping to the SHIFT key.
  78941. */
  78942. /**
  78943. * Creates and returns an object containing 4 hotkeys for Up, Down, Left and Right, and also Space Bar and shift.
  78944. *
  78945. * @method Phaser.Input.Keyboard.KeyboardPlugin#createCursorKeys
  78946. * @since 3.10.0
  78947. *
  78948. * @return {CursorKeys} An object containing the properties: `up`, `down`, `left`, `right`, `space` and `shift`.
  78949. */
  78950. createCursorKeys: function ()
  78951. {
  78952. return this.addKeys({
  78953. up: KeyCodes.UP,
  78954. down: KeyCodes.DOWN,
  78955. left: KeyCodes.LEFT,
  78956. right: KeyCodes.RIGHT,
  78957. space: KeyCodes.SPACE,
  78958. shift: KeyCodes.SHIFT
  78959. });
  78960. },
  78961. /**
  78962. * A practical way to create an object containing user selected hotkeys.
  78963. *
  78964. * For example:
  78965. *
  78966. * ```javascript
  78967. * this.input.keyboard.addKeys({ 'up': Phaser.Input.Keyboard.KeyCodes.W, 'down': Phaser.Input.Keyboard.KeyCodes.S });
  78968. * ```
  78969. *
  78970. * would return an object containing the properties (`up` and `down`) mapped to W and S {@link Phaser.Input.Keyboard.Key} objects.
  78971. *
  78972. * You can also pass in a comma-separated string:
  78973. *
  78974. * ```javascript
  78975. * this.input.keyboard.addKeys('W,S,A,D');
  78976. * ```
  78977. *
  78978. * Which will return an object with the properties W, S, A and D mapped to the relevant Key objects.
  78979. *
  78980. * To use non-alpha numeric keys, use a string, such as 'UP', 'SPACE' or 'LEFT'.
  78981. *
  78982. * @method Phaser.Input.Keyboard.KeyboardPlugin#addKeys
  78983. * @since 3.10.0
  78984. *
  78985. * @param {(object|string)} keys - An object containing Key Codes, or a comma-separated string.
  78986. *
  78987. * @return {object} An object containing Key objects mapped to the input properties.
  78988. */
  78989. addKeys: function (keys)
  78990. {
  78991. var output = {};
  78992. if (typeof keys === 'string')
  78993. {
  78994. keys = keys.split(',');
  78995. for (var i = 0; i < keys.length; i++)
  78996. {
  78997. output[keys[i]] = this.addKey(keys[i]);
  78998. }
  78999. }
  79000. else
  79001. {
  79002. for (var key in keys)
  79003. {
  79004. output[key] = this.addKey(keys[key]);
  79005. }
  79006. }
  79007. return output;
  79008. },
  79009. /**
  79010. * Adds a Key object to this Keyboard Plugin.
  79011. *
  79012. * The given argument can be either an existing Key object, a string, such as `A` or `SPACE`, or a key code value.
  79013. *
  79014. * If a Key object is given, and one already exists matching the same key code, the existing one is replaced with the new one.
  79015. *
  79016. * @method Phaser.Input.Keyboard.KeyboardPlugin#addKey
  79017. * @since 3.10.0
  79018. *
  79019. * @param {(Phaser.Input.Keyboard.Key|string|integer)} key - Either a Key object, a string, such as `A` or `SPACE`, or a key code value.
  79020. *
  79021. * @return {Phaser.Input.Keyboard.Key} The newly created Key object, or a reference to it if it already existed in the keys array.
  79022. */
  79023. addKey: function (key)
  79024. {
  79025. var keys = this.keys;
  79026. if (key instanceof Key)
  79027. {
  79028. var idx = keys.indexOf(key);
  79029. if (idx > -1)
  79030. {
  79031. keys[idx] = key;
  79032. }
  79033. else
  79034. {
  79035. keys[key.keyCode] = key;
  79036. }
  79037. return key;
  79038. }
  79039. if (typeof key === 'string')
  79040. {
  79041. key = KeyCodes[key.toUpperCase()];
  79042. }
  79043. if (!keys[key])
  79044. {
  79045. keys[key] = new Key(key);
  79046. }
  79047. return keys[key];
  79048. },
  79049. /**
  79050. * Removes a Key object from this Keyboard Plugin.
  79051. *
  79052. * The given argument can be either a Key object, a string, such as `A` or `SPACE`, or a key code value.
  79053. *
  79054. * @method Phaser.Input.Keyboard.KeyboardPlugin#removeKey
  79055. * @since 3.10.0
  79056. *
  79057. * @param {(Phaser.Input.Keyboard.Key|string|integer)} key - Either a Key object, a string, such as `A` or `SPACE`, or a key code value.
  79058. */
  79059. removeKey: function (key)
  79060. {
  79061. var keys = this.keys;
  79062. if (key instanceof Key)
  79063. {
  79064. var idx = keys.indexOf(key);
  79065. if (idx > -1)
  79066. {
  79067. this.keys[idx] = undefined;
  79068. }
  79069. }
  79070. else if (typeof key === 'string')
  79071. {
  79072. key = KeyCodes[key.toUpperCase()];
  79073. }
  79074. if (keys[key])
  79075. {
  79076. keys[key] = undefined;
  79077. }
  79078. },
  79079. /**
  79080. * Creates a new KeyCombo.
  79081. *
  79082. * A KeyCombo will listen for a specific string of keys from the Keyboard, and when it receives them
  79083. * it will emit a `keycombomatch` event from this Keyboard Plugin.
  79084. *
  79085. * The keys to be listened for can be defined as:
  79086. *
  79087. * A string (i.e. 'ATARI')
  79088. * An array of either integers (key codes) or strings, or a mixture of both
  79089. * An array of objects (such as Key objects) with a public 'keyCode' property
  79090. *
  79091. * For example, to listen for the Konami code (up, up, up, down, down, down, left, left, left, right, right, right)
  79092. * you could pass the following array of key codes:
  79093. *
  79094. * ```javascript
  79095. * this.input.keyboard.createCombo([ 38, 38, 38, 40, 40, 40, 37, 37, 37, 39, 39, 39 ], { resetOnMatch: true });
  79096. *
  79097. * this.input.keyboard.on('keycombomatch', function (event) {
  79098. * console.log('Konami Code entered!');
  79099. * });
  79100. * ```
  79101. *
  79102. * Or, to listen for the user entering the word PHASER:
  79103. *
  79104. * ```javascript
  79105. * this.input.keyboard.createCombo('PHASER');
  79106. * ```
  79107. *
  79108. * @method Phaser.Input.Keyboard.KeyboardPlugin#createCombo
  79109. * @since 3.10.0
  79110. *
  79111. * @param {(string|integer[]|object[])} keys - The keys that comprise this combo.
  79112. * @param {KeyComboConfig} [config] - A Key Combo configuration object.
  79113. *
  79114. * @return {Phaser.Input.Keyboard.KeyCombo} The new KeyCombo object.
  79115. */
  79116. createCombo: function (keys, config)
  79117. {
  79118. return new KeyCombo(this, keys, config);
  79119. },
  79120. /**
  79121. * Checks if the given Key object is currently being held down.
  79122. *
  79123. * The difference between this method and checking the `Key.isDown` property directly is that you can provide
  79124. * a duration to this method. For example, if you wanted a key press to fire a bullet, but you only wanted
  79125. * it to be able to fire every 100ms, then you can call this method with a `duration` of 100 and it
  79126. * will only return `true` every 100ms.
  79127. *
  79128. * If the Keyboard Plugin has been disabled, this method will always return `false`.
  79129. *
  79130. * @method Phaser.Input.Keyboard.KeyboardPlugin#checkDown
  79131. * @since 3.11.0
  79132. *
  79133. * @param {Phaser.Input.Keyboard.Key} key - A Key object.
  79134. * @param {number} [duration=0] - The duration which must have elapsed before this Key is considered as being down.
  79135. *
  79136. * @return {boolean} `True` if the Key is down within the duration specified, otherwise `false`.
  79137. */
  79138. checkDown: function (key, duration)
  79139. {
  79140. if (this.enabled && key.isDown)
  79141. {
  79142. var t = SnapFloor(this.time - key.timeDown, duration);
  79143. if (t > key._tick)
  79144. {
  79145. key._tick = t;
  79146. return true;
  79147. }
  79148. }
  79149. return false;
  79150. },
  79151. /**
  79152. * Internal update handler called by the Input Manager, which is in turn invoked by the Game step.
  79153. *
  79154. * @method Phaser.Input.Keyboard.KeyboardPlugin#update
  79155. * @private
  79156. * @since 3.10.0
  79157. *
  79158. * @param {number} time - The game loop time value.
  79159. */
  79160. update: function (time)
  79161. {
  79162. this.time = time;
  79163. var len = this.queue.length;
  79164. if (!this.enabled || len === 0)
  79165. {
  79166. return;
  79167. }
  79168. // Clears the queue array, and also means we don't work on array data that could potentially
  79169. // be modified during the processing phase
  79170. var queue = this.queue.splice(0, len);
  79171. var keys = this.keys;
  79172. // Process the event queue, dispatching all of the events that have stored up
  79173. for (var i = 0; i < len; i++)
  79174. {
  79175. var event = queue[i];
  79176. var code = event.keyCode;
  79177. if (event.type === 'keydown')
  79178. {
  79179. if (KeyMap[code] && (keys[code] === undefined || keys[code].isDown === false))
  79180. {
  79181. // Will emit a keyboard or keyup event
  79182. this.emit(event.type, event);
  79183. this.emit('keydown_' + KeyMap[code], event);
  79184. }
  79185. if (keys[code])
  79186. {
  79187. ProcessKeyDown(keys[code], event);
  79188. }
  79189. }
  79190. else
  79191. {
  79192. // Will emit a keyboard or keyup event
  79193. this.emit(event.type, event);
  79194. this.emit('keyup_' + KeyMap[code], event);
  79195. if (keys[code])
  79196. {
  79197. ProcessKeyUp(keys[code], event);
  79198. }
  79199. }
  79200. }
  79201. },
  79202. /**
  79203. * Shuts the Keyboard Plugin down.
  79204. * All this does is remove any listeners bound to it.
  79205. *
  79206. * @method Phaser.Input.Keyboard.KeyboardPlugin#shutdown
  79207. * @private
  79208. * @since 3.10.0
  79209. */
  79210. shutdown: function ()
  79211. {
  79212. this.stopListeners();
  79213. this.removeAllListeners();
  79214. },
  79215. /**
  79216. * Destroys this Keyboard Plugin instance and all references it holds, plus clears out local arrays.
  79217. *
  79218. * @method Phaser.Input.Keyboard.KeyboardPlugin#destroy
  79219. * @private
  79220. * @since 3.10.0
  79221. */
  79222. destroy: function ()
  79223. {
  79224. this.shutdown();
  79225. this.keys = [];
  79226. this.combos = [];
  79227. this.queue = [];
  79228. this.scene = null;
  79229. this.settings = null;
  79230. this.sceneInputPlugin = null;
  79231. this.target = null;
  79232. }
  79233. });
  79234. /**
  79235. * An instance of the Keyboard Plugin class, if enabled via the `input.keyboard` Scene or Game Config property.
  79236. * Use this to create Key objects and listen for keyboard specific events.
  79237. *
  79238. * @name Phaser.Input.InputPlugin#keyboard
  79239. * @type {?Phaser.Input.Keyboard.KeyboardPlugin}
  79240. * @since 3.10.0
  79241. */
  79242. InputPluginCache.register('KeyboardPlugin', KeyboardPlugin, 'keyboard', 'keyboard', 'inputKeyboard');
  79243. module.exports = KeyboardPlugin;
  79244. /***/ }),
  79245. /* 380 */
  79246. /***/ (function(module, exports, __webpack_require__) {
  79247. /**
  79248. * @author Richard Davey <rich@photonstorm.com>
  79249. * @copyright 2018 Photon Storm Ltd.
  79250. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  79251. */
  79252. /**
  79253. * @namespace Phaser.Input.Keyboard
  79254. */
  79255. module.exports = {
  79256. KeyboardPlugin: __webpack_require__(379),
  79257. Key: __webpack_require__(176),
  79258. KeyCodes: __webpack_require__(109),
  79259. KeyCombo: __webpack_require__(175),
  79260. JustDown: __webpack_require__(372),
  79261. JustUp: __webpack_require__(371),
  79262. DownDuration: __webpack_require__(370),
  79263. UpDuration: __webpack_require__(369)
  79264. };
  79265. /***/ }),
  79266. /* 381 */
  79267. /***/ (function(module, exports) {
  79268. /**
  79269. * @author Richard Davey <rich@photonstorm.com>
  79270. * @copyright 2018 Photon Storm Ltd.
  79271. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  79272. */
  79273. /**
  79274. * Creates a new Pixel Perfect Handler function.
  79275. *
  79276. * Access via `InputPlugin.makePixelPerfect` rather than calling it directly.
  79277. *
  79278. * @function Phaser.Input.CreatePixelPerfectHandler
  79279. * @since 3.10.0
  79280. *
  79281. * @param {Phaser.Textures.TextureManager} textureManager - A reference to the Texture Manager.
  79282. * @param {integer} alphaTolerance - The alpha level that the pixel should be above to be included as a successful interaction.
  79283. *
  79284. * @return {function} The new Pixel Perfect Handler function.
  79285. */
  79286. var CreatePixelPerfectHandler = function (textureManager, alphaTolerance)
  79287. {
  79288. return function (hitArea, x, y, gameObject)
  79289. {
  79290. var alpha = textureManager.getPixelAlpha(x, y, gameObject.texture.key, gameObject.frame.key);
  79291. return (alpha && alpha >= alphaTolerance);
  79292. };
  79293. };
  79294. module.exports = CreatePixelPerfectHandler;
  79295. /***/ }),
  79296. /* 382 */
  79297. /***/ (function(module, exports, __webpack_require__) {
  79298. /**
  79299. * @author Richard Davey <rich@photonstorm.com>
  79300. * @copyright 2018 Photon Storm Ltd.
  79301. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  79302. */
  79303. var Circle = __webpack_require__(88);
  79304. var CircleContains = __webpack_require__(33);
  79305. var Class = __webpack_require__(0);
  79306. var CreateInteractiveObject = __webpack_require__(180);
  79307. var CreatePixelPerfectHandler = __webpack_require__(381);
  79308. var DistanceBetween = __webpack_require__(58);
  79309. var Ellipse = __webpack_require__(114);
  79310. var EllipseContains = __webpack_require__(55);
  79311. var EventEmitter = __webpack_require__(9);
  79312. var GetFastValue = __webpack_require__(1);
  79313. var InputPluginCache = __webpack_require__(75);
  79314. var IsPlainObject = __webpack_require__(8);
  79315. var PluginCache = __webpack_require__(12);
  79316. var Rectangle = __webpack_require__(13);
  79317. var RectangleContains = __webpack_require__(31);
  79318. var Triangle = __webpack_require__(67);
  79319. var TriangleContains = __webpack_require__(60);
  79320. /**
  79321. * @classdesc
  79322. * The Input Plugin belongs to a Scene and handles all input related events and operations for it.
  79323. *
  79324. * You can access it from within a Scene using `this.input`.
  79325. *
  79326. * It emits events directly. For example, you can do:
  79327. *
  79328. * ```javascript
  79329. * this.input.on('pointerdown', callback, context);
  79330. * ```
  79331. *
  79332. * To listen for a pointer down event anywhere on the game canvas.
  79333. *
  79334. * Game Objects can be enabled for input by calling their `setInteractive` method. After which they
  79335. * will directly emit input events:
  79336. *
  79337. * ```javascript
  79338. * var sprite = this.add.sprite(x, y, texture);
  79339. * sprite.setInteractive();
  79340. * sprite.on('pointerdown', callback, context);
  79341. * ```
  79342. *
  79343. * Please see the Input examples and tutorials for more information.
  79344. *
  79345. * @class InputPlugin
  79346. * @extends Phaser.Events.EventEmitter
  79347. * @memberOf Phaser.Input
  79348. * @constructor
  79349. * @since 3.0.0
  79350. *
  79351. * @param {Phaser.Scene} scene - A reference to the Scene that this Input Plugin is responsible for.
  79352. */
  79353. var InputPlugin = new Class({
  79354. Extends: EventEmitter,
  79355. initialize:
  79356. function InputPlugin (scene)
  79357. {
  79358. EventEmitter.call(this);
  79359. /**
  79360. * A reference to the Scene that this Input Plugin is responsible for.
  79361. *
  79362. * @name Phaser.Input.InputPlugin#scene
  79363. * @type {Phaser.Scene}
  79364. * @since 3.0.0
  79365. */
  79366. this.scene = scene;
  79367. /**
  79368. * A reference to the Scene Systems class.
  79369. *
  79370. * @name Phaser.Input.InputPlugin#systems
  79371. * @type {Phaser.Scenes.Systems}
  79372. * @since 3.0.0
  79373. */
  79374. this.systems = scene.sys;
  79375. /**
  79376. * A reference to the Scene Systems Settings.
  79377. *
  79378. * @name Phaser.Input.InputPlugin#settings
  79379. * @type {Phaser.Scenes.Settings.Object}
  79380. * @since 3.5.0
  79381. */
  79382. this.settings = scene.sys.settings;
  79383. /**
  79384. * A reference to the Game Input Manager.
  79385. *
  79386. * @name Phaser.Input.InputPlugin#manager
  79387. * @type {Phaser.Input.InputManager}
  79388. * @since 3.0.0
  79389. */
  79390. this.manager = scene.sys.game.input;
  79391. /**
  79392. * Internal event queue used for plugins only.
  79393. *
  79394. * @name Phaser.Input.InputPlugin#pluginEvents
  79395. * @type {Phaser.Events.EventEmitter}
  79396. * @private
  79397. * @since 3.10.0
  79398. */
  79399. this.pluginEvents = new EventEmitter();
  79400. /**
  79401. * If set, the Input Plugin will run its update loop every frame.
  79402. *
  79403. * @name Phaser.Input.InputPlugin#enabled
  79404. * @type {boolean}
  79405. * @default true
  79406. * @since 3.5.0
  79407. */
  79408. this.enabled = true;
  79409. /**
  79410. * A reference to the Scene Display List. This property is set during the `boot` method.
  79411. *
  79412. * @name Phaser.Input.InputPlugin#displayList
  79413. * @type {Phaser.GameObjects.DisplayList}
  79414. * @since 3.0.0
  79415. */
  79416. this.displayList;
  79417. /**
  79418. * A reference to the Scene Cameras Manager. This property is set during the `boot` method.
  79419. *
  79420. * @name Phaser.Input.InputPlugin#cameras
  79421. * @type {Phaser.Cameras.Scene2D.CameraManager}
  79422. * @since 3.0.0
  79423. */
  79424. this.cameras;
  79425. // Inject the available input plugins into this class
  79426. InputPluginCache.install(this);
  79427. /**
  79428. * A reference to the Mouse Manager.
  79429. *
  79430. * This property is only set if Mouse support has been enabled in your Game Configuration file.
  79431. *
  79432. * If you just wish to get access to the mouse pointer, use the `mousePointer` property instead.
  79433. *
  79434. * @name Phaser.Input.InputPlugin#mouse
  79435. * @type {?Phaser.Input.Mouse.MouseManager}
  79436. * @since 3.0.0
  79437. */
  79438. this.mouse = this.manager.mouse;
  79439. /**
  79440. * When set to `true` (the default) the Input Plugin will emulate DOM behavior by only emitting events from
  79441. * the top-most Game Objects in the Display List.
  79442. *
  79443. * If set to `false` it will emit events from all Game Objects below a Pointer, not just the top one.
  79444. *
  79445. * @name Phaser.Input.InputPlugin#topOnly
  79446. * @type {boolean}
  79447. * @default true
  79448. * @since 3.0.0
  79449. */
  79450. this.topOnly = true;
  79451. /**
  79452. * How often should the Pointers be checked?
  79453. *
  79454. * The value is a time, given in ms, and is the time that must have elapsed between game steps before
  79455. * the Pointers will be polled again. When a pointer is polled it runs a hit test to see which Game
  79456. * Objects are currently below it, or being interacted with it.
  79457. *
  79458. * Pointers will *always* be checked if they have been moved by the user, or press or released.
  79459. *
  79460. * This property only controls how often they will be polled if they have not been updated.
  79461. * You should set this if you want to have Game Objects constantly check against the pointers, even
  79462. * if the pointer didn't move itself.
  79463. *
  79464. * Set to 0 to poll constantly. Set to -1 to only poll on user movement.
  79465. *
  79466. * @name Phaser.Input.InputPlugin#pollRate
  79467. * @type {integer}
  79468. * @default -1
  79469. * @since 3.0.0
  79470. */
  79471. this.pollRate = -1;
  79472. /**
  79473. * Internal poll timer value.
  79474. *
  79475. * @name Phaser.Input.InputPlugin#_pollTimer
  79476. * @type {number}
  79477. * @private
  79478. * @default 0
  79479. * @since 3.0.0
  79480. */
  79481. this._pollTimer = 0;
  79482. /**
  79483. * The distance, in pixels, a pointer has to move while being held down, before it thinks it is being dragged.
  79484. *
  79485. * @name Phaser.Input.InputPlugin#dragDistanceThreshold
  79486. * @type {number}
  79487. * @default 0
  79488. * @since 3.0.0
  79489. */
  79490. this.dragDistanceThreshold = 0;
  79491. /**
  79492. * The amount of time, in ms, a pointer has to be held down before it thinks it is dragging.
  79493. *
  79494. * @name Phaser.Input.InputPlugin#dragTimeThreshold
  79495. * @type {number}
  79496. * @default 0
  79497. * @since 3.0.0
  79498. */
  79499. this.dragTimeThreshold = 0;
  79500. /**
  79501. * Used to temporarily store the results of the Hit Test
  79502. *
  79503. * @name Phaser.Input.InputPlugin#_temp
  79504. * @type {array}
  79505. * @private
  79506. * @default []
  79507. * @since 3.0.0
  79508. */
  79509. this._temp = [];
  79510. /**
  79511. * Used to temporarily store the results of the Hit Test dropZones
  79512. *
  79513. * @name Phaser.Input.InputPlugin#_tempZones
  79514. * @type {array}
  79515. * @private
  79516. * @default []
  79517. * @since 3.0.0
  79518. */
  79519. this._tempZones = [];
  79520. /**
  79521. * A list of all Game Objects that have been set to be interactive in the Scene this Input Plugin is managing.
  79522. *
  79523. * @name Phaser.Input.InputPlugin#_list
  79524. * @type {Phaser.GameObjects.GameObject[]}
  79525. * @private
  79526. * @default []
  79527. * @since 3.0.0
  79528. */
  79529. this._list = [];
  79530. /**
  79531. * Objects waiting to be inserted to the list on the next call to 'begin'.
  79532. *
  79533. * @name Phaser.Input.InputPlugin#_pendingInsertion
  79534. * @type {Phaser.GameObjects.GameObject[]}
  79535. * @private
  79536. * @default []
  79537. * @since 3.0.0
  79538. */
  79539. this._pendingInsertion = [];
  79540. /**
  79541. * Objects waiting to be removed from the list on the next call to 'begin'.
  79542. *
  79543. * @name Phaser.Input.InputPlugin#_pendingRemoval
  79544. * @type {Phaser.GameObjects.GameObject[]}
  79545. * @private
  79546. * @default []
  79547. * @since 3.0.0
  79548. */
  79549. this._pendingRemoval = [];
  79550. /**
  79551. * A list of all Game Objects that have been enabled for dragging.
  79552. *
  79553. * @name Phaser.Input.InputPlugin#_draggable
  79554. * @type {Phaser.GameObjects.GameObject[]}
  79555. * @private
  79556. * @default []
  79557. * @since 3.0.0
  79558. */
  79559. this._draggable = [];
  79560. /**
  79561. * A list of all Interactive Objects currently considered as being 'draggable' by any pointer, indexed by pointer ID.
  79562. *
  79563. * @name Phaser.Input.InputPlugin#_drag
  79564. * @type {{0:Array,2:Array,3:Array,4:Array,5:Array,6:Array,7:Array,8:Array,9:Array}}
  79565. * @private
  79566. * @since 3.0.0
  79567. */
  79568. this._drag = { 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: [], 10: [] };
  79569. /**
  79570. * A list of all Interactive Objects currently considered as being 'over' by any pointer, indexed by pointer ID.
  79571. *
  79572. * @name Phaser.Input.InputPlugin#_over
  79573. * @type {{0:Array,2:Array,3:Array,4:Array,5:Array,6:Array,7:Array,8:Array,9:Array}}
  79574. * @private
  79575. * @since 3.0.0
  79576. */
  79577. this._over = { 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: [], 10: [] };
  79578. /**
  79579. * A list of valid DOM event types.
  79580. *
  79581. * @name Phaser.Input.InputPlugin#_validTypes
  79582. * @type {string[]}
  79583. * @private
  79584. * @since 3.0.0
  79585. */
  79586. this._validTypes = [ 'onDown', 'onUp', 'onOver', 'onOut', 'onMove', 'onDragStart', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDrop' ];
  79587. scene.sys.events.once('boot', this.boot, this);
  79588. scene.sys.events.on('start', this.start, this);
  79589. },
  79590. /**
  79591. * This method is called automatically, only once, when the Scene is first created.
  79592. * Do not invoke it directly.
  79593. *
  79594. * @method Phaser.Input.InputPlugin#boot
  79595. * @private
  79596. * @since 3.5.1
  79597. */
  79598. boot: function ()
  79599. {
  79600. this.cameras = this.systems.cameras;
  79601. this.displayList = this.systems.displayList;
  79602. this.systems.events.once('destroy', this.destroy, this);
  79603. // Registered input plugins listen for this
  79604. this.pluginEvents.emit('boot');
  79605. },
  79606. /**
  79607. * This method is called automatically by the Scene when it is starting up.
  79608. * It is responsible for creating local systems, properties and listening for Scene events.
  79609. * Do not invoke it directly.
  79610. *
  79611. * @method Phaser.Input.InputPlugin#start
  79612. * @private
  79613. * @since 3.5.0
  79614. */
  79615. start: function ()
  79616. {
  79617. var eventEmitter = this.systems.events;
  79618. eventEmitter.on('transitionstart', this.transitionIn, this);
  79619. eventEmitter.on('transitionout', this.transitionOut, this);
  79620. eventEmitter.on('transitioncomplete', this.transitionComplete, this);
  79621. eventEmitter.on('preupdate', this.preUpdate, this);
  79622. eventEmitter.on('update', this.update, this);
  79623. eventEmitter.once('shutdown', this.shutdown, this);
  79624. this.enabled = true;
  79625. // Registered input plugins listen for this
  79626. this.pluginEvents.emit('start');
  79627. },
  79628. /**
  79629. * The pre-update handler is responsible for checking the pending removal and insertion lists and
  79630. * deleting old Game Objects.
  79631. *
  79632. * @method Phaser.Input.InputPlugin#preUpdate
  79633. * @private
  79634. * @since 3.0.0
  79635. */
  79636. preUpdate: function ()
  79637. {
  79638. // Registered input plugins listen for this
  79639. this.pluginEvents.emit('preUpdate');
  79640. var removeList = this._pendingRemoval;
  79641. var insertList = this._pendingInsertion;
  79642. var toRemove = removeList.length;
  79643. var toInsert = insertList.length;
  79644. if (toRemove === 0 && toInsert === 0)
  79645. {
  79646. // Quick bail
  79647. return;
  79648. }
  79649. var current = this._list;
  79650. // Delete old gameObjects
  79651. for (var i = 0; i < toRemove; i++)
  79652. {
  79653. var gameObject = removeList[i];
  79654. var index = current.indexOf(gameObject);
  79655. if (index > -1)
  79656. {
  79657. current.splice(index, 1);
  79658. this.clear(gameObject);
  79659. }
  79660. }
  79661. // Clear the removal list
  79662. removeList.length = 0;
  79663. this._pendingRemoval.length = 0;
  79664. // Move pendingInsertion to list (also clears pendingInsertion at the same time)
  79665. this._list = current.concat(insertList.splice(0));
  79666. },
  79667. /**
  79668. * Checks to see if both this plugin and the Scene to which it belongs is active.
  79669. *
  79670. * @method Phaser.Input.InputPlugin#isActive
  79671. * @since 3.10.0
  79672. *
  79673. * @return {boolean} `true` if the plugin and the Scene it belongs to is active.
  79674. */
  79675. isActive: function ()
  79676. {
  79677. return (this.enabled && this.scene.sys.isActive());
  79678. },
  79679. /**
  79680. * The internal update loop for the Input Plugin.
  79681. * Called automatically by the Scene Systems step.
  79682. *
  79683. * @method Phaser.Input.InputPlugin#update
  79684. * @private
  79685. * @since 3.0.0
  79686. *
  79687. * @param {number} time - The time value from the most recent Game step. Typically a high-resolution timer value, or Date.now().
  79688. * @param {number} delta - The delta value since the last frame. This is smoothed to avoid delta spikes by the TimeStep class.
  79689. */
  79690. update: function (time, delta)
  79691. {
  79692. if (!this.isActive())
  79693. {
  79694. return;
  79695. }
  79696. this.pluginEvents.emit('update', time, delta);
  79697. var manager = this.manager;
  79698. // Another Scene above this one has already consumed the input events, or we're in transition
  79699. if (manager.globalTopOnly && manager.ignoreEvents)
  79700. {
  79701. return;
  79702. }
  79703. var runUpdate = (manager.dirty || this.pollRate === 0);
  79704. if (this.pollRate > -1)
  79705. {
  79706. this._pollTimer -= delta;
  79707. if (this._pollTimer < 0)
  79708. {
  79709. runUpdate = true;
  79710. // Discard timer diff
  79711. this._pollTimer = this.pollRate;
  79712. }
  79713. }
  79714. if (!runUpdate)
  79715. {
  79716. return;
  79717. }
  79718. var pointers = this.manager.pointers;
  79719. for (var i = 0; i < this.manager.pointersTotal; i++)
  79720. {
  79721. var pointer = pointers[i];
  79722. // Always reset this array
  79723. this._tempZones = [];
  79724. // _temp contains a hit tested and camera culled list of IO objects
  79725. this._temp = this.hitTestPointer(pointer);
  79726. this.sortGameObjects(this._temp);
  79727. this.sortGameObjects(this._tempZones);
  79728. if (this.topOnly)
  79729. {
  79730. // Only the top-most one counts now, so safely ignore the rest
  79731. if (this._temp.length)
  79732. {
  79733. this._temp.splice(1);
  79734. }
  79735. if (this._tempZones.length)
  79736. {
  79737. this._tempZones.splice(1);
  79738. }
  79739. }
  79740. var total = this.processDragEvents(pointer, time);
  79741. // TODO: Enable for touch
  79742. if (!pointer.wasTouch)
  79743. {
  79744. total += this.processOverOutEvents(pointer);
  79745. }
  79746. if (pointer.justDown)
  79747. {
  79748. total += this.processDownEvents(pointer);
  79749. }
  79750. if (pointer.justUp)
  79751. {
  79752. total += this.processUpEvents(pointer);
  79753. }
  79754. if (pointer.justMoved)
  79755. {
  79756. total += this.processMoveEvents(pointer);
  79757. }
  79758. if (total > 0 && manager.globalTopOnly)
  79759. {
  79760. // We interacted with an event in this Scene, so block any Scenes below us from doing the same this frame
  79761. manager.ignoreEvents = true;
  79762. }
  79763. }
  79764. },
  79765. /**
  79766. * Clears a Game Object so it no longer has an Interactive Object associated with it.
  79767. * The Game Object is then queued for removal from the Input Plugin on the next update.
  79768. *
  79769. * @method Phaser.Input.InputPlugin#clear
  79770. * @since 3.0.0
  79771. *
  79772. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will have its Interactive Object removed.
  79773. *
  79774. * @return {Phaser.GameObjects.GameObject} The Game Object that had its Interactive Object removed.
  79775. */
  79776. clear: function (gameObject)
  79777. {
  79778. var input = gameObject.input;
  79779. // If GameObject.input already cleared from higher class
  79780. if (!input)
  79781. {
  79782. return;
  79783. }
  79784. this.queueForRemoval(gameObject);
  79785. input.gameObject = undefined;
  79786. input.target = undefined;
  79787. input.hitArea = undefined;
  79788. input.hitAreaCallback = undefined;
  79789. input.callbackContext = undefined;
  79790. gameObject.input = null;
  79791. // Clear from _draggable, _drag and _over
  79792. var index = this._draggable.indexOf(gameObject);
  79793. if (index > -1)
  79794. {
  79795. this._draggable.splice(index, 1);
  79796. }
  79797. index = this._drag[0].indexOf(gameObject);
  79798. if (index > -1)
  79799. {
  79800. this._drag[0].splice(index, 1);
  79801. }
  79802. index = this._over[0].indexOf(gameObject);
  79803. if (index > -1)
  79804. {
  79805. this._over[0].splice(index, 1);
  79806. }
  79807. return gameObject;
  79808. },
  79809. /**
  79810. * Disables Input on a single Game Object.
  79811. *
  79812. * An input disabled Game Object still retains its Interactive Object component and can be re-enabled
  79813. * at any time, by passing it to `InputPlugin.enable`.
  79814. *
  79815. * @method Phaser.Input.InputPlugin#disable
  79816. * @since 3.0.0
  79817. *
  79818. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to have its input system disabled.
  79819. */
  79820. disable: function (gameObject)
  79821. {
  79822. gameObject.input.enabled = false;
  79823. },
  79824. /**
  79825. * Enable a Game Object for interaction.
  79826. *
  79827. * If the Game Object already has an Interactive Object component, it is enabled and returned.
  79828. *
  79829. * Otherwise, a new Interactive Object component is created and assigned to the Game Object's `input` property.
  79830. *
  79831. * Input works by using hit areas, these are nearly always geometric shapes, such as rectangles or circles, that act as the hit area
  79832. * for the Game Object. However, you can provide your own hit area shape and callback, should you wish to handle some more advanced
  79833. * input detection.
  79834. *
  79835. * 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
  79836. * 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
  79837. * shape for it to use.
  79838. *
  79839. * You can also provide an Input Configuration Object as the only argument to this method.
  79840. *
  79841. * @method Phaser.Input.InputPlugin#enable
  79842. * @since 3.0.0
  79843. *
  79844. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to be enabled for input.
  79845. * @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.
  79846. * @param {HitAreaCallback} [callback] - The 'contains' function to invoke to check if the pointer is within the hit area.
  79847. * @param {boolean} [dropZone=false] - Is this Game Object a drop zone or not?
  79848. *
  79849. * @return {Phaser.Input.InputPlugin} This Input Plugin.
  79850. */
  79851. enable: function (gameObject, shape, callback, dropZone)
  79852. {
  79853. if (dropZone === undefined) { dropZone = false; }
  79854. if (gameObject.input)
  79855. {
  79856. // If it is already has an InteractiveObject then just enable it and return
  79857. gameObject.input.enabled = true;
  79858. }
  79859. else
  79860. {
  79861. // Create an InteractiveObject and enable it
  79862. this.setHitArea(gameObject, shape, callback);
  79863. }
  79864. if (gameObject.input && dropZone && !gameObject.input.dropZone)
  79865. {
  79866. gameObject.input.dropZone = dropZone;
  79867. }
  79868. return this;
  79869. },
  79870. /**
  79871. * Takes the given Pointer and performs a hit test against it, to see which interactive Game Objects
  79872. * it is currently above.
  79873. *
  79874. * The hit test is performed against which-ever Camera the Pointer is over. If it is over multiple
  79875. * cameras, it starts checking the camera at the top of the camera list, and if nothing is found, iterates down the list.
  79876. *
  79877. * @method Phaser.Input.InputPlugin#hitTestPointer
  79878. * @since 3.0.0
  79879. *
  79880. * @param {Phaser.Input.Pointer} pointer - The Pointer to check against the Game Objects.
  79881. *
  79882. * @return {Phaser.GameObjects.GameObject[]} An array of all the interactive Game Objects the Pointer was above.
  79883. */
  79884. hitTestPointer: function (pointer)
  79885. {
  79886. var cameras = this.cameras.getCamerasBelowPointer(pointer);
  79887. for (var c = 0; c < cameras.length; c++)
  79888. {
  79889. var camera = cameras[c];
  79890. // Get a list of all objects that can be seen by the camera below the pointer in the scene and store in 'over' array.
  79891. // 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.
  79892. var over = this.manager.hitTest(pointer, this._list, camera);
  79893. // Filter out the drop zones
  79894. for (var i = 0; i < over.length; i++)
  79895. {
  79896. var obj = over[i];
  79897. if (obj.input.dropZone)
  79898. {
  79899. this._tempZones.push(obj);
  79900. }
  79901. }
  79902. if (over.length > 0)
  79903. {
  79904. pointer.camera = camera;
  79905. return over;
  79906. }
  79907. }
  79908. // If we got this far then there were no Game Objects below the pointer, but it was still over
  79909. // a camera, so set that the top-most one into the pointer
  79910. pointer.camera = cameras[0];
  79911. return [];
  79912. },
  79913. /**
  79914. * An internal method that handles the Pointer down event.
  79915. *
  79916. * @method Phaser.Input.InputPlugin#processDownEvents
  79917. * @private
  79918. * @since 3.0.0
  79919. *
  79920. * @param {Phaser.Input.Pointer} pointer - The Pointer being tested.
  79921. *
  79922. * @return {integer} The total number of objects interacted with.
  79923. */
  79924. processDownEvents: function (pointer)
  79925. {
  79926. var currentlyOver = this._temp;
  79927. // Contains ALL Game Objects currently over in the array
  79928. this.emit('pointerdown', pointer, currentlyOver);
  79929. var total = 0;
  79930. // Go through all objects the pointer was over and fire their events / callbacks
  79931. for (var i = 0; i < currentlyOver.length; i++)
  79932. {
  79933. var gameObject = currentlyOver[i];
  79934. if (!gameObject.input)
  79935. {
  79936. continue;
  79937. }
  79938. total++;
  79939. gameObject.emit('pointerdown', pointer, gameObject.input.localX, gameObject.input.localY, pointer.camera);
  79940. this.emit('gameobjectdown', pointer, gameObject);
  79941. }
  79942. return total;
  79943. },
  79944. /**
  79945. * An internal method that handles the Pointer drag events.
  79946. *
  79947. * @method Phaser.Input.InputPlugin#processDragEvents
  79948. * @private
  79949. * @since 3.0.0
  79950. *
  79951. * @param {Phaser.Input.Pointer} pointer - The Pointer to check against the Game Objects.
  79952. * @param {number} time - The time stamp of the most recent Game step.
  79953. *
  79954. * @return {integer} The total number of objects interacted with.
  79955. */
  79956. processDragEvents: function (pointer, time)
  79957. {
  79958. if (this._draggable.length === 0)
  79959. {
  79960. // There are no draggable items, so let's not even bother going further
  79961. return 0;
  79962. }
  79963. var i;
  79964. var gameObject;
  79965. var list;
  79966. var input;
  79967. var currentlyOver = this._temp;
  79968. // 0 = Not dragging anything
  79969. // 1 = Primary button down and objects below, so collect a draglist
  79970. // 2 = Pointer being checked if meets drag criteria
  79971. // 3 = Pointer meets criteria, notify the draglist
  79972. // 4 = Pointer actively dragging the draglist and has moved
  79973. // 5 = Pointer actively dragging but has been released, notify draglist
  79974. if (pointer.dragState === 0 && pointer.primaryDown && pointer.justDown && currentlyOver.length > 0)
  79975. {
  79976. pointer.dragState = 1;
  79977. }
  79978. else if (pointer.dragState > 0 && !pointer.primaryDown && pointer.justUp)
  79979. {
  79980. pointer.dragState = 5;
  79981. }
  79982. // Process the various drag states
  79983. // 1 = Primary button down and objects below, so collect a draglist
  79984. if (pointer.dragState === 1)
  79985. {
  79986. // Get draggable objects, sort them, pick the top (or all) and store them somewhere
  79987. var draglist = [];
  79988. for (i = 0; i < currentlyOver.length; i++)
  79989. {
  79990. gameObject = currentlyOver[i];
  79991. if (gameObject.input.draggable && (gameObject.input.dragState === 0))
  79992. {
  79993. draglist.push(gameObject);
  79994. }
  79995. }
  79996. if (draglist.length === 0)
  79997. {
  79998. pointer.dragState = 0;
  79999. return 0;
  80000. }
  80001. else if (draglist.length > 1)
  80002. {
  80003. this.sortGameObjects(draglist);
  80004. if (this.topOnly)
  80005. {
  80006. draglist.splice(1);
  80007. }
  80008. }
  80009. // draglist now contains all potential candidates for dragging
  80010. this._drag[pointer.id] = draglist;
  80011. if (this.dragDistanceThreshold === 0 && this.dragTimeThreshold === 0)
  80012. {
  80013. // No drag criteria, so snap immediately to mode 3
  80014. pointer.dragState = 3;
  80015. }
  80016. else
  80017. {
  80018. // Check the distance / time
  80019. pointer.dragState = 2;
  80020. }
  80021. }
  80022. // 2 = Pointer being checked if meets drag criteria
  80023. if (pointer.dragState === 2)
  80024. {
  80025. // Has it moved far enough to be considered a drag?
  80026. if (this.dragDistanceThreshold > 0 && DistanceBetween(pointer.x, pointer.y, pointer.downX, pointer.downY) >= this.dragDistanceThreshold)
  80027. {
  80028. // Alrighty, we've got a drag going on ...
  80029. pointer.dragState = 3;
  80030. }
  80031. // Held down long enough to be considered a drag?
  80032. if (this.dragTimeThreshold > 0 && (time >= pointer.downTime + this.dragTimeThreshold))
  80033. {
  80034. // Alrighty, we've got a drag going on ...
  80035. pointer.dragState = 3;
  80036. }
  80037. }
  80038. // 3 = Pointer meets criteria and is freshly down, notify the draglist
  80039. if (pointer.dragState === 3)
  80040. {
  80041. list = this._drag[pointer.id];
  80042. for (i = 0; i < list.length; i++)
  80043. {
  80044. gameObject = list[i];
  80045. input = gameObject.input;
  80046. input.dragState = 2;
  80047. input.dragX = pointer.x - gameObject.x;
  80048. input.dragY = pointer.y - gameObject.y;
  80049. input.dragStartX = gameObject.x;
  80050. input.dragStartY = gameObject.y;
  80051. gameObject.emit('dragstart', pointer, input.dragX, input.dragY);
  80052. this.emit('dragstart', pointer, gameObject);
  80053. }
  80054. pointer.dragState = 4;
  80055. return list.length;
  80056. }
  80057. // 4 = Pointer actively dragging the draglist and has moved
  80058. if (pointer.dragState === 4 && pointer.justMoved && !pointer.justUp)
  80059. {
  80060. var dropZones = this._tempZones;
  80061. list = this._drag[pointer.id];
  80062. for (i = 0; i < list.length; i++)
  80063. {
  80064. gameObject = list[i];
  80065. input = gameObject.input;
  80066. // If this GO has a target then let's check it
  80067. if (input.target)
  80068. {
  80069. var index = dropZones.indexOf(input.target);
  80070. // Got a target, are we still over it?
  80071. if (index === 0)
  80072. {
  80073. // We're still over it, and it's still the top of the display list, phew ...
  80074. gameObject.emit('dragover', pointer, input.target);
  80075. this.emit('dragover', pointer, gameObject, input.target);
  80076. }
  80077. else if (index > 0)
  80078. {
  80079. // Still over it but it's no longer top of the display list (targets must always be at the top)
  80080. gameObject.emit('dragleave', pointer, input.target);
  80081. this.emit('dragleave', pointer, gameObject, input.target);
  80082. input.target = dropZones[0];
  80083. gameObject.emit('dragenter', pointer, input.target);
  80084. this.emit('dragenter', pointer, gameObject, input.target);
  80085. }
  80086. else
  80087. {
  80088. // Nope, we've moved on (or the target has!), leave the old target
  80089. gameObject.emit('dragleave', pointer, input.target);
  80090. this.emit('dragleave', pointer, gameObject, input.target);
  80091. // Anything new to replace it?
  80092. // Yup!
  80093. if (dropZones[0])
  80094. {
  80095. input.target = dropZones[0];
  80096. gameObject.emit('dragenter', pointer, input.target);
  80097. this.emit('dragenter', pointer, gameObject, input.target);
  80098. }
  80099. else
  80100. {
  80101. // Nope
  80102. input.target = null;
  80103. }
  80104. }
  80105. }
  80106. else if (!input.target && dropZones[0])
  80107. {
  80108. input.target = dropZones[0];
  80109. gameObject.emit('dragenter', pointer, input.target);
  80110. this.emit('dragenter', pointer, gameObject, input.target);
  80111. }
  80112. var dragX = pointer.x - gameObject.input.dragX;
  80113. var dragY = pointer.y - gameObject.input.dragY;
  80114. gameObject.emit('drag', pointer, dragX, dragY);
  80115. this.emit('drag', pointer, gameObject, dragX, dragY);
  80116. }
  80117. return list.length;
  80118. }
  80119. // 5 = Pointer was actively dragging but has been released, notify draglist
  80120. if (pointer.dragState === 5)
  80121. {
  80122. list = this._drag[pointer.id];
  80123. for (i = 0; i < list.length; i++)
  80124. {
  80125. gameObject = list[i];
  80126. input = gameObject.input;
  80127. if (input.dragState === 2)
  80128. {
  80129. input.dragState = 0;
  80130. input.dragX = input.localX - gameObject.displayOriginX;
  80131. input.dragY = input.localY - gameObject.displayOriginY;
  80132. var dropped = false;
  80133. if (input.target)
  80134. {
  80135. gameObject.emit('drop', pointer, input.target);
  80136. this.emit('drop', pointer, gameObject, input.target);
  80137. input.target = null;
  80138. dropped = true;
  80139. }
  80140. // And finally the dragend event
  80141. gameObject.emit('dragend', pointer, input.dragX, input.dragY, dropped);
  80142. this.emit('dragend', pointer, gameObject, dropped);
  80143. }
  80144. }
  80145. pointer.dragState = 0;
  80146. list.splice(0);
  80147. }
  80148. return 0;
  80149. },
  80150. /**
  80151. * An internal method that handles the Pointer movement event.
  80152. *
  80153. * @method Phaser.Input.InputPlugin#processMoveEvents
  80154. * @private
  80155. * @since 3.0.0
  80156. *
  80157. * @param {Phaser.Input.Pointer} pointer - The pointer to check for events against.
  80158. *
  80159. * @return {integer} The total number of objects interacted with.
  80160. */
  80161. processMoveEvents: function (pointer)
  80162. {
  80163. var currentlyOver = this._temp;
  80164. this.emit('pointermove', pointer, currentlyOver);
  80165. var total = 0;
  80166. // Go through all objects the pointer was over and fire their events / callbacks
  80167. for (var i = 0; i < currentlyOver.length; i++)
  80168. {
  80169. var gameObject = currentlyOver[i];
  80170. if (!gameObject.input)
  80171. {
  80172. continue;
  80173. }
  80174. total++;
  80175. gameObject.emit('pointermove', pointer, gameObject.input.localX, gameObject.input.localY);
  80176. this.emit('gameobjectmove', pointer, gameObject);
  80177. if (this.topOnly)
  80178. {
  80179. break;
  80180. }
  80181. }
  80182. return total;
  80183. },
  80184. /**
  80185. * An internal method that handles the Pointer over and out events.
  80186. *
  80187. * @method Phaser.Input.InputPlugin#processOverOutEvents
  80188. * @private
  80189. * @since 3.0.0
  80190. *
  80191. * @param {Phaser.Input.Pointer} pointer - The pointer to check for events against.
  80192. *
  80193. * @return {integer} The total number of objects interacted with.
  80194. */
  80195. processOverOutEvents: function (pointer)
  80196. {
  80197. var currentlyOver = this._temp;
  80198. var i;
  80199. var gameObject;
  80200. var justOut = [];
  80201. var justOver = [];
  80202. var stillOver = [];
  80203. var previouslyOver = this._over[pointer.id];
  80204. var currentlyDragging = this._drag[pointer.id];
  80205. var manager = this.manager;
  80206. // Go through all objects the pointer was previously over, and see if it still is.
  80207. // Splits the previouslyOver array into two parts: justOut and stillOver
  80208. for (i = 0; i < previouslyOver.length; i++)
  80209. {
  80210. gameObject = previouslyOver[i];
  80211. if (currentlyOver.indexOf(gameObject) === -1 && currentlyDragging.indexOf(gameObject) === -1)
  80212. {
  80213. // Not in the currentlyOver array, so must be outside of this object now
  80214. justOut.push(gameObject);
  80215. }
  80216. else
  80217. {
  80218. // In the currentlyOver array
  80219. stillOver.push(gameObject);
  80220. }
  80221. }
  80222. // Go through all objects the pointer is currently over (the hit test results)
  80223. // and if not in the previouslyOver array we know it's a new entry, so add to justOver
  80224. for (i = 0; i < currentlyOver.length; i++)
  80225. {
  80226. gameObject = currentlyOver[i];
  80227. // Is this newly over?
  80228. if (previouslyOver.indexOf(gameObject) === -1)
  80229. {
  80230. justOver.push(gameObject);
  80231. }
  80232. }
  80233. // By this point the arrays are filled, so now we can process what happened...
  80234. // Process the Just Out objects
  80235. var total = justOut.length;
  80236. var totalInteracted = 0;
  80237. if (total > 0)
  80238. {
  80239. this.sortGameObjects(justOut);
  80240. this.emit('pointerout', pointer, justOut);
  80241. // Call onOut for everything in the justOut array
  80242. for (i = 0; i < total; i++)
  80243. {
  80244. gameObject = justOut[i];
  80245. if (!gameObject.input)
  80246. {
  80247. continue;
  80248. }
  80249. this.emit('gameobjectout', pointer, gameObject);
  80250. gameObject.emit('pointerout', pointer);
  80251. manager.resetCursor(gameObject.input);
  80252. totalInteracted++;
  80253. }
  80254. }
  80255. // Process the Just Over objects
  80256. total = justOver.length;
  80257. if (total > 0)
  80258. {
  80259. this.sortGameObjects(justOver);
  80260. this.emit('pointerover', pointer, justOver);
  80261. // Call onOver for everything in the justOver array
  80262. for (i = 0; i < total; i++)
  80263. {
  80264. gameObject = justOver[i];
  80265. if (!gameObject.input)
  80266. {
  80267. continue;
  80268. }
  80269. this.emit('gameobjectover', pointer, gameObject);
  80270. gameObject.emit('pointerover', pointer, gameObject.input.localX, gameObject.input.localY);
  80271. manager.setCursor(gameObject.input);
  80272. totalInteracted++;
  80273. }
  80274. }
  80275. // Add the contents of justOver to the previously over array
  80276. previouslyOver = stillOver.concat(justOver);
  80277. // Then sort it into display list order
  80278. this._over[pointer.id] = this.sortGameObjects(previouslyOver);
  80279. return totalInteracted;
  80280. },
  80281. /**
  80282. * An internal method that handles the Pointer up events.
  80283. *
  80284. * @method Phaser.Input.InputPlugin#processUpEvents
  80285. * @private
  80286. * @since 3.0.0
  80287. *
  80288. * @param {Phaser.Input.Pointer} pointer - The pointer to check for events against.
  80289. *
  80290. * @return {integer} The total number of objects interacted with.
  80291. */
  80292. processUpEvents: function (pointer)
  80293. {
  80294. var currentlyOver = this._temp;
  80295. // Contains ALL Game Objects currently up in the array
  80296. this.emit('pointerup', pointer, currentlyOver);
  80297. // Go through all objects the pointer was over and fire their events / callbacks
  80298. for (var i = 0; i < currentlyOver.length; i++)
  80299. {
  80300. var gameObject = currentlyOver[i];
  80301. if (!gameObject.input)
  80302. {
  80303. continue;
  80304. }
  80305. // pointerupoutside
  80306. gameObject.emit('pointerup', pointer, gameObject.input.localX, gameObject.input.localY);
  80307. this.emit('gameobjectup', pointer, gameObject);
  80308. }
  80309. return currentlyOver.length;
  80310. },
  80311. /**
  80312. * Queues a Game Object for insertion into this Input Plugin on the next update.
  80313. *
  80314. * @method Phaser.Input.InputPlugin#queueForInsertion
  80315. * @private
  80316. * @since 3.0.0
  80317. *
  80318. * @param {Phaser.GameObjects.GameObject} child - The Game Object to add.
  80319. *
  80320. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80321. */
  80322. queueForInsertion: function (child)
  80323. {
  80324. if (this._pendingInsertion.indexOf(child) === -1 && this._list.indexOf(child) === -1)
  80325. {
  80326. this._pendingInsertion.push(child);
  80327. }
  80328. return this;
  80329. },
  80330. /**
  80331. * Queues a Game Object for removal from this Input Plugin on the next update.
  80332. *
  80333. * @method Phaser.Input.InputPlugin#queueForRemoval
  80334. * @private
  80335. * @since 3.0.0
  80336. *
  80337. * @param {Phaser.GameObjects.GameObject} child - The Game Object to remove.
  80338. *
  80339. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80340. */
  80341. queueForRemoval: function (child)
  80342. {
  80343. this._pendingRemoval.push(child);
  80344. return this;
  80345. },
  80346. /**
  80347. * Sets the draggable state of the given array of Game Objects.
  80348. *
  80349. * They can either be set to be draggable, or can have their draggable state removed by passing `false`.
  80350. *
  80351. * A Game Object will not fire drag events unless it has been specifically enabled for drag.
  80352. *
  80353. * @method Phaser.Input.InputPlugin#setDraggable
  80354. * @since 3.0.0
  80355. *
  80356. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to change the draggable state on.
  80357. * @param {boolean} [value=true] - Set to `true` if the Game Objects should be made draggable, `false` if they should be unset.
  80358. *
  80359. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80360. */
  80361. setDraggable: function (gameObjects, value)
  80362. {
  80363. if (value === undefined) { value = true; }
  80364. if (!Array.isArray(gameObjects))
  80365. {
  80366. gameObjects = [ gameObjects ];
  80367. }
  80368. for (var i = 0; i < gameObjects.length; i++)
  80369. {
  80370. var gameObject = gameObjects[i];
  80371. gameObject.input.draggable = value;
  80372. var index = this._draggable.indexOf(gameObject);
  80373. if (value && index === -1)
  80374. {
  80375. this._draggable.push(gameObject);
  80376. }
  80377. else if (!value && index > -1)
  80378. {
  80379. this._draggable.splice(index, 1);
  80380. }
  80381. }
  80382. return this;
  80383. },
  80384. /**
  80385. * Creates a function that can be passed to `setInteractive`, `enable` or `setHitArea` that will handle
  80386. * pixel-perfect input detection on an Image or Sprite based Game Object, or any custom class that extends them.
  80387. *
  80388. * The following will create a sprite that is clickable on any pixel that has an alpha value >= 1.
  80389. *
  80390. * ```javascript
  80391. * this.add.sprite(x, y, key).setInteractive(this.input.makePixelPerfect());
  80392. * ```
  80393. *
  80394. * The following will create a sprite that is clickable on any pixel that has an alpha value >= 150.
  80395. *
  80396. * ```javascript
  80397. * this.add.sprite(x, y, key).setInteractive(this.input.makePixelPerfect(150));
  80398. * ```
  80399. *
  80400. * Once you have made an Interactive Object pixel perfect it impacts all input related events for it: down, up,
  80401. * dragstart, drag, etc.
  80402. *
  80403. * As a pointer interacts with the Game Object it will constantly poll the texture, extracting a single pixel from
  80404. * the given coordinates and checking its color values. This is an expensive process, so should only be enabled on
  80405. * Game Objects that really need it.
  80406. *
  80407. * You cannot make non-texture based Game Objects pixel perfect. So this will not work on Graphics, BitmapText,
  80408. * Render Textures, Text, Tilemaps, Containers or Particles.
  80409. *
  80410. * @method Phaser.Input.InputPlugin#makePixelPerfect
  80411. * @since 3.10.0
  80412. *
  80413. * @param {integer} [alphaTolerance=1] - The alpha level that the pixel should be above to be included as a successful interaction.
  80414. *
  80415. * @return {function} A Pixel Perfect Handler for use as a hitArea shape callback.
  80416. */
  80417. makePixelPerfect: function (alphaTolerance)
  80418. {
  80419. if (alphaTolerance === undefined) { alphaTolerance = 1; }
  80420. var textureManager = this.systems.textures;
  80421. return CreatePixelPerfectHandler(textureManager, alphaTolerance);
  80422. },
  80423. /**
  80424. * @typedef {object} Phaser.Input.InputConfiguration
  80425. *
  80426. * @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.
  80427. * @property {function} [hitAreaCallback] - The callback that determines if the pointer is within the Hit Area shape or not.
  80428. * @property {boolean} [draggable=false] - If `true` the Interactive Object will be set to be draggable and emit drag events.
  80429. * @property {boolean} [dropZone=false] - If `true` the Interactive Object will be set to be a drop zone for draggable objects.
  80430. * @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'`.
  80431. * @property {string} [cursor] - The CSS string to be used when the cursor is over this Interactive Object.
  80432. * @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.
  80433. * @property {integer} [alphaTolerance=1] - If `pixelPerfect` is set, this is the alpha tolerance threshold value used in the callback.
  80434. */
  80435. /**
  80436. * Sets the hit area for the given array of Game Objects.
  80437. *
  80438. * A hit area is typically one of the geometric shapes Phaser provides, such as a `Phaser.Geom.Rectangle`
  80439. * or `Phaser.Geom.Circle`. However, it can be any object as long as it works with the provided callback.
  80440. *
  80441. * If no hit area is provided a Rectangle is created based on the size of the Game Object, if possible
  80442. * to calculate.
  80443. *
  80444. * The hit area callback is the function that takes an `x` and `y` coordinate and returns a boolean if
  80445. * those values fall within the area of the shape or not. All of the Phaser geometry objects provide this,
  80446. * such as `Phaser.Geom.Rectangle.Contains`.
  80447. *
  80448. * @method Phaser.Input.InputPlugin#setHitArea
  80449. * @since 3.0.0
  80450. *
  80451. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to set the hit area on.
  80452. * @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.
  80453. * @param {HitAreaCallback} [callback] - The 'contains' function to invoke to check if the pointer is within the hit area.
  80454. *
  80455. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80456. */
  80457. setHitArea: function (gameObjects, shape, callback)
  80458. {
  80459. if (shape === undefined)
  80460. {
  80461. return this.setHitAreaFromTexture(gameObjects);
  80462. }
  80463. if (!Array.isArray(gameObjects))
  80464. {
  80465. gameObjects = [ gameObjects ];
  80466. }
  80467. var draggable = false;
  80468. var dropZone = false;
  80469. var cursor = false;
  80470. var useHandCursor = false;
  80471. // Config object?
  80472. if (IsPlainObject(shape))
  80473. {
  80474. var config = shape;
  80475. shape = GetFastValue(config, 'hitArea', null);
  80476. callback = GetFastValue(config, 'hitAreaCallback', null);
  80477. draggable = GetFastValue(config, 'draggable', false);
  80478. dropZone = GetFastValue(config, 'dropZone', false);
  80479. cursor = GetFastValue(config, 'cursor', false);
  80480. useHandCursor = GetFastValue(config, 'useHandCursor', false);
  80481. var pixelPerfect = GetFastValue(config, 'pixelPerfect', false);
  80482. var alphaTolerance = GetFastValue(config, 'alphaTolerance', 1);
  80483. if (pixelPerfect)
  80484. {
  80485. shape = {};
  80486. callback = this.makePixelPerfect(alphaTolerance);
  80487. }
  80488. // Still no hitArea or callback?
  80489. if (!shape || !callback)
  80490. {
  80491. this.setHitAreaFromTexture(gameObjects);
  80492. }
  80493. }
  80494. else if (typeof shape === 'function' && !callback)
  80495. {
  80496. callback = shape;
  80497. shape = {};
  80498. }
  80499. for (var i = 0; i < gameObjects.length; i++)
  80500. {
  80501. var gameObject = gameObjects[i];
  80502. var io = (!gameObject.input) ? CreateInteractiveObject(gameObject, shape, callback) : gameObject.input;
  80503. io.dropZone = dropZone;
  80504. io.cursor = (useHandCursor) ? 'pointer' : cursor;
  80505. gameObject.input = io;
  80506. if (draggable)
  80507. {
  80508. this.setDraggable(gameObject);
  80509. }
  80510. this.queueForInsertion(gameObject);
  80511. }
  80512. return this;
  80513. },
  80514. /**
  80515. * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Circle` shape, using
  80516. * the given coordinates and radius to control its position and size.
  80517. *
  80518. * @method Phaser.Input.InputPlugin#setHitAreaCircle
  80519. * @since 3.0.0
  80520. *
  80521. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to set as having a circle hit area.
  80522. * @param {number} x - The center of the circle.
  80523. * @param {number} y - The center of the circle.
  80524. * @param {number} radius - The radius of the circle.
  80525. * @param {HitAreaCallback} [callback] - The hit area callback. If undefined it uses Circle.Contains.
  80526. *
  80527. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80528. */
  80529. setHitAreaCircle: function (gameObjects, x, y, radius, callback)
  80530. {
  80531. if (callback === undefined) { callback = CircleContains; }
  80532. var shape = new Circle(x, y, radius);
  80533. return this.setHitArea(gameObjects, shape, callback);
  80534. },
  80535. /**
  80536. * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Ellipse` shape, using
  80537. * the given coordinates and dimensions to control its position and size.
  80538. *
  80539. * @method Phaser.Input.InputPlugin#setHitAreaEllipse
  80540. * @since 3.0.0
  80541. *
  80542. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to set as having an ellipse hit area.
  80543. * @param {number} x - The center of the ellipse.
  80544. * @param {number} y - The center of the ellipse.
  80545. * @param {number} width - The width of the ellipse.
  80546. * @param {number} height - The height of the ellipse.
  80547. * @param {HitAreaCallback} [callback] - The hit area callback. If undefined it uses Ellipse.Contains.
  80548. *
  80549. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80550. */
  80551. setHitAreaEllipse: function (gameObjects, x, y, width, height, callback)
  80552. {
  80553. if (callback === undefined) { callback = EllipseContains; }
  80554. var shape = new Ellipse(x, y, width, height);
  80555. return this.setHitArea(gameObjects, shape, callback);
  80556. },
  80557. /**
  80558. * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Rectangle` shape, using
  80559. * the Game Objects texture frame to define the position and size of the hit area.
  80560. *
  80561. * @method Phaser.Input.InputPlugin#setHitAreaFromTexture
  80562. * @since 3.0.0
  80563. *
  80564. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to set as having an ellipse hit area.
  80565. * @param {HitAreaCallback} [callback] - The hit area callback. If undefined it uses Rectangle.Contains.
  80566. *
  80567. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80568. */
  80569. setHitAreaFromTexture: function (gameObjects, callback)
  80570. {
  80571. if (callback === undefined) { callback = RectangleContains; }
  80572. if (!Array.isArray(gameObjects))
  80573. {
  80574. gameObjects = [ gameObjects ];
  80575. }
  80576. for (var i = 0; i < gameObjects.length; i++)
  80577. {
  80578. var gameObject = gameObjects[i];
  80579. var frame = gameObject.frame;
  80580. var width = 0;
  80581. var height = 0;
  80582. if (frame)
  80583. {
  80584. width = frame.realWidth;
  80585. height = frame.realHeight;
  80586. }
  80587. else if (gameObject.width)
  80588. {
  80589. width = gameObject.width;
  80590. height = gameObject.height;
  80591. }
  80592. if (gameObject.type === 'Container' && (width === 0 || height === 0))
  80593. {
  80594. console.warn('Container.setInteractive() must specify a Shape or call setSize() first');
  80595. continue;
  80596. }
  80597. if (width !== 0 && height !== 0)
  80598. {
  80599. gameObject.input = CreateInteractiveObject(gameObject, new Rectangle(0, 0, width, height), callback);
  80600. this.queueForInsertion(gameObject);
  80601. }
  80602. }
  80603. return this;
  80604. },
  80605. /**
  80606. * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Rectangle` shape, using
  80607. * the given coordinates and dimensions to control its position and size.
  80608. *
  80609. * @method Phaser.Input.InputPlugin#setHitAreaRectangle
  80610. * @since 3.0.0
  80611. *
  80612. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to set as having a rectangular hit area.
  80613. * @param {number} x - The top-left of the rectangle.
  80614. * @param {number} y - The top-left of the rectangle.
  80615. * @param {number} width - The width of the rectangle.
  80616. * @param {number} height - The height of the rectangle.
  80617. * @param {HitAreaCallback} [callback] - The hit area callback. If undefined it uses Rectangle.Contains.
  80618. *
  80619. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80620. */
  80621. setHitAreaRectangle: function (gameObjects, x, y, width, height, callback)
  80622. {
  80623. if (callback === undefined) { callback = RectangleContains; }
  80624. var shape = new Rectangle(x, y, width, height);
  80625. return this.setHitArea(gameObjects, shape, callback);
  80626. },
  80627. /**
  80628. * Sets the hit area for an array of Game Objects to be a `Phaser.Geom.Triangle` shape, using
  80629. * the given coordinates to control the position of its points.
  80630. *
  80631. * @method Phaser.Input.InputPlugin#setHitAreaTriangle
  80632. * @since 3.0.0
  80633. *
  80634. * @param {(Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[])} gameObjects - An array of Game Objects to set as having a triangular hit area.
  80635. * @param {number} x1 - The x coordinate of the first point of the triangle.
  80636. * @param {number} y1 - The y coordinate of the first point of the triangle.
  80637. * @param {number} x2 - The x coordinate of the second point of the triangle.
  80638. * @param {number} y2 - The y coordinate of the second point of the triangle.
  80639. * @param {number} x3 - The x coordinate of the third point of the triangle.
  80640. * @param {number} y3 - The y coordinate of the third point of the triangle.
  80641. * @param {HitAreaCallback} [callback] - The hit area callback. If undefined it uses Triangle.Contains.
  80642. *
  80643. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80644. */
  80645. setHitAreaTriangle: function (gameObjects, x1, y1, x2, y2, x3, y3, callback)
  80646. {
  80647. if (callback === undefined) { callback = TriangleContains; }
  80648. var shape = new Triangle(x1, y1, x2, y2, x3, y3);
  80649. return this.setHitArea(gameObjects, shape, callback);
  80650. },
  80651. /**
  80652. * Sets the Pointers to always poll.
  80653. *
  80654. * When a pointer is polled it runs a hit test to see which Game Objects are currently below it,
  80655. * or being interacted with it, regardless if the Pointer has actually moved or not.
  80656. *
  80657. * You should enable this if you want objects in your game to fire over / out events, and the objects
  80658. * are constantly moving, but the pointer may not have. Polling every frame has additional computation
  80659. * costs, especially if there are a large number of interactive objects in your game.
  80660. *
  80661. * @method Phaser.Input.InputPlugin#setPollAlways
  80662. * @since 3.0.0
  80663. *
  80664. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80665. */
  80666. setPollAlways: function ()
  80667. {
  80668. this.pollRate = 0;
  80669. this._pollTimer = 0;
  80670. return this;
  80671. },
  80672. /**
  80673. * Sets the Pointers to only poll when they are moved or updated.
  80674. *
  80675. * When a pointer is polled it runs a hit test to see which Game Objects are currently below it,
  80676. * or being interacted with it.
  80677. *
  80678. * @method Phaser.Input.InputPlugin#setPollOnMove
  80679. * @since 3.0.0
  80680. *
  80681. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80682. */
  80683. setPollOnMove: function ()
  80684. {
  80685. this.pollRate = -1;
  80686. this._pollTimer = 0;
  80687. return this;
  80688. },
  80689. /**
  80690. * Sets the poll rate value. This is the amount of time that should have elapsed before a pointer
  80691. * will be polled again. See the `setPollAlways` and `setPollOnMove` methods.
  80692. *
  80693. * @method Phaser.Input.InputPlugin#setPollRate
  80694. * @since 3.0.0
  80695. *
  80696. * @param {number} value - The amount of time, in ms, that should elapsed before re-polling the pointers.
  80697. *
  80698. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80699. */
  80700. setPollRate: function (value)
  80701. {
  80702. this.pollRate = value;
  80703. this._pollTimer = 0;
  80704. return this;
  80705. },
  80706. /**
  80707. * When set to `true` the global Input Manager will emulate DOM behavior by only emitting events from
  80708. * the top-most Game Objects in the Display List.
  80709. *
  80710. * If set to `false` it will emit events from all Game Objects below a Pointer, not just the top one.
  80711. *
  80712. * @method Phaser.Input.InputPlugin#setGlobalTopOnly
  80713. * @since 3.0.0
  80714. *
  80715. * @param {boolean} value - `true` to only include the top-most Game Object, or `false` to include all Game Objects in a hit test.
  80716. *
  80717. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80718. */
  80719. setGlobalTopOnly: function (value)
  80720. {
  80721. this.manager.globalTopOnly = value;
  80722. return this;
  80723. },
  80724. /**
  80725. * When set to `true` this Input Plugin will emulate DOM behavior by only emitting events from
  80726. * the top-most Game Objects in the Display List.
  80727. *
  80728. * If set to `false` it will emit events from all Game Objects below a Pointer, not just the top one.
  80729. *
  80730. * @method Phaser.Input.InputPlugin#setTopOnly
  80731. * @since 3.0.0
  80732. *
  80733. * @param {boolean} value - `true` to only include the top-most Game Object, or `false` to include all Game Objects in a hit test.
  80734. *
  80735. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80736. */
  80737. setTopOnly: function (value)
  80738. {
  80739. this.topOnly = value;
  80740. return this;
  80741. },
  80742. /**
  80743. * Given an array of Game Objects, sort the array and return it, so that the objects are in depth index order
  80744. * with the lowest at the bottom.
  80745. *
  80746. * @method Phaser.Input.InputPlugin#sortGameObjects
  80747. * @since 3.0.0
  80748. *
  80749. * @param {Phaser.GameObjects.GameObject[]} gameObjects - An array of Game Objects to be sorted.
  80750. *
  80751. * @return {Phaser.GameObjects.GameObject[]} The sorted array of Game Objects.
  80752. */
  80753. sortGameObjects: function (gameObjects)
  80754. {
  80755. if (gameObjects.length < 2)
  80756. {
  80757. return gameObjects;
  80758. }
  80759. this.scene.sys.depthSort();
  80760. return gameObjects.sort(this.sortHandlerGO.bind(this));
  80761. },
  80762. /**
  80763. * Return the child lowest down the display list (with the smallest index)
  80764. * Will iterate through all parent containers, if present.
  80765. *
  80766. * @method Phaser.Input.InputPlugin#sortHandlerGO
  80767. * @private
  80768. * @since 3.0.0
  80769. *
  80770. * @param {Phaser.GameObjects.GameObject} childA - The first Game Object to compare.
  80771. * @param {Phaser.GameObjects.GameObject} childB - The second Game Object to compare.
  80772. *
  80773. * @return {integer} Returns either a negative or positive integer, or zero if they match.
  80774. */
  80775. sortHandlerGO: function (childA, childB)
  80776. {
  80777. if (!childA.parentContainer && !childB.parentContainer)
  80778. {
  80779. // Quick bail out when neither child has a container
  80780. return this.displayList.getIndex(childB) - this.displayList.getIndex(childA);
  80781. }
  80782. else if (childA.parentContainer === childB.parentContainer)
  80783. {
  80784. // Quick bail out when both children have the same container
  80785. return childB.parentContainer.getIndex(childB) - childA.parentContainer.getIndex(childA);
  80786. }
  80787. else if (childA.parentContainer === childB)
  80788. {
  80789. // Quick bail out when childA is a child of childB
  80790. return -1;
  80791. }
  80792. else if (childB.parentContainer === childA)
  80793. {
  80794. // Quick bail out when childA is a child of childB
  80795. return 1;
  80796. }
  80797. else
  80798. {
  80799. // Container index check
  80800. var listA = childA.getIndexList();
  80801. var listB = childB.getIndexList();
  80802. var len = Math.min(listA.length, listB.length);
  80803. for (var i = 0; i < len; i++)
  80804. {
  80805. var indexA = listA[i];
  80806. var indexB = listB[i];
  80807. if (indexA === indexB)
  80808. {
  80809. // Go to the next level down
  80810. continue;
  80811. }
  80812. else
  80813. {
  80814. // Non-matching parents, so return
  80815. return indexB - indexA;
  80816. }
  80817. }
  80818. }
  80819. // Technically this shouldn't happen, but ...
  80820. return 0;
  80821. },
  80822. /**
  80823. * Causes the Input Manager to stop emitting any events for the remainder of this game step.
  80824. *
  80825. * @method Phaser.Input.InputPlugin#stopPropagation
  80826. * @since 3.0.0
  80827. *
  80828. * @return {Phaser.Input.InputPlugin} This InputPlugin object.
  80829. */
  80830. stopPropagation: function ()
  80831. {
  80832. if (this.manager.globalTopOnly)
  80833. {
  80834. this.manager.ignoreEvents = true;
  80835. }
  80836. return this;
  80837. },
  80838. /**
  80839. * Adds a callback to be invoked whenever the native DOM `mouseup` or `touchend` events are received.
  80840. * By setting the `isOnce` argument you can control if the callback is called once,
  80841. * or every time the DOM event occurs.
  80842. *
  80843. * Callbacks passed to this method are invoked _immediately_ when the DOM event happens,
  80844. * within the scope of the DOM event handler. Therefore, they are considered as 'native'
  80845. * from the perspective of the browser. This means they can be used for tasks such as
  80846. * opening new browser windows, or anything which explicitly requires user input to activate.
  80847. * However, as a result of this, they come with their own risks, and as such should not be used
  80848. * for general game input, but instead be reserved for special circumstances.
  80849. *
  80850. * If all you're trying to do is execute a callback when a pointer is released, then
  80851. * please use the internal Input event system instead.
  80852. *
  80853. * Please understand that these callbacks are invoked when the browser feels like doing so,
  80854. * which may be entirely out of the normal flow of the Phaser Game Loop. Therefore, you should absolutely keep
  80855. * Phaser related operations to a minimum in these callbacks. For example, don't destroy Game Objects,
  80856. * change Scenes or manipulate internal systems, otherwise you run a very real risk of creating
  80857. * heisenbugs (https://en.wikipedia.org/wiki/Heisenbug) that prove a challenge to reproduce, never mind
  80858. * solve.
  80859. *
  80860. * @method Phaser.Input.InputPlugin#addUpCallback
  80861. * @since 3.10.0
  80862. *
  80863. * @param {function} callback - The callback to be invoked on this DOM event.
  80864. * @param {boolean} [isOnce=true] - `true` if the callback will only be invoked once, `false` to call every time this event happens.
  80865. *
  80866. * @return {this} The Input Plugin.
  80867. */
  80868. addUpCallback: function (callback, isOnce)
  80869. {
  80870. this.manager.addUpCallback(callback, isOnce);
  80871. return this;
  80872. },
  80873. /**
  80874. * Adds a callback to be invoked whenever the native DOM `mousedown` or `touchstart` events are received.
  80875. * By setting the `isOnce` argument you can control if the callback is called once,
  80876. * or every time the DOM event occurs.
  80877. *
  80878. * Callbacks passed to this method are invoked _immediately_ when the DOM event happens,
  80879. * within the scope of the DOM event handler. Therefore, they are considered as 'native'
  80880. * from the perspective of the browser. This means they can be used for tasks such as
  80881. * opening new browser windows, or anything which explicitly requires user input to activate.
  80882. * However, as a result of this, they come with their own risks, and as such should not be used
  80883. * for general game input, but instead be reserved for special circumstances.
  80884. *
  80885. * If all you're trying to do is execute a callback when a pointer is down, then
  80886. * please use the internal Input event system instead.
  80887. *
  80888. * Please understand that these callbacks are invoked when the browser feels like doing so,
  80889. * which may be entirely out of the normal flow of the Phaser Game Loop. Therefore, you should absolutely keep
  80890. * Phaser related operations to a minimum in these callbacks. For example, don't destroy Game Objects,
  80891. * change Scenes or manipulate internal systems, otherwise you run a very real risk of creating
  80892. * heisenbugs (https://en.wikipedia.org/wiki/Heisenbug) that prove a challenge to reproduce, never mind
  80893. * solve.
  80894. *
  80895. * @method Phaser.Input.InputPlugin#addDownCallback
  80896. * @since 3.10.0
  80897. *
  80898. * @param {function} callback - The callback to be invoked on this dom event.
  80899. * @param {boolean} [isOnce=true] - `true` if the callback will only be invoked once, `false` to call every time this event happens.
  80900. *
  80901. * @return {this} The Input Plugin.
  80902. */
  80903. addDownCallback: function (callback, isOnce)
  80904. {
  80905. this.manager.addDownCallback(callback, isOnce);
  80906. return this;
  80907. },
  80908. /**
  80909. * Adds a callback to be invoked whenever the native DOM `mousemove` or `touchmove` events are received.
  80910. * By setting the `isOnce` argument you can control if the callback is called once,
  80911. * or every time the DOM event occurs.
  80912. *
  80913. * Callbacks passed to this method are invoked _immediately_ when the DOM event happens,
  80914. * within the scope of the DOM event handler. Therefore, they are considered as 'native'
  80915. * from the perspective of the browser. This means they can be used for tasks such as
  80916. * opening new browser windows, or anything which explicitly requires user input to activate.
  80917. * However, as a result of this, they come with their own risks, and as such should not be used
  80918. * for general game input, but instead be reserved for special circumstances.
  80919. *
  80920. * If all you're trying to do is execute a callback when a pointer is moved, then
  80921. * please use the internal Input event system instead.
  80922. *
  80923. * Please understand that these callbacks are invoked when the browser feels like doing so,
  80924. * which may be entirely out of the normal flow of the Phaser Game Loop. Therefore, you should absolutely keep
  80925. * Phaser related operations to a minimum in these callbacks. For example, don't destroy Game Objects,
  80926. * change Scenes or manipulate internal systems, otherwise you run a very real risk of creating
  80927. * heisenbugs (https://en.wikipedia.org/wiki/Heisenbug) that prove a challenge to reproduce, never mind
  80928. * solve.
  80929. *
  80930. * @method Phaser.Input.InputPlugin#addMoveCallback
  80931. * @since 3.10.0
  80932. *
  80933. * @param {function} callback - The callback to be invoked on this dom event.
  80934. * @param {boolean} [isOnce=false] - `true` if the callback will only be invoked once, `false` to call every time this event happens.
  80935. *
  80936. * @return {this} The Input Plugin.
  80937. */
  80938. addMoveCallback: function (callback, isOnce)
  80939. {
  80940. this.manager.addMoveCallback(callback, isOnce);
  80941. return this;
  80942. },
  80943. /**
  80944. * Adds new Pointer objects to the Input Manager.
  80945. *
  80946. * By default Phaser creates 2 pointer objects: `mousePointer` and `pointer1`.
  80947. *
  80948. * You can create more either by calling this method, or by setting the `input.activePointers` property
  80949. * in the Game Config, up to a maximum of 10 pointers.
  80950. *
  80951. * The first 10 pointers are available via the `InputPlugin.pointerX` properties, once they have been added
  80952. * via this method.
  80953. *
  80954. * @method Phaser.Input.InputPlugin#addPointer
  80955. * @since 3.10.0
  80956. *
  80957. * @param {integer} [quantity=1] The number of new Pointers to create. A maximum of 10 is allowed in total.
  80958. *
  80959. * @return {Phaser.Input.Pointer[]} An array containing all of the new Pointer objects that were created.
  80960. */
  80961. addPointer: function (quantity)
  80962. {
  80963. return this.manager.addPointer(quantity);
  80964. },
  80965. /**
  80966. * Tells the Input system to set a custom cursor.
  80967. *
  80968. * This cursor will be the default cursor used when interacting with the game canvas.
  80969. *
  80970. * If an Interactive Object also sets a custom cursor, this is the cursor that is reset after its use.
  80971. *
  80972. * Any valid CSS cursor value is allowed, including paths to image files, i.e.:
  80973. *
  80974. * ```javascript
  80975. * this.input.setDefaultCursor('url(assets/cursors/sword.cur), pointer');
  80976. * ```
  80977. *
  80978. * Please read about the differences between browsers when it comes to the file formats and sizes they support:
  80979. *
  80980. * https://developer.mozilla.org/en-US/docs/Web/CSS/cursor
  80981. * https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_User_Interface/Using_URL_values_for_the_cursor_property
  80982. *
  80983. * It's up to you to pick a suitable cursor format that works across the range of browsers you need to support.
  80984. *
  80985. * @method Phaser.Input.InputPlugin#setDefaultCursor
  80986. * @since 3.10.0
  80987. *
  80988. * @param {string} cursor - The CSS to be used when setting the default cursor.
  80989. *
  80990. * @return {Phaser.Input.InputPlugin} This Input instance.
  80991. */
  80992. setDefaultCursor: function (cursor)
  80993. {
  80994. this.manager.setDefaultCursor(cursor);
  80995. return this;
  80996. },
  80997. /**
  80998. * The Scene that owns this plugin is transitioning in.
  80999. *
  81000. * @method Phaser.Input.InputPlugin#transitionIn
  81001. * @private
  81002. * @since 3.5.0
  81003. */
  81004. transitionIn: function ()
  81005. {
  81006. this.enabled = this.settings.transitionAllowInput;
  81007. },
  81008. /**
  81009. * The Scene that owns this plugin has finished transitioning in.
  81010. *
  81011. * @method Phaser.Input.InputPlugin#transitionComplete
  81012. * @private
  81013. * @since 3.5.0
  81014. */
  81015. transitionComplete: function ()
  81016. {
  81017. if (!this.settings.transitionAllowInput)
  81018. {
  81019. this.enabled = true;
  81020. }
  81021. },
  81022. /**
  81023. * The Scene that owns this plugin is transitioning out.
  81024. *
  81025. * @method Phaser.Input.InputPlugin#transitionOut
  81026. * @private
  81027. * @since 3.5.0
  81028. */
  81029. transitionOut: function ()
  81030. {
  81031. this.enabled = this.settings.transitionAllowInput;
  81032. },
  81033. /**
  81034. * The Scene that owns this plugin is shutting down.
  81035. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  81036. *
  81037. * @method Phaser.Input.InputPlugin#shutdown
  81038. * @private
  81039. * @since 3.0.0
  81040. */
  81041. shutdown: function ()
  81042. {
  81043. // Registered input plugins listen for this
  81044. this.pluginEvents.emit('shutdown');
  81045. this._temp.length = 0;
  81046. this._list.length = 0;
  81047. this._draggable.length = 0;
  81048. this._pendingRemoval.length = 0;
  81049. this._pendingInsertion.length = 0;
  81050. for (var i = 0; i < 10; i++)
  81051. {
  81052. this._drag[i] = [];
  81053. this._over[i] = [];
  81054. }
  81055. this.removeAllListeners();
  81056. var eventEmitter = this.systems.events;
  81057. eventEmitter.off('transitionstart', this.transitionIn, this);
  81058. eventEmitter.off('transitionout', this.transitionOut, this);
  81059. eventEmitter.off('transitioncomplete', this.transitionComplete, this);
  81060. eventEmitter.off('preupdate', this.preUpdate, this);
  81061. eventEmitter.off('update', this.update, this);
  81062. eventEmitter.off('shutdown', this.shutdown, this);
  81063. },
  81064. /**
  81065. * The Scene that owns this plugin is being destroyed.
  81066. * We need to shutdown and then kill off all external references.
  81067. *
  81068. * @method Phaser.Input.InputPlugin#destroy
  81069. * @private
  81070. * @since 3.0.0
  81071. */
  81072. destroy: function ()
  81073. {
  81074. this.shutdown();
  81075. // Registered input plugins listen for this
  81076. this.pluginEvents.emit('destroy');
  81077. this.pluginEvents.removeAllListeners();
  81078. this.scene.sys.events.off('start', this.start, this);
  81079. this.scene = null;
  81080. this.cameras = null;
  81081. this.manager = null;
  81082. this.events = null;
  81083. this.mouse = null;
  81084. },
  81085. /**
  81086. * The x coordinates of the ActivePointer based on the first camera in the camera list.
  81087. * This is only safe to use if your game has just 1 non-transformed camera and doesn't use multi-touch.
  81088. *
  81089. * @name Phaser.Input.InputPlugin#x
  81090. * @type {number}
  81091. * @readOnly
  81092. * @since 3.0.0
  81093. */
  81094. x: {
  81095. get: function ()
  81096. {
  81097. return this.manager.activePointer.x;
  81098. }
  81099. },
  81100. /**
  81101. * The y coordinates of the ActivePointer based on the first camera in the camera list.
  81102. * This is only safe to use if your game has just 1 non-transformed camera and doesn't use multi-touch.
  81103. *
  81104. * @name Phaser.Input.InputPlugin#y
  81105. * @type {number}
  81106. * @readOnly
  81107. * @since 3.0.0
  81108. */
  81109. y: {
  81110. get: function ()
  81111. {
  81112. return this.manager.activePointer.y;
  81113. }
  81114. },
  81115. /**
  81116. * The mouse has its own unique Pointer object, which you can reference directly if making a _desktop specific game_.
  81117. * If you are supporting both desktop and touch devices then do not use this property, instead use `activePointer`
  81118. * which will always map to the most recently interacted pointer.
  81119. *
  81120. * @name Phaser.Input.InputPlugin#mousePointer
  81121. * @type {Phaser.Input.Pointer}
  81122. * @readOnly
  81123. * @since 3.10.0
  81124. */
  81125. mousePointer: {
  81126. get: function ()
  81127. {
  81128. return this.manager.mousePointer;
  81129. }
  81130. },
  81131. /**
  81132. * The current active input Pointer.
  81133. *
  81134. * @name Phaser.Input.InputPlugin#activePointer
  81135. * @type {Phaser.Input.Pointer}
  81136. * @readOnly
  81137. * @since 3.0.0
  81138. */
  81139. activePointer: {
  81140. get: function ()
  81141. {
  81142. return this.manager.activePointer;
  81143. }
  81144. },
  81145. /**
  81146. * A touch-based Pointer object.
  81147. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  81148. *
  81149. * @name Phaser.Input.InputPlugin#pointer1
  81150. * @type {Phaser.Input.Pointer}
  81151. * @readOnly
  81152. * @since 3.10.0
  81153. */
  81154. pointer1: {
  81155. get: function ()
  81156. {
  81157. return this.manager.pointers[1];
  81158. }
  81159. },
  81160. /**
  81161. * A touch-based Pointer object.
  81162. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  81163. *
  81164. * @name Phaser.Input.InputPlugin#pointer2
  81165. * @type {Phaser.Input.Pointer}
  81166. * @readOnly
  81167. * @since 3.10.0
  81168. */
  81169. pointer2: {
  81170. get: function ()
  81171. {
  81172. return this.manager.pointers[2];
  81173. }
  81174. },
  81175. /**
  81176. * A touch-based Pointer object.
  81177. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  81178. *
  81179. * @name Phaser.Input.InputPlugin#pointer3
  81180. * @type {Phaser.Input.Pointer}
  81181. * @readOnly
  81182. * @since 3.10.0
  81183. */
  81184. pointer3: {
  81185. get: function ()
  81186. {
  81187. return this.manager.pointers[3];
  81188. }
  81189. },
  81190. /**
  81191. * A touch-based Pointer object.
  81192. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  81193. *
  81194. * @name Phaser.Input.InputPlugin#pointer4
  81195. * @type {Phaser.Input.Pointer}
  81196. * @readOnly
  81197. * @since 3.10.0
  81198. */
  81199. pointer4: {
  81200. get: function ()
  81201. {
  81202. return this.manager.pointers[4];
  81203. }
  81204. },
  81205. /**
  81206. * A touch-based Pointer object.
  81207. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  81208. *
  81209. * @name Phaser.Input.InputPlugin#pointer5
  81210. * @type {Phaser.Input.Pointer}
  81211. * @readOnly
  81212. * @since 3.10.0
  81213. */
  81214. pointer5: {
  81215. get: function ()
  81216. {
  81217. return this.manager.pointers[5];
  81218. }
  81219. },
  81220. /**
  81221. * A touch-based Pointer object.
  81222. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  81223. *
  81224. * @name Phaser.Input.InputPlugin#pointer6
  81225. * @type {Phaser.Input.Pointer}
  81226. * @readOnly
  81227. * @since 3.10.0
  81228. */
  81229. pointer6: {
  81230. get: function ()
  81231. {
  81232. return this.manager.pointers[6];
  81233. }
  81234. },
  81235. /**
  81236. * A touch-based Pointer object.
  81237. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  81238. *
  81239. * @name Phaser.Input.InputPlugin#pointer7
  81240. * @type {Phaser.Input.Pointer}
  81241. * @readOnly
  81242. * @since 3.10.0
  81243. */
  81244. pointer7: {
  81245. get: function ()
  81246. {
  81247. return this.manager.pointers[7];
  81248. }
  81249. },
  81250. /**
  81251. * A touch-based Pointer object.
  81252. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  81253. *
  81254. * @name Phaser.Input.InputPlugin#pointer8
  81255. * @type {Phaser.Input.Pointer}
  81256. * @readOnly
  81257. * @since 3.10.0
  81258. */
  81259. pointer8: {
  81260. get: function ()
  81261. {
  81262. return this.manager.pointers[8];
  81263. }
  81264. },
  81265. /**
  81266. * A touch-based Pointer object.
  81267. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  81268. *
  81269. * @name Phaser.Input.InputPlugin#pointer9
  81270. * @type {Phaser.Input.Pointer}
  81271. * @readOnly
  81272. * @since 3.10.0
  81273. */
  81274. pointer9: {
  81275. get: function ()
  81276. {
  81277. return this.manager.pointers[9];
  81278. }
  81279. },
  81280. /**
  81281. * A touch-based Pointer object.
  81282. * This will be `undefined` by default unless you add a new Pointer using `addPointer`.
  81283. *
  81284. * @name Phaser.Input.InputPlugin#pointer10
  81285. * @type {Phaser.Input.Pointer}
  81286. * @readOnly
  81287. * @since 3.10.0
  81288. */
  81289. pointer10: {
  81290. get: function ()
  81291. {
  81292. return this.manager.pointers[10];
  81293. }
  81294. }
  81295. });
  81296. PluginCache.register('InputPlugin', InputPlugin, 'input');
  81297. module.exports = InputPlugin;
  81298. /***/ }),
  81299. /* 383 */
  81300. /***/ (function(module, exports) {
  81301. /**
  81302. * @author Richard Davey <rich@photonstorm.com>
  81303. * @copyright 2018 Photon Storm Ltd.
  81304. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  81305. */
  81306. /**
  81307. * XBox 360 Gamepad Configuration.
  81308. *
  81309. * @name Phaser.Input.Gamepad.Configs.XBOX_360
  81310. * @type {object}
  81311. * @since 3.0.0
  81312. */
  81313. module.exports = {
  81314. UP: 12,
  81315. DOWN: 13,
  81316. LEFT: 14,
  81317. RIGHT: 15,
  81318. MENU: 16,
  81319. A: 0,
  81320. B: 1,
  81321. X: 2,
  81322. Y: 3,
  81323. LB: 4,
  81324. RB: 5,
  81325. LT: 6,
  81326. RT: 7,
  81327. BACK: 8,
  81328. START: 9,
  81329. LS: 10,
  81330. RS: 11,
  81331. LEFT_STICK_H: 0,
  81332. LEFT_STICK_V: 1,
  81333. RIGHT_STICK_H: 2,
  81334. RIGHT_STICK_V: 3
  81335. };
  81336. /***/ }),
  81337. /* 384 */
  81338. /***/ (function(module, exports) {
  81339. /**
  81340. * @author Richard Davey <rich@photonstorm.com>
  81341. * @copyright 2018 Photon Storm Ltd.
  81342. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  81343. */
  81344. /**
  81345. * Tatar SNES USB Controller Gamepad Configuration.
  81346. * USB Gamepad (STANDARD GAMEPAD Vendor: 0079 Product: 0011)
  81347. *
  81348. * @name Phaser.Input.Gamepad.Configs.SNES_USB
  81349. * @type {object}
  81350. * @since 3.0.0
  81351. */
  81352. module.exports = {
  81353. UP: 12,
  81354. DOWN: 13,
  81355. LEFT: 14,
  81356. RIGHT: 15,
  81357. SELECT: 8,
  81358. START: 9,
  81359. B: 0,
  81360. A: 1,
  81361. Y: 2,
  81362. X: 3,
  81363. LEFT_SHOULDER: 4,
  81364. RIGHT_SHOULDER: 5
  81365. };
  81366. /***/ }),
  81367. /* 385 */
  81368. /***/ (function(module, exports) {
  81369. /**
  81370. * @author Richard Davey <rich@photonstorm.com>
  81371. * @copyright 2018 Photon Storm Ltd.
  81372. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  81373. */
  81374. /**
  81375. * PlayStation DualShock 4 Gamepad Configuration.
  81376. * Sony PlayStation DualShock 4 (v2) wireless controller
  81377. *
  81378. * @name Phaser.Input.Gamepad.Configs.DUALSHOCK_4
  81379. * @type {object}
  81380. * @since 3.0.0
  81381. */
  81382. module.exports = {
  81383. UP: 12,
  81384. DOWN: 13,
  81385. LEFT: 14,
  81386. RIGHT: 15,
  81387. SHARE: 8,
  81388. OPTIONS: 9,
  81389. PS: 16,
  81390. TOUCHBAR: 17,
  81391. X: 0,
  81392. CIRCLE: 1,
  81393. SQUARE: 2,
  81394. TRIANGLE: 3,
  81395. L1: 4,
  81396. R1: 5,
  81397. L2: 6,
  81398. R2: 7,
  81399. L3: 10,
  81400. R3: 11,
  81401. LEFT_STICK_H: 0,
  81402. LEFT_STICK_V: 1,
  81403. RIGHT_STICK_H: 2,
  81404. RIGHT_STICK_V: 3
  81405. };
  81406. /***/ }),
  81407. /* 386 */
  81408. /***/ (function(module, exports, __webpack_require__) {
  81409. /**
  81410. * @author Richard Davey <rich@photonstorm.com>
  81411. * @copyright 2018 Photon Storm Ltd.
  81412. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  81413. */
  81414. /**
  81415. * @namespace Phaser.Input.Gamepad.Configs
  81416. */
  81417. module.exports = {
  81418. DUALSHOCK_4: __webpack_require__(385),
  81419. SNES_USB: __webpack_require__(384),
  81420. XBOX_360: __webpack_require__(383)
  81421. };
  81422. /***/ }),
  81423. /* 387 */
  81424. /***/ (function(module, exports, __webpack_require__) {
  81425. /**
  81426. * @author Richard Davey <rich@photonstorm.com>
  81427. * @copyright 2018 Photon Storm Ltd.
  81428. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  81429. */
  81430. var Class = __webpack_require__(0);
  81431. var EventEmitter = __webpack_require__(9);
  81432. var Gamepad = __webpack_require__(177);
  81433. var GetValue = __webpack_require__(4);
  81434. var InputPluginCache = __webpack_require__(75);
  81435. /**
  81436. * @typedef {object} Pad
  81437. *
  81438. * @property {string} id - The ID of the Gamepad.
  81439. * @property {integer} index - The index of the Gamepad.
  81440. */
  81441. /**
  81442. * @classdesc
  81443. * The Gamepad Plugin is an input plugin that belongs to the Scene-owned Input system.
  81444. *
  81445. * Its role is to listen for native DOM Gamepad Events and then process them.
  81446. *
  81447. * You do not need to create this class directly, the Input system will create an instance of it automatically.
  81448. *
  81449. * You can access it from within a Scene using `this.input.gamepad`.
  81450. *
  81451. * To listen for a gamepad being connected:
  81452. *
  81453. * ```javascript
  81454. * this.input.gamepad.once('connected', function (pad) {
  81455. * // 'pad' is a reference to the gamepad that was just connected
  81456. * });
  81457. * ```
  81458. *
  81459. * Note that the browser may require you to press a button on a gamepad before it will allow you to access it,
  81460. * this is for security reasons. However, it may also trust the page already, in which case you won't get the
  81461. * 'connected' event and instead should check `GamepadPlugin.total` to see if it thinks there are any gamepads
  81462. * already connected.
  81463. *
  81464. * Once you have received the connected event, or polled the gamepads and found them enabled, you can access
  81465. * them via the built-in properties `GamepadPlugin.pad1` to `pad4`, for up to 4 game pads. With a reference
  81466. * to the gamepads you can poll its buttons and axis sticks. See the properties and methods available on
  81467. * the `Gamepad` class for more details.
  81468. *
  81469. * For more information about Gamepad support in browsers see the following resources:
  81470. *
  81471. * https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API
  81472. * https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API/Using_the_Gamepad_API
  81473. * https://www.smashingmagazine.com/2015/11/gamepad-api-in-web-games/
  81474. * http://html5gamepad.com/
  81475. *
  81476. * @class GamepadPlugin
  81477. * @extends Phaser.Events.EventEmitter
  81478. * @memberOf Phaser.Input.Gamepad
  81479. * @constructor
  81480. * @since 3.10.0
  81481. *
  81482. * @param {Phaser.Input.InputPlugin} sceneInputPlugin - A reference to the Scene Input Plugin that the KeyboardPlugin belongs to.
  81483. */
  81484. var GamepadPlugin = new Class({
  81485. Extends: EventEmitter,
  81486. initialize:
  81487. function GamepadPlugin (sceneInputPlugin)
  81488. {
  81489. EventEmitter.call(this);
  81490. /**
  81491. * A reference to the Scene that this Input Plugin is responsible for.
  81492. *
  81493. * @name Phaser.Input.Gamepad.GamepadPlugin#scene
  81494. * @type {Phaser.Scene}
  81495. * @since 3.10.0
  81496. */
  81497. this.scene = sceneInputPlugin.scene;
  81498. /**
  81499. * A reference to the Scene Systems Settings.
  81500. *
  81501. * @name Phaser.Input.Gamepad.GamepadPlugin#settings
  81502. * @type {Phaser.Scenes.Settings.Object}
  81503. * @since 3.10.0
  81504. */
  81505. this.settings = this.scene.sys.settings;
  81506. /**
  81507. * A reference to the Scene Input Plugin that created this Keyboard Plugin.
  81508. *
  81509. * @name Phaser.Input.Gamepad.GamepadPlugin#sceneInputPlugin
  81510. * @type {Phaser.Input.InputPlugin}
  81511. * @since 3.10.0
  81512. */
  81513. this.sceneInputPlugin = sceneInputPlugin;
  81514. /**
  81515. * A boolean that controls if the Gamepad Manager is enabled or not.
  81516. * Can be toggled on the fly.
  81517. *
  81518. * @name Phaser.Input.Gamepad.GamepadPlugin#enabled
  81519. * @type {boolean}
  81520. * @default true
  81521. * @since 3.10.0
  81522. */
  81523. this.enabled = true;
  81524. /**
  81525. * The Gamepad Event target, as defined in the Game Config.
  81526. * Typically the browser window, but can be any interactive DOM element.
  81527. *
  81528. * @name Phaser.Input.Gamepad.GamepadPlugin#target
  81529. * @type {any}
  81530. * @since 3.10.0
  81531. */
  81532. this.target;
  81533. /**
  81534. * An array of the connected Gamepads.
  81535. *
  81536. * @name Phaser.Input.Gamepad.GamepadPlugin#gamepads
  81537. * @type {Phaser.Input.Gamepad.Gamepad[]}
  81538. * @default []
  81539. * @since 3.10.0
  81540. */
  81541. this.gamepads = [];
  81542. /**
  81543. * An internal event queue.
  81544. *
  81545. * @name Phaser.Input.Gamepad.GamepadPlugin#queue
  81546. * @type {GamepadEvent[]}
  81547. * @private
  81548. * @since 3.10.0
  81549. */
  81550. this.queue = [];
  81551. /**
  81552. * Internal event handler.
  81553. *
  81554. * @name Phaser.Input.Gamepad.GamepadPlugin#onGamepadHandler
  81555. * @type {function}
  81556. * @private
  81557. * @since 3.10.0
  81558. */
  81559. this.onGamepadHandler;
  81560. /**
  81561. * Internal Gamepad reference.
  81562. *
  81563. * @name Phaser.Input.Gamepad.GamepadPlugin#_pad1
  81564. * @type {Phaser.Input.Gamepad.Gamepad}
  81565. * @private
  81566. * @since 3.10.0
  81567. */
  81568. this._pad1;
  81569. /**
  81570. * Internal Gamepad reference.
  81571. *
  81572. * @name Phaser.Input.Gamepad.GamepadPlugin#_pad2
  81573. * @type {Phaser.Input.Gamepad.Gamepad}
  81574. * @private
  81575. * @since 3.10.0
  81576. */
  81577. this._pad2;
  81578. /**
  81579. * Internal Gamepad reference.
  81580. *
  81581. * @name Phaser.Input.Gamepad.GamepadPlugin#_pad3
  81582. * @type {Phaser.Input.Gamepad.Gamepad}
  81583. * @private
  81584. * @since 3.10.0
  81585. */
  81586. this._pad3;
  81587. /**
  81588. * Internal Gamepad reference.
  81589. *
  81590. * @name Phaser.Input.Gamepad.GamepadPlugin#_pad4
  81591. * @type {Phaser.Input.Gamepad.Gamepad}
  81592. * @private
  81593. * @since 3.10.0
  81594. */
  81595. this._pad4;
  81596. sceneInputPlugin.pluginEvents.once('boot', this.boot, this);
  81597. sceneInputPlugin.pluginEvents.on('start', this.start, this);
  81598. },
  81599. /**
  81600. * This method is called automatically, only once, when the Scene is first created.
  81601. * Do not invoke it directly.
  81602. *
  81603. * @method Phaser.Input.Gamepad.GamepadPlugin#boot
  81604. * @private
  81605. * @since 3.10.0
  81606. */
  81607. boot: function ()
  81608. {
  81609. var game = this.scene.sys.game;
  81610. var settings = this.settings.input;
  81611. var config = game.config;
  81612. this.enabled = GetValue(settings, 'gamepad', config.inputGamepad) && game.device.input.gamepads;
  81613. this.target = GetValue(settings, 'gamepad.target', config.inputGamepadEventTarget);
  81614. this.sceneInputPlugin.pluginEvents.once('destroy', this.destroy, this);
  81615. },
  81616. /**
  81617. * This method is called automatically by the Scene when it is starting up.
  81618. * It is responsible for creating local systems, properties and listening for Scene events.
  81619. * Do not invoke it directly.
  81620. *
  81621. * @method Phaser.Input.Gamepad.GamepadPlugin#start
  81622. * @private
  81623. * @since 3.10.0
  81624. */
  81625. start: function ()
  81626. {
  81627. if (this.enabled)
  81628. {
  81629. this.startListeners();
  81630. }
  81631. this.sceneInputPlugin.pluginEvents.once('shutdown', this.shutdown, this);
  81632. },
  81633. /**
  81634. * Checks to see if both this plugin and the Scene to which it belongs is active.
  81635. *
  81636. * @method Phaser.Input.Gamepad.GamepadPlugin#isActive
  81637. * @since 3.10.0
  81638. *
  81639. * @return {boolean} `true` if the plugin and the Scene it belongs to is active.
  81640. */
  81641. isActive: function ()
  81642. {
  81643. return (this.enabled && this.scene.sys.isActive());
  81644. },
  81645. /**
  81646. * Starts the Gamepad Event listeners running.
  81647. * This is called automatically and does not need to be manually invoked.
  81648. *
  81649. * @method Phaser.Input.Gamepad.GamepadPlugin#startListeners
  81650. * @private
  81651. * @since 3.10.0
  81652. */
  81653. startListeners: function ()
  81654. {
  81655. var _this = this;
  81656. var target = this.target;
  81657. var handler = function (event)
  81658. {
  81659. // console.log(event);
  81660. if (event.defaultPrevented || !_this.isActive())
  81661. {
  81662. // Do nothing if event already handled
  81663. return;
  81664. }
  81665. _this.refreshPads();
  81666. _this.queue.push(event);
  81667. };
  81668. this.onGamepadHandler = handler;
  81669. target.addEventListener('gamepadconnected', handler, false);
  81670. target.addEventListener('gamepaddisconnected', handler, false);
  81671. // FF also supports gamepadbuttondown, gamepadbuttonup and gamepadaxismove but
  81672. // nothing else does, and we can get those values via the gamepads anyway, so we will
  81673. // until more browsers support this
  81674. // Finally, listen for an update event from the Input Plugin
  81675. this.sceneInputPlugin.pluginEvents.on('update', this.update, this);
  81676. },
  81677. /**
  81678. * Stops the Gamepad Event listeners.
  81679. * This is called automatically and does not need to be manually invoked.
  81680. *
  81681. * @method Phaser.Input.Gamepad.GamepadPlugin#stopListeners
  81682. * @private
  81683. * @since 3.10.0
  81684. */
  81685. stopListeners: function ()
  81686. {
  81687. this.target.removeEventListener('gamepadconnected', this.onGamepadHandler);
  81688. this.target.removeEventListener('gamepaddisconnected', this.onGamepadHandler);
  81689. this.sceneInputPlugin.pluginEvents.off('update', this.update);
  81690. },
  81691. /**
  81692. * Disconnects all current Gamepads.
  81693. *
  81694. * @method Phaser.Input.Gamepad.GamepadPlugin#disconnectAll
  81695. * @since 3.10.0
  81696. */
  81697. disconnectAll: function ()
  81698. {
  81699. for (var i = 0; i < this.gamepads.length; i++)
  81700. {
  81701. this.gamepads.connected = false;
  81702. }
  81703. },
  81704. /**
  81705. * Refreshes the list of connected Gamepads.
  81706. *
  81707. * This is called automatically when a gamepad is connected or disconnected,
  81708. * and during the update loop.
  81709. *
  81710. * @method Phaser.Input.Gamepad.GamepadPlugin#refreshPads
  81711. * @private
  81712. * @since 3.10.0
  81713. */
  81714. refreshPads: function ()
  81715. {
  81716. var connectedPads = navigator.getGamepads();
  81717. if (!connectedPads)
  81718. {
  81719. this.disconnectAll();
  81720. }
  81721. else
  81722. {
  81723. var currentPads = this.gamepads;
  81724. for (var i = 0; i < connectedPads.length; i++)
  81725. {
  81726. var livePad = connectedPads[i];
  81727. // Because sometimes they're null (yes, really)
  81728. if (!livePad)
  81729. {
  81730. continue;
  81731. }
  81732. var id = livePad.id;
  81733. var index = livePad.index;
  81734. var currentPad = currentPads[index];
  81735. if (!currentPad)
  81736. {
  81737. // A new Gamepad, not currently stored locally
  81738. var newPad = new Gamepad(this, livePad);
  81739. currentPads[index] = newPad;
  81740. if (!this._pad1)
  81741. {
  81742. this._pad1 = newPad;
  81743. }
  81744. else if (!this._pad2)
  81745. {
  81746. this._pad2 = newPad;
  81747. }
  81748. else if (!this._pad3)
  81749. {
  81750. this._pad3 = newPad;
  81751. }
  81752. else if (!this._pad4)
  81753. {
  81754. this._pad4 = newPad;
  81755. }
  81756. }
  81757. else if (currentPad.id !== id)
  81758. {
  81759. // A new Gamepad with a different vendor string, but it has got the same index as an old one
  81760. currentPad.destroy();
  81761. currentPads[index] = new Gamepad(this, livePad);
  81762. }
  81763. else
  81764. {
  81765. // If neither of these, it's a pad we've already got, so update it
  81766. currentPad.update(livePad);
  81767. }
  81768. }
  81769. }
  81770. },
  81771. /**
  81772. * Returns an array of all currently connected Gamepads.
  81773. *
  81774. * @method Phaser.Input.Gamepad.GamepadPlugin#getAll
  81775. * @since 3.10.0
  81776. *
  81777. * @return {Phaser.Input.Gamepad.Gamepad[]} An array of all currently connected Gamepads.
  81778. */
  81779. getAll: function ()
  81780. {
  81781. var out = [];
  81782. var pads = this.gamepads;
  81783. for (var i = 0; i < pads.length; i++)
  81784. {
  81785. if (pads[i])
  81786. {
  81787. out.push(pads[i]);
  81788. }
  81789. }
  81790. return out;
  81791. },
  81792. /**
  81793. * Looks-up a single Gamepad based on the given index value.
  81794. *
  81795. * @method Phaser.Input.Gamepad.GamepadPlugin#getPad
  81796. * @since 3.10.0
  81797. *
  81798. * @param {number} index - The index of the Gamepad to get.
  81799. *
  81800. * @return {Phaser.Input.Gamepad.Gamepad} The Gamepad matching the given index, or undefined if none were found.
  81801. */
  81802. getPad: function (index)
  81803. {
  81804. var pads = this.gamepads;
  81805. for (var i = 0; i < pads.length; i++)
  81806. {
  81807. if (pads[i] && pads[i].index === index)
  81808. {
  81809. return pads[i];
  81810. }
  81811. }
  81812. },
  81813. /**
  81814. * The internal update loop. Refreshes all connected gamepads and processes their events.
  81815. *
  81816. * Called automatically by the Input Manager, invoked from the Game step.
  81817. *
  81818. * @method Phaser.Input.Gamepad.GamepadPlugin#update
  81819. * @private
  81820. * @since 3.10.0
  81821. */
  81822. update: function ()
  81823. {
  81824. if (!this.enabled)
  81825. {
  81826. return;
  81827. }
  81828. this.refreshPads();
  81829. var len = this.queue.length;
  81830. if (len === 0)
  81831. {
  81832. return;
  81833. }
  81834. var queue = this.queue.splice(0, len);
  81835. // Process the event queue, dispatching all of the events that have stored up
  81836. for (var i = 0; i < len; i++)
  81837. {
  81838. var event = queue[i];
  81839. var pad = this.getPad(event.gamepad.index);
  81840. if (event.type === 'gamepadconnected')
  81841. {
  81842. this.emit('connected', pad, event);
  81843. }
  81844. else if (event.type === 'gamepaddisconnected')
  81845. {
  81846. this.emit('disconnected', pad, event);
  81847. }
  81848. }
  81849. },
  81850. /**
  81851. * Shuts the Gamepad Plugin down.
  81852. * All this does is remove any listeners bound to it.
  81853. *
  81854. * @method Phaser.Input.Gamepad.GamepadPlugin#shutdown
  81855. * @private
  81856. * @since 3.10.0
  81857. */
  81858. shutdown: function ()
  81859. {
  81860. this.stopListeners();
  81861. this.disconnectAll();
  81862. this.removeAllListeners();
  81863. },
  81864. /**
  81865. * Destroys this Gamepad Plugin, disconnecting all Gamepads and releasing internal references.
  81866. *
  81867. * @method Phaser.Input.Gamepad.GamepadPlugin#destroy
  81868. * @private
  81869. * @since 3.10.0
  81870. */
  81871. destroy: function ()
  81872. {
  81873. this.shutdown();
  81874. for (var i = 0; i < this.gamepads.length; i++)
  81875. {
  81876. if (this.gamepads[i])
  81877. {
  81878. this.gamepads[i].destroy();
  81879. }
  81880. }
  81881. this.gamepads = [];
  81882. this.scene = null;
  81883. this.settings = null;
  81884. this.sceneInputPlugin = null;
  81885. this.target = null;
  81886. },
  81887. /**
  81888. * The total number of connected game pads.
  81889. *
  81890. * @name Phaser.Input.Gamepad.GamepadPlugin#total
  81891. * @type {integer}
  81892. * @since 3.10.0
  81893. */
  81894. total: {
  81895. get: function ()
  81896. {
  81897. return this.gamepads.length;
  81898. }
  81899. },
  81900. /**
  81901. * A reference to the first connected Gamepad.
  81902. *
  81903. * This will be undefined if either no pads are connected, or the browser
  81904. * has not yet issued a gamepadconnect, which can happen even if a Gamepad
  81905. * is plugged in, but hasn't yet had any buttons pressed on it.
  81906. *
  81907. * @name Phaser.Input.Gamepad.GamepadPlugin#pad1
  81908. * @type {Phaser.Input.Gamepad.Gamepad}
  81909. * @since 3.10.0
  81910. */
  81911. pad1: {
  81912. get: function ()
  81913. {
  81914. return this._pad1;
  81915. }
  81916. },
  81917. /**
  81918. * A reference to the second connected Gamepad.
  81919. *
  81920. * This will be undefined if either no pads are connected, or the browser
  81921. * has not yet issued a gamepadconnect, which can happen even if a Gamepad
  81922. * is plugged in, but hasn't yet had any buttons pressed on it.
  81923. *
  81924. * @name Phaser.Input.Gamepad.GamepadPlugin#pad2
  81925. * @type {Phaser.Input.Gamepad.Gamepad}
  81926. * @since 3.10.0
  81927. */
  81928. pad2: {
  81929. get: function ()
  81930. {
  81931. return this._pad2;
  81932. }
  81933. },
  81934. /**
  81935. * A reference to the third connected Gamepad.
  81936. *
  81937. * This will be undefined if either no pads are connected, or the browser
  81938. * has not yet issued a gamepadconnect, which can happen even if a Gamepad
  81939. * is plugged in, but hasn't yet had any buttons pressed on it.
  81940. *
  81941. * @name Phaser.Input.Gamepad.GamepadPlugin#pad3
  81942. * @type {Phaser.Input.Gamepad.Gamepad}
  81943. * @since 3.10.0
  81944. */
  81945. pad3: {
  81946. get: function ()
  81947. {
  81948. return this._pad3;
  81949. }
  81950. },
  81951. /**
  81952. * A reference to the fourth connected Gamepad.
  81953. *
  81954. * This will be undefined if either no pads are connected, or the browser
  81955. * has not yet issued a gamepadconnect, which can happen even if a Gamepad
  81956. * is plugged in, but hasn't yet had any buttons pressed on it.
  81957. *
  81958. * @name Phaser.Input.Gamepad.GamepadPlugin#pad4
  81959. * @type {Phaser.Input.Gamepad.Gamepad}
  81960. * @since 3.10.0
  81961. */
  81962. pad4: {
  81963. get: function ()
  81964. {
  81965. return this._pad4;
  81966. }
  81967. }
  81968. });
  81969. /**
  81970. * An instance of the Gamepad Plugin class, if enabled via the `input.gamepad` Scene or Game Config property.
  81971. * Use this to create access Gamepads connected to the browser and respond to gamepad buttons.
  81972. *
  81973. * @name Phaser.Input.InputPlugin#gamepad
  81974. * @type {?Phaser.Input.Gamepad.GamepadPlugin}
  81975. * @since 3.10.0
  81976. */
  81977. InputPluginCache.register('GamepadPlugin', GamepadPlugin, 'gamepad', 'gamepad', 'inputGamepad');
  81978. module.exports = GamepadPlugin;
  81979. /***/ }),
  81980. /* 388 */
  81981. /***/ (function(module, exports, __webpack_require__) {
  81982. /**
  81983. * @author Richard Davey <rich@photonstorm.com>
  81984. * @copyright 2018 Photon Storm Ltd.
  81985. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  81986. */
  81987. /**
  81988. * @namespace Phaser.Input.Gamepad
  81989. */
  81990. module.exports = {
  81991. Axis: __webpack_require__(179),
  81992. Button: __webpack_require__(178),
  81993. Gamepad: __webpack_require__(177),
  81994. GamepadPlugin: __webpack_require__(387),
  81995. Configs: __webpack_require__(386)
  81996. };
  81997. /***/ }),
  81998. /* 389 */
  81999. /***/ (function(module, exports, __webpack_require__) {
  82000. /**
  82001. * @author Richard Davey <rich@photonstorm.com>
  82002. * @copyright 2018 Photon Storm Ltd.
  82003. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82004. */
  82005. var CONST = __webpack_require__(205);
  82006. var Extend = __webpack_require__(16);
  82007. /**
  82008. * @namespace Phaser.Input
  82009. */
  82010. var Input = {
  82011. CreateInteractiveObject: __webpack_require__(180),
  82012. Gamepad: __webpack_require__(388),
  82013. InputManager: __webpack_require__(206),
  82014. InputPlugin: __webpack_require__(382),
  82015. InputPluginCache: __webpack_require__(75),
  82016. Keyboard: __webpack_require__(380),
  82017. Mouse: __webpack_require__(368),
  82018. Pointer: __webpack_require__(203),
  82019. Touch: __webpack_require__(367)
  82020. };
  82021. // Merge in the consts
  82022. Input = Extend(false, Input, CONST);
  82023. module.exports = Input;
  82024. /***/ }),
  82025. /* 390 */
  82026. /***/ (function(module, exports, __webpack_require__) {
  82027. /**
  82028. * @author Richard Davey <rich@photonstorm.com>
  82029. * @copyright 2018 Photon Storm Ltd.
  82030. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82031. */
  82032. var Point = __webpack_require__(5);
  82033. // The three angle bisectors of a triangle meet in one point called the incenter.
  82034. // It is the center of the incircle, the circle inscribed in the triangle.
  82035. function getLength (x1, y1, x2, y2)
  82036. {
  82037. var x = x1 - x2;
  82038. var y = y1 - y2;
  82039. var magnitude = (x * x) + (y * y);
  82040. return Math.sqrt(magnitude);
  82041. }
  82042. /**
  82043. * [description]
  82044. *
  82045. * @function Phaser.Geom.Triangle.InCenter
  82046. * @since 3.0.0
  82047. *
  82048. * @generic {Phaser.Geom.Point} O - [out,$return]
  82049. *
  82050. * @param {Phaser.Geom.Triangle} triangle - [description]
  82051. * @param {Phaser.Geom.Point} [out] - [description]
  82052. *
  82053. * @return {Phaser.Geom.Point} [description]
  82054. */
  82055. var InCenter = function (triangle, out)
  82056. {
  82057. if (out === undefined) { out = new Point(); }
  82058. var x1 = triangle.x1;
  82059. var y1 = triangle.y1;
  82060. var x2 = triangle.x2;
  82061. var y2 = triangle.y2;
  82062. var x3 = triangle.x3;
  82063. var y3 = triangle.y3;
  82064. var d1 = getLength(x3, y3, x2, y2);
  82065. var d2 = getLength(x1, y1, x3, y3);
  82066. var d3 = getLength(x2, y2, x1, y1);
  82067. var p = d1 + d2 + d3;
  82068. out.x = (x1 * d1 + x2 * d2 + x3 * d3) / p;
  82069. out.y = (y1 * d1 + y2 * d2 + y3 * d3) / p;
  82070. return out;
  82071. };
  82072. module.exports = InCenter;
  82073. /***/ }),
  82074. /* 391 */
  82075. /***/ (function(module, exports) {
  82076. /**
  82077. * @author Richard Davey <rich@photonstorm.com>
  82078. * @copyright 2018 Photon Storm Ltd.
  82079. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82080. */
  82081. /**
  82082. * [description]
  82083. *
  82084. * @function Phaser.Geom.Triangle.Offset
  82085. * @since 3.0.0
  82086. *
  82087. * @generic {Phaser.Geom.Triangle} O - [triangle,$return]
  82088. *
  82089. * @param {Phaser.Geom.Triangle} triangle - [description]
  82090. * @param {number} x - [description]
  82091. * @param {number} y - [description]
  82092. *
  82093. * @return {Phaser.Geom.Triangle} [description]
  82094. */
  82095. var Offset = function (triangle, x, y)
  82096. {
  82097. triangle.x1 += x;
  82098. triangle.y1 += y;
  82099. triangle.x2 += x;
  82100. triangle.y2 += y;
  82101. triangle.x3 += x;
  82102. triangle.y3 += y;
  82103. return triangle;
  82104. };
  82105. module.exports = Offset;
  82106. /***/ }),
  82107. /* 392 */
  82108. /***/ (function(module, exports, __webpack_require__) {
  82109. /**
  82110. * @author Richard Davey <rich@photonstorm.com>
  82111. * @copyright 2018 Photon Storm Ltd.
  82112. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82113. */
  82114. var Point = __webpack_require__(5);
  82115. // The three medians (the lines drawn from the vertices to the bisectors of the opposite sides)
  82116. // meet in the centroid or center of mass (center of gravity).
  82117. // The centroid divides each median in a ratio of 2:1
  82118. /**
  82119. * [description]
  82120. *
  82121. * @function Phaser.Geom.Triangle.Centroid
  82122. * @since 3.0.0
  82123. *
  82124. * @generic {Phaser.Geom.Point} O - [out,$return]
  82125. *
  82126. * @param {Phaser.Geom.Triangle} triangle - [description]
  82127. * @param {(Phaser.Geom.Point|object)} [out] - [description]
  82128. *
  82129. * @return {(Phaser.Geom.Point|object)} [description]
  82130. */
  82131. var Centroid = function (triangle, out)
  82132. {
  82133. if (out === undefined) { out = new Point(); }
  82134. out.x = (triangle.x1 + triangle.x2 + triangle.x3) / 3;
  82135. out.y = (triangle.y1 + triangle.y2 + triangle.y3) / 3;
  82136. return out;
  82137. };
  82138. module.exports = Centroid;
  82139. /***/ }),
  82140. /* 393 */
  82141. /***/ (function(module, exports) {
  82142. /**
  82143. * @author Richard Davey <rich@photonstorm.com>
  82144. * @copyright 2018 Photon Storm Ltd.
  82145. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82146. */
  82147. // Checks if rectB is fully contained within rectA
  82148. /**
  82149. * [description]
  82150. *
  82151. * @function Phaser.Geom.Rectangle.ContainsRect
  82152. * @since 3.0.0
  82153. *
  82154. * @param {Phaser.Geom.Rectangle} rectA - [description]
  82155. * @param {Phaser.Geom.Rectangle} rectB - [description]
  82156. *
  82157. * @return {boolean} [description]
  82158. */
  82159. var ContainsRect = function (rectA, rectB)
  82160. {
  82161. // Volume check (if rectB volume > rectA then rectA cannot contain it)
  82162. if ((rectB.width * rectB.height) > (rectA.width * rectA.height))
  82163. {
  82164. return false;
  82165. }
  82166. return (
  82167. (rectB.x > rectA.x && rectB.x < rectA.right) &&
  82168. (rectB.right > rectA.x && rectB.right < rectA.right) &&
  82169. (rectB.y > rectA.y && rectB.y < rectA.bottom) &&
  82170. (rectB.bottom > rectA.y && rectB.bottom < rectA.bottom)
  82171. );
  82172. };
  82173. module.exports = ContainsRect;
  82174. /***/ }),
  82175. /* 394 */
  82176. /***/ (function(module, exports, __webpack_require__) {
  82177. /**
  82178. * @author Richard Davey <rich@photonstorm.com>
  82179. * @copyright 2018 Photon Storm Ltd.
  82180. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82181. */
  82182. var Rectangle = __webpack_require__(13);
  82183. Rectangle.Area = __webpack_require__(800);
  82184. Rectangle.Ceil = __webpack_require__(799);
  82185. Rectangle.CeilAll = __webpack_require__(798);
  82186. Rectangle.CenterOn = __webpack_require__(156);
  82187. Rectangle.Clone = __webpack_require__(797);
  82188. Rectangle.Contains = __webpack_require__(31);
  82189. Rectangle.ContainsPoint = __webpack_require__(796);
  82190. Rectangle.ContainsRect = __webpack_require__(393);
  82191. Rectangle.CopyFrom = __webpack_require__(795);
  82192. Rectangle.Decompose = __webpack_require__(400);
  82193. Rectangle.Equals = __webpack_require__(794);
  82194. Rectangle.FitInside = __webpack_require__(793);
  82195. Rectangle.FitOutside = __webpack_require__(792);
  82196. Rectangle.Floor = __webpack_require__(791);
  82197. Rectangle.FloorAll = __webpack_require__(790);
  82198. Rectangle.FromPoints = __webpack_require__(268);
  82199. Rectangle.GetAspectRatio = __webpack_require__(233);
  82200. Rectangle.GetCenter = __webpack_require__(789);
  82201. Rectangle.GetPoint = __webpack_require__(136);
  82202. Rectangle.GetPoints = __webpack_require__(299);
  82203. Rectangle.GetSize = __webpack_require__(788);
  82204. Rectangle.Inflate = __webpack_require__(787);
  82205. Rectangle.Intersection = __webpack_require__(786);
  82206. Rectangle.MarchingAnts = __webpack_require__(574);
  82207. Rectangle.MergePoints = __webpack_require__(785);
  82208. Rectangle.MergeRect = __webpack_require__(784);
  82209. Rectangle.MergeXY = __webpack_require__(783);
  82210. Rectangle.Offset = __webpack_require__(782);
  82211. Rectangle.OffsetPoint = __webpack_require__(781);
  82212. Rectangle.Overlaps = __webpack_require__(780);
  82213. Rectangle.Perimeter = __webpack_require__(97);
  82214. Rectangle.PerimeterPoint = __webpack_require__(779);
  82215. Rectangle.Random = __webpack_require__(159);
  82216. Rectangle.RandomOutside = __webpack_require__(778);
  82217. Rectangle.Scale = __webpack_require__(777);
  82218. Rectangle.Union = __webpack_require__(444);
  82219. module.exports = Rectangle;
  82220. /***/ }),
  82221. /* 395 */
  82222. /***/ (function(module, exports, __webpack_require__) {
  82223. /**
  82224. * @author Richard Davey <rich@photonstorm.com>
  82225. * @copyright 2018 Photon Storm Ltd.
  82226. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82227. */
  82228. var Class = __webpack_require__(0);
  82229. var Contains = __webpack_require__(234);
  82230. /**
  82231. * @classdesc
  82232. * [description]
  82233. *
  82234. * @class Polygon
  82235. * @memberOf Phaser.Geom
  82236. * @constructor
  82237. * @since 3.0.0
  82238. *
  82239. * @param {Phaser.Geom.Point[]} [points] - [description]
  82240. */
  82241. var Polygon = new Class({
  82242. initialize:
  82243. function Polygon (points)
  82244. {
  82245. /**
  82246. * The area of this Polygon.
  82247. *
  82248. * @name Phaser.Geom.Polygon#area
  82249. * @type {number}
  82250. * @default 0
  82251. * @since 3.0.0
  82252. */
  82253. this.area = 0;
  82254. /**
  82255. * An array of number pair objects that make up this polygon. I.e. [ {x,y}, {x,y}, {x,y} ]
  82256. *
  82257. * @name Phaser.Geom.Polygon#points
  82258. * @type {Phaser.Geom.Point[]}
  82259. * @since 3.0.0
  82260. */
  82261. this.points = [];
  82262. if (points)
  82263. {
  82264. this.setTo(points);
  82265. }
  82266. },
  82267. /**
  82268. * [description]
  82269. *
  82270. * @method Phaser.Geom.Polygon#contains
  82271. * @since 3.0.0
  82272. *
  82273. * @param {number} x - [description]
  82274. * @param {number} y - [description]
  82275. *
  82276. * @return {boolean} [description]
  82277. */
  82278. contains: function (x, y)
  82279. {
  82280. return Contains(this, x, y);
  82281. },
  82282. /**
  82283. * Sets this Polygon to the given points.
  82284. *
  82285. * The points can be set from a variety of formats:
  82286. *
  82287. * - An array of Point objects: `[new Phaser.Point(x1, y1), ...]`
  82288. * - An array of objects with public x/y properties: `[obj1, obj2, ...]`
  82289. * - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]`
  82290. * - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]`
  82291. *
  82292. * `setTo` may also be called without any arguments to remove all points.
  82293. *
  82294. * @method Phaser.Geom.Polygon#setTo
  82295. * @since 3.0.0
  82296. *
  82297. * @param {array} points - [description]
  82298. *
  82299. * @return {Phaser.Geom.Polygon} This Polygon object.
  82300. */
  82301. setTo: function (points)
  82302. {
  82303. this.area = 0;
  82304. this.points = [];
  82305. if (!Array.isArray(points))
  82306. {
  82307. return this;
  82308. }
  82309. var p;
  82310. var y0 = Number.MAX_VALUE;
  82311. // The points argument is an array, so iterate through it
  82312. for (var i = 0; i < points.length; i++)
  82313. {
  82314. p = { x: 0, y: 0 };
  82315. if (typeof points[i] === 'number')
  82316. {
  82317. p.x = points[i];
  82318. p.y = points[i + 1];
  82319. i++;
  82320. }
  82321. else if (Array.isArray(points[i]))
  82322. {
  82323. // An array of arrays?
  82324. p.x = points[i][0];
  82325. p.y = points[i][1];
  82326. }
  82327. else
  82328. {
  82329. p.x = points[i].x;
  82330. p.y = points[i].y;
  82331. }
  82332. this.points.push(p);
  82333. // Lowest boundary
  82334. if (p.y < y0)
  82335. {
  82336. y0 = p.y;
  82337. }
  82338. }
  82339. this.calculateArea(y0);
  82340. return this;
  82341. },
  82342. /**
  82343. * Calculates the area of the Polygon. This is available in the property Polygon.area
  82344. *
  82345. * @method Phaser.Geom.Polygon#calculateArea
  82346. * @since 3.0.0
  82347. *
  82348. * @return {number} [description]
  82349. */
  82350. calculateArea: function ()
  82351. {
  82352. if (this.points.length < 3)
  82353. {
  82354. this.area = 0;
  82355. return this.area;
  82356. }
  82357. var sum = 0;
  82358. var p1;
  82359. var p2;
  82360. for (var i = 0; i < this.points.length - 1; i++)
  82361. {
  82362. p1 = this.points[i];
  82363. p2 = this.points[i + 1];
  82364. sum += (p2.x - p1.x) * (p1.y + p2.y);
  82365. }
  82366. p1 = this.points[0];
  82367. p2 = this.points[this.points.length - 1];
  82368. sum += (p1.x - p2.x) * (p2.y + p1.y);
  82369. this.area = -sum * 0.5;
  82370. return this.area;
  82371. }
  82372. });
  82373. module.exports = Polygon;
  82374. /***/ }),
  82375. /* 396 */
  82376. /***/ (function(module, exports) {
  82377. /**
  82378. * @author Richard Davey <rich@photonstorm.com>
  82379. * @copyright 2018 Photon Storm Ltd.
  82380. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82381. */
  82382. /**
  82383. * [description]
  82384. *
  82385. * @function Phaser.Geom.Point.GetMagnitudeSq
  82386. * @since 3.0.0
  82387. *
  82388. * @param {Phaser.Geom.Point} point - [description]
  82389. *
  82390. * @return {number} [description]
  82391. */
  82392. var GetMagnitudeSq = function (point)
  82393. {
  82394. return (point.x * point.x) + (point.y * point.y);
  82395. };
  82396. module.exports = GetMagnitudeSq;
  82397. /***/ }),
  82398. /* 397 */
  82399. /***/ (function(module, exports) {
  82400. /**
  82401. * @author Richard Davey <rich@photonstorm.com>
  82402. * @copyright 2018 Photon Storm Ltd.
  82403. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82404. */
  82405. /**
  82406. * [description]
  82407. *
  82408. * @function Phaser.Geom.Point.GetMagnitude
  82409. * @since 3.0.0
  82410. *
  82411. * @param {Phaser.Geom.Point} point - [description]
  82412. *
  82413. * @return {number} [description]
  82414. */
  82415. var GetMagnitude = function (point)
  82416. {
  82417. return Math.sqrt((point.x * point.x) + (point.y * point.y));
  82418. };
  82419. module.exports = GetMagnitude;
  82420. /***/ }),
  82421. /* 398 */
  82422. /***/ (function(module, exports, __webpack_require__) {
  82423. /**
  82424. * @author Richard Davey <rich@photonstorm.com>
  82425. * @copyright 2018 Photon Storm Ltd.
  82426. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82427. */
  82428. var MATH_CONST = __webpack_require__(15);
  82429. var Wrap = __webpack_require__(40);
  82430. var Angle = __webpack_require__(82);
  82431. /**
  82432. * Get the angle of the normal of the given line in radians.
  82433. *
  82434. * @function Phaser.Geom.Line.NormalAngle
  82435. * @since 3.0.0
  82436. *
  82437. * @param {Phaser.Geom.Line} line - The line to calculate the angle of the normal of.
  82438. *
  82439. * @return {number} The angle of the normal of the line in radians.
  82440. */
  82441. var NormalAngle = function (line)
  82442. {
  82443. var angle = Angle(line) - MATH_CONST.TAU;
  82444. return Wrap(angle, -Math.PI, Math.PI);
  82445. };
  82446. module.exports = NormalAngle;
  82447. /***/ }),
  82448. /* 399 */
  82449. /***/ (function(module, exports) {
  82450. /**
  82451. * @author Richard Davey <rich@photonstorm.com>
  82452. * @copyright 2018 Photon Storm Ltd.
  82453. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82454. */
  82455. /**
  82456. * [description]
  82457. *
  82458. * @function Phaser.Geom.Triangle.Decompose
  82459. * @since 3.0.0
  82460. *
  82461. * @param {Phaser.Geom.Triangle} triangle - [description]
  82462. * @param {array} [out] - [description]
  82463. *
  82464. * @return {array} [description]
  82465. */
  82466. var Decompose = function (triangle, out)
  82467. {
  82468. if (out === undefined) { out = []; }
  82469. out.push({ x: triangle.x1, y: triangle.y1 });
  82470. out.push({ x: triangle.x2, y: triangle.y2 });
  82471. out.push({ x: triangle.x3, y: triangle.y3 });
  82472. return out;
  82473. };
  82474. module.exports = Decompose;
  82475. /***/ }),
  82476. /* 400 */
  82477. /***/ (function(module, exports) {
  82478. /**
  82479. * @author Richard Davey <rich@photonstorm.com>
  82480. * @copyright 2018 Photon Storm Ltd.
  82481. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82482. */
  82483. /**
  82484. * [description]
  82485. *
  82486. * @function Phaser.Geom.Rectangle.Decompose
  82487. * @since 3.0.0
  82488. *
  82489. * @param {Phaser.Geom.Rectangle} rect - [description]
  82490. * @param {array} [out] - [description]
  82491. *
  82492. * @return {array} [description]
  82493. */
  82494. var Decompose = function (rect, out)
  82495. {
  82496. if (out === undefined) { out = []; }
  82497. out.push({ x: rect.x, y: rect.y });
  82498. out.push({ x: rect.right, y: rect.y });
  82499. out.push({ x: rect.right, y: rect.bottom });
  82500. out.push({ x: rect.x, y: rect.bottom });
  82501. return out;
  82502. };
  82503. module.exports = Decompose;
  82504. /***/ }),
  82505. /* 401 */
  82506. /***/ (function(module, exports) {
  82507. /**
  82508. * @author Richard Davey <rich@photonstorm.com>
  82509. * @copyright 2018 Photon Storm Ltd.
  82510. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82511. */
  82512. /**
  82513. * [description]
  82514. *
  82515. * @function Phaser.Geom.Intersects.PointToLine
  82516. * @since 3.0.0
  82517. *
  82518. * @param {Phaser.Geom.Point} point - [description]
  82519. * @param {Phaser.Geom.Line} line - [description]
  82520. *
  82521. * @return {boolean} [description]
  82522. */
  82523. var PointToLine = function (point, line)
  82524. {
  82525. return ((point.x - line.x1) * (line.y2 - line.y1) === (line.x2 - line.x1) * (point.y - line.y1));
  82526. };
  82527. module.exports = PointToLine;
  82528. /***/ }),
  82529. /* 402 */
  82530. /***/ (function(module, exports, __webpack_require__) {
  82531. /**
  82532. * @author Richard Davey <rich@photonstorm.com>
  82533. * @copyright 2018 Photon Storm Ltd.
  82534. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82535. */
  82536. // Based on code by Matt DesLauriers
  82537. // https://github.com/mattdesl/line-circle-collision/blob/master/LICENSE.md
  82538. var Contains = __webpack_require__(33);
  82539. var Point = __webpack_require__(5);
  82540. var tmp = new Point();
  82541. /**
  82542. * [description]
  82543. *
  82544. * @function Phaser.Geom.Intersects.LineToCircle
  82545. * @since 3.0.0
  82546. *
  82547. * @param {Phaser.Geom.Line} line - [description]
  82548. * @param {Phaser.Geom.Circle} circle - [description]
  82549. * @param {Phaser.Geom.Point} [nearest] - [description]
  82550. *
  82551. * @return {boolean} [description]
  82552. */
  82553. var LineToCircle = function (line, circle, nearest)
  82554. {
  82555. if (nearest === undefined) { nearest = tmp; }
  82556. if (Contains(circle, line.x1, line.y1))
  82557. {
  82558. nearest.x = line.x1;
  82559. nearest.y = line.y1;
  82560. return true;
  82561. }
  82562. if (Contains(circle, line.x2, line.y2))
  82563. {
  82564. nearest.x = line.x2;
  82565. nearest.y = line.y2;
  82566. return true;
  82567. }
  82568. var dx = line.x2 - line.x1;
  82569. var dy = line.y2 - line.y1;
  82570. var lcx = circle.x - line.x1;
  82571. var lcy = circle.y - line.y1;
  82572. // project lc onto d, resulting in vector p
  82573. var dLen2 = (dx * dx) + (dy * dy);
  82574. var px = dx;
  82575. var py = dy;
  82576. if (dLen2 > 0)
  82577. {
  82578. var dp = ((lcx * dx) + (lcy * dy)) / dLen2;
  82579. px *= dp;
  82580. py *= dp;
  82581. }
  82582. nearest.x = line.x1 + px;
  82583. nearest.y = line.y1 + py;
  82584. // len2 of p
  82585. var pLen2 = (px * px) + (py * py);
  82586. return (
  82587. pLen2 <= dLen2 &&
  82588. ((px * dx) + (py * dy)) >= 0 &&
  82589. Contains(circle, nearest.x, nearest.y)
  82590. );
  82591. };
  82592. module.exports = LineToCircle;
  82593. /***/ }),
  82594. /* 403 */
  82595. /***/ (function(module, exports, __webpack_require__) {
  82596. /**
  82597. * @author Richard Davey <rich@photonstorm.com>
  82598. * @copyright 2018 Photon Storm Ltd.
  82599. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82600. */
  82601. /**
  82602. * @namespace Phaser.Geom.Intersects
  82603. */
  82604. module.exports = {
  82605. CircleToCircle: __webpack_require__(847),
  82606. CircleToRectangle: __webpack_require__(846),
  82607. GetRectangleIntersection: __webpack_require__(845),
  82608. LineToCircle: __webpack_require__(402),
  82609. LineToLine: __webpack_require__(146),
  82610. LineToRectangle: __webpack_require__(844),
  82611. PointToLine: __webpack_require__(401),
  82612. PointToLineSegment: __webpack_require__(843),
  82613. RectangleToRectangle: __webpack_require__(237),
  82614. RectangleToTriangle: __webpack_require__(842),
  82615. RectangleToValues: __webpack_require__(841),
  82616. TriangleToCircle: __webpack_require__(840),
  82617. TriangleToLine: __webpack_require__(839),
  82618. TriangleToTriangle: __webpack_require__(838)
  82619. };
  82620. /***/ }),
  82621. /* 404 */
  82622. /***/ (function(module, exports, __webpack_require__) {
  82623. /**
  82624. * @author Richard Davey <rich@photonstorm.com>
  82625. * @copyright 2018 Photon Storm Ltd.
  82626. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82627. */
  82628. /**
  82629. * @namespace Phaser.Geom
  82630. */
  82631. module.exports = {
  82632. Circle: __webpack_require__(857),
  82633. Ellipse: __webpack_require__(243),
  82634. Intersects: __webpack_require__(403),
  82635. Line: __webpack_require__(837),
  82636. Point: __webpack_require__(819),
  82637. Polygon: __webpack_require__(805),
  82638. Rectangle: __webpack_require__(394),
  82639. Triangle: __webpack_require__(776)
  82640. };
  82641. /***/ }),
  82642. /* 405 */
  82643. /***/ (function(module, exports, __webpack_require__) {
  82644. /**
  82645. * @author Richard Davey <rich@photonstorm.com>
  82646. * @copyright 2018 Photon Storm Ltd.
  82647. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82648. */
  82649. var Class = __webpack_require__(0);
  82650. var Light = __webpack_require__(406);
  82651. var LightPipeline = __webpack_require__(151);
  82652. var Utils = __webpack_require__(21);
  82653. /**
  82654. * @callback LightForEach
  82655. *
  82656. * @param {Phaser.GameObjects.Light} light - The Light.
  82657. */
  82658. /**
  82659. * @classdesc
  82660. * Manages Lights for a Scene.
  82661. *
  82662. * Affects the rendering of Game Objects using the `Light2D` pipeline.
  82663. *
  82664. * @class LightsManager
  82665. * @memberOf Phaser.GameObjects
  82666. * @constructor
  82667. * @since 3.0.0
  82668. */
  82669. var LightsManager = new Class({
  82670. initialize:
  82671. function LightsManager ()
  82672. {
  82673. /**
  82674. * The pool of Lights.
  82675. *
  82676. * Used to recycle removed Lights for a more efficient use of memory.
  82677. *
  82678. * @name Phaser.GameObjects.LightsManager#lightPool
  82679. * @type {Phaser.GameObjects.Light[]}
  82680. * @default []
  82681. * @since 3.0.0
  82682. */
  82683. this.lightPool = [];
  82684. /**
  82685. * The Lights in the Scene.
  82686. *
  82687. * @name Phaser.GameObjects.LightsManager#lights
  82688. * @type {Phaser.GameObjects.Light[]}
  82689. * @default []
  82690. * @since 3.0.0
  82691. */
  82692. this.lights = [];
  82693. /**
  82694. * Lights that have been culled from a Camera's viewport.
  82695. *
  82696. * Lights in this list will not be rendered.
  82697. *
  82698. * @name Phaser.GameObjects.LightsManager#culledLights
  82699. * @type {Phaser.GameObjects.Light[]}
  82700. * @default []
  82701. * @since 3.0.0
  82702. */
  82703. this.culledLights = [];
  82704. /**
  82705. * The ambient color.
  82706. *
  82707. * @name Phaser.GameObjects.LightsManager#ambientColor
  82708. * @type {{ r: number, g: number, b: number }}
  82709. * @since 3.0.0
  82710. */
  82711. this.ambientColor = { r: 0.1, g: 0.1, b: 0.1 };
  82712. /**
  82713. * Whether the Lights Manager is enabled.
  82714. *
  82715. * @name Phaser.GameObjects.LightsManager#active
  82716. * @type {boolean}
  82717. * @default false
  82718. * @since 3.0.0
  82719. */
  82720. this.active = false;
  82721. },
  82722. /**
  82723. * Enable the Lights Manager.
  82724. *
  82725. * @method Phaser.GameObjects.LightsManager#enable
  82726. * @since 3.0.0
  82727. *
  82728. * @return {Phaser.GameObjects.LightsManager} This Lights Manager object.
  82729. */
  82730. enable: function ()
  82731. {
  82732. this.active = true;
  82733. return this;
  82734. },
  82735. /**
  82736. * Disable the Lights Manager.
  82737. *
  82738. * @method Phaser.GameObjects.LightsManager#disable
  82739. * @since 3.0.0
  82740. *
  82741. * @return {Phaser.GameObjects.LightsManager} This Lights Manager object.
  82742. */
  82743. disable: function ()
  82744. {
  82745. this.active = false;
  82746. return this;
  82747. },
  82748. /**
  82749. * Cull any Lights that aren't visible to the given Camera.
  82750. *
  82751. * Culling Lights improves performance by ensuring that only Lights within a Camera's viewport are rendered.
  82752. *
  82753. * @method Phaser.GameObjects.LightsManager#cull
  82754. * @since 3.0.0
  82755. *
  82756. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to cull Lights for.
  82757. *
  82758. * @return {Phaser.GameObjects.Light[]} The culled Lights.
  82759. */
  82760. cull: function (camera)
  82761. {
  82762. var lights = this.lights;
  82763. var culledLights = this.culledLights;
  82764. var length = lights.length;
  82765. var cameraCenterX = camera.x + camera.width / 2.0;
  82766. var cameraCenterY = camera.y + camera.height / 2.0;
  82767. var cameraRadius = (camera.width + camera.height) / 2.0;
  82768. var point = { x: 0, y: 0 };
  82769. var cameraMatrix = camera.matrix;
  82770. var viewportHeight = this.systems.game.config.height;
  82771. culledLights.length = 0;
  82772. for (var index = 0; index < length && culledLights.length < LightPipeline.LIGHT_COUNT; ++index)
  82773. {
  82774. var light = lights[index];
  82775. cameraMatrix.transformPoint(light.x, light.y, point);
  82776. // We'll just use bounding spheres to test
  82777. // if lights should be rendered
  82778. var dx = cameraCenterX - (point.x - (camera.scrollX * light.scrollFactorX * camera.zoom));
  82779. var dy = cameraCenterY - (viewportHeight - (point.y - (camera.scrollY * light.scrollFactorY) * camera.zoom));
  82780. var distance = Math.sqrt(dx * dx + dy * dy);
  82781. if (distance < light.radius + cameraRadius)
  82782. {
  82783. culledLights.push(lights[index]);
  82784. }
  82785. }
  82786. return culledLights;
  82787. },
  82788. /**
  82789. * Iterate over each Light with a callback.
  82790. *
  82791. * @method Phaser.GameObjects.LightsManager#forEachLight
  82792. * @since 3.0.0
  82793. *
  82794. * @param {LightForEach} callback - The callback that is called with each Light.
  82795. *
  82796. * @return {Phaser.GameObjects.LightsManager} This Lights Manager object.
  82797. */
  82798. forEachLight: function (callback)
  82799. {
  82800. if (!callback)
  82801. {
  82802. return;
  82803. }
  82804. var lights = this.lights;
  82805. var length = lights.length;
  82806. for (var index = 0; index < length; ++index)
  82807. {
  82808. callback(lights[index]);
  82809. }
  82810. return this;
  82811. },
  82812. /**
  82813. * Set the ambient light color.
  82814. *
  82815. * @method Phaser.GameObjects.LightsManager#setAmbientColor
  82816. * @since 3.0.0
  82817. *
  82818. * @param {number} rgb - The integer RGB color of the ambient light.
  82819. *
  82820. * @return {Phaser.GameObjects.LightsManager} This Lights Manager object.
  82821. */
  82822. setAmbientColor: function (rgb)
  82823. {
  82824. var color = Utils.getFloatsFromUintRGB(rgb);
  82825. this.ambientColor.r = color[0];
  82826. this.ambientColor.g = color[1];
  82827. this.ambientColor.b = color[2];
  82828. return this;
  82829. },
  82830. /**
  82831. * Returns the maximum number of Lights allowed to appear at once.
  82832. *
  82833. * @method Phaser.GameObjects.LightsManager#getMaxVisibleLights
  82834. * @since 3.0.0
  82835. *
  82836. * @return {integer} The maximum number of Lights allowed to appear at once.
  82837. */
  82838. getMaxVisibleLights: function ()
  82839. {
  82840. return 10;
  82841. },
  82842. /**
  82843. * Get the number of Lights managed by this Lights Manager.
  82844. *
  82845. * @method Phaser.GameObjects.LightsManager#getLightCount
  82846. * @since 3.0.0
  82847. *
  82848. * @return {integer} The number of Lights managed by this Lights Manager.
  82849. */
  82850. getLightCount: function ()
  82851. {
  82852. return this.lights.length;
  82853. },
  82854. /**
  82855. * Add a Light.
  82856. *
  82857. * @method Phaser.GameObjects.LightsManager#addLight
  82858. * @since 3.0.0
  82859. *
  82860. * @param {number} x - The horizontal position of the Light.
  82861. * @param {number} y - The vertical position of the Light.
  82862. * @param {number} radius - The radius of the Light.
  82863. * @param {number} rgb - The integer RGB color of the light.
  82864. * @param {number} intensity - The intensity of the Light.
  82865. *
  82866. * @return {Phaser.GameObjects.Light} The Light that was added.
  82867. */
  82868. addLight: function (x, y, radius, rgb, intensity)
  82869. {
  82870. var color = null;
  82871. var light = null;
  82872. x = (x === undefined) ? 0.0 : x;
  82873. y = (y === undefined) ? 0.0 : y;
  82874. rgb = (rgb === undefined) ? 0xffffff : rgb;
  82875. radius = (radius === undefined) ? 100.0 : radius;
  82876. intensity = (intensity === undefined) ? 1.0 : intensity;
  82877. color = Utils.getFloatsFromUintRGB(rgb);
  82878. light = null;
  82879. if (this.lightPool.length > 0)
  82880. {
  82881. light = this.lightPool.pop();
  82882. light.set(x, y, radius, color[0], color[1], color[2], intensity);
  82883. }
  82884. else
  82885. {
  82886. light = new Light(x, y, radius, color[0], color[1], color[2], intensity);
  82887. }
  82888. this.lights.push(light);
  82889. return light;
  82890. },
  82891. /**
  82892. * Remove a Light.
  82893. *
  82894. * @method Phaser.GameObjects.LightsManager#removeLight
  82895. * @since 3.0.0
  82896. *
  82897. * @param {Phaser.GameObjects.Light} light - The Light to remove.
  82898. *
  82899. * @return {Phaser.GameObjects.LightsManager} This Lights Manager object.
  82900. */
  82901. removeLight: function (light)
  82902. {
  82903. var index = this.lights.indexOf(light);
  82904. if (index >= 0)
  82905. {
  82906. this.lightPool.push(light);
  82907. this.lights.splice(index, 1);
  82908. }
  82909. return this;
  82910. },
  82911. /**
  82912. * Shut down the Lights Manager.
  82913. *
  82914. * Recycles all active Lights into the Light pool, resets ambient light color and clears the lists of Lights and
  82915. * culled Lights.
  82916. *
  82917. * @method Phaser.GameObjects.LightsManager#shutdown
  82918. * @since 3.0.0
  82919. */
  82920. shutdown: function ()
  82921. {
  82922. while (this.lights.length > 0)
  82923. {
  82924. this.lightPool.push(this.lights.pop());
  82925. }
  82926. this.ambientColor = { r: 0.1, g: 0.1, b: 0.1 };
  82927. this.culledLights.length = 0;
  82928. this.lights.length = 0;
  82929. },
  82930. /**
  82931. * Destroy the Lights Manager.
  82932. *
  82933. * Cleans up all references by calling {@link Phaser.GameObjects.LightsManager#shutdown}.
  82934. *
  82935. * @method Phaser.GameObjects.LightsManager#destroy
  82936. * @since 3.0.0
  82937. */
  82938. destroy: function ()
  82939. {
  82940. this.shutdown();
  82941. }
  82942. });
  82943. module.exports = LightsManager;
  82944. /***/ }),
  82945. /* 406 */
  82946. /***/ (function(module, exports, __webpack_require__) {
  82947. /**
  82948. * @author Richard Davey <rich@photonstorm.com>
  82949. * @copyright 2018 Photon Storm Ltd.
  82950. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  82951. */
  82952. var Class = __webpack_require__(0);
  82953. var Utils = __webpack_require__(21);
  82954. /**
  82955. * @classdesc
  82956. * A 2D point light.
  82957. *
  82958. * These are typically created by a {@link Phaser.GameObjects.LightsManager}, available from within a scene via `this.lights`.
  82959. *
  82960. * Any Game Objects using the Light2D pipeline will then be affected by these Lights.
  82961. *
  82962. * They can also simply be used to represent a point light for your own purposes.
  82963. *
  82964. * @class Light
  82965. * @memberOf Phaser.GameObjects
  82966. * @constructor
  82967. * @since 3.0.0
  82968. *
  82969. * @param {number} x - The horizontal position of the light.
  82970. * @param {number} y - The vertical position of the light.
  82971. * @param {number} radius - The radius of the light.
  82972. * @param {number} r - The red color of the light. A value between 0 and 1.
  82973. * @param {number} g - The green color of the light. A value between 0 and 1.
  82974. * @param {number} b - The blue color of the light. A value between 0 and 1.
  82975. * @param {number} intensity - The intensity of the light.
  82976. */
  82977. var Light = new Class({
  82978. initialize:
  82979. function Light (x, y, radius, r, g, b, intensity)
  82980. {
  82981. /**
  82982. * The horizontal position of the light.
  82983. *
  82984. * @name Phaser.GameObjects.Light#x
  82985. * @type {number}
  82986. * @since 3.0.0
  82987. */
  82988. this.x = x;
  82989. /**
  82990. * The vertical position of the light.
  82991. *
  82992. * @name Phaser.GameObjects.Light#y
  82993. * @type {number}
  82994. * @since 3.0.0
  82995. */
  82996. this.y = y;
  82997. /**
  82998. * The radius of the light.
  82999. *
  83000. * @name Phaser.GameObjects.Light#radius
  83001. * @type {number}
  83002. * @since 3.0.0
  83003. */
  83004. this.radius = radius;
  83005. /**
  83006. * The red color of the light. A value between 0 and 1.
  83007. *
  83008. * @name Phaser.GameObjects.Light#r
  83009. * @type {number}
  83010. * @since 3.0.0
  83011. */
  83012. this.r = r;
  83013. /**
  83014. * The green color of the light. A value between 0 and 1.
  83015. *
  83016. * @name Phaser.GameObjects.Light#g
  83017. * @type {number}
  83018. * @since 3.0.0
  83019. */
  83020. this.g = g;
  83021. /**
  83022. * The blue color of the light. A value between 0 and 1.
  83023. *
  83024. * @name Phaser.GameObjects.Light#b
  83025. * @type {number}
  83026. * @since 3.0.0
  83027. */
  83028. this.b = b;
  83029. /**
  83030. * The intensity of the light.
  83031. *
  83032. * @name Phaser.GameObjects.Light#intensity
  83033. * @type {number}
  83034. * @since 3.0.0
  83035. */
  83036. this.intensity = intensity;
  83037. /**
  83038. * The horizontal scroll factor of the light.
  83039. *
  83040. * @name Phaser.GameObjects.Light#scrollFactorX
  83041. * @type {number}
  83042. * @since 3.0.0
  83043. */
  83044. this.scrollFactorX = 1.0;
  83045. /**
  83046. * The vertical scroll factor of the light.
  83047. *
  83048. * @name Phaser.GameObjects.Light#scrollFactorY
  83049. * @type {number}
  83050. * @since 3.0.0
  83051. */
  83052. this.scrollFactorY = 1.0;
  83053. },
  83054. /**
  83055. * Set the properties of the light.
  83056. *
  83057. * Sets both horizontal and vertical scroll factor to 1. Use {@link Phaser.GameObjects.Light#setScrollFactor} to set
  83058. * the scroll factor.
  83059. *
  83060. * @method Phaser.GameObjects.Light#set
  83061. * @since 3.0.0
  83062. *
  83063. * @param {number} x - The horizontal position of the light.
  83064. * @param {number} y - The vertical position of the light.
  83065. * @param {number} radius - The radius of the light.
  83066. * @param {number} r - The red color. A value between 0 and 1.
  83067. * @param {number} g - The green color. A value between 0 and 1.
  83068. * @param {number} b - The blue color. A value between 0 and 1.
  83069. * @param {number} intensity - The intensity of the light.
  83070. *
  83071. * @return {Phaser.GameObjects.Light} This Light object.
  83072. */
  83073. set: function (x, y, radius, r, g, b, intensity)
  83074. {
  83075. this.x = x;
  83076. this.y = y;
  83077. this.radius = radius;
  83078. this.r = r;
  83079. this.g = g;
  83080. this.b = b;
  83081. this.intensity = intensity;
  83082. this.scrollFactorX = 1;
  83083. this.scrollFactorY = 1;
  83084. return this;
  83085. },
  83086. /**
  83087. * Set the scroll factor of the light.
  83088. *
  83089. * @method Phaser.GameObjects.Light#setScrollFactor
  83090. * @since 3.0.0
  83091. *
  83092. * @param {number} x - The horizontal scroll factor of the light.
  83093. * @param {number} y - The vertical scroll factor of the light.
  83094. *
  83095. * @return {Phaser.GameObjects.Light} This Light object.
  83096. */
  83097. setScrollFactor: function (x, y)
  83098. {
  83099. if (x === undefined) { x = 1; }
  83100. if (y === undefined) { y = x; }
  83101. this.scrollFactorX = x;
  83102. this.scrollFactorY = y;
  83103. return this;
  83104. },
  83105. /**
  83106. * Set the color of the light from a single integer RGB value.
  83107. *
  83108. * @method Phaser.GameObjects.Light#setColor
  83109. * @since 3.0.0
  83110. *
  83111. * @param {number} rgb - The integer RGB color of the light.
  83112. *
  83113. * @return {Phaser.GameObjects.Light} This Light object.
  83114. */
  83115. setColor: function (rgb)
  83116. {
  83117. var color = Utils.getFloatsFromUintRGB(rgb);
  83118. this.r = color[0];
  83119. this.g = color[1];
  83120. this.b = color[2];
  83121. return this;
  83122. },
  83123. /**
  83124. * Set the intensity of the light.
  83125. *
  83126. * @method Phaser.GameObjects.Light#setIntensity
  83127. * @since 3.0.0
  83128. *
  83129. * @param {number} intensity - The intensity of the light.
  83130. *
  83131. * @return {Phaser.GameObjects.Light} This Light object.
  83132. */
  83133. setIntensity: function (intensity)
  83134. {
  83135. this.intensity = intensity;
  83136. return this;
  83137. },
  83138. /**
  83139. * Set the position of the light.
  83140. *
  83141. * @method Phaser.GameObjects.Light#setPosition
  83142. * @since 3.0.0
  83143. *
  83144. * @param {number} x - The horizontal position of the light.
  83145. * @param {number} y - The vertical position of the light.
  83146. *
  83147. * @return {Phaser.GameObjects.Light} This Light object.
  83148. */
  83149. setPosition: function (x, y)
  83150. {
  83151. this.x = x;
  83152. this.y = y;
  83153. return this;
  83154. },
  83155. /**
  83156. * Set the radius of the light.
  83157. *
  83158. * @method Phaser.GameObjects.Light#setRadius
  83159. * @since 3.0.0
  83160. *
  83161. * @param {number} radius - The radius of the light.
  83162. *
  83163. * @return {Phaser.GameObjects.Light} This Light object.
  83164. */
  83165. setRadius: function (radius)
  83166. {
  83167. this.radius = radius;
  83168. return this;
  83169. }
  83170. });
  83171. module.exports = Light;
  83172. /***/ }),
  83173. /* 407 */
  83174. /***/ (function(module, exports, __webpack_require__) {
  83175. /**
  83176. * @author Richard Davey <rich@photonstorm.com>
  83177. * @copyright 2018 Photon Storm Ltd.
  83178. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83179. */
  83180. var BuildGameObject = __webpack_require__(25);
  83181. var GameObjectCreator = __webpack_require__(14);
  83182. var GetAdvancedValue = __webpack_require__(10);
  83183. var Text = __webpack_require__(110);
  83184. /**
  83185. * Creates a new Text Game Object and returns it.
  83186. *
  83187. * Note: This method will only be available if the Text Game Object has been built into Phaser.
  83188. *
  83189. * @method Phaser.GameObjects.GameObjectCreator#text
  83190. * @since 3.0.0
  83191. *
  83192. * @param {object} config - The configuration object this Game Object will use to create itself.
  83193. * @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.
  83194. *
  83195. * @return {Phaser.GameObjects.Text} The Game Object that was created.
  83196. */
  83197. GameObjectCreator.register('text', function (config, addToScene)
  83198. {
  83199. if (config === undefined) { config = {}; }
  83200. // style Object = {
  83201. // font: [ 'font', '16px Courier' ],
  83202. // backgroundColor: [ 'backgroundColor', null ],
  83203. // fill: [ 'fill', '#fff' ],
  83204. // stroke: [ 'stroke', '#fff' ],
  83205. // strokeThickness: [ 'strokeThickness', 0 ],
  83206. // shadowOffsetX: [ 'shadow.offsetX', 0 ],
  83207. // shadowOffsetY: [ 'shadow.offsetY', 0 ],
  83208. // shadowColor: [ 'shadow.color', '#000' ],
  83209. // shadowBlur: [ 'shadow.blur', 0 ],
  83210. // shadowStroke: [ 'shadow.stroke', false ],
  83211. // shadowFill: [ 'shadow.fill', false ],
  83212. // align: [ 'align', 'left' ],
  83213. // maxLines: [ 'maxLines', 0 ],
  83214. // fixedWidth: [ 'fixedWidth', false ],
  83215. // fixedHeight: [ 'fixedHeight', false ],
  83216. // rtl: [ 'rtl', false ]
  83217. // }
  83218. var content = GetAdvancedValue(config, 'text', '');
  83219. var style = GetAdvancedValue(config, 'style', null);
  83220. // Padding
  83221. // { padding: 2 }
  83222. // { padding: { x: , y: }}
  83223. // { padding: { left: , top: }}
  83224. // { padding: { left: , right: , top: , bottom: }}
  83225. var padding = GetAdvancedValue(config, 'padding', null);
  83226. if (padding !== null)
  83227. {
  83228. style.padding = padding;
  83229. }
  83230. var text = new Text(this.scene, 0, 0, content, style);
  83231. if (addToScene !== undefined)
  83232. {
  83233. config.add = addToScene;
  83234. }
  83235. BuildGameObject(this.scene, text, config);
  83236. // Text specific config options:
  83237. text.autoRound = GetAdvancedValue(config, 'autoRound', true);
  83238. text.resolution = GetAdvancedValue(config, 'resolution', 1);
  83239. return text;
  83240. });
  83241. // When registering a factory function 'this' refers to the GameObjectCreator context.
  83242. /***/ }),
  83243. /* 408 */
  83244. /***/ (function(module, exports, __webpack_require__) {
  83245. /**
  83246. * @author Richard Davey <rich@photonstorm.com>
  83247. * @copyright 2018 Photon Storm Ltd.
  83248. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83249. */
  83250. var BuildGameObject = __webpack_require__(25);
  83251. var BuildGameObjectAnimation = __webpack_require__(128);
  83252. var GameObjectCreator = __webpack_require__(14);
  83253. var GetAdvancedValue = __webpack_require__(10);
  83254. var Sprite = __webpack_require__(35);
  83255. /**
  83256. * Creates a new Sprite Game Object and returns it.
  83257. *
  83258. * Note: This method will only be available if the Sprite Game Object has been built into Phaser.
  83259. *
  83260. * @method Phaser.GameObjects.GameObjectCreator#sprite
  83261. * @since 3.0.0
  83262. *
  83263. * @param {object} config - The configuration object this Game Object will use to create itself.
  83264. * @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.
  83265. *
  83266. * @return {Phaser.GameObjects.Sprite} The Game Object that was created.
  83267. */
  83268. GameObjectCreator.register('sprite', function (config, addToScene)
  83269. {
  83270. if (config === undefined) { config = {}; }
  83271. var key = GetAdvancedValue(config, 'key', null);
  83272. var frame = GetAdvancedValue(config, 'frame', null);
  83273. var sprite = new Sprite(this.scene, 0, 0, key, frame);
  83274. if (addToScene !== undefined)
  83275. {
  83276. config.add = addToScene;
  83277. }
  83278. BuildGameObject(this.scene, sprite, config);
  83279. // Sprite specific config options:
  83280. BuildGameObjectAnimation(sprite, config);
  83281. return sprite;
  83282. });
  83283. /***/ }),
  83284. /* 409 */
  83285. /***/ (function(module, exports, __webpack_require__) {
  83286. /**
  83287. * @author Richard Davey <rich@photonstorm.com>
  83288. * @copyright 2018 Photon Storm Ltd.
  83289. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83290. */
  83291. var BuildGameObject = __webpack_require__(25);
  83292. var GameObjectCreator = __webpack_require__(14);
  83293. var GetAdvancedValue = __webpack_require__(10);
  83294. var Image = __webpack_require__(68);
  83295. /**
  83296. * Creates a new Image Game Object and returns it.
  83297. *
  83298. * Note: This method will only be available if the Image Game Object has been built into Phaser.
  83299. *
  83300. * @method Phaser.GameObjects.GameObjectCreator#image
  83301. * @since 3.0.0
  83302. *
  83303. * @param {object} config - The configuration object this Game Object will use to create itself.
  83304. * @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.
  83305. *
  83306. * @return {Phaser.GameObjects.Image} The Game Object that was created.
  83307. */
  83308. GameObjectCreator.register('image', function (config, addToScene)
  83309. {
  83310. if (config === undefined) { config = {}; }
  83311. var key = GetAdvancedValue(config, 'key', null);
  83312. var frame = GetAdvancedValue(config, 'frame', null);
  83313. var image = new Image(this.scene, 0, 0, key, frame);
  83314. if (addToScene !== undefined)
  83315. {
  83316. config.add = addToScene;
  83317. }
  83318. BuildGameObject(this.scene, image, config);
  83319. return image;
  83320. });
  83321. // When registering a factory function 'this' refers to the GameObjectCreator context.
  83322. /***/ }),
  83323. /* 410 */
  83324. /***/ (function(module, exports, __webpack_require__) {
  83325. /**
  83326. * @author Richard Davey <rich@photonstorm.com>
  83327. * @copyright 2018 Photon Storm Ltd.
  83328. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83329. */
  83330. var GameObjectCreator = __webpack_require__(14);
  83331. var Graphics = __webpack_require__(115);
  83332. /**
  83333. * Creates a new Graphics Game Object and returns it.
  83334. *
  83335. * Note: This method will only be available if the Graphics Game Object has been built into Phaser.
  83336. *
  83337. * @method Phaser.GameObjects.GameObjectCreator#graphics
  83338. * @since 3.0.0
  83339. *
  83340. * @param {object} config - The configuration object this Game Object will use to create itself.
  83341. * @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.
  83342. *
  83343. * @return {Phaser.GameObjects.Graphics} The Game Object that was created.
  83344. */
  83345. GameObjectCreator.register('graphics', function (config, addToScene)
  83346. {
  83347. if (config === undefined) { config = {}; }
  83348. if (addToScene !== undefined)
  83349. {
  83350. config.add = addToScene;
  83351. }
  83352. var graphics = new Graphics(this.scene, config);
  83353. if (config.add)
  83354. {
  83355. this.scene.sys.displayList.add(graphics);
  83356. }
  83357. return graphics;
  83358. });
  83359. // When registering a factory function 'this' refers to the GameObjectCreator context.
  83360. /***/ }),
  83361. /* 411 */
  83362. /***/ (function(module, exports, __webpack_require__) {
  83363. /**
  83364. * @author Richard Davey <rich@photonstorm.com>
  83365. * @copyright 2018 Photon Storm Ltd.
  83366. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83367. */
  83368. var Text = __webpack_require__(110);
  83369. var GameObjectFactory = __webpack_require__(11);
  83370. /**
  83371. * Creates a new Text Game Object and adds it to the Scene.
  83372. *
  83373. * Note: This method will only be available if the Text Game Object has been built into Phaser.
  83374. *
  83375. * @method Phaser.GameObjects.GameObjectFactory#text
  83376. * @since 3.0.0
  83377. *
  83378. * @param {number} x - The horizontal position of this Game Object in the world.
  83379. * @param {number} y - The vertical position of this Game Object in the world.
  83380. * @param {(string|string[])} text - The text this Text object will display.
  83381. * @param {object} [style] - The Text style configuration object.
  83382. *
  83383. * @return {Phaser.GameObjects.Text} The Game Object that was created.
  83384. */
  83385. GameObjectFactory.register('text', function (x, y, text, style)
  83386. {
  83387. return this.displayList.add(new Text(this.scene, x, y, text, style));
  83388. });
  83389. // When registering a factory function 'this' refers to the GameObjectFactory context.
  83390. //
  83391. // There are several properties available to use:
  83392. //
  83393. // this.scene - a reference to the Scene that owns the GameObjectFactory
  83394. // this.displayList - a reference to the Display List the Scene owns
  83395. // this.updateList - a reference to the Update List the Scene owns
  83396. /***/ }),
  83397. /* 412 */
  83398. /***/ (function(module, exports, __webpack_require__) {
  83399. /**
  83400. * @author Richard Davey <rich@photonstorm.com>
  83401. * @copyright 2018 Photon Storm Ltd.
  83402. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83403. */
  83404. var GameObjectFactory = __webpack_require__(11);
  83405. var Sprite = __webpack_require__(35);
  83406. /**
  83407. * Creates a new Sprite Game Object and adds it to the Scene.
  83408. *
  83409. * Note: This method will only be available if the Sprite Game Object has been built into Phaser.
  83410. *
  83411. * @method Phaser.GameObjects.GameObjectFactory#sprite
  83412. * @since 3.0.0
  83413. *
  83414. * @param {number} x - The horizontal position of this Game Object in the world.
  83415. * @param {number} y - The vertical position of this Game Object in the world.
  83416. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  83417. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  83418. *
  83419. * @return {Phaser.GameObjects.Sprite} The Game Object that was created.
  83420. */
  83421. GameObjectFactory.register('sprite', function (x, y, key, frame)
  83422. {
  83423. var sprite = new Sprite(this.scene, x, y, key, frame);
  83424. this.displayList.add(sprite);
  83425. this.updateList.add(sprite);
  83426. return sprite;
  83427. });
  83428. // When registering a factory function 'this' refers to the GameObjectFactory context.
  83429. //
  83430. // There are several properties available to use:
  83431. //
  83432. // this.scene - a reference to the Scene that owns the GameObjectFactory
  83433. // this.displayList - a reference to the Display List the Scene owns
  83434. // this.updateList - a reference to the Update List the Scene owns
  83435. /***/ }),
  83436. /* 413 */
  83437. /***/ (function(module, exports, __webpack_require__) {
  83438. /**
  83439. * @author Richard Davey <rich@photonstorm.com>
  83440. * @copyright 2018 Photon Storm Ltd.
  83441. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83442. */
  83443. var Image = __webpack_require__(68);
  83444. var GameObjectFactory = __webpack_require__(11);
  83445. /**
  83446. * Creates a new Image Game Object and adds it to the Scene.
  83447. *
  83448. * Note: This method will only be available if the Image Game Object has been built into Phaser.
  83449. *
  83450. * @method Phaser.GameObjects.GameObjectFactory#image
  83451. * @since 3.0.0
  83452. *
  83453. * @param {number} x - The horizontal position of this Game Object in the world.
  83454. * @param {number} y - The vertical position of this Game Object in the world.
  83455. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  83456. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  83457. *
  83458. * @return {Phaser.GameObjects.Image} The Game Object that was created.
  83459. */
  83460. GameObjectFactory.register('image', function (x, y, key, frame)
  83461. {
  83462. return this.displayList.add(new Image(this.scene, x, y, key, frame));
  83463. });
  83464. // When registering a factory function 'this' refers to the GameObjectFactory context.
  83465. //
  83466. // There are several properties available to use:
  83467. //
  83468. // this.scene - a reference to the Scene that owns the GameObjectFactory
  83469. // this.displayList - a reference to the Display List the Scene owns
  83470. // this.updateList - a reference to the Update List the Scene owns
  83471. /***/ }),
  83472. /* 414 */
  83473. /***/ (function(module, exports, __webpack_require__) {
  83474. /**
  83475. * @author Richard Davey <rich@photonstorm.com>
  83476. * @copyright 2018 Photon Storm Ltd.
  83477. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83478. */
  83479. var Graphics = __webpack_require__(115);
  83480. var GameObjectFactory = __webpack_require__(11);
  83481. /**
  83482. * Creates a new Graphics Game Object and adds it to the Scene.
  83483. *
  83484. * Note: This method will only be available if the Graphics Game Object has been built into Phaser.
  83485. *
  83486. * @method Phaser.GameObjects.GameObjectFactory#graphics
  83487. * @since 3.0.0
  83488. *
  83489. * @param {GraphicsOptions} [config] - The Graphics configuration.
  83490. *
  83491. * @return {Phaser.GameObjects.Graphics} The Game Object that was created.
  83492. */
  83493. GameObjectFactory.register('graphics', function (config)
  83494. {
  83495. return this.displayList.add(new Graphics(this.scene, config));
  83496. });
  83497. // When registering a factory function 'this' refers to the GameObjectFactory context.
  83498. //
  83499. // There are several properties available to use:
  83500. //
  83501. // this.scene - a reference to the Scene that owns the GameObjectFactory
  83502. // this.displayList - a reference to the Display List the Scene owns
  83503. // this.updateList - a reference to the Update List the Scene owns
  83504. /***/ }),
  83505. /* 415 */
  83506. /***/ (function(module, exports) {
  83507. /**
  83508. * @author Richard Davey <rich@photonstorm.com>
  83509. * @copyright 2018 Photon Storm Ltd.
  83510. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83511. */
  83512. /**
  83513. * Returns the nearest power of 2 to the given `value`.
  83514. *
  83515. * @function Phaser.Math.Pow2.GetPowerOfTwo
  83516. * @since 3.0.0
  83517. *
  83518. * @param {number} value - The value.
  83519. *
  83520. * @return {integer} The nearest power of 2 to `value`.
  83521. */
  83522. var GetPowerOfTwo = function (value)
  83523. {
  83524. var index = Math.log(value) / 0.6931471805599453;
  83525. return (1 << Math.ceil(index));
  83526. };
  83527. module.exports = GetPowerOfTwo;
  83528. /***/ }),
  83529. /* 416 */
  83530. /***/ (function(module, exports, __webpack_require__) {
  83531. /**
  83532. * @author Richard Davey <rich@photonstorm.com>
  83533. * @copyright 2018 Photon Storm Ltd.
  83534. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83535. */
  83536. var CanvasPool = __webpack_require__(24);
  83537. /**
  83538. * Calculates the ascent, descent and fontSize of a given font style.
  83539. *
  83540. * @function Phaser.GameObjects.Text.MeasureText
  83541. * @since 3.0.0
  83542. *
  83543. * @param {Phaser.GameObjects.Text.TextStyle} textStyle - The TextStyle object to measure.
  83544. *
  83545. * @return {object} An object containing the ascent, descent and fontSize of the TextStyle.
  83546. */
  83547. var MeasureText = function (textStyle)
  83548. {
  83549. // @property {HTMLCanvasElement} canvas - The canvas element that the text is rendered.
  83550. var canvas = CanvasPool.create(this);
  83551. // @property {HTMLCanvasElement} context - The context of the canvas element that the text is rendered to.
  83552. var context = canvas.getContext('2d');
  83553. textStyle.syncFont(canvas, context);
  83554. var width = Math.ceil(context.measureText(textStyle.testString).width * textStyle.baselineX);
  83555. var baseline = width;
  83556. var height = 2 * baseline;
  83557. baseline = baseline * textStyle.baselineY | 0;
  83558. canvas.width = width;
  83559. canvas.height = height;
  83560. context.fillStyle = '#f00';
  83561. context.fillRect(0, 0, width, height);
  83562. context.font = textStyle._font;
  83563. context.textBaseline = 'alphabetic';
  83564. context.fillStyle = '#000';
  83565. context.fillText(textStyle.testString, 0, baseline);
  83566. var output = {
  83567. ascent: 0,
  83568. descent: 0,
  83569. fontSize: 0
  83570. };
  83571. if (!context.getImageData(0, 0, width, height))
  83572. {
  83573. output.ascent = baseline;
  83574. output.descent = baseline + 6;
  83575. output.fontSize = output.ascent + output.descent;
  83576. CanvasPool.remove(canvas);
  83577. return output;
  83578. }
  83579. var imagedata = context.getImageData(0, 0, width, height).data;
  83580. var pixels = imagedata.length;
  83581. var line = width * 4;
  83582. var i;
  83583. var j;
  83584. var idx = 0;
  83585. var stop = false;
  83586. // ascent. scan from top to bottom until we find a non red pixel
  83587. for (i = 0; i < baseline; i++)
  83588. {
  83589. for (j = 0; j < line; j += 4)
  83590. {
  83591. if (imagedata[idx + j] !== 255)
  83592. {
  83593. stop = true;
  83594. break;
  83595. }
  83596. }
  83597. if (!stop)
  83598. {
  83599. idx += line;
  83600. }
  83601. else
  83602. {
  83603. break;
  83604. }
  83605. }
  83606. output.ascent = baseline - i;
  83607. idx = pixels - line;
  83608. stop = false;
  83609. // descent. scan from bottom to top until we find a non red pixel
  83610. for (i = height; i > baseline; i--)
  83611. {
  83612. for (j = 0; j < line; j += 4)
  83613. {
  83614. if (imagedata[idx + j] !== 255)
  83615. {
  83616. stop = true;
  83617. break;
  83618. }
  83619. }
  83620. if (!stop)
  83621. {
  83622. idx -= line;
  83623. }
  83624. else
  83625. {
  83626. break;
  83627. }
  83628. }
  83629. output.descent = (i - baseline);
  83630. output.fontSize = output.ascent + output.descent;
  83631. CanvasPool.remove(canvas);
  83632. return output;
  83633. };
  83634. module.exports = MeasureText;
  83635. /***/ }),
  83636. /* 417 */
  83637. /***/ (function(module, exports, __webpack_require__) {
  83638. /**
  83639. * @author Richard Davey <rich@photonstorm.com>
  83640. * @copyright 2018 Photon Storm Ltd.
  83641. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  83642. */
  83643. var Class = __webpack_require__(0);
  83644. var GetAdvancedValue = __webpack_require__(10);
  83645. var GetValue = __webpack_require__(4);
  83646. var MeasureText = __webpack_require__(416);
  83647. // Key: [ Object Key, Default Value ]
  83648. /**
  83649. * A custom function that will be responsible for wrapping the text.
  83650. * @callback TextStyleWordWrapCallback
  83651. *
  83652. * @param {string} text - The string to wrap.
  83653. * @param {Phaser.GameObjects.Text} textObject - The Text instance.
  83654. *
  83655. * @return {(string|string[])} Should return the wrapped lines either as an array of lines or as a string with
  83656. * newline characters in place to indicate where breaks should happen.
  83657. */
  83658. var propertyMap = {
  83659. fontFamily: [ 'fontFamily', 'Courier' ],
  83660. fontSize: [ 'fontSize', '16px' ],
  83661. fontStyle: [ 'fontStyle', '' ],
  83662. backgroundColor: [ 'backgroundColor', null ],
  83663. color: [ 'color', '#fff' ],
  83664. stroke: [ 'stroke', '#fff' ],
  83665. strokeThickness: [ 'strokeThickness', 0 ],
  83666. shadowOffsetX: [ 'shadow.offsetX', 0 ],
  83667. shadowOffsetY: [ 'shadow.offsetY', 0 ],
  83668. shadowColor: [ 'shadow.color', '#000' ],
  83669. shadowBlur: [ 'shadow.blur', 0 ],
  83670. shadowStroke: [ 'shadow.stroke', false ],
  83671. shadowFill: [ 'shadow.fill', false ],
  83672. align: [ 'align', 'left' ],
  83673. maxLines: [ 'maxLines', 0 ],
  83674. fixedWidth: [ 'fixedWidth', 0 ],
  83675. fixedHeight: [ 'fixedHeight', 0 ],
  83676. rtl: [ 'rtl', false ],
  83677. testString: [ 'testString', '|MÉqgy' ],
  83678. baselineX: [ 'baselineX', 1.2 ],
  83679. baselineY: [ 'baselineY', 1.4 ],
  83680. wordWrapWidth: [ 'wordWrap.width', null ],
  83681. wordWrapCallback: [ 'wordWrap.callback', null ],
  83682. wordWrapCallbackScope: [ 'wordWrap.callbackScope', null ],
  83683. wordWrapUseAdvanced: [ 'wordWrap.useAdvancedWrap', false ]
  83684. };
  83685. /**
  83686. * Font metrics for a Text Style object.
  83687. *
  83688. * @typedef {object} TextMetrics
  83689. *
  83690. * @property {number} ascent - The ascent of the font.
  83691. * @property {number} descent - The descent of the font.
  83692. * @property {number} fontSize - The size of the font.
  83693. */
  83694. /**
  83695. * @classdesc
  83696. * Style settings for a Text object.
  83697. *
  83698. * @class TextStyle
  83699. * @memberOf Phaser.GameObjects.Text
  83700. * @constructor
  83701. * @since 3.0.0
  83702. *
  83703. * @param {Phaser.GameObjects.Text} text - The Text object that this TextStyle is styling.
  83704. * @param {object} style - The style settings to set.
  83705. */
  83706. var TextStyle = new Class({
  83707. initialize:
  83708. function TextStyle (text, style)
  83709. {
  83710. /**
  83711. * The Text object that this TextStyle is styling.
  83712. *
  83713. * @name Phaser.GameObjects.Text.TextStyle#parent
  83714. * @type {Phaser.GameObjects.Text}
  83715. * @since 3.0.0
  83716. */
  83717. this.parent = text;
  83718. /**
  83719. * The font family.
  83720. *
  83721. * @name Phaser.GameObjects.Text.TextStyle#fontFamily
  83722. * @type {string}
  83723. * @default 'Courier'
  83724. * @since 3.0.0
  83725. */
  83726. this.fontFamily;
  83727. /**
  83728. * The font size.
  83729. *
  83730. * @name Phaser.GameObjects.Text.TextStyle#fontSize
  83731. * @type {string}
  83732. * @default '16px'
  83733. * @since 3.0.0
  83734. */
  83735. this.fontSize;
  83736. /**
  83737. * The font style.
  83738. *
  83739. * @name Phaser.GameObjects.Text.TextStyle#fontStyle
  83740. * @type {string}
  83741. * @since 3.0.0
  83742. */
  83743. this.fontStyle;
  83744. /**
  83745. * The background color.
  83746. *
  83747. * @name Phaser.GameObjects.Text.TextStyle#backgroundColor
  83748. * @type {string}
  83749. * @since 3.0.0
  83750. */
  83751. this.backgroundColor;
  83752. /**
  83753. * The text fill color.
  83754. *
  83755. * @name Phaser.GameObjects.Text.TextStyle#color
  83756. * @type {string}
  83757. * @default '#fff'
  83758. * @since 3.0.0
  83759. */
  83760. this.color;
  83761. /**
  83762. * The text stroke color.
  83763. *
  83764. * @name Phaser.GameObjects.Text.TextStyle#stroke
  83765. * @type {string}
  83766. * @default '#fff'
  83767. * @since 3.0.0
  83768. */
  83769. this.stroke;
  83770. /**
  83771. * The text stroke thickness.
  83772. *
  83773. * @name Phaser.GameObjects.Text.TextStyle#strokeThickness
  83774. * @type {number}
  83775. * @default 0
  83776. * @since 3.0.0
  83777. */
  83778. this.strokeThickness;
  83779. /**
  83780. * The horizontal shadow offset.
  83781. *
  83782. * @name Phaser.GameObjects.Text.TextStyle#shadowOffsetX
  83783. * @type {number}
  83784. * @default 0
  83785. * @since 3.0.0
  83786. */
  83787. this.shadowOffsetX;
  83788. /**
  83789. * The vertical shadow offset.
  83790. *
  83791. * @name Phaser.GameObjects.Text.TextStyle#shadowOffsetY
  83792. * @type {number}
  83793. * @default 0
  83794. * @since 3.0.0
  83795. */
  83796. this.shadowOffsetY;
  83797. /**
  83798. * The shadow color.
  83799. *
  83800. * @name Phaser.GameObjects.Text.TextStyle#shadowColor
  83801. * @type {string}
  83802. * @default '#000'
  83803. * @since 3.0.0
  83804. */
  83805. this.shadowColor;
  83806. /**
  83807. * The shadow blur radius.
  83808. *
  83809. * @name Phaser.GameObjects.Text.TextStyle#shadowBlur
  83810. * @type {number}
  83811. * @default 0
  83812. * @since 3.0.0
  83813. */
  83814. this.shadowBlur;
  83815. /**
  83816. * Whether shadow stroke is enabled or not.
  83817. *
  83818. * @name Phaser.GameObjects.Text.TextStyle#shadowStroke
  83819. * @type {boolean}
  83820. * @default false
  83821. * @since 3.0.0
  83822. */
  83823. this.shadowStroke;
  83824. /**
  83825. * Whether shadow fill is enabled or not.
  83826. *
  83827. * @name Phaser.GameObjects.Text.TextStyle#shadowFill
  83828. * @type {boolean}
  83829. * @default false
  83830. * @since 3.0.0
  83831. */
  83832. this.shadowFill;
  83833. /**
  83834. * The text alignment.
  83835. *
  83836. * @name Phaser.GameObjects.Text.TextStyle#align
  83837. * @type {string}
  83838. * @default 'left'
  83839. * @since 3.0.0
  83840. */
  83841. this.align;
  83842. /**
  83843. * The maximum number of lines to draw.
  83844. *
  83845. * @name Phaser.GameObjects.Text.TextStyle#maxLines
  83846. * @type {integer}
  83847. * @default 0
  83848. * @since 3.0.0
  83849. */
  83850. this.maxLines;
  83851. /**
  83852. * The fixed width of the text.
  83853. *
  83854. * `0` means no fixed with.
  83855. *
  83856. * @name Phaser.GameObjects.Text.TextStyle#fixedWidth
  83857. * @type {number}
  83858. * @default 0
  83859. * @since 3.0.0
  83860. */
  83861. this.fixedWidth;
  83862. /**
  83863. * The fixed height of the text.
  83864. *
  83865. * `0` means no fixed height.
  83866. *
  83867. * @name Phaser.GameObjects.Text.TextStyle#fixedHeight
  83868. * @type {number}
  83869. * @default 0
  83870. * @since 3.0.0
  83871. */
  83872. this.fixedHeight;
  83873. /**
  83874. * Whether the text should render right to left.
  83875. *
  83876. * @name Phaser.GameObjects.Text.TextStyle#rtl
  83877. * @type {boolean}
  83878. * @default false
  83879. * @since 3.0.0
  83880. */
  83881. this.rtl;
  83882. /**
  83883. * The test string to use when measuring the font.
  83884. *
  83885. * @name Phaser.GameObjects.Text.TextStyle#testString
  83886. * @type {string}
  83887. * @default '|MÉqgy'
  83888. * @since 3.0.0
  83889. */
  83890. this.testString;
  83891. /**
  83892. * The amount of horizontal padding adding to the width of the text when calculating the font metrics.
  83893. *
  83894. * @name Phaser.GameObjects.Text.TextStyle#baselineX
  83895. * @type {number}
  83896. * @default 1.2
  83897. * @since 3.3.0
  83898. */
  83899. this.baselineX;
  83900. /**
  83901. * The amount of vertical padding adding to the width of the text when calculating the font metrics.
  83902. *
  83903. * @name Phaser.GameObjects.Text.TextStyle#baselineY
  83904. * @type {number}
  83905. * @default 1.4
  83906. * @since 3.3.0
  83907. */
  83908. this.baselineY;
  83909. /**
  83910. * The font style, size and family.
  83911. *
  83912. * @name Phaser.GameObjects.Text.TextStyle#_font
  83913. * @type {string}
  83914. * @private
  83915. * @since 3.0.0
  83916. */
  83917. this._font;
  83918. // Set to defaults + user style
  83919. this.setStyle(style, false);
  83920. var metrics = GetValue(style, 'metrics', false);
  83921. // Provide optional TextMetrics in the style object to avoid the canvas look-up / scanning
  83922. // Doing this is reset if you then change the font of this TextStyle after creation
  83923. if (metrics)
  83924. {
  83925. this.metrics = {
  83926. ascent: GetValue(metrics, 'ascent', 0),
  83927. descent: GetValue(metrics, 'descent', 0),
  83928. fontSize: GetValue(metrics, 'fontSize', 0)
  83929. };
  83930. }
  83931. else
  83932. {
  83933. this.metrics = MeasureText(this);
  83934. }
  83935. },
  83936. /**
  83937. * Set the text style.
  83938. *
  83939. * @example
  83940. * text.setStyle({
  83941. * fontSize: '64px',
  83942. * fontFamily: 'Arial',
  83943. * color: '#ffffff',
  83944. * align: 'center',
  83945. * backgroundColor: '#ff00ff'
  83946. * });
  83947. *
  83948. * @method Phaser.GameObjects.Text.TextStyle#setStyle
  83949. * @since 3.0.0
  83950. *
  83951. * @param {object} style - The style settings to set.
  83952. * @param {boolean} [updateText=true] - Whether to update the text immediately.
  83953. *
  83954. * @return {Phaser.GameObjects.Text} The parent Text object.
  83955. */
  83956. setStyle: function (style, updateText)
  83957. {
  83958. if (updateText === undefined) { updateText = true; }
  83959. // Avoid type mutation
  83960. if (style && style.hasOwnProperty('fontSize') && typeof style.fontSize === 'number')
  83961. {
  83962. style.fontSize = style.fontSize.toString() + 'px';
  83963. }
  83964. for (var key in propertyMap)
  83965. {
  83966. if (key === 'wordWrapCallback' || key === 'wordWrapCallbackScope')
  83967. {
  83968. // Callback & scope should be set without processing the values
  83969. this[key] = GetValue(style, propertyMap[key][0], propertyMap[key][1]);
  83970. }
  83971. else
  83972. {
  83973. this[key] = GetAdvancedValue(style, propertyMap[key][0], propertyMap[key][1]);
  83974. }
  83975. }
  83976. // Allow for 'font' override
  83977. var font = GetValue(style, 'font', null);
  83978. if (font === null)
  83979. {
  83980. this._font = [ this.fontStyle, this.fontSize, this.fontFamily ].join(' ');
  83981. }
  83982. else
  83983. {
  83984. this._font = font;
  83985. }
  83986. // Allow for 'fill' to be used in place of 'color'
  83987. var fill = GetValue(style, 'fill', null);
  83988. if (fill !== null)
  83989. {
  83990. this.color = fill;
  83991. }
  83992. if (updateText)
  83993. {
  83994. return this.update(true);
  83995. }
  83996. else
  83997. {
  83998. return this.parent;
  83999. }
  84000. },
  84001. /**
  84002. * Synchronize the font settings to the given Canvas Rendering Context.
  84003. *
  84004. * @method Phaser.GameObjects.Text.TextStyle#syncFont
  84005. * @since 3.0.0
  84006. *
  84007. * @param {HTMLCanvasElement} canvas - The Canvas Element.
  84008. * @param {CanvasRenderingContext2D} context - The Canvas Rendering Context.
  84009. */
  84010. syncFont: function (canvas, context)
  84011. {
  84012. context.font = this._font;
  84013. },
  84014. /**
  84015. * Synchronize the text style settings to the given Canvas Rendering Context.
  84016. *
  84017. * @method Phaser.GameObjects.Text.TextStyle#syncStyle
  84018. * @since 3.0.0
  84019. *
  84020. * @param {HTMLCanvasElement} canvas - The Canvas Element.
  84021. * @param {CanvasRenderingContext2D} context - The Canvas Rendering Context.
  84022. */
  84023. syncStyle: function (canvas, context)
  84024. {
  84025. context.textBaseline = 'alphabetic';
  84026. context.fillStyle = this.color;
  84027. context.strokeStyle = this.stroke;
  84028. context.lineWidth = this.strokeThickness;
  84029. context.lineCap = 'round';
  84030. context.lineJoin = 'round';
  84031. },
  84032. /**
  84033. * Synchronize the shadow settings to the given Canvas Rendering Context.
  84034. *
  84035. * @method Phaser.GameObjects.Text.TextStyle#syncShadow
  84036. * @since 3.0.0
  84037. *
  84038. * @param {CanvasRenderingContext2D} context - The Canvas Rendering Context.
  84039. * @param {boolean} enabled - Whether shadows are enabled or not.
  84040. */
  84041. syncShadow: function (context, enabled)
  84042. {
  84043. if (enabled)
  84044. {
  84045. context.shadowOffsetX = this.shadowOffsetX;
  84046. context.shadowOffsetY = this.shadowOffsetY;
  84047. context.shadowColor = this.shadowColor;
  84048. context.shadowBlur = this.shadowBlur;
  84049. }
  84050. else
  84051. {
  84052. context.shadowOffsetX = 0;
  84053. context.shadowOffsetY = 0;
  84054. context.shadowColor = 0;
  84055. context.shadowBlur = 0;
  84056. }
  84057. },
  84058. /**
  84059. * Update the style settings for the parent Text object.
  84060. *
  84061. * @method Phaser.GameObjects.Text.TextStyle#update
  84062. * @since 3.0.0
  84063. *
  84064. * @param {boolean} recalculateMetrics - Whether to recalculate font and text metrics.
  84065. *
  84066. * @return {Phaser.GameObjects.Text} The parent Text object.
  84067. */
  84068. update: function (recalculateMetrics)
  84069. {
  84070. if (recalculateMetrics)
  84071. {
  84072. this._font = [ this.fontStyle, this.fontSize, this.fontFamily ].join(' ');
  84073. this.metrics = MeasureText(this);
  84074. }
  84075. return this.parent.updateText();
  84076. },
  84077. /**
  84078. * Set the font.
  84079. *
  84080. * If a string is given, the font family is set.
  84081. *
  84082. * If an object is given, the `fontFamily`, `fontSize` and `fontStyle`
  84083. * properties of that object are set.
  84084. *
  84085. * @method Phaser.GameObjects.Text.TextStyle#setFont
  84086. * @since 3.0.0
  84087. *
  84088. * @param {(string|object)} font - The font family or font settings to set.
  84089. *
  84090. * @return {Phaser.GameObjects.Text} The parent Text object.
  84091. */
  84092. setFont: function (font)
  84093. {
  84094. if (typeof font === 'string')
  84095. {
  84096. this.fontFamily = font;
  84097. this.fontSize = '';
  84098. this.fontStyle = '';
  84099. }
  84100. else
  84101. {
  84102. this.fontFamily = GetValue(font, 'fontFamily', 'Courier');
  84103. this.fontSize = GetValue(font, 'fontSize', '16px');
  84104. this.fontStyle = GetValue(font, 'fontStyle', '');
  84105. }
  84106. return this.update(true);
  84107. },
  84108. /**
  84109. * Set the font family.
  84110. *
  84111. * @method Phaser.GameObjects.Text.TextStyle#setFontFamily
  84112. * @since 3.0.0
  84113. *
  84114. * @param {string} family - The font family.
  84115. *
  84116. * @return {Phaser.GameObjects.Text} The parent Text object.
  84117. */
  84118. setFontFamily: function (family)
  84119. {
  84120. this.fontFamily = family;
  84121. return this.update(true);
  84122. },
  84123. /**
  84124. * Set the font style.
  84125. *
  84126. * @method Phaser.GameObjects.Text.TextStyle#setFontStyle
  84127. * @since 3.0.0
  84128. *
  84129. * @param {string} style - The font style.
  84130. *
  84131. * @return {Phaser.GameObjects.Text} The parent Text object.
  84132. */
  84133. setFontStyle: function (style)
  84134. {
  84135. this.fontStyle = style;
  84136. return this.update(true);
  84137. },
  84138. /**
  84139. * Set the font size.
  84140. *
  84141. * @method Phaser.GameObjects.Text.TextStyle#setFontSize
  84142. * @since 3.0.0
  84143. *
  84144. * @param {(number|string)} size - The font size.
  84145. *
  84146. * @return {Phaser.GameObjects.Text} The parent Text object.
  84147. */
  84148. setFontSize: function (size)
  84149. {
  84150. if (typeof size === 'number')
  84151. {
  84152. size = size.toString() + 'px';
  84153. }
  84154. this.fontSize = size;
  84155. return this.update(true);
  84156. },
  84157. /**
  84158. * Set the test string to use when measuring the font.
  84159. *
  84160. * @method Phaser.GameObjects.Text.TextStyle#setTestString
  84161. * @since 3.0.0
  84162. *
  84163. * @param {string} string - The test string to use when measuring the font.
  84164. *
  84165. * @return {Phaser.GameObjects.Text} The parent Text object.
  84166. */
  84167. setTestString: function (string)
  84168. {
  84169. this.testString = string;
  84170. return this.update(true);
  84171. },
  84172. /**
  84173. * Set a fixed width and height for the text.
  84174. *
  84175. * Pass in `0` for either of these parameters to disable fixed width or height respectively.
  84176. *
  84177. * @method Phaser.GameObjects.Text.TextStyle#setFixedSize
  84178. * @since 3.0.0
  84179. *
  84180. * @param {number} width - The fixed width to set.
  84181. * @param {number} height - The fixed height to set.
  84182. *
  84183. * @return {Phaser.GameObjects.Text} The parent Text object.
  84184. */
  84185. setFixedSize: function (width, height)
  84186. {
  84187. this.fixedWidth = width;
  84188. this.fixedHeight = height;
  84189. if (width)
  84190. {
  84191. this.parent.width = width;
  84192. }
  84193. if (height)
  84194. {
  84195. this.parent.height = height;
  84196. }
  84197. return this.update(false);
  84198. },
  84199. /**
  84200. * Set the background color.
  84201. *
  84202. * @method Phaser.GameObjects.Text.TextStyle#setBackgroundColor
  84203. * @since 3.0.0
  84204. *
  84205. * @param {string} color - The background color.
  84206. *
  84207. * @return {Phaser.GameObjects.Text} The parent Text object.
  84208. */
  84209. setBackgroundColor: function (color)
  84210. {
  84211. this.backgroundColor = color;
  84212. return this.update(false);
  84213. },
  84214. /**
  84215. * Set the text fill color.
  84216. *
  84217. * @method Phaser.GameObjects.Text.TextStyle#setFill
  84218. * @since 3.0.0
  84219. *
  84220. * @param {string} color - The text fill color.
  84221. *
  84222. * @return {Phaser.GameObjects.Text} The parent Text object.
  84223. */
  84224. setFill: function (color)
  84225. {
  84226. this.color = color;
  84227. return this.update(false);
  84228. },
  84229. /**
  84230. * Set the text fill color.
  84231. *
  84232. * @method Phaser.GameObjects.Text.TextStyle#setColor
  84233. * @since 3.0.0
  84234. *
  84235. * @param {string} color - The text fill color.
  84236. *
  84237. * @return {Phaser.GameObjects.Text} The parent Text object.
  84238. */
  84239. setColor: function (color)
  84240. {
  84241. this.color = color;
  84242. return this.update(false);
  84243. },
  84244. /**
  84245. * Set the stroke settings.
  84246. *
  84247. * @method Phaser.GameObjects.Text.TextStyle#setStroke
  84248. * @since 3.0.0
  84249. *
  84250. * @param {string} color - The stroke color.
  84251. * @param {number} thickness - The stroke thickness.
  84252. *
  84253. * @return {Phaser.GameObjects.Text} The parent Text object.
  84254. */
  84255. setStroke: function (color, thickness)
  84256. {
  84257. if (color === undefined)
  84258. {
  84259. // Reset the stroke to zero (disabling it)
  84260. this.strokeThickness = 0;
  84261. }
  84262. else
  84263. {
  84264. if (thickness === undefined) { thickness = this.strokeThickness; }
  84265. this.stroke = color;
  84266. this.strokeThickness = thickness;
  84267. }
  84268. return this.update(true);
  84269. },
  84270. /**
  84271. * Set the shadow settings.
  84272. *
  84273. * @method Phaser.GameObjects.Text.TextStyle#setShadow
  84274. * @since 3.0.0
  84275. *
  84276. * @param {number} [x=0] - The horizontal shadow offset.
  84277. * @param {number} [y=0] - The vertical shadow offset.
  84278. * @param {string} [color='#000'] - The shadow color.
  84279. * @param {number} [blur=0] - The shadow blur radius.
  84280. * @param {boolean} [shadowStroke=false] - Whether to stroke the shadow.
  84281. * @param {boolean} [shadowFill=true] - Whether to fill the shadow.
  84282. *
  84283. * @return {Phaser.GameObjects.Text} The parent Text object.
  84284. */
  84285. setShadow: function (x, y, color, blur, shadowStroke, shadowFill)
  84286. {
  84287. if (x === undefined) { x = 0; }
  84288. if (y === undefined) { y = 0; }
  84289. if (color === undefined) { color = '#000'; }
  84290. if (blur === undefined) { blur = 0; }
  84291. if (shadowStroke === undefined) { shadowStroke = false; }
  84292. if (shadowFill === undefined) { shadowFill = true; }
  84293. this.shadowOffsetX = x;
  84294. this.shadowOffsetY = y;
  84295. this.shadowColor = color;
  84296. this.shadowBlur = blur;
  84297. this.shadowStroke = shadowStroke;
  84298. this.shadowFill = shadowFill;
  84299. return this.update(false);
  84300. },
  84301. /**
  84302. * Set the shadow offset.
  84303. *
  84304. * @method Phaser.GameObjects.Text.TextStyle#setShadowOffset
  84305. * @since 3.0.0
  84306. *
  84307. * @param {number} [x=0] - The horizontal shadow offset.
  84308. * @param {number} [y=0] - The vertical shadow offset.
  84309. *
  84310. * @return {Phaser.GameObjects.Text} The parent Text object.
  84311. */
  84312. setShadowOffset: function (x, y)
  84313. {
  84314. if (x === undefined) { x = 0; }
  84315. if (y === undefined) { y = x; }
  84316. this.shadowOffsetX = x;
  84317. this.shadowOffsetY = y;
  84318. return this.update(false);
  84319. },
  84320. /**
  84321. * Set the shadow color.
  84322. *
  84323. * @method Phaser.GameObjects.Text.TextStyle#setShadowColor
  84324. * @since 3.0.0
  84325. *
  84326. * @param {string} [color='#000'] - The shadow color.
  84327. *
  84328. * @return {Phaser.GameObjects.Text} The parent Text object.
  84329. */
  84330. setShadowColor: function (color)
  84331. {
  84332. if (color === undefined) { color = '#000'; }
  84333. this.shadowColor = color;
  84334. return this.update(false);
  84335. },
  84336. /**
  84337. * Set the shadow blur radius.
  84338. *
  84339. * @method Phaser.GameObjects.Text.TextStyle#setShadowBlur
  84340. * @since 3.0.0
  84341. *
  84342. * @param {number} [blur=0] - The shadow blur radius.
  84343. *
  84344. * @return {Phaser.GameObjects.Text} The parent Text object.
  84345. */
  84346. setShadowBlur: function (blur)
  84347. {
  84348. if (blur === undefined) { blur = 0; }
  84349. this.shadowBlur = blur;
  84350. return this.update(false);
  84351. },
  84352. /**
  84353. * Enable or disable shadow stroke.
  84354. *
  84355. * @method Phaser.GameObjects.Text.TextStyle#setShadowStroke
  84356. * @since 3.0.0
  84357. *
  84358. * @param {boolean} enabled - Whether shadow stroke is enabled or not.
  84359. *
  84360. * @return {Phaser.GameObjects.Text} The parent Text object.
  84361. */
  84362. setShadowStroke: function (enabled)
  84363. {
  84364. this.shadowStroke = enabled;
  84365. return this.update(false);
  84366. },
  84367. /**
  84368. * Enable or disable shadow fill.
  84369. *
  84370. * @method Phaser.GameObjects.Text.TextStyle#setShadowFill
  84371. * @since 3.0.0
  84372. *
  84373. * @param {boolean} enabled - Whether shadow fill is enabled or not.
  84374. *
  84375. * @return {Phaser.GameObjects.Text} The parent Text object.
  84376. */
  84377. setShadowFill: function (enabled)
  84378. {
  84379. this.shadowFill = enabled;
  84380. return this.update(false);
  84381. },
  84382. /**
  84383. * Set the width (in pixels) to use for wrapping lines.
  84384. *
  84385. * Pass in null to remove wrapping by width.
  84386. *
  84387. * @method Phaser.GameObjects.Text.TextStyle#setWordWrapWidth
  84388. * @since 3.0.0
  84389. *
  84390. * @param {number} width - The maximum width of a line in pixels. Set to null to remove wrapping.
  84391. * @param {boolean} [useAdvancedWrap=false] - Whether or not to use the advanced wrapping
  84392. * algorithm. If true, spaces are collapsed and whitespace is trimmed from lines. If false,
  84393. * spaces and whitespace are left as is.
  84394. *
  84395. * @return {Phaser.GameObjects.Text} The parent Text object.
  84396. */
  84397. setWordWrapWidth: function (width, useAdvancedWrap)
  84398. {
  84399. if (useAdvancedWrap === undefined) { useAdvancedWrap = false; }
  84400. this.wordWrapWidth = width;
  84401. this.wordWrapUseAdvanced = useAdvancedWrap;
  84402. return this.update(false);
  84403. },
  84404. /**
  84405. * Set a custom callback for wrapping lines.
  84406. *
  84407. * Pass in null to remove wrapping by callback.
  84408. *
  84409. * @method Phaser.GameObjects.Text.TextStyle#setWordWrapCallback
  84410. * @since 3.0.0
  84411. *
  84412. * @param {TextStyleWordWrapCallback} callback - A custom function that will be responsible for wrapping the
  84413. * text. It will receive two arguments: text (the string to wrap), textObject (this Text
  84414. * instance). It should return the wrapped lines either as an array of lines or as a string with
  84415. * newline characters in place to indicate where breaks should happen.
  84416. * @param {object} [scope=null] - The scope that will be applied when the callback is invoked.
  84417. *
  84418. * @return {Phaser.GameObjects.Text} The parent Text object.
  84419. */
  84420. setWordWrapCallback: function (callback, scope)
  84421. {
  84422. if (scope === undefined) { scope = null; }
  84423. this.wordWrapCallback = callback;
  84424. this.wordWrapCallbackScope = scope;
  84425. return this.update(false);
  84426. },
  84427. /**
  84428. * Set the text alignment.
  84429. *
  84430. * Expects values like `'left'`, `'right'`, `'center'` or `'justified'`.
  84431. *
  84432. * @method Phaser.GameObjects.Text.TextStyle#setAlign
  84433. * @since 3.0.0
  84434. *
  84435. * @param {string} align - The text alignment.
  84436. *
  84437. * @return {Phaser.GameObjects.Text} The parent Text object.
  84438. */
  84439. setAlign: function (align)
  84440. {
  84441. if (align === undefined) { align = 'left'; }
  84442. this.align = align;
  84443. return this.update(false);
  84444. },
  84445. /**
  84446. * Set the maximum number of lines to draw.
  84447. *
  84448. * @method Phaser.GameObjects.Text.TextStyle#setMaxLines
  84449. * @since 3.0.0
  84450. *
  84451. * @param {integer} [max=0] - The maximum number of lines to draw.
  84452. *
  84453. * @return {Phaser.GameObjects.Text} The parent Text object.
  84454. */
  84455. setMaxLines: function (max)
  84456. {
  84457. if (max === undefined) { max = 0; }
  84458. this.maxLines = max;
  84459. return this.update(false);
  84460. },
  84461. /**
  84462. * Get the current text metrics.
  84463. *
  84464. * @method Phaser.GameObjects.Text.TextStyle#getTextMetrics
  84465. * @since 3.0.0
  84466. *
  84467. * @return {TextMetrics} The text metrics.
  84468. */
  84469. getTextMetrics: function ()
  84470. {
  84471. var metrics = this.metrics;
  84472. return {
  84473. ascent: metrics.ascent,
  84474. descent: metrics.descent,
  84475. fontSize: metrics.fontSize
  84476. };
  84477. },
  84478. /**
  84479. * Build a JSON representation of this Text Style.
  84480. *
  84481. * @method Phaser.GameObjects.Text.TextStyle#toJSON
  84482. * @since 3.0.0
  84483. *
  84484. * @return {object} A JSON representation of this Text Style.
  84485. */
  84486. toJSON: function ()
  84487. {
  84488. var output = {};
  84489. for (var key in propertyMap)
  84490. {
  84491. output[key] = this[key];
  84492. }
  84493. output.metrics = this.getTextMetrics();
  84494. return output;
  84495. },
  84496. /**
  84497. * Destroy this Text Style.
  84498. *
  84499. * @method Phaser.GameObjects.Text.TextStyle#destroy
  84500. * @since 3.0.0
  84501. */
  84502. destroy: function ()
  84503. {
  84504. this.parent = undefined;
  84505. }
  84506. });
  84507. module.exports = TextStyle;
  84508. /***/ }),
  84509. /* 418 */
  84510. /***/ (function(module, exports, __webpack_require__) {
  84511. /**
  84512. * @author Richard Davey <rich@photonstorm.com>
  84513. * @copyright 2018 Photon Storm Ltd.
  84514. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  84515. */
  84516. var GameObject = __webpack_require__(2);
  84517. /**
  84518. * Renders this Game Object with the Canvas Renderer to the given Camera.
  84519. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  84520. * This method should not be called directly. It is a utility function of the Render module.
  84521. *
  84522. * @method Phaser.GameObjects.Text#renderCanvas
  84523. * @since 3.0.0
  84524. * @private
  84525. *
  84526. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  84527. * @param {Phaser.GameObjects.Text} src - The Game Object being rendered in this call.
  84528. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  84529. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  84530. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  84531. */
  84532. var TextCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  84533. {
  84534. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)) || src.text === '')
  84535. {
  84536. return;
  84537. }
  84538. var ctx = renderer.currentContext;
  84539. // Alpha
  84540. var alpha = camera.alpha * src.alpha;
  84541. if (alpha === 0)
  84542. {
  84543. // Nothing to see, so abort early
  84544. return;
  84545. }
  84546. else if (renderer.currentAlpha !== alpha)
  84547. {
  84548. renderer.currentAlpha = alpha;
  84549. ctx.globalAlpha = alpha;
  84550. }
  84551. // Blend Mode
  84552. if (renderer.currentBlendMode !== src.blendMode)
  84553. {
  84554. renderer.currentBlendMode = src.blendMode;
  84555. ctx.globalCompositeOperation = renderer.blendModes[src.blendMode];
  84556. }
  84557. // Smoothing
  84558. if (renderer.currentScaleMode !== src.scaleMode)
  84559. {
  84560. renderer.currentScaleMode = src.scaleMode;
  84561. }
  84562. var canvas = src.canvas;
  84563. ctx.save();
  84564. if (parentMatrix !== undefined)
  84565. {
  84566. var matrix = parentMatrix.matrix;
  84567. ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  84568. }
  84569. var tx = src.x - camera.scrollX * src.scrollFactorX;
  84570. var ty = src.y - camera.scrollY * src.scrollFactorY;
  84571. if (camera.roundPixels)
  84572. {
  84573. tx |= 0;
  84574. ty |= 0;
  84575. }
  84576. ctx.translate(tx, ty);
  84577. ctx.rotate(src.rotation);
  84578. ctx.scale(src.scaleX, src.scaleY);
  84579. ctx.translate(canvas.width * (src.flipX ? 1 : 0), canvas.height * (src.flipY ? 1 : 0));
  84580. ctx.scale(src.flipX ? -1 : 1, src.flipY ? -1 : 1);
  84581. ctx.drawImage(canvas, 0, 0, canvas.width, canvas.height, -src.displayOriginX, -src.displayOriginY, canvas.width, canvas.height);
  84582. ctx.restore();
  84583. };
  84584. module.exports = TextCanvasRenderer;
  84585. /***/ }),
  84586. /* 419 */
  84587. /***/ (function(module, exports, __webpack_require__) {
  84588. /**
  84589. * @author Richard Davey <rich@photonstorm.com>
  84590. * @copyright 2018 Photon Storm Ltd.
  84591. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  84592. */
  84593. var GameObject = __webpack_require__(2);
  84594. var Utils = __webpack_require__(21);
  84595. /**
  84596. * Renders this Game Object with the WebGL Renderer to the given Camera.
  84597. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  84598. * This method should not be called directly. It is a utility function of the Render module.
  84599. *
  84600. * @method Phaser.GameObjects.Text#renderWebGL
  84601. * @since 3.0.0
  84602. * @private
  84603. *
  84604. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  84605. * @param {Phaser.GameObjects.Text} src - The Game Object being rendered in this call.
  84606. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  84607. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  84608. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  84609. */
  84610. var TextWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  84611. {
  84612. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)) || src.text === '')
  84613. {
  84614. return;
  84615. }
  84616. if (src.dirty)
  84617. {
  84618. src.canvasTexture = renderer.canvasToTexture(src.canvas, src.canvasTexture);
  84619. src.dirty = false;
  84620. }
  84621. var getTint = Utils.getTintAppendFloatAlpha;
  84622. this.pipeline.batchTexture(
  84623. src,
  84624. src.canvasTexture,
  84625. src.canvasTexture.width, src.canvasTexture.height,
  84626. src.x, src.y,
  84627. src.canvasTexture.width, src.canvasTexture.height,
  84628. src.scaleX, src.scaleY,
  84629. src.rotation,
  84630. src.flipX, src.flipY,
  84631. src.scrollFactorX, src.scrollFactorY,
  84632. src.displayOriginX, src.displayOriginY,
  84633. 0, 0, src.canvasTexture.width, src.canvasTexture.height,
  84634. getTint(src._tintTL, camera.alpha * src._alphaTL),
  84635. getTint(src._tintTR, camera.alpha * src._alphaTR),
  84636. getTint(src._tintBL, camera.alpha * src._alphaBL),
  84637. getTint(src._tintBR, camera.alpha * src._alphaBR),
  84638. (src._isTinted && src.tintFill),
  84639. 0, 0,
  84640. camera,
  84641. parentMatrix
  84642. );
  84643. };
  84644. module.exports = TextWebGLRenderer;
  84645. /***/ }),
  84646. /* 420 */
  84647. /***/ (function(module, exports, __webpack_require__) {
  84648. /**
  84649. * @author Richard Davey <rich@photonstorm.com>
  84650. * @copyright 2018 Photon Storm Ltd.
  84651. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  84652. */
  84653. var renderWebGL = __webpack_require__(3);
  84654. var renderCanvas = __webpack_require__(3);
  84655. if (true)
  84656. {
  84657. renderWebGL = __webpack_require__(419);
  84658. }
  84659. if (true)
  84660. {
  84661. renderCanvas = __webpack_require__(418);
  84662. }
  84663. module.exports = {
  84664. renderWebGL: renderWebGL,
  84665. renderCanvas: renderCanvas
  84666. };
  84667. /***/ }),
  84668. /* 421 */
  84669. /***/ (function(module, exports) {
  84670. /**
  84671. * @author Richard Davey <rich@photonstorm.com>
  84672. * @copyright 2018 Photon Storm Ltd.
  84673. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  84674. */
  84675. /**
  84676. * Returns an object containing dimensions of the Text object.
  84677. *
  84678. * @function Phaser.GameObjects.Text.GetTextSize
  84679. * @since 3.0.0
  84680. *
  84681. * @param {Phaser.GameObjects.Text} text - The Text object to calculate the size from.
  84682. * @param {TextMetrics} size - The Text metrics to use when calculating the size.
  84683. * @param {array} lines - The lines of text to calculate the size from.
  84684. *
  84685. * @return {object} An object containing dimensions of the Text object.
  84686. */
  84687. var GetTextSize = function (text, size, lines)
  84688. {
  84689. var canvas = text.canvas;
  84690. var context = text.context;
  84691. var style = text.style;
  84692. var lineWidths = [];
  84693. var maxLineWidth = 0;
  84694. var drawnLines = lines.length;
  84695. if (style.maxLines > 0 && style.maxLines < lines.length)
  84696. {
  84697. drawnLines = style.maxLines;
  84698. }
  84699. style.syncFont(canvas, context);
  84700. // Text Width
  84701. for (var i = 0; i < drawnLines; i++)
  84702. {
  84703. var lineWidth = style.strokeThickness;
  84704. lineWidth += context.measureText(lines[i]).width;
  84705. // Adjust for wrapped text
  84706. if (style.wordWrap)
  84707. {
  84708. lineWidth -= context.measureText(' ').width;
  84709. }
  84710. lineWidths[i] = Math.ceil(lineWidth);
  84711. maxLineWidth = Math.max(maxLineWidth, lineWidths[i]);
  84712. }
  84713. // Text Height
  84714. var lineHeight = size.fontSize + style.strokeThickness;
  84715. var height = lineHeight * drawnLines;
  84716. var lineSpacing = text._lineSpacing || 0;
  84717. if (lineSpacing < 0 && Math.abs(lineSpacing) > lineHeight)
  84718. {
  84719. lineSpacing = -lineHeight;
  84720. }
  84721. // Adjust for line spacing
  84722. if (lineSpacing !== 0)
  84723. {
  84724. height += (lineSpacing > 0) ? lineSpacing * lines.length : lineSpacing * (lines.length - 1);
  84725. }
  84726. return {
  84727. width: maxLineWidth,
  84728. height: height,
  84729. lines: drawnLines,
  84730. lineWidths: lineWidths,
  84731. lineSpacing: lineSpacing,
  84732. lineHeight: lineHeight
  84733. };
  84734. };
  84735. module.exports = GetTextSize;
  84736. /***/ }),
  84737. /* 422 */
  84738. /***/ (function(module, exports, __webpack_require__) {
  84739. /**
  84740. * @author Richard Davey <rich@photonstorm.com>
  84741. * @copyright 2018 Photon Storm Ltd.
  84742. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  84743. */
  84744. var Class = __webpack_require__(0);
  84745. var DegToRad = __webpack_require__(39);
  84746. var GetBoolean = __webpack_require__(62);
  84747. var GetValue = __webpack_require__(4);
  84748. var Sprite = __webpack_require__(35);
  84749. var TWEEN_CONST = __webpack_require__(61);
  84750. var Vector2 = __webpack_require__(6);
  84751. /**
  84752. * Settings for a PathFollower.
  84753. *
  84754. * @typedef {object} PathConfig
  84755. *
  84756. * @property {number} duration - The duration of the path follow.
  84757. * @property {number} from - The start position of the path follow, between 0 and 1.
  84758. * @property {number} to - The end position of the path follow, between 0 and 1.
  84759. * @property {boolean} [positionOnPath=false] - Whether to position the PathFollower on the Path using its path offset.
  84760. * @property {boolean} [rotateToPath=false] - Should the PathFollower automatically rotate to point in the direction of the Path?
  84761. * @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.
  84762. * @property {boolean} [verticalAdjust=false] - [description]
  84763. */
  84764. /**
  84765. * @classdesc
  84766. * A PathFollower Game Object.
  84767. *
  84768. * A PathFollower is a Sprite Game Object with some extra helpers to allow it to follow a Path automatically.
  84769. *
  84770. * Anything you can do with a standard Sprite can be done with this PathFollower, such as animate it, tint it,
  84771. * scale it and so on.
  84772. *
  84773. * PathFollowers are bound to a single Path at any one time and can traverse the length of the Path, from start
  84774. * to finish, forwards or backwards, or from any given point on the Path to its end. They can optionally rotate
  84775. * to face the direction of the path, be offset from the path coordinates or rotate independently of the Path.
  84776. *
  84777. * @class PathFollower
  84778. * @extends Phaser.GameObjects.Sprite
  84779. * @memberOf Phaser.GameObjects
  84780. * @constructor
  84781. * @since 3.0.0
  84782. *
  84783. * @param {Phaser.Scene} scene - The Scene to which this PathFollower belongs.
  84784. * @param {Phaser.Curves.Path} path - The Path this PathFollower is following. It can only follow one Path at a time.
  84785. * @param {number} x - The horizontal position of this Game Object in the world.
  84786. * @param {number} y - The vertical position of this Game Object in the world.
  84787. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  84788. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  84789. */
  84790. var PathFollower = new Class({
  84791. Extends: Sprite,
  84792. initialize:
  84793. function PathFollower (scene, path, x, y, texture, frame)
  84794. {
  84795. Sprite.call(this, scene, x, y, texture, frame);
  84796. /**
  84797. * The Path this PathFollower is following. It can only follow one Path at a time.
  84798. *
  84799. * @name Phaser.GameObjects.PathFollower#path
  84800. * @type {Phaser.Curves.Path}
  84801. * @since 3.0.0
  84802. */
  84803. this.path = path;
  84804. /**
  84805. * Should the PathFollower automatically rotate to point in the direction of the Path?
  84806. *
  84807. * @name Phaser.GameObjects.PathFollower#rotateToPath
  84808. * @type {boolean}
  84809. * @default false
  84810. * @since 3.0.0
  84811. */
  84812. this.rotateToPath = false;
  84813. /**
  84814. * [description]
  84815. *
  84816. * @name Phaser.GameObjects.PathFollower#pathRotationVerticalAdjust
  84817. * @type {boolean}
  84818. * @default false
  84819. * @since 3.0.0
  84820. */
  84821. this.pathRotationVerticalAdjust = false;
  84822. /**
  84823. * If the PathFollower is rotating to match the Path (@see Phaser.GameObjects.PathFollower#rotateToPath)
  84824. * this value is added to the rotation value. This allows you to rotate objects to a path but control
  84825. * the angle of the rotation as well.
  84826. *
  84827. * @name Phaser.GameObjects.PathFollower#pathRotationOffset
  84828. * @type {number}
  84829. * @default 0
  84830. * @since 3.0.0
  84831. */
  84832. this.pathRotationOffset = 0;
  84833. /**
  84834. * An additional vector to add to the PathFollowers position, allowing you to offset it from the
  84835. * Path coordinates.
  84836. *
  84837. * @name Phaser.GameObjects.PathFollower#pathOffset
  84838. * @type {Phaser.Math.Vector2}
  84839. * @since 3.0.0
  84840. */
  84841. this.pathOffset = new Vector2(x, y);
  84842. /**
  84843. * [description]
  84844. *
  84845. * @name Phaser.GameObjects.PathFollower#pathVector
  84846. * @type {Phaser.Math.Vector2}
  84847. * @since 3.0.0
  84848. */
  84849. this.pathVector = new Vector2();
  84850. /**
  84851. * The Tween used for following the Path.
  84852. *
  84853. * @name Phaser.GameObjects.PathFollower#pathTween
  84854. * @type {Phaser.Tweens.Tween}
  84855. * @since 3.0.0
  84856. */
  84857. this.pathTween;
  84858. /**
  84859. * Settings for the PathFollower.
  84860. *
  84861. * @name Phaser.GameObjects.PathFollower#pathConfig
  84862. * @type {?PathConfig}
  84863. * @default null
  84864. * @since 3.0.0
  84865. */
  84866. this.pathConfig = null;
  84867. /**
  84868. * Records the direction of the follower so it can change direction.
  84869. *
  84870. * @name Phaser.GameObjects.PathFollower#_prevDirection
  84871. * @type {integer}
  84872. * @private
  84873. * @since 3.0.0
  84874. */
  84875. this._prevDirection = TWEEN_CONST.PLAYING_FORWARD;
  84876. },
  84877. /**
  84878. * Set the Path that this PathFollower should follow.
  84879. *
  84880. * Optionally accepts {@link PathConfig} settings.
  84881. *
  84882. * @method Phaser.GameObjects.PathFollower#setPath
  84883. * @since 3.0.0
  84884. *
  84885. * @param {Phaser.Curves.Path} path - The Path this PathFollower is following. It can only follow one Path at a time.
  84886. * @param {PathConfig} [config] - Settings for the PathFollower.
  84887. *
  84888. * @return {Phaser.GameObjects.PathFollower} This Game Object.
  84889. */
  84890. setPath: function (path, config)
  84891. {
  84892. if (config === undefined) { config = this.pathConfig; }
  84893. var tween = this.pathTween;
  84894. if (tween && tween.isPlaying())
  84895. {
  84896. tween.stop();
  84897. }
  84898. this.path = path;
  84899. if (config)
  84900. {
  84901. this.startFollow(config);
  84902. }
  84903. return this;
  84904. },
  84905. /**
  84906. * Set whether the PathFollower should automatically rotate to point in the direction of the Path.
  84907. *
  84908. * @method Phaser.GameObjects.PathFollower#setRotateToPath
  84909. * @since 3.0.0
  84910. *
  84911. * @param {boolean} value - Whether the PathFollower should automatically rotate to point in the direction of the Path.
  84912. * @param {number} [offset=0] - Rotation offset in degrees.
  84913. * @param {boolean} [verticalAdjust=false] - [description]
  84914. *
  84915. * @return {Phaser.GameObjects.PathFollower} This Game Object.
  84916. */
  84917. setRotateToPath: function (value, offset, verticalAdjust)
  84918. {
  84919. if (offset === undefined) { offset = 0; }
  84920. if (verticalAdjust === undefined) { verticalAdjust = false; }
  84921. this.rotateToPath = value;
  84922. this.pathRotationOffset = offset;
  84923. this.pathRotationVerticalAdjust = verticalAdjust;
  84924. return this;
  84925. },
  84926. /**
  84927. * Is this PathFollower actively following a Path or not?
  84928. *
  84929. * To be considered as `isFollowing` it must be currently moving on a Path, and not paused.
  84930. *
  84931. * @method Phaser.GameObjects.PathFollower#isFollowing
  84932. * @since 3.0.0
  84933. *
  84934. * @return {boolean} `true` is this PathFollower is actively following a Path, otherwise `false`.
  84935. */
  84936. isFollowing: function ()
  84937. {
  84938. var tween = this.pathTween;
  84939. return (tween && tween.isPlaying());
  84940. },
  84941. /**
  84942. * Starts this PathFollower following its given Path.
  84943. *
  84944. * @method Phaser.GameObjects.PathFollower#startFollow
  84945. * @since 3.3.0
  84946. *
  84947. * @param {(number|PathConfig)} [config={}] - The duration of the follow, or a PathFollower config object.
  84948. * @param {number} [startAt=0] - Optional start position of the follow, between 0 and 1.
  84949. *
  84950. * @return {Phaser.GameObjects.PathFollower} This Game Object.
  84951. */
  84952. startFollow: function (config, startAt)
  84953. {
  84954. if (config === undefined) { config = {}; }
  84955. if (startAt === undefined) { startAt = 0; }
  84956. var tween = this.pathTween;
  84957. if (tween && tween.isPlaying())
  84958. {
  84959. tween.stop();
  84960. }
  84961. if (typeof config === 'number')
  84962. {
  84963. config = { duration: config };
  84964. }
  84965. // Override in case they've been specified in the config
  84966. config.from = 0;
  84967. config.to = 1;
  84968. // Can also read extra values out of the config:
  84969. var positionOnPath = GetBoolean(config, 'positionOnPath', false);
  84970. this.rotateToPath = GetBoolean(config, 'rotateToPath', false);
  84971. this.pathRotationOffset = GetValue(config, 'rotationOffset', 0);
  84972. this.pathRotationVerticalAdjust = GetBoolean(config, 'verticalAdjust', false);
  84973. this.pathTween = this.scene.sys.tweens.addCounter(config);
  84974. // The starting point of the path, relative to this follower
  84975. this.path.getStartPoint(this.pathOffset);
  84976. if (positionOnPath)
  84977. {
  84978. this.x = this.pathOffset.x;
  84979. this.y = this.pathOffset.y;
  84980. }
  84981. this.pathOffset.x = this.x - this.pathOffset.x;
  84982. this.pathOffset.y = this.y - this.pathOffset.y;
  84983. this._prevDirection = TWEEN_CONST.PLAYING_FORWARD;
  84984. if (this.rotateToPath)
  84985. {
  84986. // Set the rotation now (in case the tween has a delay on it, etc)
  84987. var nextPoint = this.path.getPoint(0.1);
  84988. this.rotation = Math.atan2(nextPoint.y - this.y, nextPoint.x - this.x) + DegToRad(this.pathRotationOffset);
  84989. }
  84990. this.pathConfig = config;
  84991. return this;
  84992. },
  84993. /**
  84994. * Pauses this PathFollower. It will still continue to render, but it will remain motionless at the
  84995. * point on the Path at which you paused it.
  84996. *
  84997. * @method Phaser.GameObjects.PathFollower#pauseFollow
  84998. * @since 3.3.0
  84999. *
  85000. * @return {Phaser.GameObjects.PathFollower} This Game Object.
  85001. */
  85002. pauseFollow: function ()
  85003. {
  85004. var tween = this.pathTween;
  85005. if (tween && tween.isPlaying())
  85006. {
  85007. tween.pause();
  85008. }
  85009. return this;
  85010. },
  85011. /**
  85012. * Resumes a previously paused PathFollower.
  85013. *
  85014. * If the PathFollower was not paused this has no effect.
  85015. *
  85016. * @method Phaser.GameObjects.PathFollower#resumeFollow
  85017. * @since 3.3.0
  85018. *
  85019. * @return {Phaser.GameObjects.PathFollower} This Game Object.
  85020. */
  85021. resumeFollow: function ()
  85022. {
  85023. var tween = this.pathTween;
  85024. if (tween && tween.isPaused())
  85025. {
  85026. tween.resume();
  85027. }
  85028. return this;
  85029. },
  85030. /**
  85031. * Stops this PathFollower from following the path any longer.
  85032. *
  85033. * This will invoke any 'stop' conditions that may exist on the Path, or for the follower.
  85034. *
  85035. * @method Phaser.GameObjects.PathFollower#stopFollow
  85036. * @since 3.3.0
  85037. *
  85038. * @return {Phaser.GameObjects.PathFollower} This Game Object.
  85039. */
  85040. stopFollow: function ()
  85041. {
  85042. var tween = this.pathTween;
  85043. if (tween && tween.isPlaying())
  85044. {
  85045. tween.stop();
  85046. }
  85047. return this;
  85048. },
  85049. /**
  85050. * Internal update handler that advances this PathFollower along the path.
  85051. *
  85052. * Called automatically by the Scene step, should not typically be called directly.
  85053. *
  85054. * @method Phaser.GameObjects.PathFollower#preUpdate
  85055. * @protected
  85056. * @since 3.0.0
  85057. *
  85058. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  85059. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  85060. */
  85061. preUpdate: function (time, delta)
  85062. {
  85063. this.anims.update(time, delta);
  85064. var tween = this.pathTween;
  85065. if (tween)
  85066. {
  85067. var tweenData = tween.data[0];
  85068. if (tweenData.state !== TWEEN_CONST.PLAYING_FORWARD && tweenData.state !== TWEEN_CONST.PLAYING_BACKWARD)
  85069. {
  85070. // If delayed, etc then bail out
  85071. return;
  85072. }
  85073. var pathVector = this.pathVector;
  85074. this.path.getPoint(tween.getValue(), pathVector);
  85075. pathVector.add(this.pathOffset);
  85076. var oldX = this.x;
  85077. var oldY = this.y;
  85078. this.setPosition(pathVector.x, pathVector.y);
  85079. var speedX = this.x - oldX;
  85080. var speedY = this.y - oldY;
  85081. if (speedX === 0 && speedY === 0)
  85082. {
  85083. // Bail out early
  85084. return;
  85085. }
  85086. if (tweenData.state !== this._prevDirection)
  85087. {
  85088. // We've changed direction, so don't do a rotate this frame
  85089. this._prevDirection = tweenData.state;
  85090. return;
  85091. }
  85092. if (this.rotateToPath)
  85093. {
  85094. this.rotation = Math.atan2(speedY, speedX) + DegToRad(this.pathRotationOffset);
  85095. if (this.pathRotationVerticalAdjust)
  85096. {
  85097. this.flipY = (this.rotation !== 0 && tweenData.state === TWEEN_CONST.PLAYING_BACKWARD);
  85098. }
  85099. }
  85100. }
  85101. }
  85102. });
  85103. module.exports = PathFollower;
  85104. /***/ }),
  85105. /* 423 */
  85106. /***/ (function(module, exports, __webpack_require__) {
  85107. /**
  85108. * @author Richard Davey <rich@photonstorm.com>
  85109. * @copyright 2018 Photon Storm Ltd.
  85110. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  85111. */
  85112. var Class = __webpack_require__(0);
  85113. var Vector2 = __webpack_require__(6);
  85114. /**
  85115. * @callback RandomZoneSourceCallback
  85116. *
  85117. * @param {Phaser.Math.Vector2} point - A point to modify.
  85118. */
  85119. /**
  85120. * @typedef {object} RandomZoneSource
  85121. *
  85122. * @property {RandomZoneSourceCallback} getRandomPoint - A function modifying its point argument.
  85123. *
  85124. * @see Phaser.Geom.Circle
  85125. * @see Phaser.Geom.Ellipse
  85126. * @see Phaser.Geom.Line
  85127. * @see Phaser.Geom.Polygon
  85128. * @see Phaser.Geom.Rectangle
  85129. * @see Phaser.Geom.Triangle
  85130. */
  85131. /**
  85132. * @classdesc
  85133. * A zone that places particles randomly within a shape's area.
  85134. *
  85135. * @class RandomZone
  85136. * @memberOf Phaser.GameObjects.Particles.Zones
  85137. * @constructor
  85138. * @since 3.0.0
  85139. *
  85140. * @param {RandomZoneSource} source - An object instance with a `getRandomPoint(point)` method.
  85141. */
  85142. var RandomZone = new Class({
  85143. initialize:
  85144. function RandomZone (source)
  85145. {
  85146. /**
  85147. * An object instance with a `getRandomPoint(point)` method.
  85148. *
  85149. * @name Phaser.GameObjects.Particles.Zones.RandomZone#source
  85150. * @type {RandomZoneSource}
  85151. * @since 3.0.0
  85152. */
  85153. this.source = source;
  85154. /**
  85155. * Internal calculation vector.
  85156. *
  85157. * @name Phaser.GameObjects.Particles.Zones.RandomZone#_tempVec
  85158. * @type {Phaser.Math.Vector2}
  85159. * @private
  85160. * @since 3.0.0
  85161. */
  85162. this._tempVec = new Vector2();
  85163. },
  85164. /**
  85165. * Get the next point in the Zone and set its coordinates on the given Particle.
  85166. *
  85167. * @method Phaser.GameObjects.Particles.Zones.RandomZone#getPoint
  85168. * @since 3.0.0
  85169. *
  85170. * @param {Phaser.GameObjects.Particles.Particle} particle - The Particle.
  85171. */
  85172. getPoint: function (particle)
  85173. {
  85174. var vec = this._tempVec;
  85175. this.source.getRandomPoint(vec);
  85176. particle.x = vec.x;
  85177. particle.y = vec.y;
  85178. }
  85179. });
  85180. module.exports = RandomZone;
  85181. /***/ }),
  85182. /* 424 */
  85183. /***/ (function(module, exports) {
  85184. /**
  85185. * @author Richard Davey <rich@photonstorm.com>
  85186. * @copyright 2018 Photon Storm Ltd.
  85187. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  85188. */
  85189. /**
  85190. * Verifies that an object contains at least one of the requested keys
  85191. *
  85192. * @function Phaser.Utils.Object.HasAny
  85193. * @since 3.0.0
  85194. *
  85195. * @param {object} source - an object on which to check for key existence
  85196. * @param {string[]} keys - an array of keys to search the object for
  85197. *
  85198. * @return {boolean} true if the source object contains at least one of the keys, false otherwise
  85199. */
  85200. var HasAny = function (source, keys)
  85201. {
  85202. for (var i = 0; i < keys.length; i++)
  85203. {
  85204. if (source.hasOwnProperty(keys[i]))
  85205. {
  85206. return true;
  85207. }
  85208. }
  85209. return false;
  85210. };
  85211. module.exports = HasAny;
  85212. /***/ }),
  85213. /* 425 */
  85214. /***/ (function(module, exports, __webpack_require__) {
  85215. /**
  85216. * @author Richard Davey <rich@photonstorm.com>
  85217. * @copyright 2018 Photon Storm Ltd.
  85218. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  85219. */
  85220. var Class = __webpack_require__(0);
  85221. /**
  85222. * @callback EdgeZoneSourceCallback
  85223. *
  85224. * @param {integer} quantity - The number of particles to place on the source edge. If 0, `stepRate` should be used instead.
  85225. * @param {number} [stepRate] - The distance between each particle. When set, `quantity` is implied and should be set to `0`.
  85226. *
  85227. * @return {Phaser.Geom.Point[]} - The points placed on the source edge.
  85228. */
  85229. /**
  85230. * @typedef {object} EdgeZoneSource
  85231. *
  85232. * @property {EdgeZoneSourceCallback} getPoints - A function placing points on the source's edge or edges.
  85233. *
  85234. * @see Phaser.Curves.Curve
  85235. * @see Phaser.Curves.Path
  85236. * @see Phaser.Geom.Circle
  85237. * @see Phaser.Geom.Ellipse
  85238. * @see Phaser.Geom.Line
  85239. * @see Phaser.Geom.Polygon
  85240. * @see Phaser.Geom.Rectangle
  85241. * @see Phaser.Geom.Triangle
  85242. */
  85243. /**
  85244. * @classdesc
  85245. * A zone that places particles on a shape's edges.
  85246. *
  85247. * @class EdgeZone
  85248. * @memberOf Phaser.GameObjects.Particles.Zones
  85249. * @constructor
  85250. * @since 3.0.0
  85251. *
  85252. * @param {EdgeZoneSource} source - An object instance with a `getPoints(quantity, stepRate)` method returning an array of points.
  85253. * @param {integer} quantity - The number of particles to place on the source edge. Set to 0 to use `stepRate` instead.
  85254. * @param {number} stepRate - The distance between each particle. When set, `quantity` is implied and should be set to 0.
  85255. * @param {boolean} [yoyo=false] - Whether particles are placed from start to end and then end to start.
  85256. * @param {boolean} [seamless=true] - Whether one endpoint will be removed if it's identical to the other.
  85257. */
  85258. var EdgeZone = new Class({
  85259. initialize:
  85260. function EdgeZone (source, quantity, stepRate, yoyo, seamless)
  85261. {
  85262. if (yoyo === undefined) { yoyo = false; }
  85263. if (seamless === undefined) { seamless = true; }
  85264. /**
  85265. * An object instance with a `getPoints(quantity, stepRate)` method returning an array of points.
  85266. *
  85267. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#source
  85268. * @type {EdgeZoneSource|RandomZoneSource}
  85269. * @since 3.0.0
  85270. */
  85271. this.source = source;
  85272. /**
  85273. * The points placed on the source edge.
  85274. *
  85275. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#points
  85276. * @type {Phaser.Geom.Point[]}
  85277. * @default []
  85278. * @since 3.0.0
  85279. */
  85280. this.points = [];
  85281. /**
  85282. * The number of particles to place on the source edge. Set to 0 to use `stepRate` instead.
  85283. *
  85284. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#quantity
  85285. * @type {integer}
  85286. * @since 3.0.0
  85287. */
  85288. this.quantity = quantity;
  85289. /**
  85290. * The distance between each particle. When set, `quantity` is implied and should be set to 0.
  85291. *
  85292. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#stepRate
  85293. * @type {number}
  85294. * @since 3.0.0
  85295. */
  85296. this.stepRate = stepRate;
  85297. /**
  85298. * Whether particles are placed from start to end and then end to start.
  85299. *
  85300. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#yoyo
  85301. * @type {boolean}
  85302. * @since 3.0.0
  85303. */
  85304. this.yoyo = yoyo;
  85305. /**
  85306. * The counter used for iterating the EdgeZone's points.
  85307. *
  85308. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#counter
  85309. * @type {number}
  85310. * @default -1
  85311. * @since 3.0.0
  85312. */
  85313. this.counter = -1;
  85314. /**
  85315. * Whether one endpoint will be removed if it's identical to the other.
  85316. *
  85317. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#seamless
  85318. * @type {boolean}
  85319. * @since 3.0.0
  85320. */
  85321. this.seamless = seamless;
  85322. /**
  85323. * An internal count of the points belonging to this EdgeZone.
  85324. *
  85325. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#_length
  85326. * @type {number}
  85327. * @private
  85328. * @default 0
  85329. * @since 3.0.0
  85330. */
  85331. this._length = 0;
  85332. /**
  85333. * An internal value used to keep track of the current iteration direction for the EdgeZone's points.
  85334. *
  85335. * 0 = forwards, 1 = backwards
  85336. *
  85337. * @name Phaser.GameObjects.Particles.Zones.EdgeZone#_direction
  85338. * @type {number}
  85339. * @private
  85340. * @default 0
  85341. * @since 3.0.0
  85342. */
  85343. this._direction = 0;
  85344. this.updateSource();
  85345. },
  85346. /**
  85347. * Update the {@link Phaser.GameObjects.Particles.Zones.EdgeZone#points} from the EdgeZone's
  85348. * {@link Phaser.GameObjects.Particles.Zones.EdgeZone#source}.
  85349. *
  85350. * Also updates internal properties.
  85351. *
  85352. * @method Phaser.GameObjects.Particles.Zones.EdgeZone#updateSource
  85353. * @since 3.0.0
  85354. *
  85355. * @return {Phaser.GameObjects.Particles.Zones.EdgeZone} This Edge Zone.
  85356. */
  85357. updateSource: function ()
  85358. {
  85359. this.points = this.source.getPoints(this.quantity, this.stepRate);
  85360. // Remove ends?
  85361. if (this.seamless)
  85362. {
  85363. var a = this.points[0];
  85364. var b = this.points[this.points.length - 1];
  85365. if (a.x === b.x && a.y === b.y)
  85366. {
  85367. this.points.pop();
  85368. }
  85369. }
  85370. var oldLength = this._length;
  85371. this._length = this.points.length;
  85372. // Adjust counter if we now have less points than before
  85373. if (this._length < oldLength && this.counter > this._length)
  85374. {
  85375. this.counter = this._length - 1;
  85376. }
  85377. return this;
  85378. },
  85379. /**
  85380. * Change the EdgeZone's source.
  85381. *
  85382. * @method Phaser.GameObjects.Particles.Zones.EdgeZone#changeSource
  85383. * @since 3.0.0
  85384. *
  85385. * @param {EdgeZoneSource} source - An object instance with a `getPoints(quantity, stepRate)` method returning an array of points.
  85386. *
  85387. * @return {Phaser.GameObjects.Particles.Zones.EdgeZone} This Edge Zone.
  85388. */
  85389. changeSource: function (source)
  85390. {
  85391. this.source = source;
  85392. return this.updateSource();
  85393. },
  85394. /**
  85395. * Get the next point in the Zone and set its coordinates on the given Particle.
  85396. *
  85397. * @method Phaser.GameObjects.Particles.Zones.EdgeZone#getPoint
  85398. * @since 3.0.0
  85399. *
  85400. * @param {Phaser.GameObjects.Particles.Particle} particle - The Particle.
  85401. */
  85402. getPoint: function (particle)
  85403. {
  85404. if (this._direction === 0)
  85405. {
  85406. this.counter++;
  85407. if (this.counter >= this._length)
  85408. {
  85409. if (this.yoyo)
  85410. {
  85411. this._direction = 1;
  85412. this.counter = this._length - 1;
  85413. }
  85414. else
  85415. {
  85416. this.counter = 0;
  85417. }
  85418. }
  85419. }
  85420. else
  85421. {
  85422. this.counter--;
  85423. if (this.counter === -1)
  85424. {
  85425. if (this.yoyo)
  85426. {
  85427. this._direction = 0;
  85428. this.counter = 0;
  85429. }
  85430. else
  85431. {
  85432. this.counter = this._length - 1;
  85433. }
  85434. }
  85435. }
  85436. var point = this.points[this.counter];
  85437. if (point)
  85438. {
  85439. particle.x = point.x;
  85440. particle.y = point.y;
  85441. }
  85442. }
  85443. });
  85444. module.exports = EdgeZone;
  85445. /***/ }),
  85446. /* 426 */
  85447. /***/ (function(module, exports, __webpack_require__) {
  85448. /**
  85449. * @author Richard Davey <rich@photonstorm.com>
  85450. * @copyright 2018 Photon Storm Ltd.
  85451. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  85452. */
  85453. var Class = __webpack_require__(0);
  85454. /**
  85455. * @callback DeathZoneSourceCallback
  85456. *
  85457. * @param {number} x - The x coordinate of the particle to check against this source area.
  85458. * @param {number} y - The y coordinate of the particle to check against this source area.
  85459. *
  85460. * @return {boolean} - True if the coordinates are within the source area.
  85461. */
  85462. /**
  85463. * @typedef {object} DeathZoneSource
  85464. *
  85465. * @property {DeathZoneSourceCallback} contains
  85466. *
  85467. * @see Phaser.Geom.Circle
  85468. * @see Phaser.Geom.Ellipse
  85469. * @see Phaser.Geom.Polygon
  85470. * @see Phaser.Geom.Rectangle
  85471. * @see Phaser.Geom.Triangle
  85472. */
  85473. /**
  85474. * @classdesc
  85475. * A Death Zone.
  85476. *
  85477. * A Death Zone is a special type of zone that will kill a Particle as soon as it either enters, or leaves, the zone.
  85478. *
  85479. * The zone consists of a `source` which could be a Geometric shape, such as a Rectangle or Ellipse, or your own
  85480. * object as long as it includes a `contains` method for which the Particles can be tested against.
  85481. *
  85482. * @class DeathZone
  85483. * @memberOf Phaser.GameObjects.Particles.Zones
  85484. * @constructor
  85485. * @since 3.0.0
  85486. *
  85487. * @param {DeathZoneSource} source - An object instance that has a `contains` method that returns a boolean when given `x` and `y` arguments.
  85488. * @param {boolean} killOnEnter - Should the Particle be killed when it enters the zone? `true` or leaves it? `false`
  85489. */
  85490. var DeathZone = new Class({
  85491. initialize:
  85492. function DeathZone (source, killOnEnter)
  85493. {
  85494. /**
  85495. * An object instance that has a `contains` method that returns a boolean when given `x` and `y` arguments.
  85496. * This could be a Geometry shape, such as `Phaser.Geom.Circle`, or your own custom object.
  85497. *
  85498. * @name Phaser.GameObjects.Particles.Zones.DeathZone#source
  85499. * @type {DeathZoneSource}
  85500. * @since 3.0.0
  85501. */
  85502. this.source = source;
  85503. /**
  85504. * Set to `true` if the Particle should be killed if it enters this zone.
  85505. * Set to `false` to kill the Particle if it leaves this zone.
  85506. *
  85507. * @name Phaser.GameObjects.Particles.Zones.DeathZone#killOnEnter
  85508. * @type {boolean}
  85509. * @since 3.0.0
  85510. */
  85511. this.killOnEnter = killOnEnter;
  85512. },
  85513. /**
  85514. * Checks if the given Particle will be killed or not by this zone.
  85515. *
  85516. * @method Phaser.GameObjects.Particles.Zones.DeathZone#willKill
  85517. * @since 3.0.0
  85518. *
  85519. * @param {Phaser.GameObjects.Particles.Particle} particle - The Particle to be checked against this zone.
  85520. *
  85521. * @return {boolean} Return `true` if the Particle is to be killed, otherwise return `false`.
  85522. */
  85523. willKill: function (particle)
  85524. {
  85525. var withinZone = this.source.contains(particle.x, particle.y);
  85526. return (withinZone && this.killOnEnter || !withinZone && !this.killOnEnter);
  85527. }
  85528. });
  85529. module.exports = DeathZone;
  85530. /***/ }),
  85531. /* 427 */
  85532. /***/ (function(module, exports, __webpack_require__) {
  85533. /**
  85534. * @author Richard Davey <rich@photonstorm.com>
  85535. * @copyright 2018 Photon Storm Ltd.
  85536. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  85537. */
  85538. var BlendModes = __webpack_require__(52);
  85539. var Class = __webpack_require__(0);
  85540. var Components = __webpack_require__(17);
  85541. var DeathZone = __webpack_require__(426);
  85542. var EdgeZone = __webpack_require__(425);
  85543. var EmitterOp = __webpack_require__(902);
  85544. var GetFastValue = __webpack_require__(1);
  85545. var GetRandom = __webpack_require__(149);
  85546. var HasAny = __webpack_require__(424);
  85547. var HasValue = __webpack_require__(111);
  85548. var Particle = __webpack_require__(428);
  85549. var RandomZone = __webpack_require__(423);
  85550. var Rectangle = __webpack_require__(13);
  85551. var StableSort = __webpack_require__(83);
  85552. var Vector2 = __webpack_require__(6);
  85553. var Wrap = __webpack_require__(40);
  85554. /**
  85555. * @callback ParticleEmitterCallback
  85556. *
  85557. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle associated with the call.
  85558. * @param {Phaser.GameObjects.Particles.ParticleEmitter} emitter - This particle emitter associated with the call.
  85559. */
  85560. /**
  85561. * @callback ParticleDeathCallback
  85562. *
  85563. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle that died.
  85564. */
  85565. /**
  85566. * @typedef {object} ParticleEmitterBounds
  85567. *
  85568. * @property {number} x - The left edge of the rectangle.
  85569. * @property {number} y - The top edge of the rectangle.
  85570. * @property {number} width - The width of the rectangle.
  85571. * @property {number} height - The height of the rectangle.
  85572. *
  85573. * @see Phaser.GameObjects.Particles.ParticleEmitter#setBounds
  85574. */
  85575. /**
  85576. * @typedef {object} ParticleEmitterBoundsAlt
  85577. *
  85578. * @property {number} x - The left edge of the rectangle.
  85579. * @property {number} y - The top edge of the rectangle.
  85580. * @property {number} w - The width of the rectangle.
  85581. * @property {number} h - The height of the rectangle.
  85582. *
  85583. * @see Phaser.GameObjects.Particles.ParticleEmitter#setBounds
  85584. */
  85585. /**
  85586. * @typedef {object} ParticleEmitterDeathZoneConfig
  85587. *
  85588. * @property {DeathZoneSource} source - A shape representing the zone. See {@link Phaser.GameObjects.Particles.Zones.DeathZone#source}.
  85589. * @property {string} [type='onEnter'] - 'onEnter' or 'onLeave'.
  85590. */
  85591. /**
  85592. * @typedef {object} ParticleEmitterEdgeZoneConfig
  85593. *
  85594. * @property {EdgeZoneSource} source - A shape representing the zone. See {@link Phaser.GameObjects.Particles.Zones.EdgeZone#source}.
  85595. * @property {string} type - 'edge'.
  85596. * @property {integer} quantity - The number of particles to place on the source edge. Set to 0 to use `stepRate` instead.
  85597. * @property {number} [stepRate] - The distance between each particle. When set, `quantity` is implied and should be set to 0.
  85598. * @property {boolean} [yoyo=false] - Whether particles are placed from start to end and then end to start.
  85599. * @property {boolean} [seamless=true] - Whether one endpoint will be removed if it's identical to the other.
  85600. */
  85601. /**
  85602. * @typedef {object} ParticleEmitterRandomZoneConfig
  85603. *
  85604. * @property {RandomZoneSource} source - A shape representing the zone. See {@link Phaser.GameObjects.Particles.Zones.RandomZone#source}.
  85605. * @property {string} [type] - 'random'.
  85606. */
  85607. /**
  85608. * @typedef {object} ParticleEmitterConfig
  85609. *
  85610. * @property {boolean} [active] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#active}.
  85611. * @property {integer} [blendMode] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#blendMode}.
  85612. * @property {*} [callbackScope] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallbackScope} and {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallbackScope}.
  85613. * @property {boolean} [collideBottom] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideBottom}.
  85614. * @property {boolean} [collideLeft] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideLeft}.
  85615. * @property {boolean} [collideRight] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideRight}.
  85616. * @property {boolean} [collideTop] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#collideTop}.
  85617. * @property {boolean} [deathCallback] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallback}.
  85618. * @property {*} [deathCallbackScope] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallbackScope}.
  85619. * @property {function} [emitCallback] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallback}.
  85620. * @property {*} [emitCallbackScope] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallbackScope}.
  85621. * @property {Phaser.GameObjects.GameObject} [follow] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#follow}.
  85622. * @property {number} [frequency] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#frequency}.
  85623. * @property {number} [gravityX] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#gravityX}.
  85624. * @property {number} [gravityY] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#gravityY}.
  85625. * @property {integer} [maxParticles] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxParticles}.
  85626. * @property {string} [name] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#name}.
  85627. * @property {boolean} [on] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#on}.
  85628. * @property {boolean} [particleBringToTop] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleBringToTop}.
  85629. * @property {Phaser.GameObjects.Particles.Particle} [particleClass] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#particleClass}.
  85630. * @property {boolean} [radial] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#radial}.
  85631. * @property {number} [timeScale] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#timeScale}.
  85632. * @property {boolean} [trackVisible] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#trackVisible}.
  85633. * @property {boolean} [visible] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#visible}.
  85634. * @property {number|number[]|EmitterOpOnEmitCallback|object} [accelerationX] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#accelerationX} (emit only).
  85635. * @property {number|number[]|EmitterOpOnEmitCallback|object} [accelerationY] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#accelerationY} (emit only).
  85636. * @property {number|number[]|EmitterOpOnUpdateCallback|object} [alpha] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#alpha}.
  85637. * @property {number|number[]|EmitterOpOnEmitCallback|object} [angle] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#angle} (emit only)
  85638. * @property {number|number[]|EmitterOpOnEmitCallback|object} [bounce] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#bounce} (emit only).
  85639. * @property {number|number[]|EmitterOpOnEmitCallback|object} [delay] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#delay} (emit only).
  85640. * @property {number|number[]|EmitterOpOnEmitCallback|object} [lifespan] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#lifespan} (emit only).
  85641. * @property {number|number[]|EmitterOpOnEmitCallback|object} [maxVelocityX] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxVelocityX} (emit only).
  85642. * @property {number|number[]|EmitterOpOnEmitCallback|object} [maxVelocityY] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#maxVelocityY} (emit only).
  85643. * @property {number|number[]|EmitterOpOnEmitCallback|object} [moveToX] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#moveToX} (emit only).
  85644. * @property {number|number[]|EmitterOpOnEmitCallback|object} [moveToY] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#moveToY} (emit only).
  85645. * @property {number|number[]|EmitterOpOnEmitCallback|object} [quantity] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#quantity} (emit only).
  85646. * @property {number|number[]|EmitterOpOnUpdateCallback|object} [rotate] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#rotate}.
  85647. * @property {number|number[]|EmitterOpOnUpdateCallback|object} [scale] - As {@link Phaser.GameObjects.Particles.ParticleEmitter#setScale}.
  85648. * @property {number|number[]|EmitterOpOnUpdateCallback|object} [scaleX] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#scaleX}.
  85649. * @property {number|number[]|EmitterOpOnUpdateCallback|object} [scaleY] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#scaleY}.
  85650. * @property {number|number[]|EmitterOpOnEmitCallback|object} [speed] - As {@link Phaser.GameObjects.Particles.ParticleEmitter#setSpeed} (emit only).
  85651. * @property {number|number[]|EmitterOpOnEmitCallback|object} [speedX] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#speedX} (emit only).
  85652. * @property {number|number[]|EmitterOpOnEmitCallback|object} [speedY] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#speedY} (emit only).
  85653. * @property {number|number[]|EmitterOpOnEmitCallback|object} [tint] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#tint}.
  85654. * @property {number|number[]|EmitterOpOnEmitCallback|object} [x] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#x} (emit only).
  85655. * @property {number|number[]|EmitterOpOnEmitCallback|object} [y] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#y} (emit only).
  85656. * @property {object} [emitZone] - As {@link Phaser.GameObjects.Particles.ParticleEmitter#setEmitZone}.
  85657. * @property {ParticleEmitterBounds|ParticleEmitterBoundsAlt} [bounds] - As {@link Phaser.GameObjects.Particles.ParticleEmitter#setBounds}.
  85658. * @property {object} [followOffset] - Assigns to {@link Phaser.GameObjects.Particles.ParticleEmitter#followOffset}.
  85659. * @property {number} [followOffset.x] - x-coordinate of the offset.
  85660. * @property {number} [followOffset.y] - y-coordinate of the offset.
  85661. * @property {number|number[]|string|string[]|Phaser.Textures.Frame|Phaser.Textures.Frame[]|ParticleEmitterFrameConfig} [frames] - Sets {@link Phaser.GameObjects.Particles.ParticleEmitter#frames}.
  85662. */
  85663. /**
  85664. * @typedef {object} ParticleEmitterFrameConfig
  85665. *
  85666. * @property {number|number[]|string|string[]|Phaser.Textures.Frame|Phaser.Textures.Frame[]} [frames] - One or more texture frames.
  85667. * @property {boolean} [cycle] - Whether texture frames will be assigned consecutively (true) or at random (false).
  85668. * @property {integer} [quantity] - The number of consecutive particles receiving each texture frame, when `cycle` is true.
  85669. */
  85670. /**
  85671. * @classdesc
  85672. * A particle emitter represents a single particle stream.
  85673. * It controls a pool of {@link Phaser.GameObjects.Particles.Particle Particles} and is controlled by a {@link Phaser.GameObjects.Particles.ParticleEmitterManager Particle Emitter Manager}.
  85674. *
  85675. * @class ParticleEmitter
  85676. * @memberOf Phaser.GameObjects.Particles
  85677. * @constructor
  85678. * @since 3.0.0
  85679. *
  85680. * @extends Phaser.GameObjects.Components.BlendMode
  85681. * @extends Phaser.GameObjects.Components.Mask
  85682. * @extends Phaser.GameObjects.Components.ScrollFactor
  85683. * @extends Phaser.GameObjects.Components.Visible
  85684. *
  85685. * @param {Phaser.GameObjects.Particles.ParticleEmitterManager} manager - The Emitter Manager this Emitter belongs to.
  85686. * @param {ParticleEmitterConfig} config - Settings for this emitter.
  85687. */
  85688. var ParticleEmitter = new Class({
  85689. Mixins: [
  85690. Components.BlendMode,
  85691. Components.Mask,
  85692. Components.ScrollFactor,
  85693. Components.Visible
  85694. ],
  85695. initialize:
  85696. function ParticleEmitter (manager, config)
  85697. {
  85698. /**
  85699. * The Emitter Manager this Emitter belongs to.
  85700. *
  85701. * @name Phaser.GameObjects.Particles.ParticleEmitter#manager
  85702. * @type {Phaser.GameObjects.Particles.ParticleEmitterManager}
  85703. * @since 3.0.0
  85704. */
  85705. this.manager = manager;
  85706. /**
  85707. * The texture assigned to particles.
  85708. *
  85709. * @name Phaser.GameObjects.Particles.ParticleEmitter#texture
  85710. * @type {Phaser.Textures.Texture}
  85711. * @since 3.0.0
  85712. */
  85713. this.texture = manager.texture;
  85714. /**
  85715. * The texture frames assigned to particles.
  85716. *
  85717. * @name Phaser.GameObjects.Particles.ParticleEmitter#frames
  85718. * @type {Phaser.Textures.Frame[]}
  85719. * @since 3.0.0
  85720. */
  85721. this.frames = [ manager.defaultFrame ];
  85722. /**
  85723. * The default texture frame assigned to particles.
  85724. *
  85725. * @name Phaser.GameObjects.Particles.ParticleEmitter#defaultFrame
  85726. * @type {Phaser.Textures.Frame}
  85727. * @since 3.0.0
  85728. */
  85729. this.defaultFrame = manager.defaultFrame;
  85730. /**
  85731. * Names of simple configuration properties.
  85732. *
  85733. * @name Phaser.GameObjects.Particles.ParticleEmitter#configFastMap
  85734. * @type {object}
  85735. * @since 3.0.0
  85736. */
  85737. this.configFastMap = [
  85738. 'active',
  85739. 'blendMode',
  85740. 'collideBottom',
  85741. 'collideLeft',
  85742. 'collideRight',
  85743. 'collideTop',
  85744. 'deathCallback',
  85745. 'deathCallbackScope',
  85746. 'emitCallback',
  85747. 'emitCallbackScope',
  85748. 'follow',
  85749. 'frequency',
  85750. 'gravityX',
  85751. 'gravityY',
  85752. 'maxParticles',
  85753. 'name',
  85754. 'on',
  85755. 'particleBringToTop',
  85756. 'particleClass',
  85757. 'radial',
  85758. 'timeScale',
  85759. 'trackVisible',
  85760. 'visible'
  85761. ];
  85762. /**
  85763. * Names of complex configuration properties.
  85764. *
  85765. * @name Phaser.GameObjects.Particles.ParticleEmitter#configOpMap
  85766. * @type {object}
  85767. * @since 3.0.0
  85768. */
  85769. this.configOpMap = [
  85770. 'accelerationX',
  85771. 'accelerationY',
  85772. 'angle',
  85773. 'alpha',
  85774. 'bounce',
  85775. 'delay',
  85776. 'lifespan',
  85777. 'maxVelocityX',
  85778. 'maxVelocityY',
  85779. 'moveToX',
  85780. 'moveToY',
  85781. 'quantity',
  85782. 'rotate',
  85783. 'scaleX',
  85784. 'scaleY',
  85785. 'speedX',
  85786. 'speedY',
  85787. 'tint',
  85788. 'x',
  85789. 'y'
  85790. ];
  85791. /**
  85792. * The name of this Particle Emitter.
  85793. *
  85794. * Empty by default and never populated by Phaser, this is left for developers to use.
  85795. *
  85796. * @name Phaser.GameObjects.Particles.ParticleEmitter#name
  85797. * @type {string}
  85798. * @default ''
  85799. * @since 3.0.0
  85800. */
  85801. this.name = '';
  85802. /**
  85803. * The Particle Class which will be emitted by this Emitter.
  85804. *
  85805. * @name Phaser.GameObjects.Particles.ParticleEmitter#particleClass
  85806. * @type {Phaser.GameObjects.Particles.Particle}
  85807. * @default Phaser.GameObjects.Particles.Particle
  85808. * @since 3.0.0
  85809. */
  85810. this.particleClass = Particle;
  85811. /**
  85812. * The x-coordinate of the particle origin (where particles will be emitted).
  85813. *
  85814. * @name Phaser.GameObjects.Particles.ParticleEmitter#x
  85815. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85816. * @default 0
  85817. * @since 3.0.0
  85818. * @see Phaser.GameObjects.Particles.ParticleEmitter#setPosition
  85819. */
  85820. this.x = new EmitterOp(config, 'x', 0);
  85821. /**
  85822. * The y-coordinate of the particle origin (where particles will be emitted).
  85823. *
  85824. * @name Phaser.GameObjects.Particles.ParticleEmitter#y
  85825. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85826. * @default 0
  85827. * @since 3.0.0
  85828. * @see Phaser.GameObjects.Particles.ParticleEmitter#setPosition
  85829. */
  85830. this.y = new EmitterOp(config, 'y', 0);
  85831. /**
  85832. * A radial emitter will emit particles in all directions between angle min and max,
  85833. * using {@link Phaser.GameObjects.Particles.ParticleEmitter#speed} as the value. If set to false then this acts as a point Emitter.
  85834. * A point emitter will emit particles only in the direction derived from the speedX and speedY values.
  85835. *
  85836. * @name Phaser.GameObjects.Particles.ParticleEmitter#radial
  85837. * @type {boolean}
  85838. * @default true
  85839. * @since 3.0.0
  85840. * @see Phaser.GameObjects.Particles.ParticleEmitter#setRadial
  85841. */
  85842. this.radial = true;
  85843. /**
  85844. * Horizontal acceleration applied to emitted particles, in pixels per second squared.
  85845. *
  85846. * @name Phaser.GameObjects.Particles.ParticleEmitter#gravityX
  85847. * @type {number}
  85848. * @default 0
  85849. * @since 3.0.0
  85850. * @see Phaser.GameObjects.Particles.ParticleEmitter#setGravity
  85851. */
  85852. this.gravityX = 0;
  85853. /**
  85854. * Vertical acceleration applied to emitted particles, in pixels per second squared.
  85855. *
  85856. * @name Phaser.GameObjects.Particles.ParticleEmitter#gravityY
  85857. * @type {number}
  85858. * @default 0
  85859. * @since 3.0.0
  85860. * @see Phaser.GameObjects.Particles.ParticleEmitter#setGravity
  85861. */
  85862. this.gravityY = 0;
  85863. /**
  85864. * Whether accelerationX and accelerationY are non-zero. Set automatically during configuration.
  85865. *
  85866. * @name Phaser.GameObjects.Particles.ParticleEmitter#acceleration
  85867. * @type {boolean}
  85868. * @default false
  85869. * @since 3.0.0
  85870. */
  85871. this.acceleration = false;
  85872. /**
  85873. * Horizontal acceleration applied to emitted particles, in pixels per second squared.
  85874. *
  85875. * @name Phaser.GameObjects.Particles.ParticleEmitter#accelerationX
  85876. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85877. * @default 0
  85878. * @since 3.0.0
  85879. */
  85880. this.accelerationX = new EmitterOp(config, 'accelerationX', 0, true);
  85881. /**
  85882. * Vertical acceleration applied to emitted particles, in pixels per second squared.
  85883. *
  85884. * @name Phaser.GameObjects.Particles.ParticleEmitter#accelerationY
  85885. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85886. * @default 0
  85887. * @since 3.0.0
  85888. */
  85889. this.accelerationY = new EmitterOp(config, 'accelerationY', 0, true);
  85890. /**
  85891. * The maximum horizontal velocity of emitted particles, in pixels per second squared.
  85892. *
  85893. * @name Phaser.GameObjects.Particles.ParticleEmitter#maxVelocityX
  85894. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85895. * @default 10000
  85896. * @since 3.0.0
  85897. */
  85898. this.maxVelocityX = new EmitterOp(config, 'maxVelocityX', 10000, true);
  85899. /**
  85900. * The maximum vertical velocity of emitted particles, in pixels per second squared.
  85901. *
  85902. * @name Phaser.GameObjects.Particles.ParticleEmitter#maxVelocityY
  85903. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85904. * @default 10000
  85905. * @since 3.0.0
  85906. */
  85907. this.maxVelocityY = new EmitterOp(config, 'maxVelocityY', 10000, true);
  85908. /**
  85909. * The initial horizontal speed of emitted particles, in pixels per second.
  85910. *
  85911. * @name Phaser.GameObjects.Particles.ParticleEmitter#speedX
  85912. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85913. * @default 0
  85914. * @since 3.0.0
  85915. * @see Phaser.GameObjects.Particles.ParticleEmitter#setSpeedX
  85916. */
  85917. this.speedX = new EmitterOp(config, 'speedX', 0, true);
  85918. /**
  85919. * The initial vertical speed of emitted particles, in pixels per second.
  85920. *
  85921. * @name Phaser.GameObjects.Particles.ParticleEmitter#speedY
  85922. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85923. * @default 0
  85924. * @since 3.0.0
  85925. * @see Phaser.GameObjects.Particles.ParticleEmitter#setSpeedY
  85926. */
  85927. this.speedY = new EmitterOp(config, 'speedY', 0, true);
  85928. /**
  85929. * Whether moveToX and moveToY are nonzero. Set automatically during configuration.
  85930. *
  85931. * @name Phaser.GameObjects.Particles.ParticleEmitter#moveTo
  85932. * @type {boolean}
  85933. * @default false
  85934. * @since 3.0.0
  85935. */
  85936. this.moveTo = false;
  85937. /**
  85938. * The x-coordinate emitted particles move toward, when {@link Phaser.GameObjects.Particles.ParticleEmitter#moveTo} is true.
  85939. *
  85940. * @name Phaser.GameObjects.Particles.ParticleEmitter#moveToX
  85941. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85942. * @default 0
  85943. * @since 3.0.0
  85944. */
  85945. this.moveToX = new EmitterOp(config, 'moveToX', 0, true);
  85946. /**
  85947. * The y-coordinate emitted particles move toward, when {@link Phaser.GameObjects.Particles.ParticleEmitter#moveTo} is true.
  85948. *
  85949. * @name Phaser.GameObjects.Particles.ParticleEmitter#moveToY
  85950. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85951. * @default 0
  85952. * @since 3.0.0
  85953. */
  85954. this.moveToY = new EmitterOp(config, 'moveToY', 0, true);
  85955. /**
  85956. * Whether particles will rebound when they meet the emitter bounds.
  85957. *
  85958. * @name Phaser.GameObjects.Particles.ParticleEmitter#bounce
  85959. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85960. * @default 0
  85961. * @since 3.0.0
  85962. */
  85963. this.bounce = new EmitterOp(config, 'bounce', 0, true);
  85964. /**
  85965. * The horizontal scale of emitted particles.
  85966. *
  85967. * @name Phaser.GameObjects.Particles.ParticleEmitter#scaleX
  85968. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85969. * @default 1
  85970. * @since 3.0.0
  85971. * @see Phaser.GameObjects.Particles.ParticleEmitter#setScale
  85972. * @see Phaser.GameObjects.Particles.ParticleEmitter#setScaleX
  85973. */
  85974. this.scaleX = new EmitterOp(config, 'scaleX', 1);
  85975. /**
  85976. * The vertical scale of emitted particles.
  85977. *
  85978. * @name Phaser.GameObjects.Particles.ParticleEmitter#scaleY
  85979. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85980. * @default 1
  85981. * @since 3.0.0
  85982. * @see Phaser.GameObjects.Particles.ParticleEmitter#setScale
  85983. * @see Phaser.GameObjects.Particles.ParticleEmitter#setScaleY
  85984. */
  85985. this.scaleY = new EmitterOp(config, 'scaleY', 1);
  85986. /**
  85987. * Color tint applied to emitted particles. Any alpha component (0xAA000000) is ignored.
  85988. *
  85989. * @name Phaser.GameObjects.Particles.ParticleEmitter#tint
  85990. * @type {Phaser.GameObjects.Particles.EmitterOp}
  85991. * @default 0xffffffff
  85992. * @since 3.0.0
  85993. */
  85994. this.tint = new EmitterOp(config, 'tint', 0xffffffff);
  85995. /**
  85996. * The alpha (transparency) of emitted particles.
  85997. *
  85998. * @name Phaser.GameObjects.Particles.ParticleEmitter#alpha
  85999. * @type {Phaser.GameObjects.Particles.EmitterOp}
  86000. * @default 1
  86001. * @since 3.0.0
  86002. * @see Phaser.GameObjects.Particles.ParticleEmitter#setAlpha
  86003. */
  86004. this.alpha = new EmitterOp(config, 'alpha', 1);
  86005. /**
  86006. * The lifespan of emitted particles, in ms.
  86007. *
  86008. * @name Phaser.GameObjects.Particles.ParticleEmitter#lifespan
  86009. * @type {Phaser.GameObjects.Particles.EmitterOp}
  86010. * @default 1000
  86011. * @since 3.0.0
  86012. * @see Phaser.GameObjects.Particles.ParticleEmitter#setLifespan
  86013. */
  86014. this.lifespan = new EmitterOp(config, 'lifespan', 1000);
  86015. /**
  86016. * The angle of the initial velocity of emitted particles, in degrees.
  86017. *
  86018. * @name Phaser.GameObjects.Particles.ParticleEmitter#angle
  86019. * @type {Phaser.GameObjects.Particles.EmitterOp}
  86020. * @default { min: 0, max: 360 }
  86021. * @since 3.0.0
  86022. * @see Phaser.GameObjects.Particles.ParticleEmitter#setAngle
  86023. */
  86024. this.angle = new EmitterOp(config, 'angle', { min: 0, max: 360 });
  86025. /**
  86026. * The rotation of emitted particles, in degrees.
  86027. *
  86028. * @name Phaser.GameObjects.Particles.ParticleEmitter#rotate
  86029. * @type {Phaser.GameObjects.Particles.EmitterOp}
  86030. * @default 0
  86031. * @since 3.0.0
  86032. */
  86033. this.rotate = new EmitterOp(config, 'rotate', 0);
  86034. /**
  86035. * A function to call when a particle is emitted.
  86036. *
  86037. * @name Phaser.GameObjects.Particles.ParticleEmitter#emitCallback
  86038. * @type {?ParticleEmitterCallback}
  86039. * @default null
  86040. * @since 3.0.0
  86041. */
  86042. this.emitCallback = null;
  86043. /**
  86044. * The calling context for {@link Phaser.GameObjects.Particles.ParticleEmitter#emitCallback}.
  86045. *
  86046. * @name Phaser.GameObjects.Particles.ParticleEmitter#emitCallbackScope
  86047. * @type {?*}
  86048. * @default null
  86049. * @since 3.0.0
  86050. */
  86051. this.emitCallbackScope = null;
  86052. /**
  86053. * A function to call when a particle dies.
  86054. *
  86055. * @name Phaser.GameObjects.Particles.ParticleEmitter#deathCallback
  86056. * @type {?ParticleDeathCallback}
  86057. * @default null
  86058. * @since 3.0.0
  86059. */
  86060. this.deathCallback = null;
  86061. /**
  86062. * The calling context for {@link Phaser.GameObjects.Particles.ParticleEmitter#deathCallback}.
  86063. *
  86064. * @name Phaser.GameObjects.Particles.ParticleEmitter#deathCallbackScope
  86065. * @type {?*}
  86066. * @default null
  86067. * @since 3.0.0
  86068. */
  86069. this.deathCallbackScope = null;
  86070. /**
  86071. * Set to hard limit the amount of particle objects this emitter is allowed to create.
  86072. * 0 means unlimited.
  86073. *
  86074. * @name Phaser.GameObjects.Particles.ParticleEmitter#maxParticles
  86075. * @type {integer}
  86076. * @default 0
  86077. * @since 3.0.0
  86078. */
  86079. this.maxParticles = 0;
  86080. /**
  86081. * How many particles are emitted each time particles are emitted (one explosion or one flow cycle).
  86082. *
  86083. * @name Phaser.GameObjects.Particles.ParticleEmitter#quantity
  86084. * @type {Phaser.GameObjects.Particles.EmitterOp}
  86085. * @default 1
  86086. * @since 3.0.0
  86087. * @see Phaser.GameObjects.Particles.ParticleEmitter#setFrequency
  86088. * @see Phaser.GameObjects.Particles.ParticleEmitter#setQuantity
  86089. */
  86090. this.quantity = new EmitterOp(config, 'quantity', 1, true);
  86091. /**
  86092. * How many ms to wait after emission before the particles start updating.
  86093. *
  86094. * @name Phaser.GameObjects.Particles.ParticleEmitter#delay
  86095. * @type {Phaser.GameObjects.Particles.EmitterOp}
  86096. * @default 0
  86097. * @since 3.0.0
  86098. */
  86099. this.delay = new EmitterOp(config, 'delay', 0, true);
  86100. /**
  86101. * For a flow emitter, the time interval (>= 0) between particle flow cycles in ms.
  86102. * A value of 0 means there is one particle flow cycle for each logic update (the maximum flow frequency). This is the default setting.
  86103. * For an exploding emitter, this value will be -1.
  86104. * Calling {@link Phaser.GameObjects.Particles.ParticleEmitter#flow} also puts the emitter in flow mode (frequency >= 0).
  86105. * Calling {@link Phaser.GameObjects.Particles.ParticleEmitter#explode} also puts the emitter in explode mode (frequency = -1).
  86106. *
  86107. * @name Phaser.GameObjects.Particles.ParticleEmitter#frequency
  86108. * @type {number}
  86109. * @default 0
  86110. * @since 3.0.0
  86111. * @see Phaser.GameObjects.Particles.ParticleEmitter#setFrequency
  86112. */
  86113. this.frequency = 0;
  86114. /**
  86115. * Controls if the emitter is currently emitting a particle flow (when frequency >= 0).
  86116. * Already alive particles will continue to update until they expire.
  86117. * Controlled by {@link Phaser.GameObjects.Particles.ParticleEmitter#start} and {@link Phaser.GameObjects.Particles.ParticleEmitter#stop}.
  86118. *
  86119. * @name Phaser.GameObjects.Particles.ParticleEmitter#on
  86120. * @type {boolean}
  86121. * @default true
  86122. * @since 3.0.0
  86123. */
  86124. this.on = true;
  86125. /**
  86126. * Newly emitted particles are added to the top of the particle list, i.e. rendered above those already alive.
  86127. * Set to false to send them to the back.
  86128. *
  86129. * @name Phaser.GameObjects.Particles.ParticleEmitter#particleBringToTop
  86130. * @type {boolean}
  86131. * @default true
  86132. * @since 3.0.0
  86133. */
  86134. this.particleBringToTop = true;
  86135. /**
  86136. * The time rate applied to active particles, affecting lifespan, movement, and tweens. Values larger than 1 are faster than normal.
  86137. *
  86138. * @name Phaser.GameObjects.Particles.ParticleEmitter#timeScale
  86139. * @type {number}
  86140. * @default 1
  86141. * @since 3.0.0
  86142. */
  86143. this.timeScale = 1;
  86144. /**
  86145. * An object describing a shape to emit particles from.
  86146. *
  86147. * @name Phaser.GameObjects.Particles.ParticleEmitter#emitZone
  86148. * @type {?Phaser.GameObjects.Particles.Zones.EdgeZone|Phaser.GameObjects.Particles.Zones.RandomZone}
  86149. * @default null
  86150. * @since 3.0.0
  86151. * @see Phaser.GameObjects.Particles.ParticleEmitter#setEmitZone
  86152. */
  86153. this.emitZone = null;
  86154. /**
  86155. * An object describing a shape that deactivates particles when they interact with it.
  86156. *
  86157. * @name Phaser.GameObjects.Particles.ParticleEmitter#deathZone
  86158. * @type {?Phaser.GameObjects.Particles.Zones.DeathZone}
  86159. * @default null
  86160. * @since 3.0.0
  86161. * @see Phaser.GameObjects.Particles.ParticleEmitter#setDeathZone
  86162. */
  86163. this.deathZone = null;
  86164. /**
  86165. * A rectangular boundary constraining particle movement.
  86166. *
  86167. * @name Phaser.GameObjects.Particles.ParticleEmitter#bounds
  86168. * @type {?Phaser.Geom.Rectangle}
  86169. * @default null
  86170. * @since 3.0.0
  86171. * @see Phaser.GameObjects.Particles.ParticleEmitter#setBounds
  86172. */
  86173. this.bounds = null;
  86174. /**
  86175. * Whether particles interact with the left edge of the emitter {@link Phaser.GameObjects.Particles.ParticleEmitter#bounds}.
  86176. *
  86177. * @name Phaser.GameObjects.Particles.ParticleEmitter#collideLeft
  86178. * @type {boolean}
  86179. * @default true
  86180. * @since 3.0.0
  86181. */
  86182. this.collideLeft = true;
  86183. /**
  86184. * Whether particles interact with the right edge of the emitter {@link Phaser.GameObjects.Particles.ParticleEmitter#bounds}.
  86185. *
  86186. * @name Phaser.GameObjects.Particles.ParticleEmitter#collideRight
  86187. * @type {boolean}
  86188. * @default true
  86189. * @since 3.0.0
  86190. */
  86191. this.collideRight = true;
  86192. /**
  86193. * Whether particles interact with the top edge of the emitter {@link Phaser.GameObjects.Particles.ParticleEmitter#bounds}.
  86194. *
  86195. * @name Phaser.GameObjects.Particles.ParticleEmitter#collideTop
  86196. * @type {boolean}
  86197. * @default true
  86198. * @since 3.0.0
  86199. */
  86200. this.collideTop = true;
  86201. /**
  86202. * Whether particles interact with the bottom edge of the emitter {@link Phaser.GameObjects.Particles.ParticleEmitter#bounds}.
  86203. *
  86204. * @name Phaser.GameObjects.Particles.ParticleEmitter#collideBottom
  86205. * @type {boolean}
  86206. * @default true
  86207. * @since 3.0.0
  86208. */
  86209. this.collideBottom = true;
  86210. /**
  86211. * Whether this emitter updates itself and its particles.
  86212. *
  86213. * Controlled by {@link Phaser.GameObjects.Particles.ParticleEmitter#pause}
  86214. * and {@link Phaser.GameObjects.Particles.ParticleEmitter#resume}.
  86215. *
  86216. * @name Phaser.GameObjects.Particles.ParticleEmitter#active
  86217. * @type {boolean}
  86218. * @default true
  86219. * @since 3.0.0
  86220. */
  86221. this.active = true;
  86222. /**
  86223. * Set this to false to hide any active particles.
  86224. *
  86225. * @name Phaser.GameObjects.Particles.ParticleEmitter#visible
  86226. * @type {boolean}
  86227. * @default true
  86228. * @since 3.0.0
  86229. * @see Phaser.GameObjects.Particles.ParticleEmitter#setVisible
  86230. */
  86231. this.visible = true;
  86232. /**
  86233. * The blend mode of this emitter's particles.
  86234. *
  86235. * @name Phaser.GameObjects.Particles.ParticleEmitter#blendMode
  86236. * @type {integer}
  86237. * @since 3.0.0
  86238. * @see Phaser.GameObjects.Particles.ParticleEmitter#setBlendMode
  86239. */
  86240. this.blendMode = BlendModes.NORMAL;
  86241. /**
  86242. * A Game Object whose position is used as the particle origin.
  86243. *
  86244. * @name Phaser.GameObjects.Particles.ParticleEmitter#follow
  86245. * @type {?Phaser.GameObjects.GameObject}
  86246. * @default null
  86247. * @since 3.0.0
  86248. * @see Phaser.GameObjects.Particles.ParticleEmitter#startFollow
  86249. * @see Phaser.GameObjects.Particles.ParticleEmitter#stopFollow
  86250. */
  86251. this.follow = null;
  86252. /**
  86253. * The offset of the particle origin from the {@link Phaser.GameObjects.Particles.ParticleEmitter#follow} target.
  86254. *
  86255. * @name Phaser.GameObjects.Particles.ParticleEmitter#followOffset
  86256. * @type {Phaser.Math.Vector2}
  86257. * @since 3.0.0
  86258. * @see Phaser.GameObjects.Particles.ParticleEmitter#startFollow
  86259. */
  86260. this.followOffset = new Vector2();
  86261. /**
  86262. * Whether the emitter's {@link Phaser.GameObjects.Particles.ParticleEmitter#visible} state will track
  86263. * the {@link Phaser.GameObjects.Particles.ParticleEmitter#follow} target's visibility state.
  86264. *
  86265. * @name Phaser.GameObjects.Particles.ParticleEmitter#trackVisible
  86266. * @type {boolean}
  86267. * @default false
  86268. * @since 3.0.0
  86269. * @see Phaser.GameObjects.Particles.ParticleEmitter#startFollow
  86270. */
  86271. this.trackVisible = false;
  86272. /**
  86273. * The current texture frame, as an index of {@link Phaser.GameObjects.Particles.ParticleEmitter#frames}.
  86274. *
  86275. * @name Phaser.GameObjects.Particles.ParticleEmitter#currentFrame
  86276. * @type {integer}
  86277. * @default 0
  86278. * @since 3.0.0
  86279. * @see Phaser.GameObjects.Particles.ParticleEmitter#setFrame
  86280. */
  86281. this.currentFrame = 0;
  86282. /**
  86283. * Whether texture {@link Phaser.GameObjects.Particles.ParticleEmitter#frames} are selected at random.
  86284. *
  86285. * @name Phaser.GameObjects.Particles.ParticleEmitter#randomFrame
  86286. * @type {boolean}
  86287. * @default true
  86288. * @since 3.0.0
  86289. * @see Phaser.GameObjects.Particles.ParticleEmitter#setFrame
  86290. */
  86291. this.randomFrame = true;
  86292. /**
  86293. * The number of consecutive particles that receive a single texture frame (per frame cycle).
  86294. *
  86295. * @name Phaser.GameObjects.Particles.ParticleEmitter#frameQuantity
  86296. * @type {integer}
  86297. * @default 1
  86298. * @since 3.0.0
  86299. * @see Phaser.GameObjects.Particles.ParticleEmitter#setFrame
  86300. */
  86301. this.frameQuantity = 1;
  86302. /**
  86303. * Inactive particles.
  86304. *
  86305. * @name Phaser.GameObjects.Particles.ParticleEmitter#dead
  86306. * @type {Phaser.GameObjects.Particles.Particle[]}
  86307. * @private
  86308. * @since 3.0.0
  86309. */
  86310. this.dead = [];
  86311. /**
  86312. * Active particles
  86313. *
  86314. * @name Phaser.GameObjects.Particles.ParticleEmitter#alive
  86315. * @type {Phaser.GameObjects.Particles.Particle[]}
  86316. * @private
  86317. * @since 3.0.0
  86318. */
  86319. this.alive = [];
  86320. /**
  86321. * The time until the next flow cycle.
  86322. *
  86323. * @name Phaser.GameObjects.Particles.ParticleEmitter#_counter
  86324. * @type {number}
  86325. * @private
  86326. * @default 0
  86327. * @since 3.0.0
  86328. */
  86329. this._counter = 0;
  86330. /**
  86331. * Counts up to {@link Phaser.GameObjects.Particles.ParticleEmitter#frameQuantity}.
  86332. *
  86333. * @name Phaser.GameObjects.Particles.ParticleEmitter#_frameCounter
  86334. * @type {integer}
  86335. * @private
  86336. * @default 0
  86337. * @since 3.0.0
  86338. */
  86339. this._frameCounter = 0;
  86340. if (config)
  86341. {
  86342. this.fromJSON(config);
  86343. }
  86344. },
  86345. /**
  86346. * Merges configuration settings into the emitter's current settings.
  86347. *
  86348. * @method Phaser.GameObjects.Particles.ParticleEmitter#fromJSON
  86349. * @since 3.0.0
  86350. *
  86351. * @param {ParticleEmitterConfig} config - Settings for this emitter.
  86352. *
  86353. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86354. */
  86355. fromJSON: function (config)
  86356. {
  86357. if (!config)
  86358. {
  86359. return this;
  86360. }
  86361. // Only update properties from their current state if they exist in the given config
  86362. var i = 0;
  86363. var key = '';
  86364. for (i = 0; i < this.configFastMap.length; i++)
  86365. {
  86366. key = this.configFastMap[i];
  86367. if (HasValue(config, key))
  86368. {
  86369. this[key] = GetFastValue(config, key);
  86370. }
  86371. }
  86372. for (i = 0; i < this.configOpMap.length; i++)
  86373. {
  86374. key = this.configOpMap[i];
  86375. if (HasValue(config, key))
  86376. {
  86377. this[key].loadConfig(config);
  86378. }
  86379. }
  86380. this.acceleration = (this.accelerationX.propertyValue !== 0 || this.accelerationY.propertyValue !== 0);
  86381. this.moveTo = (this.moveToX.propertyValue !== 0 || this.moveToY.propertyValue !== 0);
  86382. // Special 'speed' override
  86383. if (HasValue(config, 'speed'))
  86384. {
  86385. this.speedX.loadConfig(config, 'speed');
  86386. this.speedY = null;
  86387. }
  86388. // If you specify speedX, speedY or moveTo then it changes the emitter from radial to a point emitter
  86389. if (HasAny(config, [ 'speedX', 'speedY' ]) || this.moveTo)
  86390. {
  86391. this.radial = false;
  86392. }
  86393. // Special 'scale' override
  86394. if (HasValue(config, 'scale'))
  86395. {
  86396. this.scaleX.loadConfig(config, 'scale');
  86397. this.scaleY = null;
  86398. }
  86399. if (HasValue(config, 'callbackScope'))
  86400. {
  86401. var callbackScope = GetFastValue(config, 'callbackScope', null);
  86402. this.emitCallbackScope = callbackScope;
  86403. this.deathCallbackScope = callbackScope;
  86404. }
  86405. if (HasValue(config, 'emitZone'))
  86406. {
  86407. this.setEmitZone(config.emitZone);
  86408. }
  86409. if (HasValue(config, 'deathZone'))
  86410. {
  86411. this.setDeathZone(config.deathZone);
  86412. }
  86413. if (HasValue(config, 'bounds'))
  86414. {
  86415. this.setBounds(config.bounds);
  86416. }
  86417. if (HasValue(config, 'followOffset'))
  86418. {
  86419. this.followOffset.setFromObject(GetFastValue(config, 'followOffset', 0));
  86420. }
  86421. if (HasValue(config, 'frame'))
  86422. {
  86423. this.setFrame(config.frame);
  86424. }
  86425. return this;
  86426. },
  86427. /**
  86428. * Creates a description of this emitter suitable for JSON serialization.
  86429. *
  86430. * @method Phaser.GameObjects.Particles.ParticleEmitter#toJSON
  86431. * @since 3.0.0
  86432. *
  86433. * @param {object} [output] - An object to copy output into.
  86434. *
  86435. * @return {object} - The output object.
  86436. */
  86437. toJSON: function (output)
  86438. {
  86439. if (output === undefined) { output = {}; }
  86440. var i = 0;
  86441. var key = '';
  86442. for (i = 0; i < this.configFastMap.length; i++)
  86443. {
  86444. key = this.configFastMap[i];
  86445. output[key] = this[key];
  86446. }
  86447. for (i = 0; i < this.configOpMap.length; i++)
  86448. {
  86449. key = this.configOpMap[i];
  86450. if (this[key])
  86451. {
  86452. output[key] = this[key].toJSON();
  86453. }
  86454. }
  86455. // special handlers
  86456. if (!this.speedY)
  86457. {
  86458. delete output.speedX;
  86459. output.speed = this.speedX.toJSON();
  86460. }
  86461. if (!this.scaleY)
  86462. {
  86463. delete output.scaleX;
  86464. output.scale = this.scaleX.toJSON();
  86465. }
  86466. return output;
  86467. },
  86468. /**
  86469. * Continuously moves the particle origin to follow a Game Object's position.
  86470. *
  86471. * @method Phaser.GameObjects.Particles.ParticleEmitter#startFollow
  86472. * @since 3.0.0
  86473. *
  86474. * @param {Phaser.GameObjects.GameObject} target - The Game Object to follow.
  86475. * @param {number} [offsetX=0] - Horizontal offset of the particle origin from the Game Object.
  86476. * @param {number} [offsetY=0] - Vertical offset of the particle origin from the Game Object.
  86477. * @param {boolean} [trackVisible=false] - Whether the emitter's visible state will track the target's visible state.
  86478. *
  86479. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86480. */
  86481. startFollow: function (target, offsetX, offsetY, trackVisible)
  86482. {
  86483. if (offsetX === undefined) { offsetX = 0; }
  86484. if (offsetY === undefined) { offsetY = 0; }
  86485. if (trackVisible === undefined) { trackVisible = false; }
  86486. this.follow = target;
  86487. this.followOffset.set(offsetX, offsetY);
  86488. this.trackVisible = trackVisible;
  86489. return this;
  86490. },
  86491. /**
  86492. * Stops following a Game Object.
  86493. *
  86494. * @method Phaser.GameObjects.Particles.ParticleEmitter#stopFollow
  86495. * @since 3.0.0
  86496. *
  86497. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86498. */
  86499. stopFollow: function ()
  86500. {
  86501. this.follow = null;
  86502. this.followOffset.set(0, 0);
  86503. this.trackVisible = false;
  86504. return this;
  86505. },
  86506. /**
  86507. * Chooses a texture frame from {@link Phaser.GameObjects.Particles.ParticleEmitter#frames}.
  86508. *
  86509. * @method Phaser.GameObjects.Particles.ParticleEmitter#getFrame
  86510. * @since 3.0.0
  86511. *
  86512. * @return {Phaser.Textures.Frame} The texture frame.
  86513. */
  86514. getFrame: function ()
  86515. {
  86516. if (this.frames.length === 1)
  86517. {
  86518. return this.defaultFrame;
  86519. }
  86520. else if (this.randomFrame)
  86521. {
  86522. return GetRandom(this.frames);
  86523. }
  86524. else
  86525. {
  86526. var frame = this.frames[this.currentFrame];
  86527. this._frameCounter++;
  86528. if (this._frameCounter === this.frameQuantity)
  86529. {
  86530. this._frameCounter = 0;
  86531. this.currentFrame = Wrap(this.currentFrame + 1, 0, this._frameLength);
  86532. }
  86533. return frame;
  86534. }
  86535. },
  86536. // frame: 0
  86537. // frame: 'red'
  86538. // frame: [ 0, 1, 2, 3 ]
  86539. // frame: [ 'red', 'green', 'blue', 'pink', 'white' ]
  86540. // frame: { frames: [ 'red', 'green', 'blue', 'pink', 'white' ], [cycle: bool], [quantity: int] }
  86541. /**
  86542. * Sets a pattern for assigning texture frames to emitted particles.
  86543. *
  86544. * @method Phaser.GameObjects.Particles.ParticleEmitter#setFrame
  86545. * @since 3.0.0
  86546. *
  86547. * @param {(array|string|integer|ParticleEmitterFrameConfig)} frames - One or more texture frames, or a configuration object.
  86548. * @param {boolean} [pickRandom=true] - Whether frames should be assigned at random from `frames`.
  86549. * @param {integer} [quantity=1] - The number of consecutive particles that will receive each frame.
  86550. *
  86551. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86552. */
  86553. setFrame: function (frames, pickRandom, quantity)
  86554. {
  86555. if (pickRandom === undefined) { pickRandom = true; }
  86556. if (quantity === undefined) { quantity = 1; }
  86557. this.randomFrame = pickRandom;
  86558. this.frameQuantity = quantity;
  86559. this.currentFrame = 0;
  86560. this._frameCounter = 0;
  86561. var t = typeof (frames);
  86562. if (Array.isArray(frames) || t === 'string' || t === 'number')
  86563. {
  86564. this.manager.setEmitterFrames(frames, this);
  86565. }
  86566. else if (t === 'object')
  86567. {
  86568. var frameConfig = frames;
  86569. frames = GetFastValue(frameConfig, 'frames', null);
  86570. if (frames)
  86571. {
  86572. this.manager.setEmitterFrames(frames, this);
  86573. }
  86574. var isCycle = GetFastValue(frameConfig, 'cycle', false);
  86575. this.randomFrame = (isCycle) ? false : true;
  86576. this.frameQuantity = GetFastValue(frameConfig, 'quantity', quantity);
  86577. }
  86578. this._frameLength = this.frames.length;
  86579. if (this._frameLength === 1)
  86580. {
  86581. this.frameQuantity = 1;
  86582. this.randomFrame = false;
  86583. }
  86584. return this;
  86585. },
  86586. /**
  86587. * Turns {@link Phaser.GameObjects.Particles.ParticleEmitter#radial} particle movement on or off.
  86588. *
  86589. * @method Phaser.GameObjects.Particles.ParticleEmitter#setRadial
  86590. * @since 3.0.0
  86591. *
  86592. * @param {boolean} [value=true] - Radial mode (true) or point mode (true).
  86593. *
  86594. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86595. */
  86596. setRadial: function (value)
  86597. {
  86598. if (value === undefined) { value = true; }
  86599. this.radial = value;
  86600. return this;
  86601. },
  86602. /**
  86603. * Sets the position of the emitter's particle origin.
  86604. * New particles will be emitted here.
  86605. *
  86606. * @method Phaser.GameObjects.Particles.ParticleEmitter#setPosition
  86607. * @since 3.0.0
  86608. *
  86609. * @param {number|float[]|EmitterOpOnEmitCallback|object} x - The x-coordinate of the particle origin.
  86610. * @param {number|float[]|EmitterOpOnEmitCallback|object} y - The y-coordinate of the particle origin.
  86611. *
  86612. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86613. */
  86614. setPosition: function (x, y)
  86615. {
  86616. this.x.onChange(x);
  86617. this.y.onChange(y);
  86618. return this;
  86619. },
  86620. /**
  86621. * Sets or modifies a rectangular boundary constraining the particles.
  86622. *
  86623. * To remove the boundary, set {@link Phaser.GameObjects.Particles.ParticleEmitter#bounds} to null.
  86624. *
  86625. * @method Phaser.GameObjects.Particles.ParticleEmitter#setBounds
  86626. * @since 3.0.0
  86627. *
  86628. * @param {(number|ParticleEmitterBounds|ParticleEmitterBoundsAlt)} x - The x-coordinate of the left edge of the boundary, or an object representing a rectangle.
  86629. * @param {number} y - The y-coordinate of the top edge of the boundary.
  86630. * @param {number} width - The width of the boundary.
  86631. * @param {number} height - The height of the boundary.
  86632. *
  86633. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86634. */
  86635. setBounds: function (x, y, width, height)
  86636. {
  86637. if (typeof x === 'object')
  86638. {
  86639. var obj = x;
  86640. x = obj.x;
  86641. y = obj.y;
  86642. width = (HasValue(obj, 'w')) ? obj.w : obj.width;
  86643. height = (HasValue(obj, 'h')) ? obj.h : obj.height;
  86644. }
  86645. if (this.bounds)
  86646. {
  86647. this.bounds.setTo(x, y, width, height);
  86648. }
  86649. else
  86650. {
  86651. this.bounds = new Rectangle(x, y, width, height);
  86652. }
  86653. return this;
  86654. },
  86655. /**
  86656. * Sets the initial horizontal speed of emitted particles.
  86657. * Changes the emitter to point mode.
  86658. *
  86659. * @method Phaser.GameObjects.Particles.ParticleEmitter#setSpeedX
  86660. * @since 3.0.0
  86661. *
  86662. * @param {number|float[]|EmitterOpOnEmitCallback|object} value - The speed, in pixels per second.
  86663. *
  86664. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86665. */
  86666. setSpeedX: function (value)
  86667. {
  86668. this.speedX.onChange(value);
  86669. // If you specify speedX and Y then it changes the emitter from radial to a point emitter
  86670. this.radial = false;
  86671. return this;
  86672. },
  86673. /**
  86674. * Sets the initial vertical speed of emitted particles.
  86675. * Changes the emitter to point mode.
  86676. *
  86677. * @method Phaser.GameObjects.Particles.ParticleEmitter#setSpeedY
  86678. * @since 3.0.0
  86679. *
  86680. * @param {number|float[]|EmitterOpOnEmitCallback|object} value - The speed, in pixels per second.
  86681. *
  86682. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86683. */
  86684. setSpeedY: function (value)
  86685. {
  86686. if (this.speedY)
  86687. {
  86688. this.speedY.onChange(value);
  86689. // If you specify speedX and Y then it changes the emitter from radial to a point emitter
  86690. this.radial = false;
  86691. }
  86692. return this;
  86693. },
  86694. /**
  86695. * Sets the initial radial speed of emitted particles.
  86696. * Changes the emitter to radial mode.
  86697. *
  86698. * @method Phaser.GameObjects.Particles.ParticleEmitter#setSpeed
  86699. * @since 3.0.0
  86700. *
  86701. * @param {number|float[]|EmitterOpOnEmitCallback|object} value - The speed, in pixels per second.
  86702. *
  86703. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86704. */
  86705. setSpeed: function (value)
  86706. {
  86707. this.speedX.onChange(value);
  86708. this.speedY = null;
  86709. // If you specify speedX and Y then it changes the emitter from radial to a point emitter
  86710. this.radial = true;
  86711. return this;
  86712. },
  86713. /**
  86714. * Sets the horizontal scale of emitted particles.
  86715. *
  86716. * @method Phaser.GameObjects.Particles.ParticleEmitter#setScaleX
  86717. * @since 3.0.0
  86718. *
  86719. * @param {number|float[]|EmitterOpOnUpdateCallback|object} value - The scale, relative to 1.
  86720. *
  86721. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86722. */
  86723. setScaleX: function (value)
  86724. {
  86725. this.scaleX.onChange(value);
  86726. return this;
  86727. },
  86728. /**
  86729. * Sets the vertical scale of emitted particles.
  86730. *
  86731. * @method Phaser.GameObjects.Particles.ParticleEmitter#setScaleY
  86732. * @since 3.0.0
  86733. *
  86734. * @param {number|float[]|EmitterOpOnUpdateCallback|object} value - The scale, relative to 1.
  86735. *
  86736. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86737. */
  86738. setScaleY: function (value)
  86739. {
  86740. this.scaleY.onChange(value);
  86741. return this;
  86742. },
  86743. /**
  86744. * Sets the scale of emitted particles.
  86745. *
  86746. * @method Phaser.GameObjects.Particles.ParticleEmitter#setScale
  86747. * @since 3.0.0
  86748. *
  86749. * @param {number|float[]|EmitterOpOnUpdateCallback|object} value - The scale, relative to 1.
  86750. *
  86751. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86752. */
  86753. setScale: function (value)
  86754. {
  86755. this.scaleX.onChange(value);
  86756. this.scaleY = null;
  86757. return this;
  86758. },
  86759. /**
  86760. * Sets the horizontal gravity applied to emitted particles.
  86761. *
  86762. * @method Phaser.GameObjects.Particles.ParticleEmitter#setGravityX
  86763. * @since 3.0.0
  86764. *
  86765. * @param {number} value - Acceleration due to gravity, in pixels per second squared.
  86766. *
  86767. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86768. */
  86769. setGravityX: function (value)
  86770. {
  86771. this.gravityX = value;
  86772. return this;
  86773. },
  86774. /**
  86775. * Sets the vertical gravity applied to emitted particles.
  86776. *
  86777. * @method Phaser.GameObjects.Particles.ParticleEmitter#setGravityY
  86778. * @since 3.0.0
  86779. *
  86780. * @param {number} value - Acceleration due to gravity, in pixels per second squared.
  86781. *
  86782. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86783. */
  86784. setGravityY: function (value)
  86785. {
  86786. this.gravityY = value;
  86787. return this;
  86788. },
  86789. /**
  86790. * Sets the gravity applied to emitted particles.
  86791. *
  86792. * @method Phaser.GameObjects.Particles.ParticleEmitter#setGravity
  86793. * @since 3.0.0
  86794. *
  86795. * @param {number} x - Horizontal acceleration due to gravity, in pixels per second squared.
  86796. * @param {number} y - Vertical acceleration due to gravity, in pixels per second squared.
  86797. *
  86798. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86799. */
  86800. setGravity: function (x, y)
  86801. {
  86802. this.gravityX = x;
  86803. this.gravityY = y;
  86804. return this;
  86805. },
  86806. /**
  86807. * Sets the opacity of emitted particles.
  86808. *
  86809. * @method Phaser.GameObjects.Particles.ParticleEmitter#setAlpha
  86810. * @since 3.0.0
  86811. *
  86812. * @param {number|float[]|EmitterOpOnUpdateCallback|object} value - A value between 0 (transparent) and 1 (opaque).
  86813. *
  86814. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86815. */
  86816. setAlpha: function (value)
  86817. {
  86818. this.alpha.onChange(value);
  86819. return this;
  86820. },
  86821. /**
  86822. * Sets the angle of a {@link Phaser.GameObjects.Particles.ParticleEmitter#radial} particle stream.
  86823. *
  86824. * @method Phaser.GameObjects.Particles.ParticleEmitter#setEmitterAngle
  86825. * @since 3.0.0
  86826. *
  86827. * @param {number|float[]|EmitterOpOnEmitCallback|object} value - The angle of the initial velocity of emitted particles.
  86828. *
  86829. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86830. */
  86831. setEmitterAngle: function (value)
  86832. {
  86833. this.angle.onChange(value);
  86834. return this;
  86835. },
  86836. /**
  86837. * Sets the angle of a {@link Phaser.GameObjects.Particles.ParticleEmitter#radial} particle stream.
  86838. *
  86839. * @method Phaser.GameObjects.Particles.ParticleEmitter#setAngle
  86840. * @since 3.0.0
  86841. *
  86842. * @param {number|float[]|EmitterOpOnEmitCallback|object} value - The angle of the initial velocity of emitted particles.
  86843. *
  86844. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86845. */
  86846. setAngle: function (value)
  86847. {
  86848. this.angle.onChange(value);
  86849. return this;
  86850. },
  86851. /**
  86852. * Sets the lifespan of newly emitted particles.
  86853. *
  86854. * @method Phaser.GameObjects.Particles.ParticleEmitter#setLifespan
  86855. * @since 3.0.0
  86856. *
  86857. * @param {number|float[]|EmitterOpOnEmitCallback|object} value - The particle lifespan, in ms.
  86858. *
  86859. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86860. */
  86861. setLifespan: function (value)
  86862. {
  86863. this.lifespan.onChange(value);
  86864. return this;
  86865. },
  86866. /**
  86867. * Sets the number of particles released at each flow cycle or explosion.
  86868. *
  86869. * @method Phaser.GameObjects.Particles.ParticleEmitter#setQuantity
  86870. * @since 3.0.0
  86871. *
  86872. * @param {number|float[]|EmitterOpOnEmitCallback|object} quantity - The number of particles to release at each flow cycle or explosion.
  86873. *
  86874. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86875. */
  86876. setQuantity: function (quantity)
  86877. {
  86878. this.quantity.onChange(quantity);
  86879. return this;
  86880. },
  86881. /**
  86882. * Sets the emitter's {@link Phaser.GameObjects.Particles.ParticleEmitter#frequency}
  86883. * and {@link Phaser.GameObjects.Particles.ParticleEmitter#quantity}.
  86884. *
  86885. * @method Phaser.GameObjects.Particles.ParticleEmitter#setFrequency
  86886. * @since 3.0.0
  86887. *
  86888. * @param {number} frequency - The time interval (>= 0) of each flow cycle, in ms; or -1 to put the emitter in explosion mode.
  86889. * @param {number|float[]|EmitterOpOnEmitCallback|object} [quantity] - The number of particles to release at each flow cycle or explosion.
  86890. *
  86891. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86892. */
  86893. setFrequency: function (frequency, quantity)
  86894. {
  86895. this.frequency = frequency;
  86896. this._counter = 0;
  86897. if (quantity)
  86898. {
  86899. this.quantity.onChange(quantity);
  86900. }
  86901. return this;
  86902. },
  86903. /**
  86904. * Sets or removes the {@link Phaser.GameObjects.Particles.ParticleEmitter#emitZone}.
  86905. *
  86906. * 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.
  86907. *
  86908. * 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.
  86909. *
  86910. * @method Phaser.GameObjects.Particles.ParticleEmitter#setEmitZone
  86911. * @since 3.0.0
  86912. *
  86913. * @param {ParticleEmitterEdgeZoneConfig|ParticleEmitterRandomZoneConfig} [zoneConfig] - An object describing the zone, or `undefined` to remove any current emit zone.
  86914. *
  86915. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86916. */
  86917. setEmitZone: function (zoneConfig)
  86918. {
  86919. if (zoneConfig === undefined)
  86920. {
  86921. this.emitZone = null;
  86922. }
  86923. else
  86924. {
  86925. // Where source = Geom like Circle, or a Path or Curve
  86926. // emitZone: { type: 'random', source: X }
  86927. // emitZone: { type: 'edge', source: X, quantity: 32, [stepRate=0], [yoyo=false], [seamless=true] }
  86928. var type = GetFastValue(zoneConfig, 'type', 'random');
  86929. var source = GetFastValue(zoneConfig, 'source', null);
  86930. switch (type)
  86931. {
  86932. case 'random':
  86933. this.emitZone = new RandomZone(source);
  86934. break;
  86935. case 'edge':
  86936. var quantity = GetFastValue(zoneConfig, 'quantity', 1);
  86937. var stepRate = GetFastValue(zoneConfig, 'stepRate', 0);
  86938. var yoyo = GetFastValue(zoneConfig, 'yoyo', false);
  86939. var seamless = GetFastValue(zoneConfig, 'seamless', true);
  86940. this.emitZone = new EdgeZone(source, quantity, stepRate, yoyo, seamless);
  86941. break;
  86942. }
  86943. }
  86944. return this;
  86945. },
  86946. /**
  86947. * Sets or removes the {@link Phaser.GameObjects.Particles.ParticleEmitter#deathZone}.
  86948. *
  86949. * @method Phaser.GameObjects.Particles.ParticleEmitter#setDeathZone
  86950. * @since 3.0.0
  86951. *
  86952. * @param {ParticleEmitterDeathZoneConfig} [zoneConfig] - An object describing the zone, or `undefined` to remove any current death zone.
  86953. *
  86954. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86955. */
  86956. setDeathZone: function (zoneConfig)
  86957. {
  86958. if (zoneConfig === undefined)
  86959. {
  86960. this.deathZone = null;
  86961. }
  86962. else
  86963. {
  86964. // Where source = Geom like Circle or Rect that supports a 'contains' function
  86965. // deathZone: { type: 'onEnter', source: X }
  86966. // deathZone: { type: 'onLeave', source: X }
  86967. var type = GetFastValue(zoneConfig, 'type', 'onEnter');
  86968. var source = GetFastValue(zoneConfig, 'source', null);
  86969. if (source && typeof source.contains === 'function')
  86970. {
  86971. var killOnEnter = (type === 'onEnter') ? true : false;
  86972. this.deathZone = new DeathZone(source, killOnEnter);
  86973. }
  86974. }
  86975. return this;
  86976. },
  86977. /**
  86978. * Creates inactive particles and adds them to this emitter's pool.
  86979. *
  86980. * @method Phaser.GameObjects.Particles.ParticleEmitter#reserve
  86981. * @since 3.0.0
  86982. *
  86983. * @param {integer} particleCount - The number of particles to create.
  86984. *
  86985. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  86986. */
  86987. reserve: function (particleCount)
  86988. {
  86989. var dead = this.dead;
  86990. for (var i = 0; i < particleCount; i++)
  86991. {
  86992. dead.push(new this.particleClass(this));
  86993. }
  86994. return this;
  86995. },
  86996. /**
  86997. * Gets the number of active (in-use) particles in this emitter.
  86998. *
  86999. * @method Phaser.GameObjects.Particles.ParticleEmitter#getAliveParticleCount
  87000. * @since 3.0.0
  87001. *
  87002. * @return {integer} The number of particles with `active=true`.
  87003. */
  87004. getAliveParticleCount: function ()
  87005. {
  87006. return this.alive.length;
  87007. },
  87008. /**
  87009. * Gets the number of inactive (available) particles in this emitter.
  87010. *
  87011. * @method Phaser.GameObjects.Particles.ParticleEmitter#getDeadParticleCount
  87012. * @since 3.0.0
  87013. *
  87014. * @return {integer} The number of particles with `active=false`.
  87015. */
  87016. getDeadParticleCount: function ()
  87017. {
  87018. return this.dead.length;
  87019. },
  87020. /**
  87021. * Gets the total number of particles in this emitter.
  87022. *
  87023. * @method Phaser.GameObjects.Particles.ParticleEmitter#getParticleCount
  87024. * @since 3.0.0
  87025. *
  87026. * @return {integer} The number of particles, including both alive and dead.
  87027. */
  87028. getParticleCount: function ()
  87029. {
  87030. return this.getAliveParticleCount() + this.getDeadParticleCount();
  87031. },
  87032. /**
  87033. * Whether this emitter is at its limit (if set).
  87034. *
  87035. * @method Phaser.GameObjects.Particles.ParticleEmitter#atLimit
  87036. * @since 3.0.0
  87037. *
  87038. * @return {boolean} Returns `true` if this Emitter is at its limit, or `false` if no limit, or below the `maxParticles` level.
  87039. */
  87040. atLimit: function ()
  87041. {
  87042. return (this.maxParticles > 0 && this.getParticleCount() === this.maxParticles);
  87043. },
  87044. /**
  87045. * Sets a function to call for each newly emitted particle.
  87046. *
  87047. * @method Phaser.GameObjects.Particles.ParticleEmitter#onParticleEmit
  87048. * @since 3.0.0
  87049. *
  87050. * @param {ParticleEmitterCallback} callback - The function.
  87051. * @param {*} [context] - The calling context.
  87052. *
  87053. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  87054. */
  87055. onParticleEmit: function (callback, context)
  87056. {
  87057. if (callback === undefined)
  87058. {
  87059. // Clear any previously set callback
  87060. this.emitCallback = null;
  87061. this.emitCallbackScope = null;
  87062. }
  87063. else if (typeof callback === 'function')
  87064. {
  87065. this.emitCallback = callback;
  87066. if (context)
  87067. {
  87068. this.emitCallbackScope = context;
  87069. }
  87070. }
  87071. return this;
  87072. },
  87073. /**
  87074. * Sets a function to call for each particle death.
  87075. *
  87076. * @method Phaser.GameObjects.Particles.ParticleEmitter#onParticleDeath
  87077. * @since 3.0.0
  87078. *
  87079. * @param {ParticleDeathCallback} callback - The function.
  87080. * @param {*} [context] - The function's calling context.
  87081. *
  87082. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  87083. */
  87084. onParticleDeath: function (callback, context)
  87085. {
  87086. if (callback === undefined)
  87087. {
  87088. // Clear any previously set callback
  87089. this.deathCallback = null;
  87090. this.deathCallbackScope = null;
  87091. }
  87092. else if (typeof callback === 'function')
  87093. {
  87094. this.deathCallback = callback;
  87095. if (context)
  87096. {
  87097. this.deathCallbackScope = context;
  87098. }
  87099. }
  87100. return this;
  87101. },
  87102. /**
  87103. * Deactivates every particle in this emitter.
  87104. *
  87105. * @method Phaser.GameObjects.Particles.ParticleEmitter#killAll
  87106. * @since 3.0.0
  87107. *
  87108. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  87109. */
  87110. killAll: function ()
  87111. {
  87112. var dead = this.dead;
  87113. var alive = this.alive;
  87114. while (alive.length > 0)
  87115. {
  87116. dead.push(alive.pop());
  87117. }
  87118. return this;
  87119. },
  87120. /**
  87121. * Calls a function for each active particle in this emitter.
  87122. *
  87123. * @method Phaser.GameObjects.Particles.ParticleEmitter#forEachAlive
  87124. * @since 3.0.0
  87125. *
  87126. * @param {ParticleEmitterCallback} callback - The function.
  87127. * @param {*} context - The function's calling context.
  87128. *
  87129. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  87130. */
  87131. forEachAlive: function (callback, context)
  87132. {
  87133. var alive = this.alive;
  87134. var length = alive.length;
  87135. for (var index = 0; index < length; ++index)
  87136. {
  87137. // Sends the Particle and the Emitter
  87138. callback.call(context, alive[index], this);
  87139. }
  87140. return this;
  87141. },
  87142. /**
  87143. * Calls a function for each inactive particle in this emitter.
  87144. *
  87145. * @method Phaser.GameObjects.Particles.ParticleEmitter#forEachDead
  87146. * @since 3.0.0
  87147. *
  87148. * @param {ParticleEmitterCallback} callback - The function.
  87149. * @param {*} context - The function's calling context.
  87150. *
  87151. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  87152. */
  87153. forEachDead: function (callback, context)
  87154. {
  87155. var dead = this.dead;
  87156. var length = dead.length;
  87157. for (var index = 0; index < length; ++index)
  87158. {
  87159. // Sends the Particle and the Emitter
  87160. callback.call(context, dead[index], this);
  87161. }
  87162. return this;
  87163. },
  87164. /**
  87165. * Turns {@link Phaser.GameObjects.Particles.ParticleEmitter#on} the emitter and resets the flow counter.
  87166. *
  87167. * If this emitter is in flow mode (frequency >= 0; the default), the particle flow will start (or restart).
  87168. *
  87169. * If this emitter is in explode mode (frequency = -1), nothing will happen.
  87170. * Use {@link Phaser.GameObjects.Particles.ParticleEmitter#explode} or {@link Phaser.GameObjects.Particles.ParticleEmitter#flow} instead.
  87171. *
  87172. * @method Phaser.GameObjects.Particles.ParticleEmitter#start
  87173. * @since 3.0.0
  87174. *
  87175. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  87176. */
  87177. start: function ()
  87178. {
  87179. this.on = true;
  87180. this._counter = 0;
  87181. return this;
  87182. },
  87183. /**
  87184. * Turns {@link Phaser.GameObjects.Particles.ParticleEmitter#on off} the emitter.
  87185. *
  87186. * @method Phaser.GameObjects.Particles.ParticleEmitter#stop
  87187. * @since 3.11.0
  87188. *
  87189. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  87190. */
  87191. stop: function ()
  87192. {
  87193. this.on = false;
  87194. return this;
  87195. },
  87196. /**
  87197. * {@link Phaser.GameObjects.Particles.ParticleEmitter#active Deactivates} the emitter.
  87198. *
  87199. * @method Phaser.GameObjects.Particles.ParticleEmitter#pause
  87200. * @since 3.0.0
  87201. *
  87202. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  87203. */
  87204. pause: function ()
  87205. {
  87206. this.active = false;
  87207. return this;
  87208. },
  87209. /**
  87210. * {@link Phaser.GameObjects.Particles.ParticleEmitter#active Activates} the emitter.
  87211. *
  87212. * @method Phaser.GameObjects.Particles.ParticleEmitter#resume
  87213. * @since 3.0.0
  87214. *
  87215. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  87216. */
  87217. resume: function ()
  87218. {
  87219. this.active = true;
  87220. return this;
  87221. },
  87222. /**
  87223. * Sorts active particles with {@link Phaser.GameObjects.Particles.ParticleEmitter#depthSortCallback}.
  87224. *
  87225. * @method Phaser.GameObjects.Particles.ParticleEmitter#depthSort
  87226. * @since 3.0.0
  87227. *
  87228. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  87229. */
  87230. depthSort: function ()
  87231. {
  87232. StableSort.inplace(this.alive, this.depthSortCallback);
  87233. return this;
  87234. },
  87235. /**
  87236. * Puts the emitter in flow mode (frequency >= 0) and starts (or restarts) a particle flow.
  87237. *
  87238. * To resume a flow at the current frequency and quantity, use {@link Phaser.GameObjects.Particles.ParticleEmitter#start} instead.
  87239. *
  87240. * @method Phaser.GameObjects.Particles.ParticleEmitter#flow
  87241. * @since 3.0.0
  87242. *
  87243. * @param {number} frequency - The time interval (>= 0) of each flow cycle, in ms.
  87244. * @param {number|float[]|EmitterOpOnEmitCallback|object} [count=1] - The number of particles to emit at each flow cycle.
  87245. *
  87246. * @return {Phaser.GameObjects.Particles.ParticleEmitter} This Particle Emitter.
  87247. */
  87248. flow: function (frequency, count)
  87249. {
  87250. if (count === undefined) { count = 1; }
  87251. this.frequency = frequency;
  87252. this.quantity.onChange(count);
  87253. return this.start();
  87254. },
  87255. /**
  87256. * Puts the emitter in explode mode (frequency = -1), stopping any current particle flow, and emits several particles all at once.
  87257. *
  87258. * @method Phaser.GameObjects.Particles.ParticleEmitter#explode
  87259. * @since 3.0.0
  87260. *
  87261. * @param {integer} count - The amount of Particles to emit.
  87262. * @param {number} x - The x coordinate to emit the Particles from.
  87263. * @param {number} y - The y coordinate to emit the Particles from.
  87264. *
  87265. * @return {Phaser.GameObjects.Particles.Particle} The most recently emitted Particle.
  87266. */
  87267. explode: function (count, x, y)
  87268. {
  87269. this.frequency = -1;
  87270. return this.emitParticle(count, x, y);
  87271. },
  87272. /**
  87273. * Emits particles at a given position (or the emitter's current position).
  87274. *
  87275. * @method Phaser.GameObjects.Particles.ParticleEmitter#emitParticleAt
  87276. * @since 3.0.0
  87277. *
  87278. * @param {number} [x=this.x] - The x coordinate to emit the Particles from.
  87279. * @param {number} [y=this.x] - The y coordinate to emit the Particles from.
  87280. * @param {integer} [count=this.quantity] - The number of Particles to emit.
  87281. *
  87282. * @return {Phaser.GameObjects.Particles.Particle} The most recently emitted Particle.
  87283. */
  87284. emitParticleAt: function (x, y, count)
  87285. {
  87286. return this.emitParticle(count, x, y);
  87287. },
  87288. /**
  87289. * Emits particles at a given position (or the emitter's current position).
  87290. *
  87291. * @method Phaser.GameObjects.Particles.ParticleEmitter#emitParticle
  87292. * @since 3.0.0
  87293. *
  87294. * @param {integer} [count=this.quantity] - The number of Particles to emit.
  87295. * @param {number} [x=this.x] - The x coordinate to emit the Particles from.
  87296. * @param {number} [y=this.x] - The y coordinate to emit the Particles from.
  87297. *
  87298. * @return {Phaser.GameObjects.Particles.Particle} The most recently emitted Particle.
  87299. *
  87300. * @see Phaser.GameObjects.Particles.Particle#fire
  87301. */
  87302. emitParticle: function (count, x, y)
  87303. {
  87304. if (this.atLimit())
  87305. {
  87306. return;
  87307. }
  87308. if (count === undefined)
  87309. {
  87310. count = this.quantity.onEmit();
  87311. }
  87312. var dead = this.dead;
  87313. for (var i = 0; i < count; i++)
  87314. {
  87315. var particle;
  87316. if (dead.length > 0)
  87317. {
  87318. particle = dead.pop();
  87319. }
  87320. else
  87321. {
  87322. particle = new this.particleClass(this);
  87323. }
  87324. particle.fire(x, y);
  87325. if (this.particleBringToTop)
  87326. {
  87327. this.alive.push(particle);
  87328. }
  87329. else
  87330. {
  87331. this.alive.unshift(particle);
  87332. }
  87333. if (this.emitCallback)
  87334. {
  87335. this.emitCallback.call(this.emitCallbackScope, particle, this);
  87336. }
  87337. if (this.atLimit())
  87338. {
  87339. break;
  87340. }
  87341. }
  87342. return particle;
  87343. },
  87344. /**
  87345. * Updates this emitter and its particles.
  87346. *
  87347. * @method Phaser.GameObjects.Particles.ParticleEmitter#preUpdate
  87348. * @since 3.0.0
  87349. *
  87350. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  87351. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  87352. */
  87353. preUpdate: function (time, delta)
  87354. {
  87355. // Scale the delta
  87356. delta *= this.timeScale;
  87357. var step = (delta / 1000);
  87358. if (this.trackVisible)
  87359. {
  87360. this.visible = this.follow.visible;
  87361. }
  87362. // Any particle processors?
  87363. var processors = this.manager.getProcessors();
  87364. var particles = this.alive;
  87365. var length = particles.length;
  87366. for (var index = 0; index < length; index++)
  87367. {
  87368. var particle = particles[index];
  87369. // update returns `true` if the particle is now dead (lifeStep < 0)
  87370. if (particle.update(delta, step, processors))
  87371. {
  87372. // Moves the dead particle to the end of the particles array (ready for splicing out later)
  87373. var last = particles[length - 1];
  87374. particles[length - 1] = particle;
  87375. particles[index] = last;
  87376. index -= 1;
  87377. length -= 1;
  87378. }
  87379. }
  87380. // Move dead particles to the dead array
  87381. var deadLength = particles.length - length;
  87382. if (deadLength > 0)
  87383. {
  87384. var rip = particles.splice(particles.length - deadLength, deadLength);
  87385. var deathCallback = this.deathCallback;
  87386. var deathCallbackScope = this.deathCallbackScope;
  87387. if (deathCallback)
  87388. {
  87389. for (var i = 0; i < rip.length; i++)
  87390. {
  87391. deathCallback.call(deathCallbackScope, rip[i]);
  87392. }
  87393. }
  87394. this.dead.concat(rip);
  87395. StableSort.inplace(particles, this.indexSortCallback);
  87396. }
  87397. if (!this.on)
  87398. {
  87399. return;
  87400. }
  87401. if (this.frequency === 0)
  87402. {
  87403. this.emitParticle();
  87404. }
  87405. else if (this.frequency > 0)
  87406. {
  87407. this._counter -= delta;
  87408. if (this._counter <= 0)
  87409. {
  87410. this.emitParticle();
  87411. // counter = frequency - remained from previous delta
  87412. this._counter = (this.frequency - Math.abs(this._counter));
  87413. }
  87414. }
  87415. },
  87416. /**
  87417. * Calculates the difference of two particles, for sorting them by depth.
  87418. *
  87419. * @method Phaser.GameObjects.Particles.ParticleEmitter#depthSortCallback
  87420. * @since 3.0.0
  87421. *
  87422. * @param {object} a - The first particle.
  87423. * @param {object} b - The second particle.
  87424. *
  87425. * @return {integer} The difference of a and b's y coordinates.
  87426. */
  87427. depthSortCallback: function (a, b)
  87428. {
  87429. return a.y - b.y;
  87430. },
  87431. /**
  87432. * Calculates the difference of two particles, for sorting them by index.
  87433. *
  87434. * @method Phaser.GameObjects.Particles.ParticleEmitter#indexSortCallback
  87435. * @since 3.0.0
  87436. *
  87437. * @param {object} a - The first particle.
  87438. * @param {object} b - The second particle.
  87439. *
  87440. * @return {integer} The difference of a and b's `index` properties.
  87441. */
  87442. indexSortCallback: function (a, b)
  87443. {
  87444. return a.index - b.index;
  87445. }
  87446. });
  87447. module.exports = ParticleEmitter;
  87448. /***/ }),
  87449. /* 428 */
  87450. /***/ (function(module, exports, __webpack_require__) {
  87451. /**
  87452. * @author Richard Davey <rich@photonstorm.com>
  87453. * @copyright 2018 Photon Storm Ltd.
  87454. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  87455. */
  87456. var Class = __webpack_require__(0);
  87457. var DegToRad = __webpack_require__(39);
  87458. var DistanceBetween = __webpack_require__(58);
  87459. var GetColor = function (value)
  87460. {
  87461. return (value >> 16) + (value & 0xff00) + ((value & 0xff) << 16);
  87462. };
  87463. /**
  87464. * @classdesc
  87465. * A Particle is a simple Game Object controlled by a Particle Emitter and Manager, and rendered by the Manager.
  87466. * It uses its own lightweight physics system, and can interact only with its Emitter's bounds and zones.
  87467. *
  87468. * @class Particle
  87469. * @memberOf Phaser.GameObjects.Particles
  87470. * @constructor
  87471. * @since 3.0.0
  87472. *
  87473. * @param {Phaser.GameObjects.Particles.ParticleEmitter} emitter - The Emitter to which this Particle belongs.
  87474. */
  87475. var Particle = new Class({
  87476. initialize:
  87477. function Particle (emitter)
  87478. {
  87479. /**
  87480. * The Emitter to which this Particle belongs.
  87481. *
  87482. * A Particle can only belong to a single Emitter and is created, updated and destroyed via it.
  87483. *
  87484. * @name Phaser.GameObjects.Particles.Particle#emitter
  87485. * @type {Phaser.GameObjects.Particles.ParticleEmitter}
  87486. * @since 3.0.0
  87487. */
  87488. this.emitter = emitter;
  87489. /**
  87490. * The texture frame used to render this Particle.
  87491. *
  87492. * @name Phaser.GameObjects.Particles.Particle#frame
  87493. * @type {Phaser.Textures.Frame}
  87494. * @default null
  87495. * @since 3.0.0
  87496. */
  87497. this.frame = null;
  87498. /**
  87499. * The position of this Particle within its Emitter's particle pool.
  87500. *
  87501. * @name Phaser.GameObjects.Particles.Particle#index
  87502. * @type {number}
  87503. * @default 0
  87504. * @since 3.0.0
  87505. */
  87506. this.index = 0;
  87507. /**
  87508. * The x coordinate of this Particle.
  87509. *
  87510. * @name Phaser.GameObjects.Particles.Particle#x
  87511. * @type {number}
  87512. * @default 0
  87513. * @since 3.0.0
  87514. */
  87515. this.x = 0;
  87516. /**
  87517. * The y coordinate of this Particle.
  87518. *
  87519. * @name Phaser.GameObjects.Particles.Particle#y
  87520. * @type {number}
  87521. * @default 0
  87522. * @since 3.0.0
  87523. */
  87524. this.y = 0;
  87525. /**
  87526. * The x velocity of this Particle.
  87527. *
  87528. * @name Phaser.GameObjects.Particles.Particle#velocityX
  87529. * @type {number}
  87530. * @default 0
  87531. * @since 3.0.0
  87532. */
  87533. this.velocityX = 0;
  87534. /**
  87535. * The y velocity of this Particle.
  87536. *
  87537. * @name Phaser.GameObjects.Particles.Particle#velocityY
  87538. * @type {number}
  87539. * @default 0
  87540. * @since 3.0.0
  87541. */
  87542. this.velocityY = 0;
  87543. /**
  87544. * The x acceleration of this Particle.
  87545. *
  87546. * @name Phaser.GameObjects.Particles.Particle#accelerationX
  87547. * @type {number}
  87548. * @default 0
  87549. * @since 3.0.0
  87550. */
  87551. this.accelerationX = 0;
  87552. /**
  87553. * The y acceleration of this Particle.
  87554. *
  87555. * @name Phaser.GameObjects.Particles.Particle#accelerationY
  87556. * @type {number}
  87557. * @default 0
  87558. * @since 3.0.0
  87559. */
  87560. this.accelerationY = 0;
  87561. /**
  87562. * The maximum horizontal velocity this Particle can travel at.
  87563. *
  87564. * @name Phaser.GameObjects.Particles.Particle#maxVelocityX
  87565. * @type {number}
  87566. * @default 10000
  87567. * @since 3.0.0
  87568. */
  87569. this.maxVelocityX = 10000;
  87570. /**
  87571. * The maximum vertical velocity this Particle can travel at.
  87572. *
  87573. * @name Phaser.GameObjects.Particles.Particle#maxVelocityY
  87574. * @type {number}
  87575. * @default 10000
  87576. * @since 3.0.0
  87577. */
  87578. this.maxVelocityY = 10000;
  87579. /**
  87580. * The bounciness, or restitution, of this Particle.
  87581. *
  87582. * @name Phaser.GameObjects.Particles.Particle#bounce
  87583. * @type {number}
  87584. * @default 0
  87585. * @since 3.0.0
  87586. */
  87587. this.bounce = 0;
  87588. /**
  87589. * The horizontal scale of this Particle.
  87590. *
  87591. * @name Phaser.GameObjects.Particles.Particle#scaleX
  87592. * @type {number}
  87593. * @default 1
  87594. * @since 3.0.0
  87595. */
  87596. this.scaleX = 1;
  87597. /**
  87598. * The vertical scale of this Particle.
  87599. *
  87600. * @name Phaser.GameObjects.Particles.Particle#scaleY
  87601. * @type {number}
  87602. * @default 1
  87603. * @since 3.0.0
  87604. */
  87605. this.scaleY = 1;
  87606. /**
  87607. * The alpha value of this Particle.
  87608. *
  87609. * @name Phaser.GameObjects.Particles.Particle#alpha
  87610. * @type {number}
  87611. * @default 1
  87612. * @since 3.0.0
  87613. */
  87614. this.alpha = 1;
  87615. /**
  87616. * The angle of this Particle in degrees.
  87617. *
  87618. * @name Phaser.GameObjects.Particles.Particle#angle
  87619. * @type {number}
  87620. * @default 0
  87621. * @since 3.0.0
  87622. */
  87623. this.angle = 0;
  87624. /**
  87625. * The angle of this Particle in radians.
  87626. *
  87627. * @name Phaser.GameObjects.Particles.Particle#rotation
  87628. * @type {number}
  87629. * @default 0
  87630. * @since 3.0.0
  87631. */
  87632. this.rotation = 0;
  87633. /**
  87634. * The tint applied to this Particle.
  87635. *
  87636. * @name Phaser.GameObjects.Particles.Particle#tint
  87637. * @type {integer}
  87638. * @webglOnly
  87639. * @since 3.0.0
  87640. */
  87641. this.tint = 0xffffff;
  87642. /**
  87643. * The full color of this Particle, computed from its alpha and tint.
  87644. *
  87645. * @name Phaser.GameObjects.Particles.Particle#color
  87646. * @type {integer}
  87647. * @since 3.0.0
  87648. */
  87649. this.color = 16777215;
  87650. /**
  87651. * The lifespan of this Particle in ms.
  87652. *
  87653. * @name Phaser.GameObjects.Particles.Particle#life
  87654. * @type {number}
  87655. * @default 1000
  87656. * @since 3.0.0
  87657. */
  87658. this.life = 1000;
  87659. /**
  87660. * The current life of this Particle in ms.
  87661. *
  87662. * @name Phaser.GameObjects.Particles.Particle#lifeCurrent
  87663. * @type {number}
  87664. * @default 1000
  87665. * @since 3.0.0
  87666. */
  87667. this.lifeCurrent = 1000;
  87668. /**
  87669. * The delay applied to this Particle upon emission, in ms.
  87670. *
  87671. * @name Phaser.GameObjects.Particles.Particle#delayCurrent
  87672. * @type {number}
  87673. * @default 0
  87674. * @since 3.0.0
  87675. */
  87676. this.delayCurrent = 0;
  87677. /**
  87678. * The normalized lifespan T value, where 0 is the start and 1 is the end.
  87679. *
  87680. * @name Phaser.GameObjects.Particles.Particle#lifeT
  87681. * @type {number}
  87682. * @default 0
  87683. * @since 3.0.0
  87684. */
  87685. this.lifeT = 0;
  87686. /**
  87687. * The data used by the ease equation.
  87688. *
  87689. * @name Phaser.GameObjects.Particles.Particle#data
  87690. * @type {object}
  87691. * @since 3.0.0
  87692. */
  87693. this.data = {
  87694. tint: { min: 0xffffff, max: 0xffffff, current: 0xffffff },
  87695. alpha: { min: 1, max: 1 },
  87696. rotate: { min: 0, max: 0 },
  87697. scaleX: { min: 1, max: 1 },
  87698. scaleY: { min: 1, max: 1 }
  87699. };
  87700. },
  87701. /**
  87702. * Checks to see if this Particle is alive and updating.
  87703. *
  87704. * @method Phaser.GameObjects.Particles.Particle#isAlive
  87705. * @since 3.0.0
  87706. *
  87707. * @return {boolean} `true` if this Particle is alive and updating, otherwise `false`.
  87708. */
  87709. isAlive: function ()
  87710. {
  87711. return (this.lifeCurrent > 0);
  87712. },
  87713. /**
  87714. * Starts this Particle from the given coordinates.
  87715. *
  87716. * @method Phaser.GameObjects.Particles.Particle#fire
  87717. * @since 3.0.0
  87718. *
  87719. * @param {number} x - The x coordinate to launch this Particle from.
  87720. * @param {number} y - The y coordinate to launch this Particle from.
  87721. */
  87722. fire: function (x, y)
  87723. {
  87724. var emitter = this.emitter;
  87725. this.frame = emitter.getFrame();
  87726. if (emitter.emitZone)
  87727. {
  87728. // Updates particle.x and particle.y during this call
  87729. emitter.emitZone.getPoint(this);
  87730. }
  87731. if (x === undefined)
  87732. {
  87733. if (emitter.follow)
  87734. {
  87735. this.x += emitter.follow.x + emitter.followOffset.x;
  87736. }
  87737. this.x += emitter.x.onEmit(this, 'x');
  87738. }
  87739. else
  87740. {
  87741. this.x += x;
  87742. }
  87743. if (y === undefined)
  87744. {
  87745. if (emitter.follow)
  87746. {
  87747. this.y += emitter.follow.y + emitter.followOffset.y;
  87748. }
  87749. this.y += emitter.y.onEmit(this, 'y');
  87750. }
  87751. else
  87752. {
  87753. this.y += y;
  87754. }
  87755. this.life = emitter.lifespan.onEmit(this, 'lifespan');
  87756. this.lifeCurrent = this.life;
  87757. this.lifeT = 0;
  87758. var sx = emitter.speedX.onEmit(this, 'speedX');
  87759. var sy = (emitter.speedY) ? emitter.speedY.onEmit(this, 'speedY') : sx;
  87760. if (emitter.radial)
  87761. {
  87762. var rad = DegToRad(emitter.angle.onEmit(this, 'angle'));
  87763. this.velocityX = Math.cos(rad) * Math.abs(sx);
  87764. this.velocityY = Math.sin(rad) * Math.abs(sy);
  87765. }
  87766. else if (emitter.moveTo)
  87767. {
  87768. var mx = emitter.moveToX.onEmit(this, 'moveToX');
  87769. var my = (emitter.moveToY) ? emitter.moveToY.onEmit(this, 'moveToY') : mx;
  87770. var angle = Math.atan2(my - this.y, mx - this.x);
  87771. var speed = DistanceBetween(this.x, this.y, mx, my) / (this.life / 1000);
  87772. // We know how many pixels we need to move, but how fast?
  87773. // var speed = this.distanceToXY(displayObject, x, y) / (maxTime / 1000);
  87774. this.velocityX = Math.cos(angle) * speed;
  87775. this.velocityY = Math.sin(angle) * speed;
  87776. }
  87777. else
  87778. {
  87779. this.velocityX = sx;
  87780. this.velocityY = sy;
  87781. }
  87782. if (emitter.acceleration)
  87783. {
  87784. this.accelerationX = emitter.accelerationX.onEmit(this, 'accelerationX');
  87785. this.accelerationY = emitter.accelerationY.onEmit(this, 'accelerationY');
  87786. }
  87787. this.maxVelocityX = emitter.maxVelocityX.onEmit(this, 'maxVelocityX');
  87788. this.maxVelocityY = emitter.maxVelocityY.onEmit(this, 'maxVelocityY');
  87789. this.delayCurrent = emitter.delay.onEmit(this, 'delay');
  87790. this.scaleX = emitter.scaleX.onEmit(this, 'scaleX');
  87791. this.scaleY = (emitter.scaleY) ? emitter.scaleY.onEmit(this, 'scaleY') : this.scaleX;
  87792. this.angle = emitter.rotate.onEmit(this, 'rotate');
  87793. this.rotation = DegToRad(this.angle);
  87794. this.bounce = emitter.bounce.onEmit(this, 'bounce');
  87795. this.alpha = emitter.alpha.onEmit(this, 'alpha');
  87796. this.tint = emitter.tint.onEmit(this, 'tint');
  87797. var ua = ((this.alpha * 255) | 0) & 0xFF;
  87798. this.color = ((ua << 24) | GetColor(this.tint)) >>> 0;
  87799. this.index = emitter.alive.length;
  87800. },
  87801. /**
  87802. * An internal method that calculates the velocity of the Particle.
  87803. *
  87804. * @method Phaser.GameObjects.Particles.Particle#computeVelocity
  87805. * @since 3.0.0
  87806. *
  87807. * @param {Phaser.GameObjects.Particles.ParticleEmitter} emitter - The Emitter that is updating this Particle.
  87808. * @param {number} delta - The delta time in ms.
  87809. * @param {number} step - The delta value divided by 1000.
  87810. * @param {array} processors - Particle processors (gravity wells).
  87811. */
  87812. computeVelocity: function (emitter, delta, step, processors)
  87813. {
  87814. var vx = this.velocityX;
  87815. var vy = this.velocityY;
  87816. var ax = this.accelerationX;
  87817. var ay = this.accelerationY;
  87818. var mx = this.maxVelocityX;
  87819. var my = this.maxVelocityY;
  87820. vx += (emitter.gravityX * step);
  87821. vy += (emitter.gravityY * step);
  87822. if (ax)
  87823. {
  87824. vx += (ax * step);
  87825. }
  87826. if (ay)
  87827. {
  87828. vy += (ay * step);
  87829. }
  87830. if (vx > mx)
  87831. {
  87832. vx = mx;
  87833. }
  87834. else if (vx < -mx)
  87835. {
  87836. vx = -mx;
  87837. }
  87838. if (vy > my)
  87839. {
  87840. vy = my;
  87841. }
  87842. else if (vy < -my)
  87843. {
  87844. vy = -my;
  87845. }
  87846. this.velocityX = vx;
  87847. this.velocityY = vy;
  87848. // Apply any additional processors
  87849. for (var i = 0; i < processors.length; i++)
  87850. {
  87851. processors[i].update(this, delta, step);
  87852. }
  87853. },
  87854. /**
  87855. * Checks if this Particle is still within the bounds defined by the given Emitter.
  87856. *
  87857. * If not, and depending on the Emitter collision flags, the Particle may either stop or rebound.
  87858. *
  87859. * @method Phaser.GameObjects.Particles.Particle#checkBounds
  87860. * @since 3.0.0
  87861. *
  87862. * @param {Phaser.GameObjects.Particles.ParticleEmitter} emitter - The Emitter to check the bounds against.
  87863. */
  87864. checkBounds: function (emitter)
  87865. {
  87866. var bounds = emitter.bounds;
  87867. var bounce = -this.bounce;
  87868. if (this.x < bounds.x && emitter.collideLeft)
  87869. {
  87870. this.x = bounds.x;
  87871. this.velocityX *= bounce;
  87872. }
  87873. else if (this.x > bounds.right && emitter.collideRight)
  87874. {
  87875. this.x = bounds.right;
  87876. this.velocityX *= bounce;
  87877. }
  87878. if (this.y < bounds.y && emitter.collideTop)
  87879. {
  87880. this.y = bounds.y;
  87881. this.velocityY *= bounce;
  87882. }
  87883. else if (this.y > bounds.bottom && emitter.collideBottom)
  87884. {
  87885. this.y = bounds.bottom;
  87886. this.velocityY *= bounce;
  87887. }
  87888. },
  87889. /**
  87890. * The main update method for this Particle.
  87891. *
  87892. * Updates its life values, computes the velocity and repositions the Particle.
  87893. *
  87894. * @method Phaser.GameObjects.Particles.Particle#update
  87895. * @since 3.0.0
  87896. *
  87897. * @param {number} delta - The delta time in ms.
  87898. * @param {number} step - The delta value divided by 1000.
  87899. * @param {array} processors - An optional array of update processors.
  87900. *
  87901. * @return {boolean} Returns `true` if this Particle has now expired and should be removed, otherwise `false` if still active.
  87902. */
  87903. update: function (delta, step, processors)
  87904. {
  87905. if (this.delayCurrent > 0)
  87906. {
  87907. this.delayCurrent -= delta;
  87908. return false;
  87909. }
  87910. var emitter = this.emitter;
  87911. // How far along in life is this particle? (t = 0 to 1)
  87912. var t = 1 - (this.lifeCurrent / this.life);
  87913. this.lifeT = t;
  87914. this.computeVelocity(emitter, delta, step, processors);
  87915. this.x += this.velocityX * step;
  87916. this.y += this.velocityY * step;
  87917. if (emitter.bounds)
  87918. {
  87919. this.checkBounds(emitter);
  87920. }
  87921. if (emitter.deathZone && emitter.deathZone.willKill(this))
  87922. {
  87923. this.lifeCurrent = 0;
  87924. // No need to go any further, particle has been killed
  87925. return true;
  87926. }
  87927. this.scaleX = emitter.scaleX.onUpdate(this, 'scaleX', t, this.scaleX);
  87928. if (emitter.scaleY)
  87929. {
  87930. this.scaleY = emitter.scaleY.onUpdate(this, 'scaleY', t, this.scaleY);
  87931. }
  87932. else
  87933. {
  87934. this.scaleY = this.scaleX;
  87935. }
  87936. this.angle = emitter.rotate.onUpdate(this, 'rotate', t, this.angle);
  87937. this.rotation = DegToRad(this.angle);
  87938. this.alpha = emitter.alpha.onUpdate(this, 'alpha', t, this.alpha);
  87939. this.tint = emitter.tint.onUpdate(this, 'tint', t, this.tint);
  87940. var ua = ((this.alpha * 255) | 0) & 0xFF;
  87941. this.color = ((ua << 24) | GetColor(this.tint)) >>> 0;
  87942. this.lifeCurrent -= delta;
  87943. return (this.lifeCurrent <= 0);
  87944. }
  87945. });
  87946. module.exports = Particle;
  87947. /***/ }),
  87948. /* 429 */
  87949. /***/ (function(module, exports, __webpack_require__) {
  87950. /**
  87951. * @author Richard Davey <rich@photonstorm.com>
  87952. * @copyright 2018 Photon Storm Ltd.
  87953. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  87954. */
  87955. var Class = __webpack_require__(0);
  87956. var GetFastValue = __webpack_require__(1);
  87957. /**
  87958. * @typedef {object} GravityWellConfig
  87959. *
  87960. * @property {number} [x=0] - The x coordinate of the Gravity Well, in world space.
  87961. * @property {number} [y=0] - The y coordinate of the Gravity Well, in world space.
  87962. * @property {number} [power=0] - The power of the Gravity Well.
  87963. * @property {number} [epsilon=100] - [description]
  87964. * @property {number} [gravity=50] - The gravitational force of this Gravity Well.
  87965. */
  87966. /**
  87967. * @classdesc
  87968. * [description]
  87969. *
  87970. * @class GravityWell
  87971. * @memberOf Phaser.GameObjects.Particles
  87972. * @constructor
  87973. * @since 3.0.0
  87974. *
  87975. * @param {(number|GravityWellConfig)} [x=0] - The x coordinate of the Gravity Well, in world space.
  87976. * @param {number} [y=0] - The y coordinate of the Gravity Well, in world space.
  87977. * @param {number} [power=0] - The power of the Gravity Well.
  87978. * @param {number} [epsilon=100] - [description]
  87979. * @param {number} [gravity=50] - The gravitational force of this Gravity Well.
  87980. */
  87981. var GravityWell = new Class({
  87982. initialize:
  87983. function GravityWell (x, y, power, epsilon, gravity)
  87984. {
  87985. if (typeof x === 'object')
  87986. {
  87987. var config = x;
  87988. x = GetFastValue(config, 'x', 0);
  87989. y = GetFastValue(config, 'y', 0);
  87990. power = GetFastValue(config, 'power', 0);
  87991. epsilon = GetFastValue(config, 'epsilon', 100);
  87992. gravity = GetFastValue(config, 'gravity', 50);
  87993. }
  87994. else
  87995. {
  87996. if (x === undefined) { x = 0; }
  87997. if (y === undefined) { y = 0; }
  87998. if (power === undefined) { power = 0; }
  87999. if (epsilon === undefined) { epsilon = 100; }
  88000. if (gravity === undefined) { gravity = 50; }
  88001. }
  88002. /**
  88003. * The x coordinate of the Gravity Well, in world space.
  88004. *
  88005. * @name Phaser.GameObjects.Particles.GravityWell#x
  88006. * @type {number}
  88007. * @since 3.0.0
  88008. */
  88009. this.x = x;
  88010. /**
  88011. * The y coordinate of the Gravity Well, in world space.
  88012. *
  88013. * @name Phaser.GameObjects.Particles.GravityWell#y
  88014. * @type {number}
  88015. * @since 3.0.0
  88016. */
  88017. this.y = y;
  88018. /**
  88019. * The active state of the Gravity Well. An inactive Gravity Well will not influence any particles.
  88020. *
  88021. * @name Phaser.GameObjects.Particles.GravityWell#active
  88022. * @type {boolean}
  88023. * @default true
  88024. * @since 3.0.0
  88025. */
  88026. this.active = true;
  88027. /**
  88028. * Internal gravity value.
  88029. *
  88030. * @name Phaser.GameObjects.Particles.GravityWell#_gravity
  88031. * @type {number}
  88032. * @private
  88033. * @since 3.0.0
  88034. */
  88035. this._gravity = gravity;
  88036. /**
  88037. * Internal power value.
  88038. *
  88039. * @name Phaser.GameObjects.Particles.GravityWell#_power
  88040. * @type {number}
  88041. * @private
  88042. * @default 0
  88043. * @since 3.0.0
  88044. */
  88045. this._power = 0;
  88046. /**
  88047. * Internal epsilon value.
  88048. *
  88049. * @name Phaser.GameObjects.Particles.GravityWell#_epsilon
  88050. * @type {number}
  88051. * @private
  88052. * @default 0
  88053. * @since 3.0.0
  88054. */
  88055. this._epsilon = 0;
  88056. /**
  88057. * The power of the Gravity Well.
  88058. *
  88059. * @name Phaser.GameObjects.Particles.GravityWell#power
  88060. * @type {number}
  88061. * @since 3.0.0
  88062. */
  88063. this.power = power;
  88064. /**
  88065. * [description]
  88066. *
  88067. * @name Phaser.GameObjects.Particles.GravityWell#epsilon
  88068. * @type {number}
  88069. * @since 3.0.0
  88070. */
  88071. this.epsilon = epsilon;
  88072. },
  88073. /**
  88074. * Takes a Particle and updates it based on the properties of this Gravity Well.
  88075. *
  88076. * @method Phaser.GameObjects.Particles.GravityWell#update
  88077. * @since 3.0.0
  88078. *
  88079. * @param {Phaser.GameObjects.Particles.Particle} particle - The Particle to update.
  88080. * @param {number} delta - The delta time in ms.
  88081. * @param {number} step - The delta value divided by 1000.
  88082. */
  88083. update: function (particle, delta)
  88084. {
  88085. var x = this.x - particle.x;
  88086. var y = this.y - particle.y;
  88087. var dSq = x * x + y * y;
  88088. if (dSq === 0)
  88089. {
  88090. return;
  88091. }
  88092. var d = Math.sqrt(dSq);
  88093. if (dSq < this._epsilon)
  88094. {
  88095. dSq = this._epsilon;
  88096. }
  88097. var factor = ((this._power * delta) / (dSq * d)) * 100;
  88098. particle.velocityX += x * factor;
  88099. particle.velocityY += y * factor;
  88100. },
  88101. epsilon: {
  88102. get: function ()
  88103. {
  88104. return Math.sqrt(this._epsilon);
  88105. },
  88106. set: function (value)
  88107. {
  88108. this._epsilon = value * value;
  88109. }
  88110. },
  88111. power: {
  88112. get: function ()
  88113. {
  88114. return this._power / this._gravity;
  88115. },
  88116. set: function (value)
  88117. {
  88118. this._power = value * this._gravity;
  88119. }
  88120. },
  88121. gravity: {
  88122. get: function ()
  88123. {
  88124. return this._gravity;
  88125. },
  88126. set: function (value)
  88127. {
  88128. var pwr = this.power;
  88129. this._gravity = value;
  88130. this.power = pwr;
  88131. }
  88132. }
  88133. });
  88134. module.exports = GravityWell;
  88135. /***/ }),
  88136. /* 430 */
  88137. /***/ (function(module, exports, __webpack_require__) {
  88138. /**
  88139. * @author Richard Davey <rich@photonstorm.com>
  88140. * @copyright 2018 Photon Storm Ltd.
  88141. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88142. */
  88143. var GameObject = __webpack_require__(2);
  88144. /**
  88145. * Renders this Game Object with the Canvas Renderer to the given Camera.
  88146. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  88147. * This method should not be called directly. It is a utility function of the Render module.
  88148. *
  88149. * @method Phaser.GameObjects.Image#renderCanvas
  88150. * @since 3.0.0
  88151. * @private
  88152. *
  88153. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  88154. * @param {Phaser.GameObjects.Image} src - The Game Object being rendered in this call.
  88155. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  88156. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  88157. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  88158. */
  88159. var ImageCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  88160. {
  88161. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  88162. {
  88163. return;
  88164. }
  88165. renderer.drawImage(src, camera, parentMatrix);
  88166. };
  88167. module.exports = ImageCanvasRenderer;
  88168. /***/ }),
  88169. /* 431 */
  88170. /***/ (function(module, exports, __webpack_require__) {
  88171. /**
  88172. * @author Richard Davey <rich@photonstorm.com>
  88173. * @copyright 2018 Photon Storm Ltd.
  88174. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88175. */
  88176. var GameObject = __webpack_require__(2);
  88177. /**
  88178. * Renders this Game Object with the WebGL Renderer to the given Camera.
  88179. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  88180. * This method should not be called directly. It is a utility function of the Render module.
  88181. *
  88182. * @method Phaser.GameObjects.Image#renderWebGL
  88183. * @since 3.0.0
  88184. * @private
  88185. *
  88186. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  88187. * @param {Phaser.GameObjects.Image} src - The Game Object being rendered in this call.
  88188. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  88189. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  88190. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  88191. */
  88192. var ImageWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  88193. {
  88194. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  88195. {
  88196. return;
  88197. }
  88198. this.pipeline.batchSprite(src, camera, parentMatrix);
  88199. };
  88200. module.exports = ImageWebGLRenderer;
  88201. /***/ }),
  88202. /* 432 */
  88203. /***/ (function(module, exports, __webpack_require__) {
  88204. /**
  88205. * @author Richard Davey <rich@photonstorm.com>
  88206. * @copyright 2018 Photon Storm Ltd.
  88207. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88208. */
  88209. var renderWebGL = __webpack_require__(3);
  88210. var renderCanvas = __webpack_require__(3);
  88211. if (true)
  88212. {
  88213. renderWebGL = __webpack_require__(431);
  88214. }
  88215. if (true)
  88216. {
  88217. renderCanvas = __webpack_require__(430);
  88218. }
  88219. module.exports = {
  88220. renderWebGL: renderWebGL,
  88221. renderCanvas: renderCanvas
  88222. };
  88223. /***/ }),
  88224. /* 433 */
  88225. /***/ (function(module, exports, __webpack_require__) {
  88226. /**
  88227. * @author Richard Davey <rich@photonstorm.com>
  88228. * @copyright 2018 Photon Storm Ltd.
  88229. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88230. */
  88231. var GameObject = __webpack_require__(2);
  88232. /**
  88233. * Renders this Game Object with the WebGL Renderer to the given Camera.
  88234. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  88235. * This method should not be called directly. It is a utility function of the Render module.
  88236. *
  88237. * @method Phaser.GameObjects.Graphics#renderWebGL
  88238. * @since 3.0.0
  88239. * @private
  88240. *
  88241. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  88242. * @param {Phaser.GameObjects.Graphics} graphics - The Game Object being rendered in this call.
  88243. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  88244. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  88245. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  88246. */
  88247. var GraphicsWebGLRenderer = function (renderer, graphics, interpolationPercentage, camera, parentMatrix)
  88248. {
  88249. if (GameObject.RENDER_MASK !== graphics.renderFlags || (graphics.cameraFilter > 0 && (graphics.cameraFilter & camera._id)))
  88250. {
  88251. return;
  88252. }
  88253. this.pipeline.batchGraphics(this, camera, parentMatrix);
  88254. };
  88255. module.exports = GraphicsWebGLRenderer;
  88256. /***/ }),
  88257. /* 434 */
  88258. /***/ (function(module, exports, __webpack_require__) {
  88259. /**
  88260. * @author Richard Davey <rich@photonstorm.com>
  88261. * @copyright 2018 Photon Storm Ltd.
  88262. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88263. */
  88264. var renderWebGL = __webpack_require__(3);
  88265. var renderCanvas = __webpack_require__(3);
  88266. if (true)
  88267. {
  88268. renderWebGL = __webpack_require__(433);
  88269. // Needed for Graphics.generateTexture
  88270. renderCanvas = __webpack_require__(181);
  88271. }
  88272. if (true)
  88273. {
  88274. renderCanvas = __webpack_require__(181);
  88275. }
  88276. module.exports = {
  88277. renderWebGL: renderWebGL,
  88278. renderCanvas: renderCanvas
  88279. };
  88280. /***/ }),
  88281. /* 435 */
  88282. /***/ (function(module, exports) {
  88283. /**
  88284. * @author Richard Davey <rich@photonstorm.com>
  88285. * @copyright 2018 Photon Storm Ltd.
  88286. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88287. */
  88288. /**
  88289. * Offsets the Ellipse by the values given in the `x` and `y` properties of the Point object.
  88290. *
  88291. * @function Phaser.Geom.Ellipse.OffsetPoint
  88292. * @since 3.0.0
  88293. *
  88294. * @generic {Phaser.Geom.Ellipse} O - [ellipse,$return]
  88295. *
  88296. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to be offset (translated.)
  88297. * @param {(Phaser.Geom.Point|object)} point - The Point object containing the values to offset the Ellipse by.
  88298. *
  88299. * @return {Phaser.Geom.Ellipse} The Ellipse that was offset.
  88300. */
  88301. var OffsetPoint = function (ellipse, point)
  88302. {
  88303. ellipse.x += point.x;
  88304. ellipse.y += point.y;
  88305. return ellipse;
  88306. };
  88307. module.exports = OffsetPoint;
  88308. /***/ }),
  88309. /* 436 */
  88310. /***/ (function(module, exports) {
  88311. /**
  88312. * @author Richard Davey <rich@photonstorm.com>
  88313. * @copyright 2018 Photon Storm Ltd.
  88314. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88315. */
  88316. /**
  88317. * Offsets the Ellipse by the values given.
  88318. *
  88319. * @function Phaser.Geom.Ellipse.Offset
  88320. * @since 3.0.0
  88321. *
  88322. * @generic {Phaser.Geom.Ellipse} O - [ellipse,$return]
  88323. *
  88324. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to be offset (translated.)
  88325. * @param {number} x - The amount to horizontally offset the Ellipse by.
  88326. * @param {number} y - The amount to vertically offset the Ellipse by.
  88327. *
  88328. * @return {Phaser.Geom.Ellipse} The Ellipse that was offset.
  88329. */
  88330. var Offset = function (ellipse, x, y)
  88331. {
  88332. ellipse.x += x;
  88333. ellipse.y += y;
  88334. return ellipse;
  88335. };
  88336. module.exports = Offset;
  88337. /***/ }),
  88338. /* 437 */
  88339. /***/ (function(module, exports, __webpack_require__) {
  88340. /**
  88341. * @author Richard Davey <rich@photonstorm.com>
  88342. * @copyright 2018 Photon Storm Ltd.
  88343. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88344. */
  88345. var Rectangle = __webpack_require__(13);
  88346. /**
  88347. * Returns the bounds of the Ellipse object.
  88348. *
  88349. * @function Phaser.Geom.Ellipse.GetBounds
  88350. * @since 3.0.0
  88351. *
  88352. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  88353. *
  88354. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get the bounds from.
  88355. * @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.
  88356. *
  88357. * @return {(Phaser.Geom.Rectangle|object)} The Rectangle object containing the Ellipse bounds.
  88358. */
  88359. var GetBounds = function (ellipse, out)
  88360. {
  88361. if (out === undefined) { out = new Rectangle(); }
  88362. out.x = ellipse.left;
  88363. out.y = ellipse.top;
  88364. out.width = ellipse.width;
  88365. out.height = ellipse.height;
  88366. return out;
  88367. };
  88368. module.exports = GetBounds;
  88369. /***/ }),
  88370. /* 438 */
  88371. /***/ (function(module, exports) {
  88372. /**
  88373. * @author Richard Davey <rich@photonstorm.com>
  88374. * @copyright 2018 Photon Storm Ltd.
  88375. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88376. */
  88377. /**
  88378. * Compares the `x`, `y`, `width` and `height` properties of the two given Ellipses.
  88379. * Returns `true` if they all match, otherwise returns `false`.
  88380. *
  88381. * @function Phaser.Geom.Ellipse.Equals
  88382. * @since 3.0.0
  88383. *
  88384. * @param {Phaser.Geom.Ellipse} ellipse - The first Ellipse to compare.
  88385. * @param {Phaser.Geom.Ellipse} toCompare - The second Ellipse to compare.
  88386. *
  88387. * @return {boolean} `true` if the two Ellipse equal each other, otherwise `false`.
  88388. */
  88389. var Equals = function (ellipse, toCompare)
  88390. {
  88391. return (
  88392. ellipse.x === toCompare.x &&
  88393. ellipse.y === toCompare.y &&
  88394. ellipse.width === toCompare.width &&
  88395. ellipse.height === toCompare.height
  88396. );
  88397. };
  88398. module.exports = Equals;
  88399. /***/ }),
  88400. /* 439 */
  88401. /***/ (function(module, exports) {
  88402. /**
  88403. * @author Richard Davey <rich@photonstorm.com>
  88404. * @copyright 2018 Photon Storm Ltd.
  88405. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88406. */
  88407. /**
  88408. * Copies the `x`, `y`, `width` and `height` properties from the `source` Ellipse
  88409. * into the given `dest` Ellipse, then returns the `dest` Ellipse.
  88410. *
  88411. * @function Phaser.Geom.Ellipse.CopyFrom
  88412. * @since 3.0.0
  88413. *
  88414. * @generic {Phaser.Geom.Ellipse} O - [dest,$return]
  88415. *
  88416. * @param {Phaser.Geom.Ellipse} source - The source Ellipse to copy the values from.
  88417. * @param {Phaser.Geom.Ellipse} dest - The destination Ellipse to copy the values to.
  88418. *
  88419. * @return {Phaser.Geom.Ellipse} The destination Ellipse.
  88420. */
  88421. var CopyFrom = function (source, dest)
  88422. {
  88423. return dest.setTo(source.x, source.y, source.width, source.height);
  88424. };
  88425. module.exports = CopyFrom;
  88426. /***/ }),
  88427. /* 440 */
  88428. /***/ (function(module, exports, __webpack_require__) {
  88429. /**
  88430. * @author Richard Davey <rich@photonstorm.com>
  88431. * @copyright 2018 Photon Storm Ltd.
  88432. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88433. */
  88434. var Contains = __webpack_require__(55);
  88435. /**
  88436. * Check to see if the Ellipse contains all four points of the given Rectangle object.
  88437. *
  88438. * @function Phaser.Geom.Ellipse.ContainsRect
  88439. * @since 3.0.0
  88440. *
  88441. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to check.
  88442. * @param {(Phaser.Geom.Rectangle|object)} rect - The Rectangle object to check if it's within the Ellipse or not.
  88443. *
  88444. * @return {boolean} True if all of the Rectangle coordinates are within the ellipse, otherwise false.
  88445. */
  88446. var ContainsRect = function (ellipse, rect)
  88447. {
  88448. return (
  88449. Contains(ellipse, rect.x, rect.y) &&
  88450. Contains(ellipse, rect.right, rect.y) &&
  88451. Contains(ellipse, rect.x, rect.bottom) &&
  88452. Contains(ellipse, rect.right, rect.bottom)
  88453. );
  88454. };
  88455. module.exports = ContainsRect;
  88456. /***/ }),
  88457. /* 441 */
  88458. /***/ (function(module, exports, __webpack_require__) {
  88459. /**
  88460. * @author Richard Davey <rich@photonstorm.com>
  88461. * @copyright 2018 Photon Storm Ltd.
  88462. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88463. */
  88464. var Contains = __webpack_require__(55);
  88465. /**
  88466. * Check to see if the Ellipse contains the given Point object.
  88467. *
  88468. * @function Phaser.Geom.Ellipse.ContainsPoint
  88469. * @since 3.0.0
  88470. *
  88471. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to check.
  88472. * @param {(Phaser.Geom.Point|object)} point - The Point object to check if it's within the Circle or not.
  88473. *
  88474. * @return {boolean} True if the Point coordinates are within the circle, otherwise false.
  88475. */
  88476. var ContainsPoint = function (ellipse, point)
  88477. {
  88478. return Contains(ellipse, point.x, point.y);
  88479. };
  88480. module.exports = ContainsPoint;
  88481. /***/ }),
  88482. /* 442 */
  88483. /***/ (function(module, exports, __webpack_require__) {
  88484. /**
  88485. * @author Richard Davey <rich@photonstorm.com>
  88486. * @copyright 2018 Photon Storm Ltd.
  88487. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88488. */
  88489. var Ellipse = __webpack_require__(114);
  88490. /**
  88491. * Creates a new Ellipse instance based on the values contained in the given source.
  88492. *
  88493. * @function Phaser.Geom.Ellipse.Clone
  88494. * @since 3.0.0
  88495. *
  88496. * @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.
  88497. *
  88498. * @return {Phaser.Geom.Ellipse} A clone of the source Ellipse.
  88499. */
  88500. var Clone = function (source)
  88501. {
  88502. return new Ellipse(source.x, source.y, source.width, source.height);
  88503. };
  88504. module.exports = Clone;
  88505. /***/ }),
  88506. /* 443 */
  88507. /***/ (function(module, exports) {
  88508. /**
  88509. * @author Richard Davey <rich@photonstorm.com>
  88510. * @copyright 2018 Photon Storm Ltd.
  88511. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88512. */
  88513. /**
  88514. * Calculates the area of the Ellipse.
  88515. *
  88516. * @function Phaser.Geom.Ellipse.Area
  88517. * @since 3.0.0
  88518. *
  88519. * @param {Phaser.Geom.Ellipse} ellipse - The Ellipse to get the area of.
  88520. *
  88521. * @return {number} The area of the Ellipse.
  88522. */
  88523. var Area = function (ellipse)
  88524. {
  88525. if (ellipse.isEmpty())
  88526. {
  88527. return 0;
  88528. }
  88529. // units squared
  88530. return (ellipse.getMajorRadius() * ellipse.getMinorRadius() * Math.PI);
  88531. };
  88532. module.exports = Area;
  88533. /***/ }),
  88534. /* 444 */
  88535. /***/ (function(module, exports, __webpack_require__) {
  88536. /**
  88537. * @author Richard Davey <rich@photonstorm.com>
  88538. * @copyright 2018 Photon Storm Ltd.
  88539. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88540. */
  88541. var Rectangle = __webpack_require__(13);
  88542. /**
  88543. * [description]
  88544. *
  88545. * @function Phaser.Geom.Rectangle.Union
  88546. * @since 3.0.0
  88547. *
  88548. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  88549. *
  88550. * @param {Phaser.Geom.Rectangle} rectA - [description]
  88551. * @param {Phaser.Geom.Rectangle} rectB - [description]
  88552. * @param {Phaser.Geom.Rectangle} [out] - [description]
  88553. *
  88554. * @return {Phaser.Geom.Rectangle} [description]
  88555. */
  88556. var Union = function (rectA, rectB, out)
  88557. {
  88558. if (out === undefined) { out = new Rectangle(); }
  88559. // Cache vars so we can use one of the input rects as the output rect
  88560. var x = Math.min(rectA.x, rectB.x);
  88561. var y = Math.min(rectA.y, rectB.y);
  88562. var w = Math.max(rectA.right, rectB.right) - x;
  88563. var h = Math.max(rectA.bottom, rectB.bottom) - y;
  88564. return out.setTo(x, y, w, h);
  88565. };
  88566. module.exports = Union;
  88567. /***/ }),
  88568. /* 445 */
  88569. /***/ (function(module, exports) {
  88570. /**
  88571. * @author Richard Davey <rich@photonstorm.com>
  88572. * @copyright 2018 Photon Storm Ltd.
  88573. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88574. */
  88575. /**
  88576. * Read an integer value from an XML Node.
  88577. *
  88578. * @function getValue
  88579. * @since 3.0.0
  88580. * @private
  88581. *
  88582. * @param {Node} node - The XML Node.
  88583. * @param {string} attribute - The attribute to read.
  88584. *
  88585. * @return {integer} The parsed value.
  88586. */
  88587. function getValue (node, attribute)
  88588. {
  88589. return parseInt(node.getAttribute(attribute), 10);
  88590. }
  88591. /**
  88592. * Parse an XML font to Bitmap Font data for the Bitmap Font cache.
  88593. *
  88594. * @function ParseXMLBitmapFont
  88595. * @since 3.0.0
  88596. * @private
  88597. *
  88598. * @param {XMLDocument} xml - The XML Document to parse the font from.
  88599. * @param {integer} [xSpacing=0] - The x-axis spacing to add between each letter.
  88600. * @param {integer} [ySpacing=0] - The y-axis spacing to add to the line height.
  88601. * @param {Phaser.Textures.Frame} [frame] - The texture frame to take into account while parsing.
  88602. *
  88603. * @return {BitmapFontData} The parsed Bitmap Font data.
  88604. */
  88605. var ParseXMLBitmapFont = function (xml, xSpacing, ySpacing, frame)
  88606. {
  88607. if (xSpacing === undefined) { xSpacing = 0; }
  88608. if (ySpacing === undefined) { ySpacing = 0; }
  88609. var data = {};
  88610. var info = xml.getElementsByTagName('info')[0];
  88611. var common = xml.getElementsByTagName('common')[0];
  88612. data.font = info.getAttribute('face');
  88613. data.size = getValue(info, 'size');
  88614. data.lineHeight = getValue(common, 'lineHeight') + ySpacing;
  88615. data.chars = {};
  88616. var letters = xml.getElementsByTagName('char');
  88617. var adjustForTrim = (frame !== undefined && frame.trimmed);
  88618. if (adjustForTrim)
  88619. {
  88620. var top = frame.height;
  88621. var left = frame.width;
  88622. }
  88623. for (var i = 0; i < letters.length; i++)
  88624. {
  88625. var node = letters[i];
  88626. var charCode = getValue(node, 'id');
  88627. var gx = getValue(node, 'x');
  88628. var gy = getValue(node, 'y');
  88629. var gw = getValue(node, 'width');
  88630. var gh = getValue(node, 'height');
  88631. // Handle frame trim issues
  88632. if (adjustForTrim)
  88633. {
  88634. if (gx < left)
  88635. {
  88636. left = gx;
  88637. }
  88638. if (gy < top)
  88639. {
  88640. top = gy;
  88641. }
  88642. }
  88643. data.chars[charCode] =
  88644. {
  88645. x: gx,
  88646. y: gy,
  88647. width: gw,
  88648. height: gh,
  88649. centerX: Math.floor(gw / 2),
  88650. centerY: Math.floor(gh / 2),
  88651. xOffset: getValue(node, 'xoffset'),
  88652. yOffset: getValue(node, 'yoffset'),
  88653. xAdvance: getValue(node, 'xadvance') + xSpacing,
  88654. data: {},
  88655. kerning: {}
  88656. };
  88657. }
  88658. if (adjustForTrim && top !== 0 && left !== 0)
  88659. {
  88660. // console.log('top and left', top, left, frame.x, frame.y);
  88661. // Now we know the top and left coordinates of the glyphs in the original data
  88662. // so we can work out how much to adjust the glyphs by
  88663. for (var code in data.chars)
  88664. {
  88665. var glyph = data.chars[code];
  88666. glyph.x -= frame.x;
  88667. glyph.y -= frame.y;
  88668. }
  88669. }
  88670. var kernings = xml.getElementsByTagName('kerning');
  88671. for (i = 0; i < kernings.length; i++)
  88672. {
  88673. var kern = kernings[i];
  88674. var first = getValue(kern, 'first');
  88675. var second = getValue(kern, 'second');
  88676. var amount = getValue(kern, 'amount');
  88677. data.chars[second].kerning[first] = amount;
  88678. }
  88679. return data;
  88680. };
  88681. module.exports = ParseXMLBitmapFont;
  88682. /***/ }),
  88683. /* 446 */
  88684. /***/ (function(module, exports, __webpack_require__) {
  88685. /**
  88686. * @author Richard Davey <rich@photonstorm.com>
  88687. * @copyright 2018 Photon Storm Ltd.
  88688. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88689. */
  88690. var Class = __webpack_require__(0);
  88691. var PluginCache = __webpack_require__(12);
  88692. /**
  88693. * @classdesc
  88694. * The Update List plugin.
  88695. *
  88696. * Update Lists belong to a Scene and maintain the list Game Objects to be updated every frame.
  88697. *
  88698. * Some or all of these Game Objects may also be part of the Scene's [Display List]{@link Phaser.GameObjects.DisplayList}, for Rendering.
  88699. *
  88700. * @class UpdateList
  88701. * @memberOf Phaser.GameObjects
  88702. * @constructor
  88703. * @since 3.0.0
  88704. *
  88705. * @param {Phaser.Scene} scene - The Scene that the Update List belongs to.
  88706. */
  88707. var UpdateList = new Class({
  88708. initialize:
  88709. function UpdateList (scene)
  88710. {
  88711. /**
  88712. * The Scene that the Update List belongs to.
  88713. *
  88714. * @name Phaser.GameObjects.UpdateList#scene
  88715. * @type {Phaser.Scene}
  88716. * @since 3.0.0
  88717. */
  88718. this.scene = scene;
  88719. /**
  88720. * The Scene's Systems.
  88721. *
  88722. * @name Phaser.GameObjects.UpdateList#systems
  88723. * @type {Phaser.Scenes.Systems}
  88724. * @since 3.0.0
  88725. */
  88726. this.systems = scene.sys;
  88727. /**
  88728. * The list of Game Objects.
  88729. *
  88730. * @name Phaser.GameObjects.UpdateList#_list
  88731. * @type {array}
  88732. * @private
  88733. * @default []
  88734. * @since 3.0.0
  88735. */
  88736. this._list = [];
  88737. /**
  88738. * Game Objects that are pending insertion into the list.
  88739. *
  88740. * @name Phaser.GameObjects.UpdateList#_pendingInsertion
  88741. * @type {array}
  88742. * @private
  88743. * @default []
  88744. * @since 3.0.0
  88745. */
  88746. this._pendingInsertion = [];
  88747. /**
  88748. * Game Objects that are pending removal from the list.
  88749. *
  88750. * @name Phaser.GameObjects.UpdateList#_pendingRemoval
  88751. * @type {array}
  88752. * @private
  88753. * @default []
  88754. * @since 3.0.0
  88755. */
  88756. this._pendingRemoval = [];
  88757. scene.sys.events.once('boot', this.boot, this);
  88758. scene.sys.events.on('start', this.start, this);
  88759. },
  88760. /**
  88761. * This method is called automatically, only once, when the Scene is first created.
  88762. * Do not invoke it directly.
  88763. *
  88764. * @method Phaser.GameObjects.UpdateList#boot
  88765. * @private
  88766. * @since 3.5.1
  88767. */
  88768. boot: function ()
  88769. {
  88770. this.systems.events.once('destroy', this.destroy, this);
  88771. },
  88772. /**
  88773. * This method is called automatically by the Scene when it is starting up.
  88774. * It is responsible for creating local systems, properties and listening for Scene events.
  88775. * Do not invoke it directly.
  88776. *
  88777. * @method Phaser.GameObjects.UpdateList#start
  88778. * @private
  88779. * @since 3.5.0
  88780. */
  88781. start: function ()
  88782. {
  88783. var eventEmitter = this.systems.events;
  88784. eventEmitter.on('preupdate', this.preUpdate, this);
  88785. eventEmitter.on('update', this.update, this);
  88786. eventEmitter.once('shutdown', this.shutdown, this);
  88787. },
  88788. /**
  88789. * Add a Game Object to the Update List.
  88790. *
  88791. * @method Phaser.GameObjects.UpdateList#add
  88792. * @since 3.0.0
  88793. *
  88794. * @param {Phaser.GameObjects.GameObject} child - The Game Object to add.
  88795. *
  88796. * @return {Phaser.GameObjects.GameObject} The added Game Object.
  88797. */
  88798. add: function (child)
  88799. {
  88800. // Is child already in this list?
  88801. if (this._list.indexOf(child) === -1 && this._pendingInsertion.indexOf(child) === -1)
  88802. {
  88803. this._pendingInsertion.push(child);
  88804. }
  88805. return child;
  88806. },
  88807. /**
  88808. * The pre-update step.
  88809. *
  88810. * Handles Game Objects that are pending insertion to and removal from the list.
  88811. *
  88812. * @method Phaser.GameObjects.UpdateList#preUpdate
  88813. * @since 3.0.0
  88814. */
  88815. preUpdate: function ()
  88816. {
  88817. var toRemove = this._pendingRemoval.length;
  88818. var toInsert = this._pendingInsertion.length;
  88819. if (toRemove === 0 && toInsert === 0)
  88820. {
  88821. // Quick bail
  88822. return;
  88823. }
  88824. var i;
  88825. var gameObject;
  88826. // Delete old gameObjects
  88827. for (i = 0; i < toRemove; i++)
  88828. {
  88829. gameObject = this._pendingRemoval[i];
  88830. var index = this._list.indexOf(gameObject);
  88831. if (index > -1)
  88832. {
  88833. this._list.splice(index, 1);
  88834. }
  88835. }
  88836. // Move pending to active
  88837. this._list = this._list.concat(this._pendingInsertion.splice(0));
  88838. // Clear the lists
  88839. this._pendingRemoval.length = 0;
  88840. this._pendingInsertion.length = 0;
  88841. },
  88842. /**
  88843. * The update step.
  88844. *
  88845. * Pre-updates every active Game Object in the list.
  88846. *
  88847. * @method Phaser.GameObjects.UpdateList#update
  88848. * @since 3.0.0
  88849. *
  88850. * @param {number} time - The current timestamp.
  88851. * @param {number} delta - The delta time elapsed since the last frame.
  88852. */
  88853. update: function (time, delta)
  88854. {
  88855. for (var i = 0; i < this._list.length; i++)
  88856. {
  88857. var gameObject = this._list[i];
  88858. if (gameObject.active)
  88859. {
  88860. gameObject.preUpdate.call(gameObject, time, delta);
  88861. }
  88862. }
  88863. },
  88864. /**
  88865. * Remove a Game Object from the list.
  88866. *
  88867. * @method Phaser.GameObjects.UpdateList#remove
  88868. * @since 3.0.0
  88869. *
  88870. * @param {Phaser.GameObjects.GameObject} child - The Game Object to remove from the list.
  88871. *
  88872. * @return {Phaser.GameObjects.GameObject} The removed Game Object.
  88873. */
  88874. remove: function (child)
  88875. {
  88876. var index = this._list.indexOf(child);
  88877. if (index !== -1)
  88878. {
  88879. this._list.splice(index, 1);
  88880. }
  88881. return child;
  88882. },
  88883. /**
  88884. * Remove all Game Objects from the list.
  88885. *
  88886. * @method Phaser.GameObjects.UpdateList#removeAll
  88887. * @since 3.0.0
  88888. *
  88889. * @return {Phaser.GameObjects.UpdateList} This UpdateList.
  88890. */
  88891. removeAll: function ()
  88892. {
  88893. var i = this._list.length;
  88894. while (i--)
  88895. {
  88896. this.remove(this._list[i]);
  88897. }
  88898. return this;
  88899. },
  88900. /**
  88901. * The Scene that owns this plugin is shutting down.
  88902. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  88903. *
  88904. * @method Phaser.GameObjects.UpdateList#shutdown
  88905. * @since 3.0.0
  88906. */
  88907. shutdown: function ()
  88908. {
  88909. this.removeAll();
  88910. this._list.length = 0;
  88911. this._pendingRemoval.length = 0;
  88912. this._pendingInsertion.length = 0;
  88913. var eventEmitter = this.systems.events;
  88914. eventEmitter.off('preupdate', this.preUpdate, this);
  88915. eventEmitter.off('update', this.update, this);
  88916. eventEmitter.off('shutdown', this.shutdown, this);
  88917. },
  88918. /**
  88919. * The Scene that owns this plugin is being destroyed.
  88920. * We need to shutdown and then kill off all external references.
  88921. *
  88922. * @method Phaser.GameObjects.UpdateList#destroy
  88923. * @since 3.0.0
  88924. */
  88925. destroy: function ()
  88926. {
  88927. this.shutdown();
  88928. this.scene.sys.events.off('start', this.start, this);
  88929. this.scene = null;
  88930. this.systems = null;
  88931. },
  88932. /**
  88933. * The length of the list.
  88934. *
  88935. * @name Phaser.GameObjects.UpdateList#length
  88936. * @type {integer}
  88937. * @readOnly
  88938. * @since 3.10.0
  88939. */
  88940. length: {
  88941. get: function ()
  88942. {
  88943. return this._list.length;
  88944. }
  88945. }
  88946. });
  88947. PluginCache.register('UpdateList', UpdateList, 'updateList');
  88948. module.exports = UpdateList;
  88949. /***/ }),
  88950. /* 447 */
  88951. /***/ (function(module, exports) {
  88952. /**
  88953. * @author Richard Davey <rich@photonstorm.com>
  88954. * @copyright 2018 Photon Storm Ltd.
  88955. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88956. */
  88957. /**
  88958. * Swaps the position of two elements in the given array.
  88959. * The elements must exist in the same array.
  88960. * The array is modified in-place.
  88961. *
  88962. * @function Phaser.Utils.Array.Swap
  88963. * @since 3.4.0
  88964. *
  88965. * @param {array} array - The input array.
  88966. * @param {*} item1 - The first element to swap.
  88967. * @param {*} item2 - The second element to swap.
  88968. *
  88969. * @return {array} The input array.
  88970. */
  88971. var Swap = function (array, item1, item2)
  88972. {
  88973. if (item1 === item2)
  88974. {
  88975. return;
  88976. }
  88977. var index1 = array.indexOf(item1);
  88978. var index2 = array.indexOf(item2);
  88979. if (index1 < 0 || index2 < 0)
  88980. {
  88981. throw new Error('Supplied items must be elements of the same array');
  88982. }
  88983. array[index1] = item2;
  88984. array[index2] = item1;
  88985. return array;
  88986. };
  88987. module.exports = Swap;
  88988. /***/ }),
  88989. /* 448 */
  88990. /***/ (function(module, exports, __webpack_require__) {
  88991. /**
  88992. * @author Richard Davey <rich@photonstorm.com>
  88993. * @copyright 2018 Photon Storm Ltd.
  88994. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  88995. */
  88996. var SafeRange = __webpack_require__(29);
  88997. /**
  88998. * Scans the array for elements with the given property. If found, the property is set to the `value`.
  88999. *
  89000. * For example: `SetAll('visible', true)` would set all elements that have a `visible` property to `false`.
  89001. *
  89002. * Optionally you can specify a start and end index. For example if the array had 100 elements,
  89003. * and you set `startIndex` to 0 and `endIndex` to 50, it would update only the first 50 elements.
  89004. *
  89005. * @function Phaser.Utils.Array.SetAll
  89006. * @since 3.4.0
  89007. *
  89008. * @param {array} array - The array to search.
  89009. * @param {string} property - The property to test for on each array element.
  89010. * @param {*} value - The value to set the property to.
  89011. * @param {integer} [startIndex] - An optional start index to search from.
  89012. * @param {integer} [endIndex] - An optional end index to search to.
  89013. *
  89014. * @return {array} The input array.
  89015. */
  89016. var SetAll = function (array, property, value, startIndex, endIndex)
  89017. {
  89018. if (startIndex === undefined) { startIndex = 0; }
  89019. if (endIndex === undefined) { endIndex = array.length; }
  89020. if (SafeRange(array, startIndex, endIndex))
  89021. {
  89022. for (var i = startIndex; i < endIndex; i++)
  89023. {
  89024. var entry = array[i];
  89025. if (entry.hasOwnProperty(property))
  89026. {
  89027. entry[property] = value;
  89028. }
  89029. }
  89030. }
  89031. return array;
  89032. };
  89033. module.exports = SetAll;
  89034. /***/ }),
  89035. /* 449 */
  89036. /***/ (function(module, exports) {
  89037. /**
  89038. * @author Richard Davey <rich@photonstorm.com>
  89039. * @copyright 2018 Photon Storm Ltd.
  89040. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89041. */
  89042. /**
  89043. * Moves the given element to the bottom of the array.
  89044. * The array is modified in-place.
  89045. *
  89046. * @function Phaser.Utils.Array.SendToBack
  89047. * @since 3.4.0
  89048. *
  89049. * @param {array} array - The array.
  89050. * @param {*} item - The element to move.
  89051. *
  89052. * @return {*} The element that was moved.
  89053. */
  89054. var SendToBack = function (array, item)
  89055. {
  89056. var currentIndex = array.indexOf(item);
  89057. if (currentIndex !== -1 && currentIndex > 0)
  89058. {
  89059. array.splice(currentIndex, 1);
  89060. array.unshift(item);
  89061. }
  89062. return item;
  89063. };
  89064. module.exports = SendToBack;
  89065. /***/ }),
  89066. /* 450 */
  89067. /***/ (function(module, exports) {
  89068. /**
  89069. * @author Richard Davey <rich@photonstorm.com>
  89070. * @copyright 2018 Photon Storm Ltd.
  89071. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89072. */
  89073. /**
  89074. * Replaces an element of the array with the new element.
  89075. * The new element cannot already be a member of the array.
  89076. * The array is modified in-place.
  89077. *
  89078. * @function Phaser.Utils.Array.Replace
  89079. * @since 3.4.0
  89080. *
  89081. * @param {*} oldChild - The element in the array that will be replaced.
  89082. * @param {*} newChild - The element to be inserted into the array at the position of `oldChild`.
  89083. *
  89084. * @return {boolean} Returns true if the oldChild was successfully replaced, otherwise returns false.
  89085. */
  89086. var Replace = function (array, oldChild, newChild)
  89087. {
  89088. var index1 = array.indexOf(oldChild);
  89089. var index2 = array.indexOf(newChild);
  89090. if (index1 !== -1 && index2 === -1)
  89091. {
  89092. array[index1] = newChild;
  89093. return true;
  89094. }
  89095. else
  89096. {
  89097. return false;
  89098. }
  89099. };
  89100. module.exports = Replace;
  89101. /***/ }),
  89102. /* 451 */
  89103. /***/ (function(module, exports, __webpack_require__) {
  89104. /**
  89105. * @author Richard Davey <rich@photonstorm.com>
  89106. * @copyright 2018 Photon Storm Ltd.
  89107. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89108. */
  89109. var SpliceOne = __webpack_require__(56);
  89110. /**
  89111. * Removes a random object from the given array and returns it.
  89112. * 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.
  89113. *
  89114. * @function Phaser.Utils.Array.RemoveRandomElement
  89115. * @since 3.0.0
  89116. *
  89117. * @param {array} array - The array to removed a random element from.
  89118. * @param {integer} [start=0] - The array index to start the search from.
  89119. * @param {integer} [length=array.length] - Optional restriction on the number of elements to randomly select from.
  89120. *
  89121. * @return {object} The random element that was removed, or `null` if there were no array elements that fell within the given range.
  89122. */
  89123. var RemoveRandomElement = function (array, start, length)
  89124. {
  89125. if (start === undefined) { start = 0; }
  89126. if (length === undefined) { length = array.length; }
  89127. var randomIndex = start + Math.floor(Math.random() * length);
  89128. return SpliceOne(array, randomIndex);
  89129. };
  89130. module.exports = RemoveRandomElement;
  89131. /***/ }),
  89132. /* 452 */
  89133. /***/ (function(module, exports, __webpack_require__) {
  89134. /**
  89135. * @author Richard Davey <rich@photonstorm.com>
  89136. * @copyright 2018 Photon Storm Ltd.
  89137. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89138. */
  89139. var SafeRange = __webpack_require__(29);
  89140. /**
  89141. * Removes the item within the given range in the array.
  89142. *
  89143. * The array is modified in-place.
  89144. *
  89145. * You can optionally specify a callback to be invoked for the item/s successfully removed from the array.
  89146. *
  89147. * @function Phaser.Utils.Array.RemoveBetween
  89148. * @since 3.4.0
  89149. *
  89150. * @param {array} array - The array to be modified.
  89151. * @param {integer} startIndex - The start index to remove from.
  89152. * @param {integer} endIndex - The end index to remove to.
  89153. * @param {function} [callback] - A callback to be invoked for the item removed from the array.
  89154. * @param {object} [context] - The context in which the callback is invoked.
  89155. *
  89156. * @return {Array.<*>} An array of items that were removed.
  89157. */
  89158. var RemoveBetween = function (array, startIndex, endIndex, callback, context)
  89159. {
  89160. if (startIndex === undefined) { startIndex = 0; }
  89161. if (endIndex === undefined) { endIndex = array.length; }
  89162. if (context === undefined) { context = array; }
  89163. if (SafeRange(array, startIndex, endIndex))
  89164. {
  89165. var size = endIndex - startIndex;
  89166. var removed = array.splice(startIndex, size);
  89167. if (callback)
  89168. {
  89169. for (var i = 0; i < removed.length; i++)
  89170. {
  89171. var entry = removed[i];
  89172. callback.call(context, entry);
  89173. }
  89174. }
  89175. return removed;
  89176. }
  89177. else
  89178. {
  89179. return [];
  89180. }
  89181. };
  89182. module.exports = RemoveBetween;
  89183. /***/ }),
  89184. /* 453 */
  89185. /***/ (function(module, exports, __webpack_require__) {
  89186. /**
  89187. * @author Richard Davey <rich@photonstorm.com>
  89188. * @copyright 2018 Photon Storm Ltd.
  89189. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89190. */
  89191. var SpliceOne = __webpack_require__(56);
  89192. /**
  89193. * Removes the item from the given position in the array.
  89194. *
  89195. * The array is modified in-place.
  89196. *
  89197. * You can optionally specify a callback to be invoked for the item if it is successfully removed from the array.
  89198. *
  89199. * @function Phaser.Utils.Array.RemoveAt
  89200. * @since 3.4.0
  89201. *
  89202. * @param {array} array - The array to be modified.
  89203. * @param {integer} index - The array index to remove the item from. The index must be in bounds or it will throw an error.
  89204. * @param {function} [callback] - A callback to be invoked for the item removed from the array.
  89205. * @param {object} [context] - The context in which the callback is invoked.
  89206. *
  89207. * @return {*} The item that was removed.
  89208. */
  89209. var RemoveAt = function (array, index, callback, context)
  89210. {
  89211. if (context === undefined) { context = array; }
  89212. if (index < 0 || index > array.length - 1)
  89213. {
  89214. throw new Error('Index out of bounds');
  89215. }
  89216. var item = SpliceOne(array, index);
  89217. if (callback)
  89218. {
  89219. callback.call(context, item);
  89220. }
  89221. return item;
  89222. };
  89223. module.exports = RemoveAt;
  89224. /***/ }),
  89225. /* 454 */
  89226. /***/ (function(module, exports, __webpack_require__) {
  89227. /**
  89228. * @author Richard Davey <rich@photonstorm.com>
  89229. * @copyright 2018 Photon Storm Ltd.
  89230. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89231. */
  89232. var RoundAwayFromZero = __webpack_require__(248);
  89233. /**
  89234. * Create an array of numbers (positive and/or negative) progressing from `start`
  89235. * up to but not including `end` by advancing by `step`.
  89236. *
  89237. * If `start` is less than `end` a zero-length range is created unless a negative `step` is specified.
  89238. *
  89239. * Certain values for `start` and `end` (eg. NaN/undefined/null) are currently coerced to 0;
  89240. * for forward compatibility make sure to pass in actual numbers.
  89241. *
  89242. * @example
  89243. * NumberArrayStep(4);
  89244. * // => [0, 1, 2, 3]
  89245. *
  89246. * NumberArrayStep(1, 5);
  89247. * // => [1, 2, 3, 4]
  89248. *
  89249. * NumberArrayStep(0, 20, 5);
  89250. * // => [0, 5, 10, 15]
  89251. *
  89252. * NumberArrayStep(0, -4, -1);
  89253. * // => [0, -1, -2, -3]
  89254. *
  89255. * NumberArrayStep(1, 4, 0);
  89256. * // => [1, 1, 1]
  89257. *
  89258. * NumberArrayStep(0);
  89259. * // => []
  89260. *
  89261. * @function Phaser.Utils.Array.NumberArrayStep
  89262. * @since 3.0.0
  89263. *
  89264. * @param {number} [start=0] - The start of the range.
  89265. * @param {number} [end=null] - The end of the range.
  89266. * @param {number} [step=1] - The value to increment or decrement by.
  89267. *
  89268. * @return {number[]} [description]
  89269. */
  89270. var NumberArrayStep = function (start, end, step)
  89271. {
  89272. if (start === undefined) { start = 0; }
  89273. if (end === undefined) { end = null; }
  89274. if (step === undefined) { step = 1; }
  89275. if (end === null)
  89276. {
  89277. end = start;
  89278. start = 0;
  89279. }
  89280. var result = [];
  89281. var total = Math.max(RoundAwayFromZero((end - start) / (step || 1)), 0);
  89282. for (var i = 0; i < total; i++)
  89283. {
  89284. result.push(start);
  89285. start += step;
  89286. }
  89287. return result;
  89288. };
  89289. module.exports = NumberArrayStep;
  89290. /***/ }),
  89291. /* 455 */
  89292. /***/ (function(module, exports) {
  89293. /**
  89294. * @author Richard Davey <rich@photonstorm.com>
  89295. * @copyright 2018 Photon Storm Ltd.
  89296. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89297. */
  89298. /**
  89299. * Create an array representing the range of numbers (usually integers), between, and inclusive of,
  89300. * the given `start` and `end` arguments. For example:
  89301. *
  89302. * `var array = numberArray(2, 4); // array = [2, 3, 4]`
  89303. * `var array = numberArray(0, 9); // array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]`
  89304. *
  89305. * This is equivalent to `numberArrayStep(start, end, 1)`.
  89306. *
  89307. * You can optionally provide a prefix and / or suffix string. If given the array will contain
  89308. * strings, not integers. For example:
  89309. *
  89310. * `var array = numberArray(1, 4, 'Level '); // array = ["Level 1", "Level 2", "Level 3", "Level 4"]`
  89311. * `var array = numberArray(5, 7, 'HD-', '.png'); // array = ["HD-5.png", "HD-6.png", "HD-7.png"]`
  89312. *
  89313. * @function Phaser.Utils.Array.NumberArray
  89314. * @since 3.0.0
  89315. *
  89316. * @param {number} start - The minimum value the array starts with.
  89317. * @param {number} end - The maximum value the array contains.
  89318. * @param {string} [prefix] - Optional prefix to place before the number. If provided the array will contain strings, not integers.
  89319. * @param {string} [suffix] - Optional suffix to place after the number. If provided the array will contain strings, not integers.
  89320. *
  89321. * @return {(number[]|string[])} The array of number values, or strings if a prefix or suffix was provided.
  89322. */
  89323. var NumberArray = function (start, end, prefix, suffix)
  89324. {
  89325. var result = [];
  89326. for (var i = start; i <= end; i++)
  89327. {
  89328. if (prefix || suffix)
  89329. {
  89330. var key = (prefix) ? prefix + i.toString() : i.toString();
  89331. if (suffix)
  89332. {
  89333. key = key.concat(suffix);
  89334. }
  89335. result.push(key);
  89336. }
  89337. else
  89338. {
  89339. result.push(i);
  89340. }
  89341. }
  89342. return result;
  89343. };
  89344. module.exports = NumberArray;
  89345. /***/ }),
  89346. /* 456 */
  89347. /***/ (function(module, exports) {
  89348. /**
  89349. * @author Richard Davey <rich@photonstorm.com>
  89350. * @copyright 2018 Photon Storm Ltd.
  89351. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89352. */
  89353. /**
  89354. * Moves the given array element up one place in the array.
  89355. * The array is modified in-place.
  89356. *
  89357. * @function Phaser.Utils.Array.MoveUp
  89358. * @since 3.4.0
  89359. *
  89360. * @param {array} array - The input array.
  89361. * @param {*} item - The element to move up the array.
  89362. *
  89363. * @return {array} The input array.
  89364. */
  89365. var MoveUp = function (array, item)
  89366. {
  89367. var currentIndex = array.indexOf(item);
  89368. if (currentIndex !== -1 && currentIndex < array.length - 2)
  89369. {
  89370. var item2 = array[currentIndex + 1];
  89371. var index2 = array.indexOf(item2);
  89372. array[currentIndex] = item2;
  89373. array[index2] = item;
  89374. }
  89375. return array;
  89376. };
  89377. module.exports = MoveUp;
  89378. /***/ }),
  89379. /* 457 */
  89380. /***/ (function(module, exports) {
  89381. /**
  89382. * @author Richard Davey <rich@photonstorm.com>
  89383. * @copyright 2018 Photon Storm Ltd.
  89384. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89385. */
  89386. /**
  89387. * Moves an element in an array to a new position within the same array.
  89388. * The array is modified in-place.
  89389. *
  89390. * @function Phaser.Utils.Array.MoveTo
  89391. * @since 3.4.0
  89392. *
  89393. * @param {array} array - The array.
  89394. * @param {*} item - The element to move.
  89395. * @param {integer} index - The new index that the element will be moved to.
  89396. *
  89397. * @return {*} The element that was moved.
  89398. */
  89399. var MoveTo = function (array, item, index)
  89400. {
  89401. var currentIndex = array.indexOf(item);
  89402. if (currentIndex === -1 || index < 0 || index >= array.length)
  89403. {
  89404. throw new Error('Supplied index out of bounds');
  89405. }
  89406. if (currentIndex !== index)
  89407. {
  89408. // Remove
  89409. array.splice(currentIndex, 1);
  89410. // Add in new location
  89411. array.splice(index, 0, item);
  89412. }
  89413. return item;
  89414. };
  89415. module.exports = MoveTo;
  89416. /***/ }),
  89417. /* 458 */
  89418. /***/ (function(module, exports) {
  89419. /**
  89420. * @author Richard Davey <rich@photonstorm.com>
  89421. * @copyright 2018 Photon Storm Ltd.
  89422. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89423. */
  89424. /**
  89425. * Moves the given array element down one place in the array.
  89426. * The array is modified in-place.
  89427. *
  89428. * @function Phaser.Utils.Array.MoveDown
  89429. * @since 3.4.0
  89430. *
  89431. * @param {array} array - The input array.
  89432. * @param {*} item - The element to move down the array.
  89433. *
  89434. * @return {array} The input array.
  89435. */
  89436. var MoveDown = function (array, item)
  89437. {
  89438. var currentIndex = array.indexOf(item);
  89439. if (currentIndex > 0)
  89440. {
  89441. var item2 = array[currentIndex - 1];
  89442. var index2 = array.indexOf(item2);
  89443. array[currentIndex] = item2;
  89444. array[index2] = item;
  89445. }
  89446. return array;
  89447. };
  89448. module.exports = MoveDown;
  89449. /***/ }),
  89450. /* 459 */
  89451. /***/ (function(module, exports, __webpack_require__) {
  89452. /**
  89453. * @author Richard Davey <rich@photonstorm.com>
  89454. * @copyright 2018 Photon Storm Ltd.
  89455. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89456. */
  89457. var SafeRange = __webpack_require__(29);
  89458. /**
  89459. * Returns the first element in the array.
  89460. *
  89461. * You can optionally specify a matching criteria using the `property` and `value` arguments.
  89462. *
  89463. * For example: `getAll('visible', true)` would return the first element that had its `visible` property set.
  89464. *
  89465. * Optionally you can specify a start and end index. For example if the array had 100 elements,
  89466. * and you set `startIndex` to 0 and `endIndex` to 50, it would search only the first 50 elements.
  89467. *
  89468. * @function Phaser.Utils.Array.GetFirst
  89469. * @since 3.4.0
  89470. *
  89471. * @param {array} array - The array to search.
  89472. * @param {string} [property] - The property to test on each array element.
  89473. * @param {*} [value] - The value to test the property against. Must pass a strict (`===`) comparison check.
  89474. * @param {integer} [startIndex=0] - An optional start index to search from.
  89475. * @param {integer} [endIndex=array.length] - An optional end index to search up to (but not included)
  89476. *
  89477. * @return {object} The first matching element from the array, or `null` if no element could be found in the range given.
  89478. */
  89479. var GetFirst = function (array, property, value, startIndex, endIndex)
  89480. {
  89481. if (startIndex === undefined) { startIndex = 0; }
  89482. if (endIndex === undefined) { endIndex = array.length; }
  89483. if (SafeRange(array, startIndex, endIndex))
  89484. {
  89485. for (var i = startIndex; i < endIndex; i++)
  89486. {
  89487. var child = array[i];
  89488. if (!property ||
  89489. (property && value === undefined && child.hasOwnProperty(property)) ||
  89490. (property && value !== undefined && child[property] === value))
  89491. {
  89492. return child;
  89493. }
  89494. }
  89495. }
  89496. return null;
  89497. };
  89498. module.exports = GetFirst;
  89499. /***/ }),
  89500. /* 460 */
  89501. /***/ (function(module, exports, __webpack_require__) {
  89502. /**
  89503. * @author Richard Davey <rich@photonstorm.com>
  89504. * @copyright 2018 Photon Storm Ltd.
  89505. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89506. */
  89507. var SafeRange = __webpack_require__(29);
  89508. /**
  89509. * Returns all elements in the array.
  89510. *
  89511. * You can optionally specify a matching criteria using the `property` and `value` arguments.
  89512. *
  89513. * For example: `getAll('visible', true)` would return only elements that have their visible property set.
  89514. *
  89515. * Optionally you can specify a start and end index. For example if the array had 100 elements,
  89516. * and you set `startIndex` to 0 and `endIndex` to 50, it would return matches from only
  89517. * the first 50 elements.
  89518. *
  89519. * @function Phaser.Utils.Array.GetAll
  89520. * @since 3.4.0
  89521. *
  89522. * @param {array} array - The array to search.
  89523. * @param {string} [property] - The property to test on each array element.
  89524. * @param {*} [value] - The value to test the property against. Must pass a strict (`===`) comparison check.
  89525. * @param {integer} [startIndex] - An optional start index to search from.
  89526. * @param {integer} [endIndex] - An optional end index to search to.
  89527. *
  89528. * @return {array} All matching elements from the array.
  89529. */
  89530. var GetAll = function (array, property, value, startIndex, endIndex)
  89531. {
  89532. if (startIndex === undefined) { startIndex = 0; }
  89533. if (endIndex === undefined) { endIndex = array.length; }
  89534. var output = [];
  89535. if (SafeRange(array, startIndex, endIndex))
  89536. {
  89537. for (var i = startIndex; i < endIndex; i++)
  89538. {
  89539. var child = array[i];
  89540. if (!property ||
  89541. (property && value === undefined && child.hasOwnProperty(property)) ||
  89542. (property && value !== undefined && child[property] === value))
  89543. {
  89544. output.push(child);
  89545. }
  89546. }
  89547. }
  89548. return output;
  89549. };
  89550. module.exports = GetAll;
  89551. /***/ }),
  89552. /* 461 */
  89553. /***/ (function(module, exports, __webpack_require__) {
  89554. /**
  89555. * @author Richard Davey <rich@photonstorm.com>
  89556. * @copyright 2018 Photon Storm Ltd.
  89557. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89558. */
  89559. var SafeRange = __webpack_require__(29);
  89560. /**
  89561. * Passes each element in the array, between the start and end indexes, to the given callback.
  89562. *
  89563. * @function Phaser.Utils.Array.EachInRange
  89564. * @since 3.4.0
  89565. *
  89566. * @param {array} array - The array to search.
  89567. * @param {function} callback - A callback to be invoked for each item in the array.
  89568. * @param {object} context - The context in which the callback is invoked.
  89569. * @param {integer} startIndex - The start index to search from.
  89570. * @param {integer} endIndex - The end index to search to.
  89571. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the child.
  89572. *
  89573. * @return {array} The input array.
  89574. */
  89575. var EachInRange = function (array, callback, context, startIndex, endIndex)
  89576. {
  89577. if (startIndex === undefined) { startIndex = 0; }
  89578. if (endIndex === undefined) { endIndex = array.length; }
  89579. if (SafeRange(array, startIndex, endIndex))
  89580. {
  89581. var i;
  89582. var args = [ null ];
  89583. for (i = 5; i < arguments.length; i++)
  89584. {
  89585. args.push(arguments[i]);
  89586. }
  89587. for (i = startIndex; i < endIndex; i++)
  89588. {
  89589. args[0] = array[i];
  89590. callback.apply(context, args);
  89591. }
  89592. }
  89593. return array;
  89594. };
  89595. module.exports = EachInRange;
  89596. /***/ }),
  89597. /* 462 */
  89598. /***/ (function(module, exports) {
  89599. /**
  89600. * @author Richard Davey <rich@photonstorm.com>
  89601. * @copyright 2018 Photon Storm Ltd.
  89602. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89603. */
  89604. /**
  89605. * Passes each element in the array to the given callback.
  89606. *
  89607. * @function Phaser.Utils.Array.Each
  89608. * @since 3.4.0
  89609. *
  89610. * @param {array} array - The array to search.
  89611. * @param {function} callback - A callback to be invoked for each item in the array.
  89612. * @param {object} context - The context in which the callback is invoked.
  89613. * @param {...*} [args] - Additional arguments that will be passed to the callback, after the current array item.
  89614. *
  89615. * @return {array} The input array.
  89616. */
  89617. var Each = function (array, callback, context)
  89618. {
  89619. var i;
  89620. var args = [ null ];
  89621. for (i = 3; i < arguments.length; i++)
  89622. {
  89623. args.push(arguments[i]);
  89624. }
  89625. for (i = 0; i < array.length; i++)
  89626. {
  89627. args[0] = array[i];
  89628. callback.apply(context, args);
  89629. }
  89630. return array;
  89631. };
  89632. module.exports = Each;
  89633. /***/ }),
  89634. /* 463 */
  89635. /***/ (function(module, exports, __webpack_require__) {
  89636. /**
  89637. * @author Richard Davey <rich@photonstorm.com>
  89638. * @copyright 2018 Photon Storm Ltd.
  89639. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89640. */
  89641. var SafeRange = __webpack_require__(29);
  89642. /**
  89643. * Returns the total number of elements in the array which have a property matching the given value.
  89644. *
  89645. * @function Phaser.Utils.Array.CountAllMatching
  89646. * @since 3.4.0
  89647. *
  89648. * @param {array} array - The array to search.
  89649. * @param {string} property - The property to test on each array element.
  89650. * @param {*} value - The value to test the property against. Must pass a strict (`===`) comparison check.
  89651. * @param {integer} [startIndex] - An optional start index to search from.
  89652. * @param {integer} [endIndex] - An optional end index to search to.
  89653. *
  89654. * @return {integer} The total number of elements with properties matching the given value.
  89655. */
  89656. var CountAllMatching = function (array, property, value, startIndex, endIndex)
  89657. {
  89658. if (startIndex === undefined) { startIndex = 0; }
  89659. if (endIndex === undefined) { endIndex = array.length; }
  89660. var total = 0;
  89661. if (SafeRange(array, startIndex, endIndex))
  89662. {
  89663. for (var i = startIndex; i < endIndex; i++)
  89664. {
  89665. var child = array[i];
  89666. if (child[property] === value)
  89667. {
  89668. total++;
  89669. }
  89670. }
  89671. }
  89672. return total;
  89673. };
  89674. module.exports = CountAllMatching;
  89675. /***/ }),
  89676. /* 464 */
  89677. /***/ (function(module, exports) {
  89678. /**
  89679. * @author Richard Davey <rich@photonstorm.com>
  89680. * @copyright 2018 Photon Storm Ltd.
  89681. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89682. */
  89683. /**
  89684. * Moves the given element to the top of the array.
  89685. * The array is modified in-place.
  89686. *
  89687. * @function Phaser.Utils.Array.BringToTop
  89688. * @since 3.4.0
  89689. *
  89690. * @param {array} array - The array.
  89691. * @param {*} item - The element to move.
  89692. *
  89693. * @return {*} The element that was moved.
  89694. */
  89695. var BringToTop = function (array, item)
  89696. {
  89697. var currentIndex = array.indexOf(item);
  89698. if (currentIndex !== -1 && currentIndex < array.length)
  89699. {
  89700. array.splice(currentIndex, 1);
  89701. array.push(item);
  89702. }
  89703. return item;
  89704. };
  89705. module.exports = BringToTop;
  89706. /***/ }),
  89707. /* 465 */
  89708. /***/ (function(module, exports) {
  89709. /**
  89710. * @author Richard Davey <rich@photonstorm.com>
  89711. * @copyright 2018 Photon Storm Ltd.
  89712. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89713. */
  89714. /**
  89715. * Adds the given item, or array of items, to the array starting at the index specified.
  89716. *
  89717. * Each item must be unique within the array.
  89718. *
  89719. * Existing elements in the array are shifted up.
  89720. *
  89721. * The array is modified in-place and returned.
  89722. *
  89723. * You can optionally specify a limit to the maximum size of the array. If the quantity of items being
  89724. * added will take the array length over this limit, it will stop adding once the limit is reached.
  89725. *
  89726. * You can optionally specify a callback to be invoked for each item successfully added to the array.
  89727. *
  89728. * @function Phaser.Utils.Array.AddAt
  89729. * @since 3.4.0
  89730. *
  89731. * @param {array} array - The array to be added to.
  89732. * @param {any|any[]} item - The item, or array of items, to add to the array.
  89733. * @param {integer} [index=0] - The index in the array where the item will be inserted.
  89734. * @param {integer} [limit] - Optional limit which caps the size of the array.
  89735. * @param {function} [callback] - A callback to be invoked for each item successfully added to the array.
  89736. * @param {object} [context] - The context in which the callback is invoked.
  89737. *
  89738. * @return {array} The input array.
  89739. */
  89740. var AddAt = function (array, item, index, limit, callback, context)
  89741. {
  89742. if (index === undefined) { index = 0; }
  89743. if (context === undefined) { context = array; }
  89744. if (limit > 0)
  89745. {
  89746. var remaining = limit - array.length;
  89747. // There's nothing more we can do here, the array is full
  89748. if (remaining <= 0)
  89749. {
  89750. return null;
  89751. }
  89752. }
  89753. // Fast path to avoid array mutation and iteration
  89754. if (!Array.isArray(item))
  89755. {
  89756. if (array.indexOf(item) === -1)
  89757. {
  89758. array.splice(index, 0, item);
  89759. if (callback)
  89760. {
  89761. callback.call(context, item);
  89762. }
  89763. return item;
  89764. }
  89765. else
  89766. {
  89767. return null;
  89768. }
  89769. }
  89770. // If we got this far, we have an array of items to insert
  89771. // Ensure all the items are unique
  89772. var itemLength = item.length - 1;
  89773. while (itemLength >= 0)
  89774. {
  89775. if (array.indexOf(item[itemLength]) !== -1)
  89776. {
  89777. // Already exists in array, so remove it
  89778. item.pop();
  89779. }
  89780. itemLength--;
  89781. }
  89782. // Anything left?
  89783. itemLength = item.length;
  89784. if (itemLength === 0)
  89785. {
  89786. return null;
  89787. }
  89788. // Truncate to the limit
  89789. if (limit > 0 && itemLength > remaining)
  89790. {
  89791. item.splice(remaining);
  89792. itemLength = remaining;
  89793. }
  89794. for (var i = itemLength - 1; i >= 0; i--)
  89795. {
  89796. var entry = item[i];
  89797. array.splice(index, 0, entry);
  89798. if (callback)
  89799. {
  89800. callback.call(context, entry);
  89801. }
  89802. }
  89803. return item;
  89804. };
  89805. module.exports = AddAt;
  89806. /***/ }),
  89807. /* 466 */
  89808. /***/ (function(module, exports) {
  89809. /**
  89810. * @author Richard Davey <rich@photonstorm.com>
  89811. * @copyright 2018 Photon Storm Ltd.
  89812. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89813. */
  89814. /**
  89815. * Adds the given item, or array of items, to the array.
  89816. *
  89817. * Each item must be unique within the array.
  89818. *
  89819. * The array is modified in-place and returned.
  89820. *
  89821. * You can optionally specify a limit to the maximum size of the array. If the quantity of items being
  89822. * added will take the array length over this limit, it will stop adding once the limit is reached.
  89823. *
  89824. * You can optionally specify a callback to be invoked for each item successfully added to the array.
  89825. *
  89826. * @function Phaser.Utils.Array.Add
  89827. * @since 3.4.0
  89828. *
  89829. * @param {array} array - The array to be added to.
  89830. * @param {any|any[]} item - The item, or array of items, to add to the array. Each item must be unique within the array.
  89831. * @param {integer} [limit] - Optional limit which caps the size of the array.
  89832. * @param {function} [callback] - A callback to be invoked for each item successfully added to the array.
  89833. * @param {object} [context] - The context in which the callback is invoked.
  89834. *
  89835. * @return {array} The input array.
  89836. */
  89837. var Add = function (array, item, limit, callback, context)
  89838. {
  89839. if (context === undefined) { context = array; }
  89840. if (limit > 0)
  89841. {
  89842. var remaining = limit - array.length;
  89843. // There's nothing more we can do here, the array is full
  89844. if (remaining <= 0)
  89845. {
  89846. return null;
  89847. }
  89848. }
  89849. // Fast path to avoid array mutation and iteration
  89850. if (!Array.isArray(item))
  89851. {
  89852. if (array.indexOf(item) === -1)
  89853. {
  89854. array.push(item);
  89855. if (callback)
  89856. {
  89857. callback.call(context, item);
  89858. }
  89859. return item;
  89860. }
  89861. else
  89862. {
  89863. return null;
  89864. }
  89865. }
  89866. // If we got this far, we have an array of items to insert
  89867. // Ensure all the items are unique
  89868. var itemLength = item.length - 1;
  89869. while (itemLength >= 0)
  89870. {
  89871. if (array.indexOf(item[itemLength]) !== -1)
  89872. {
  89873. // Already exists in array, so remove it
  89874. item.pop();
  89875. }
  89876. itemLength--;
  89877. }
  89878. // Anything left?
  89879. itemLength = item.length;
  89880. if (itemLength === 0)
  89881. {
  89882. return null;
  89883. }
  89884. if (limit > 0 && itemLength > remaining)
  89885. {
  89886. item.splice(remaining);
  89887. itemLength = remaining;
  89888. }
  89889. for (var i = 0; i < itemLength; i++)
  89890. {
  89891. var entry = item[i];
  89892. array.push(entry);
  89893. if (callback)
  89894. {
  89895. callback.call(context, entry);
  89896. }
  89897. }
  89898. return item;
  89899. };
  89900. module.exports = Add;
  89901. /***/ }),
  89902. /* 467 */
  89903. /***/ (function(module, exports, __webpack_require__) {
  89904. /**
  89905. * @author Richard Davey <rich@photonstorm.com>
  89906. * @copyright 2018 Photon Storm Ltd.
  89907. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89908. */
  89909. var RotateMatrix = __webpack_require__(76);
  89910. /**
  89911. * [description]
  89912. *
  89913. * @function Phaser.Utils.Array.Matrix.RotateRight
  89914. * @since 3.0.0
  89915. *
  89916. * @param {array} matrix - [description]
  89917. *
  89918. * @return {array} [description]
  89919. */
  89920. var RotateRight = function (matrix)
  89921. {
  89922. return RotateMatrix(matrix, -90);
  89923. };
  89924. module.exports = RotateRight;
  89925. /***/ }),
  89926. /* 468 */
  89927. /***/ (function(module, exports, __webpack_require__) {
  89928. /**
  89929. * @author Richard Davey <rich@photonstorm.com>
  89930. * @copyright 2018 Photon Storm Ltd.
  89931. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89932. */
  89933. var RotateMatrix = __webpack_require__(76);
  89934. /**
  89935. * [description]
  89936. *
  89937. * @function Phaser.Utils.Array.Matrix.RotateLeft
  89938. * @since 3.0.0
  89939. *
  89940. * @param {array} matrix - [description]
  89941. *
  89942. * @return {array} [description]
  89943. */
  89944. var RotateLeft = function (matrix)
  89945. {
  89946. return RotateMatrix(matrix, 90);
  89947. };
  89948. module.exports = RotateLeft;
  89949. /***/ }),
  89950. /* 469 */
  89951. /***/ (function(module, exports, __webpack_require__) {
  89952. /**
  89953. * @author Richard Davey <rich@photonstorm.com>
  89954. * @copyright 2018 Photon Storm Ltd.
  89955. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89956. */
  89957. var RotateMatrix = __webpack_require__(76);
  89958. /**
  89959. * [description]
  89960. *
  89961. * @function Phaser.Utils.Array.Matrix.Rotate180
  89962. * @since 3.0.0
  89963. *
  89964. * @param {array} matrix - [description]
  89965. *
  89966. * @return {array} [description]
  89967. */
  89968. var Rotate180 = function (matrix)
  89969. {
  89970. return RotateMatrix(matrix, 180);
  89971. };
  89972. module.exports = Rotate180;
  89973. /***/ }),
  89974. /* 470 */
  89975. /***/ (function(module, exports) {
  89976. /**
  89977. * @author Richard Davey <rich@photonstorm.com>
  89978. * @copyright 2018 Photon Storm Ltd.
  89979. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  89980. */
  89981. /**
  89982. * [description]
  89983. *
  89984. * @function Phaser.Utils.Array.Matrix.ReverseRows
  89985. * @since 3.0.0
  89986. *
  89987. * @param {array} matrix - [description]
  89988. *
  89989. * @return {array} [description]
  89990. */
  89991. var ReverseRows = function (matrix)
  89992. {
  89993. return matrix.reverse();
  89994. };
  89995. module.exports = ReverseRows;
  89996. /***/ }),
  89997. /* 471 */
  89998. /***/ (function(module, exports) {
  89999. /**
  90000. * @author Richard Davey <rich@photonstorm.com>
  90001. * @copyright 2018 Photon Storm Ltd.
  90002. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  90003. */
  90004. /**
  90005. * [description]
  90006. *
  90007. * @function Phaser.Utils.Array.Matrix.ReverseColumns
  90008. * @since 3.0.0
  90009. *
  90010. * @param {array} matrix - [description]
  90011. *
  90012. * @return {array} [description]
  90013. */
  90014. var ReverseColumns = function (matrix)
  90015. {
  90016. for (var i = 0; i < matrix.length; i++)
  90017. {
  90018. matrix[i].reverse();
  90019. }
  90020. return matrix;
  90021. };
  90022. module.exports = ReverseColumns;
  90023. /***/ }),
  90024. /* 472 */
  90025. /***/ (function(module, exports, __webpack_require__) {
  90026. /**
  90027. * @author Richard Davey <rich@photonstorm.com>
  90028. * @copyright 2018 Photon Storm Ltd.
  90029. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  90030. */
  90031. var Pad = __webpack_require__(134);
  90032. var CheckMatrix = __webpack_require__(116);
  90033. // Generates a string (which you can pass to console.log) from the given
  90034. // Array Matrix.
  90035. /**
  90036. * [description]
  90037. *
  90038. * @function Phaser.Utils.Array.Matrix.MatrixToString
  90039. * @since 3.0.0
  90040. *
  90041. * @param {array} matrix - [description]
  90042. *
  90043. * @return {string} [description]
  90044. */
  90045. var MatrixToString = function (matrix)
  90046. {
  90047. var str = '';
  90048. if (!CheckMatrix(matrix))
  90049. {
  90050. return str;
  90051. }
  90052. for (var r = 0; r < matrix.length; r++)
  90053. {
  90054. for (var c = 0; c < matrix[r].length; c++)
  90055. {
  90056. var cell = matrix[r][c].toString();
  90057. if (cell !== 'undefined')
  90058. {
  90059. str += Pad(cell, 2);
  90060. }
  90061. else
  90062. {
  90063. str += '?';
  90064. }
  90065. if (c < matrix[r].length - 1)
  90066. {
  90067. str += ' |';
  90068. }
  90069. }
  90070. if (r < matrix.length - 1)
  90071. {
  90072. str += '\n';
  90073. for (var i = 0; i < matrix[r].length; i++)
  90074. {
  90075. str += '---';
  90076. if (i < matrix[r].length - 1)
  90077. {
  90078. str += '+';
  90079. }
  90080. }
  90081. str += '\n';
  90082. }
  90083. }
  90084. return str;
  90085. };
  90086. module.exports = MatrixToString;
  90087. /***/ }),
  90088. /* 473 */
  90089. /***/ (function(module, exports, __webpack_require__) {
  90090. /**
  90091. * @author Richard Davey <rich@photonstorm.com>
  90092. * @copyright 2018 Photon Storm Ltd.
  90093. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  90094. */
  90095. /**
  90096. * @namespace Phaser.Utils.Array.Matrix
  90097. */
  90098. module.exports = {
  90099. CheckMatrix: __webpack_require__(116),
  90100. MatrixToString: __webpack_require__(472),
  90101. ReverseColumns: __webpack_require__(471),
  90102. ReverseRows: __webpack_require__(470),
  90103. Rotate180: __webpack_require__(469),
  90104. RotateLeft: __webpack_require__(468),
  90105. RotateMatrix: __webpack_require__(76),
  90106. RotateRight: __webpack_require__(467),
  90107. TransposeMatrix: __webpack_require__(186)
  90108. };
  90109. /***/ }),
  90110. /* 474 */
  90111. /***/ (function(module, exports, __webpack_require__) {
  90112. /**
  90113. * @author Richard Davey <rich@photonstorm.com>
  90114. * @copyright 2018 Photon Storm Ltd.
  90115. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  90116. */
  90117. var Class = __webpack_require__(0);
  90118. var List = __webpack_require__(93);
  90119. var PluginCache = __webpack_require__(12);
  90120. var StableSort = __webpack_require__(83);
  90121. /**
  90122. * @classdesc
  90123. * The Display List plugin.
  90124. *
  90125. * Display Lists belong to a Scene and maintain the list of Game Objects to render every frame.
  90126. *
  90127. * Some of these Game Objects may also be part of the Scene's [Update List]{@link Phaser.GameObjects.UpdateList}, for updating.
  90128. *
  90129. * @class DisplayList
  90130. * @extends Phaser.Structs.List.<Phaser.GameObjects.GameObject>
  90131. * @memberOf Phaser.GameObjects
  90132. * @constructor
  90133. * @since 3.0.0
  90134. *
  90135. * @param {Phaser.Scene} scene - The Scene that this Display List belongs to.
  90136. */
  90137. var DisplayList = new Class({
  90138. Extends: List,
  90139. initialize:
  90140. function DisplayList (scene)
  90141. {
  90142. List.call(this, scene);
  90143. /**
  90144. * The flag the determines whether Game Objects should be sorted when `depthSort()` is called.
  90145. *
  90146. * @name Phaser.GameObjects.DisplayList#sortChildrenFlag
  90147. * @type {boolean}
  90148. * @default false
  90149. * @since 3.0.0
  90150. */
  90151. this.sortChildrenFlag = false;
  90152. /**
  90153. * The Scene that this Display List belongs to.
  90154. *
  90155. * @name Phaser.GameObjects.DisplayList#scene
  90156. * @type {Phaser.Scene}
  90157. * @since 3.0.0
  90158. */
  90159. this.scene = scene;
  90160. /**
  90161. * The Scene's Systems.
  90162. *
  90163. * @name Phaser.GameObjects.DisplayList#systems
  90164. * @type {Phaser.Scenes.Systems}
  90165. * @since 3.0.0
  90166. */
  90167. this.systems = scene.sys;
  90168. scene.sys.events.once('boot', this.boot, this);
  90169. scene.sys.events.on('start', this.start, this);
  90170. },
  90171. /**
  90172. * This method is called automatically, only once, when the Scene is first created.
  90173. * Do not invoke it directly.
  90174. *
  90175. * @method Phaser.GameObjects.DisplayList#boot
  90176. * @private
  90177. * @since 3.5.1
  90178. */
  90179. boot: function ()
  90180. {
  90181. this.systems.events.once('destroy', this.destroy, this);
  90182. },
  90183. /**
  90184. * This method is called automatically by the Scene when it is starting up.
  90185. * It is responsible for creating local systems, properties and listening for Scene events.
  90186. * Do not invoke it directly.
  90187. *
  90188. * @method Phaser.GameObjects.DisplayList#start
  90189. * @private
  90190. * @since 3.5.0
  90191. */
  90192. start: function ()
  90193. {
  90194. this.systems.events.once('shutdown', this.shutdown, this);
  90195. },
  90196. /**
  90197. * Force a sort of the display list on the next call to depthSort.
  90198. *
  90199. * @method Phaser.GameObjects.DisplayList#queueDepthSort
  90200. * @since 3.0.0
  90201. */
  90202. queueDepthSort: function ()
  90203. {
  90204. this.sortChildrenFlag = true;
  90205. },
  90206. /**
  90207. * Immediately sorts the display list if the flag is set.
  90208. *
  90209. * @method Phaser.GameObjects.DisplayList#depthSort
  90210. * @since 3.0.0
  90211. */
  90212. depthSort: function ()
  90213. {
  90214. if (this.sortChildrenFlag)
  90215. {
  90216. StableSort.inplace(this.list, this.sortByDepth);
  90217. this.sortChildrenFlag = false;
  90218. }
  90219. },
  90220. /**
  90221. * Compare the depth of two Game Objects.
  90222. *
  90223. * @method Phaser.GameObjects.DisplayList#sortByDepth
  90224. * @since 3.0.0
  90225. *
  90226. * @param {Phaser.GameObjects.GameObject} childA - The first Game Object.
  90227. * @param {Phaser.GameObjects.GameObject} childB - The second Game Object.
  90228. *
  90229. * @return {integer} The difference between the depths of each Game Object.
  90230. */
  90231. sortByDepth: function (childA, childB)
  90232. {
  90233. return childA._depth - childB._depth;
  90234. },
  90235. /**
  90236. * Given an array of Game Objects, sort the array and return it, so that
  90237. * the objects are in index order with the lowest at the bottom.
  90238. *
  90239. * @method Phaser.GameObjects.DisplayList#sortGameObjects
  90240. * @since 3.0.0
  90241. *
  90242. * @param {Phaser.GameObjects.GameObject[]} gameObjects - The array of Game Objects to sort.
  90243. *
  90244. * @return {array} The sorted array of Game Objects.
  90245. */
  90246. sortGameObjects: function (gameObjects)
  90247. {
  90248. if (gameObjects === undefined) { gameObjects = this.list; }
  90249. this.scene.sys.depthSort();
  90250. return gameObjects.sort(this.sortIndexHandler.bind(this));
  90251. },
  90252. /**
  90253. * Get the top-most Game Object in the given array of Game Objects, after sorting it.
  90254. *
  90255. * Note that the given array is sorted in place, even though it isn't returned directly it will still be updated.
  90256. *
  90257. * @method Phaser.GameObjects.DisplayList#getTopGameObject
  90258. * @since 3.0.0
  90259. *
  90260. * @param {Phaser.GameObjects.GameObject[]} gameObjects - The array of Game Objects.
  90261. *
  90262. * @return {Phaser.GameObjects.GameObject} The top-most Game Object in the array of Game Objects.
  90263. */
  90264. getTopGameObject: function (gameObjects)
  90265. {
  90266. this.sortGameObjects(gameObjects);
  90267. return gameObjects[gameObjects.length - 1];
  90268. },
  90269. /**
  90270. * The Scene that owns this plugin is shutting down.
  90271. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  90272. *
  90273. * @method Phaser.GameObjects.DisplayList#shutdown
  90274. * @private
  90275. * @since 3.0.0
  90276. */
  90277. shutdown: function ()
  90278. {
  90279. this.removeAll();
  90280. this.systems.events.off('shutdown', this.shutdown, this);
  90281. },
  90282. /**
  90283. * The Scene that owns this plugin is being destroyed.
  90284. * We need to shutdown and then kill off all external references.
  90285. *
  90286. * @method Phaser.GameObjects.DisplayList#destroy
  90287. * @private
  90288. * @since 3.0.0
  90289. */
  90290. destroy: function ()
  90291. {
  90292. this.shutdown();
  90293. this.scene.sys.events.off('start', this.start, this);
  90294. this.scene = null;
  90295. this.systems = null;
  90296. }
  90297. });
  90298. PluginCache.register('DisplayList', DisplayList, 'displayList');
  90299. module.exports = DisplayList;
  90300. /***/ }),
  90301. /* 475 */
  90302. /***/ (function(module, exports) {
  90303. /**
  90304. * @author Richard Davey <rich@photonstorm.com>
  90305. * @copyright 2018 Photon Storm Ltd.
  90306. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  90307. */
  90308. /**
  90309. * Visibility Handler hidden event.
  90310. *
  90311. * The document in which the Game is embedded has entered a hidden state.
  90312. *
  90313. * @event Phaser.Boot.VisibilityHandler#hidden
  90314. */
  90315. /**
  90316. * Visibility Handler visible event.
  90317. *
  90318. * The document in which the Game is embedded has entered a visible state.
  90319. *
  90320. * @event Phaser.Boot.VisibilityHandler#visible
  90321. */
  90322. /**
  90323. * Visibility Handler blur event.
  90324. *
  90325. * The window in which the Game is embedded has entered a blurred state.
  90326. *
  90327. * @event Phaser.Boot.VisibilityHandler#blur
  90328. */
  90329. /**
  90330. * Visibility Handler focus event.
  90331. *
  90332. * The window in which the Game is embedded has entered a focused state.
  90333. *
  90334. * @event Phaser.Boot.VisibilityHandler#focus
  90335. */
  90336. /**
  90337. * The Visibility Handler is responsible for listening out for document level visibility change events.
  90338. * This includes `visibilitychange` if the browser supports it, and blur and focus events. It then uses
  90339. * the provided Event Emitter and fires the related events.
  90340. *
  90341. * @function Phaser.Boot.VisibilityHandler
  90342. * @fires Phaser.Boot.VisibilityHandler#hidden
  90343. * @fires Phaser.Boot.VisibilityHandler#visible
  90344. * @fires Phaser.Boot.VisibilityHandler#blur
  90345. * @fires Phaser.Boot.VisibilityHandler#focus
  90346. * @since 3.0.0
  90347. *
  90348. * @param {Phaser.Game} game - The Game instance this Visibility Handler is working on.
  90349. */
  90350. var VisibilityHandler = function (game)
  90351. {
  90352. var hiddenVar;
  90353. var eventEmitter = game.events;
  90354. if (document.hidden !== undefined)
  90355. {
  90356. hiddenVar = 'visibilitychange';
  90357. }
  90358. else
  90359. {
  90360. var vendors = [ 'webkit', 'moz', 'ms' ];
  90361. vendors.forEach(function (prefix)
  90362. {
  90363. if (document[prefix + 'Hidden'] !== undefined)
  90364. {
  90365. document.hidden = function ()
  90366. {
  90367. return document[prefix + 'Hidden'];
  90368. };
  90369. hiddenVar = prefix + 'visibilitychange';
  90370. }
  90371. });
  90372. }
  90373. var onChange = function (event)
  90374. {
  90375. if (document.hidden || event.type === 'pause')
  90376. {
  90377. eventEmitter.emit('hidden');
  90378. }
  90379. else
  90380. {
  90381. eventEmitter.emit('visible');
  90382. }
  90383. };
  90384. if (hiddenVar)
  90385. {
  90386. document.addEventListener(hiddenVar, onChange, false);
  90387. }
  90388. window.onblur = function ()
  90389. {
  90390. eventEmitter.emit('blur');
  90391. };
  90392. window.onfocus = function ()
  90393. {
  90394. eventEmitter.emit('focus');
  90395. };
  90396. // Automatically give the window focus unless config says otherwise
  90397. if (window.focus && game.config.autoFocus)
  90398. {
  90399. window.focus();
  90400. game.canvas.addEventListener('mousedown', function ()
  90401. {
  90402. window.focus();
  90403. }, { passive: true });
  90404. }
  90405. if (game.canvas)
  90406. {
  90407. game.canvas.onmouseout = function ()
  90408. {
  90409. game.isOver = false;
  90410. eventEmitter.emit('mouseout');
  90411. };
  90412. game.canvas.onmouseover = function ()
  90413. {
  90414. game.isOver = true;
  90415. eventEmitter.emit('mouseover');
  90416. };
  90417. }
  90418. };
  90419. module.exports = VisibilityHandler;
  90420. /***/ }),
  90421. /* 476 */
  90422. /***/ (function(module, exports, __webpack_require__) {
  90423. /**
  90424. * @author Richard Davey <rich@photonstorm.com>
  90425. * @copyright 2018 Photon Storm Ltd.
  90426. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  90427. */
  90428. var Class = __webpack_require__(0);
  90429. var GetValue = __webpack_require__(4);
  90430. var NOOP = __webpack_require__(3);
  90431. var RequestAnimationFrame = __webpack_require__(262);
  90432. // Frame Rate config
  90433. // fps: {
  90434. // min: 10,
  90435. // target: 60,
  90436. // forceSetTimeOut: false,
  90437. // deltaHistory: 10,
  90438. // panicMax: 120
  90439. // }
  90440. // http://www.testufo.com/#test=animation-time-graph
  90441. /**
  90442. * @callback TimeStepCallback
  90443. *
  90444. * @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.
  90445. * @param {number} average - The Delta Average.
  90446. * @param {number} interpolation - Interpolation - how far between what is expected and where we are?
  90447. */
  90448. /**
  90449. * @classdesc
  90450. * [description]
  90451. *
  90452. * @class TimeStep
  90453. * @memberOf Phaser.Boot
  90454. * @constructor
  90455. * @since 3.0.0
  90456. *
  90457. * @param {Phaser.Game} game - A reference to the Phaser.Game instance that owns this Time Step.
  90458. * @param {FPSConfig} config
  90459. */
  90460. var TimeStep = new Class({
  90461. initialize:
  90462. function TimeStep (game, config)
  90463. {
  90464. /**
  90465. * A reference to the Phaser.Game instance.
  90466. *
  90467. * @name Phaser.Boot.TimeStep#game
  90468. * @type {Phaser.Game}
  90469. * @readOnly
  90470. * @since 3.0.0
  90471. */
  90472. this.game = game;
  90473. /**
  90474. * [description]
  90475. *
  90476. * @name Phaser.Boot.TimeStep#raf
  90477. * @type {Phaser.DOM.RequestAnimationFrame}
  90478. * @readOnly
  90479. * @since 3.0.0
  90480. */
  90481. this.raf = new RequestAnimationFrame();
  90482. /**
  90483. * A flag that is set once the TimeStep has started running and toggled when it stops.
  90484. *
  90485. * @name Phaser.Boot.TimeStep#started
  90486. * @type {boolean}
  90487. * @readOnly
  90488. * @default false
  90489. * @since 3.0.0
  90490. */
  90491. this.started = false;
  90492. /**
  90493. * A flag that is set once the TimeStep has started running and toggled when it stops.
  90494. * The difference between this value and `started` is that `running` is toggled when
  90495. * the TimeStep is sent to sleep, where-as `started` remains `true`, only changing if
  90496. * the TimeStep is actually stopped, not just paused.
  90497. *
  90498. * @name Phaser.Boot.TimeStep#running
  90499. * @type {boolean}
  90500. * @readOnly
  90501. * @default false
  90502. * @since 3.0.0
  90503. */
  90504. this.running = false;
  90505. /**
  90506. * The minimum fps rate you want the Time Step to run at.
  90507. *
  90508. * @name Phaser.Boot.TimeStep#minFps
  90509. * @type {integer}
  90510. * @default 5
  90511. * @since 3.0.0
  90512. */
  90513. this.minFps = GetValue(config, 'min', 5);
  90514. /**
  90515. * The target fps rate for the Time Step to run at.
  90516. *
  90517. * Setting this value will not actually change the speed at which the browser runs, that is beyond
  90518. * the control of Phaser. Instead, it allows you to determine performance issues and if the Time Step
  90519. * is spiraling out of control.
  90520. *
  90521. * @name Phaser.Boot.TimeStep#targetFps
  90522. * @type {integer}
  90523. * @default 60
  90524. * @since 3.0.0
  90525. */
  90526. this.targetFps = GetValue(config, 'target', 60);
  90527. /**
  90528. * The minFps value in ms.
  90529. * Defaults to 200ms between frames (i.e. super slow!)
  90530. *
  90531. * @name Phaser.Boot.TimeStep#_min
  90532. * @type {number}
  90533. * @private
  90534. * @since 3.0.0
  90535. */
  90536. this._min = 1000 / this.minFps;
  90537. /**
  90538. * The targetFps value in ms.
  90539. * Defaults to 16.66ms between frames (i.e. normal)
  90540. *
  90541. * @name Phaser.Boot.TimeStep#_target
  90542. * @type {number}
  90543. * @private
  90544. * @since 3.0.0
  90545. */
  90546. this._target = 1000 / this.targetFps;
  90547. /**
  90548. * An exponential moving average of the frames per second.
  90549. *
  90550. * @name Phaser.Boot.TimeStep#actualFps
  90551. * @type {integer}
  90552. * @readOnly
  90553. * @default 60
  90554. * @since 3.0.0
  90555. */
  90556. this.actualFps = this.targetFps;
  90557. /**
  90558. * [description]
  90559. *
  90560. * @name Phaser.Boot.TimeStep#nextFpsUpdate
  90561. * @type {integer}
  90562. * @readOnly
  90563. * @default 0
  90564. * @since 3.0.0
  90565. */
  90566. this.nextFpsUpdate = 0;
  90567. /**
  90568. * The number of frames processed this second.
  90569. *
  90570. * @name Phaser.Boot.TimeStep#framesThisSecond
  90571. * @type {integer}
  90572. * @readOnly
  90573. * @default 0
  90574. * @since 3.0.0
  90575. */
  90576. this.framesThisSecond = 0;
  90577. /**
  90578. * A callback to be invoked each time the Time Step steps.
  90579. *
  90580. * @name Phaser.Boot.TimeStep#callback
  90581. * @type {TimeStepCallback}
  90582. * @default NOOP
  90583. * @since 3.0.0
  90584. */
  90585. this.callback = NOOP;
  90586. /**
  90587. * You can force the Time Step to use Set Timeout instead of Request Animation Frame by setting
  90588. * the `forceSetTimeOut` property to `true` in the Game Configuration object. It cannot be changed at run-time.
  90589. *
  90590. * @name Phaser.Boot.TimeStep#forceSetTimeOut
  90591. * @type {boolean}
  90592. * @readOnly
  90593. * @default false
  90594. * @since 3.0.0
  90595. */
  90596. this.forceSetTimeOut = GetValue(config, 'forceSetTimeOut', false);
  90597. /**
  90598. * [description]
  90599. *
  90600. * @name Phaser.Boot.TimeStep#time
  90601. * @type {integer}
  90602. * @default 0
  90603. * @since 3.0.0
  90604. */
  90605. this.time = 0;
  90606. /**
  90607. * [description]
  90608. *
  90609. * @name Phaser.Boot.TimeStep#startTime
  90610. * @type {integer}
  90611. * @default 0
  90612. * @since 3.0.0
  90613. */
  90614. this.startTime = 0;
  90615. /**
  90616. * [description]
  90617. *
  90618. * @name Phaser.Boot.TimeStep#lastTime
  90619. * @type {integer}
  90620. * @default 0
  90621. * @since 3.0.0
  90622. */
  90623. this.lastTime = 0;
  90624. /**
  90625. * [description]
  90626. *
  90627. * @name Phaser.Boot.TimeStep#frame
  90628. * @type {integer}
  90629. * @readOnly
  90630. * @default 0
  90631. * @since 3.0.0
  90632. */
  90633. this.frame = 0;
  90634. /**
  90635. * [description]
  90636. *
  90637. * @name Phaser.Boot.TimeStep#inFocus
  90638. * @type {boolean}
  90639. * @readOnly
  90640. * @default true
  90641. * @since 3.0.0
  90642. */
  90643. this.inFocus = true;
  90644. /**
  90645. * [description]
  90646. *
  90647. * @name Phaser.Boot.TimeStep#_pauseTime
  90648. * @type {integer}
  90649. * @private
  90650. * @default 0
  90651. * @since 3.0.0
  90652. */
  90653. this._pauseTime = 0;
  90654. /**
  90655. * [description]
  90656. *
  90657. * @name Phaser.Boot.TimeStep#_coolDown
  90658. * @type {integer}
  90659. * @private
  90660. * @default 0
  90661. * @since 3.0.0
  90662. */
  90663. this._coolDown = 0;
  90664. /**
  90665. * [description]
  90666. *
  90667. * @name Phaser.Boot.TimeStep#delta
  90668. * @type {integer}
  90669. * @default 0
  90670. * @since 3.0.0
  90671. */
  90672. this.delta = 0;
  90673. /**
  90674. * [description]
  90675. *
  90676. * @name Phaser.Boot.TimeStep#deltaIndex
  90677. * @type {integer}
  90678. * @default 0
  90679. * @since 3.0.0
  90680. */
  90681. this.deltaIndex = 0;
  90682. /**
  90683. * [description]
  90684. *
  90685. * @name Phaser.Boot.TimeStep#deltaHistory
  90686. * @type {integer[]}
  90687. * @since 3.0.0
  90688. */
  90689. this.deltaHistory = [];
  90690. /**
  90691. * [description]
  90692. *
  90693. * @name Phaser.Boot.TimeStep#deltaSmoothingMax
  90694. * @type {integer}
  90695. * @default 10
  90696. * @since 3.0.0
  90697. */
  90698. this.deltaSmoothingMax = GetValue(config, 'deltaHistory', 10);
  90699. /**
  90700. * [description]
  90701. *
  90702. * @name Phaser.Boot.TimeStep#panicMax
  90703. * @type {integer}
  90704. * @default 120
  90705. * @since 3.0.0
  90706. */
  90707. this.panicMax = GetValue(config, 'panicMax', 120);
  90708. /**
  90709. * The actual elapsed time in ms between one update and the next.
  90710. * Unlike with `delta` no smoothing, capping, or averaging is applied to this value.
  90711. * So please be careful when using this value in calculations.
  90712. *
  90713. * @name Phaser.Boot.TimeStep#rawDelta
  90714. * @type {number}
  90715. * @default 0
  90716. * @since 3.0.0
  90717. */
  90718. this.rawDelta = 0;
  90719. },
  90720. /**
  90721. * Called when the DOM window.onBlur event triggers.
  90722. *
  90723. * @method Phaser.Boot.TimeStep#blur
  90724. * @since 3.0.0
  90725. */
  90726. blur: function ()
  90727. {
  90728. this.inFocus = false;
  90729. },
  90730. /**
  90731. * Called when the DOM window.onFocus event triggers.
  90732. *
  90733. * @method Phaser.Boot.TimeStep#focus
  90734. * @since 3.0.0
  90735. */
  90736. focus: function ()
  90737. {
  90738. this.inFocus = true;
  90739. this.resetDelta();
  90740. },
  90741. /**
  90742. * Called when the visibility API says the game is 'hidden' (tab switch out of view, etc)
  90743. *
  90744. * @method Phaser.Boot.TimeStep#pause
  90745. * @since 3.0.0
  90746. */
  90747. pause: function ()
  90748. {
  90749. this._pauseTime = window.performance.now();
  90750. },
  90751. /**
  90752. * Called when the visibility API says the game is 'visible' again (tab switch back into view, etc)
  90753. *
  90754. * @method Phaser.Boot.TimeStep#resume
  90755. * @since 3.0.0
  90756. */
  90757. resume: function ()
  90758. {
  90759. this.resetDelta();
  90760. this.startTime += this.time - this._pauseTime;
  90761. },
  90762. /**
  90763. * [description]
  90764. *
  90765. * @method Phaser.Boot.TimeStep#resetDelta
  90766. * @since 3.0.0
  90767. */
  90768. resetDelta: function ()
  90769. {
  90770. var now = window.performance.now();
  90771. this.time = now;
  90772. this.lastTime = now;
  90773. this.nextFpsUpdate = now + 1000;
  90774. this.framesThisSecond = 0;
  90775. this.frame = 0;
  90776. // Pre-populate smoothing array
  90777. for (var i = 0; i < this.deltaSmoothingMax; i++)
  90778. {
  90779. this.deltaHistory[i] = Math.min(this._target, this.deltaHistory[i]);
  90780. }
  90781. this.delta = 0;
  90782. this.deltaIndex = 0;
  90783. this._coolDown = this.panicMax;
  90784. },
  90785. /**
  90786. * Starts the Time Step running, if it is not already doing so.
  90787. * Called automatically by the Game Boot process.
  90788. *
  90789. * @method Phaser.Boot.TimeStep#start
  90790. * @since 3.0.0
  90791. *
  90792. * @param {TimeStepCallback} callback - The callback to be invoked each time the Time Step steps.
  90793. */
  90794. start: function (callback)
  90795. {
  90796. if (this.started)
  90797. {
  90798. return this;
  90799. }
  90800. this.started = true;
  90801. this.running = true;
  90802. for (var i = 0; i < this.deltaSmoothingMax; i++)
  90803. {
  90804. this.deltaHistory[i] = this._target;
  90805. }
  90806. this.resetDelta();
  90807. this.startTime = window.performance.now();
  90808. this.callback = callback;
  90809. this.raf.start(this.step.bind(this), this.forceSetTimeOut);
  90810. },
  90811. /**
  90812. * The main step method. This is called each time the browser updates, either by Request Animation Frame,
  90813. * or by Set Timeout. It is responsible for calculating the delta values, frame totals, cool down history and more.
  90814. * You generally should never call this method directly.
  90815. *
  90816. * @method Phaser.Boot.TimeStep#step
  90817. * @since 3.0.0
  90818. *
  90819. * @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.
  90820. */
  90821. step: function (time)
  90822. {
  90823. this.frame++;
  90824. var before = time - this.lastTime;
  90825. if (before < 0)
  90826. {
  90827. // Because, Chrome.
  90828. before = 0;
  90829. }
  90830. this.rawDelta = before;
  90831. var idx = this.deltaIndex;
  90832. var history = this.deltaHistory;
  90833. var max = this.deltaSmoothingMax;
  90834. // delta time (time is in ms)
  90835. var dt = before;
  90836. // When a browser switches tab, then comes back again, it takes around 10 frames before
  90837. // the delta time settles down so we employ a 'cooling down' period before we start
  90838. // trusting the delta values again, to avoid spikes flooding through our delta average
  90839. if (this._coolDown > 0 || !this.inFocus)
  90840. {
  90841. this._coolDown--;
  90842. dt = Math.min(dt, this._target);
  90843. }
  90844. if (dt > this._min)
  90845. {
  90846. // Probably super bad start time or browser tab context loss,
  90847. // so use the last 'sane' dt value
  90848. dt = history[idx];
  90849. // Clamp delta to min (in case history has become corrupted somehow)
  90850. dt = Math.min(dt, this._min);
  90851. }
  90852. // Smooth out the delta over the previous X frames
  90853. // add the delta to the smoothing array
  90854. history[idx] = dt;
  90855. // adjusts the delta history array index based on the smoothing count
  90856. // this stops the array growing beyond the size of deltaSmoothingMax
  90857. this.deltaIndex++;
  90858. if (this.deltaIndex > max)
  90859. {
  90860. this.deltaIndex = 0;
  90861. }
  90862. // Delta Average
  90863. var avg = 0;
  90864. // Loop the history array, adding the delta values together
  90865. for (var i = 0; i < max; i++)
  90866. {
  90867. avg += history[i];
  90868. }
  90869. // Then divide by the array length to get the average delta
  90870. avg /= max;
  90871. // Set as the world delta value
  90872. this.delta = avg;
  90873. // Real-world timer advance
  90874. this.time += this.rawDelta;
  90875. // Update the estimate of the frame rate, `fps`. Every second, the number
  90876. // of frames that occurred in that second are included in an exponential
  90877. // moving average of all frames per second, with an alpha of 0.25. This
  90878. // means that more recent seconds affect the estimated frame rate more than
  90879. // older seconds.
  90880. //
  90881. // When a browser window is NOT minimized, but is covered up (i.e. you're using
  90882. // another app which has spawned a window over the top of the browser), then it
  90883. // will start to throttle the raf callback time. It waits for a while, and then
  90884. // starts to drop the frame rate at 1 frame per second until it's down to just over 1fps.
  90885. // So if the game was running at 60fps, and the player opens a new window, then
  90886. // after 60 seconds (+ the 'buffer time') it'll be down to 1fps, so rafin'g at 1Hz.
  90887. //
  90888. // When they make the game visible again, the frame rate is increased at a rate of
  90889. // approx. 8fps, back up to 60fps (or the max it can obtain)
  90890. //
  90891. // There is no easy way to determine if this drop in frame rate is because the
  90892. // browser is throttling raf, or because the game is struggling with performance
  90893. // because you're asking it to do too much on the device.
  90894. if (time > this.nextFpsUpdate)
  90895. {
  90896. // Compute the new exponential moving average with an alpha of 0.25.
  90897. this.actualFps = 0.25 * this.framesThisSecond + 0.75 * this.actualFps;
  90898. this.nextFpsUpdate = time + 1000;
  90899. this.framesThisSecond = 0;
  90900. }
  90901. this.framesThisSecond++;
  90902. // Interpolation - how far between what is expected and where we are?
  90903. var interpolation = avg / this._target;
  90904. this.callback(time, avg, interpolation);
  90905. // Shift time value over
  90906. this.lastTime = time;
  90907. },
  90908. /**
  90909. * Manually calls TimeStep.step, passing in the performance.now value to it.
  90910. *
  90911. * @method Phaser.Boot.TimeStep#tick
  90912. * @since 3.0.0
  90913. */
  90914. tick: function ()
  90915. {
  90916. this.step(window.performance.now());
  90917. },
  90918. /**
  90919. * Sends the TimeStep to sleep, stopping Request Animation Frame (or SetTimeout) and toggling the `running` flag to false.
  90920. *
  90921. * @method Phaser.Boot.TimeStep#sleep
  90922. * @since 3.0.0
  90923. */
  90924. sleep: function ()
  90925. {
  90926. if (this.running)
  90927. {
  90928. this.raf.stop();
  90929. this.running = false;
  90930. }
  90931. },
  90932. /**
  90933. * Wakes-up the TimeStep, restarting Request Animation Frame (or SetTimeout) and toggling the `running` flag to true.
  90934. * The `seamless` argument controls if the wake-up should adjust the start time or not.
  90935. *
  90936. * @method Phaser.Boot.TimeStep#wake
  90937. * @since 3.0.0
  90938. *
  90939. * @param {boolean} [seamless=false] - Adjust the startTime based on the lastTime values.
  90940. */
  90941. wake: function (seamless)
  90942. {
  90943. if (this.running)
  90944. {
  90945. this.sleep();
  90946. }
  90947. else if (seamless)
  90948. {
  90949. this.startTime += -this.lastTime + (this.lastTime = window.performance.now());
  90950. }
  90951. this.raf.start(this.step.bind(this), this.useRAF);
  90952. this.running = true;
  90953. this.step(window.performance.now());
  90954. },
  90955. /**
  90956. * Stops the TimeStep running.
  90957. *
  90958. * @method Phaser.Boot.TimeStep#stop
  90959. * @since 3.0.0
  90960. *
  90961. * @return {Phaser.Boot.TimeStep} The TimeStep object.
  90962. */
  90963. stop: function ()
  90964. {
  90965. this.running = false;
  90966. this.started = false;
  90967. this.raf.stop();
  90968. return this;
  90969. },
  90970. /**
  90971. * Destroys the TimeStep. This will stop Request Animation Frame, stop the step, clear the callbacks and null
  90972. * any objects.
  90973. *
  90974. * @method Phaser.Boot.TimeStep#destroy
  90975. * @since 3.0.0
  90976. */
  90977. destroy: function ()
  90978. {
  90979. this.stop();
  90980. this.callback = NOOP;
  90981. this.raf = null;
  90982. this.game = null;
  90983. }
  90984. });
  90985. module.exports = TimeStep;
  90986. /***/ }),
  90987. /* 477 */
  90988. /***/ (function(module, exports) {
  90989. /**
  90990. * @author Richard Davey <rich@photonstorm.com>
  90991. * @copyright 2018 Photon Storm Ltd.
  90992. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  90993. */
  90994. var imageHeight = 0;
  90995. /**
  90996. * @function addFrame
  90997. * @private
  90998. * @since 3.0.0
  90999. */
  91000. var addFrame = function (texture, sourceIndex, name, frame)
  91001. {
  91002. // The frame values are the exact coordinates to cut the frame out of the atlas from
  91003. var y = imageHeight - frame.y - frame.height;
  91004. texture.add(name, sourceIndex, frame.x, y, frame.width, frame.height);
  91005. // These are the original (non-trimmed) sprite values
  91006. /*
  91007. if (src.trimmed)
  91008. {
  91009. newFrame.setTrim(
  91010. src.sourceSize.w,
  91011. src.sourceSize.h,
  91012. src.spriteSourceSize.x,
  91013. src.spriteSourceSize.y,
  91014. src.spriteSourceSize.w,
  91015. src.spriteSourceSize.h
  91016. );
  91017. }
  91018. */
  91019. };
  91020. /**
  91021. * Parses a Unity YAML File and creates Frames in the Texture.
  91022. * For more details about Sprite Meta Data see https://docs.unity3d.com/ScriptReference/SpriteMetaData.html
  91023. *
  91024. * @function Phaser.Textures.Parsers.UnityYAML
  91025. * @memberOf Phaser.Textures.Parsers
  91026. * @private
  91027. * @since 3.0.0
  91028. *
  91029. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  91030. * @param {integer} sourceIndex - The index of the TextureSource.
  91031. * @param {object} yaml - The YAML data.
  91032. *
  91033. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  91034. */
  91035. var UnityYAML = function (texture, sourceIndex, yaml)
  91036. {
  91037. // Add in a __BASE entry (for the entire atlas)
  91038. var source = texture.source[sourceIndex];
  91039. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  91040. imageHeight = source.height;
  91041. var data = yaml.split('\n');
  91042. var lineRegExp = /^[ ]*(- )*(\w+)+[: ]+(.*)/;
  91043. var prevSprite = '';
  91044. var currentSprite = '';
  91045. var rect = { x: 0, y: 0, width: 0, height: 0 };
  91046. // var pivot = { x: 0, y: 0 };
  91047. // var border = { x: 0, y: 0, z: 0, w: 0 };
  91048. for (var i = 0; i < data.length; i++)
  91049. {
  91050. var results = data[i].match(lineRegExp);
  91051. if (!results)
  91052. {
  91053. continue;
  91054. }
  91055. var isList = (results[1] === '- ');
  91056. var key = results[2];
  91057. var value = results[3];
  91058. if (isList)
  91059. {
  91060. if (currentSprite !== prevSprite)
  91061. {
  91062. addFrame(texture, sourceIndex, currentSprite, rect);
  91063. prevSprite = currentSprite;
  91064. }
  91065. rect = { x: 0, y: 0, width: 0, height: 0 };
  91066. }
  91067. if (key === 'name')
  91068. {
  91069. // Start new list
  91070. currentSprite = value;
  91071. continue;
  91072. }
  91073. switch (key)
  91074. {
  91075. case 'x':
  91076. case 'y':
  91077. case 'width':
  91078. case 'height':
  91079. rect[key] = parseInt(value, 10);
  91080. break;
  91081. // case 'pivot':
  91082. // pivot = eval('var obj = ' + value);
  91083. // break;
  91084. // case 'border':
  91085. // border = eval('var obj = ' + value);
  91086. // break;
  91087. }
  91088. }
  91089. if (currentSprite !== prevSprite)
  91090. {
  91091. addFrame(texture, sourceIndex, currentSprite, rect);
  91092. }
  91093. return texture;
  91094. };
  91095. module.exports = UnityYAML;
  91096. /*
  91097. Example data:
  91098. TextureImporter:
  91099. spritePivot: {x: .5, y: .5}
  91100. spriteBorder: {x: 0, y: 0, z: 0, w: 0}
  91101. spritePixelsToUnits: 100
  91102. spriteSheet:
  91103. sprites:
  91104. - name: asteroids_0
  91105. rect:
  91106. serializedVersion: 2
  91107. x: 5
  91108. y: 328
  91109. width: 65
  91110. height: 82
  91111. alignment: 0
  91112. pivot: {x: 0, y: 0}
  91113. border: {x: 0, y: 0, z: 0, w: 0}
  91114. - name: asteroids_1
  91115. rect:
  91116. serializedVersion: 2
  91117. x: 80
  91118. y: 322
  91119. width: 53
  91120. height: 88
  91121. alignment: 0
  91122. pivot: {x: 0, y: 0}
  91123. border: {x: 0, y: 0, z: 0, w: 0}
  91124. spritePackingTag: Asteroids
  91125. */
  91126. /***/ }),
  91127. /* 478 */
  91128. /***/ (function(module, exports, __webpack_require__) {
  91129. /**
  91130. * @author Richard Davey <rich@photonstorm.com>
  91131. * @copyright 2018 Photon Storm Ltd.
  91132. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91133. */
  91134. var GetFastValue = __webpack_require__(1);
  91135. /**
  91136. * Parses a Sprite Sheet and adds the Frames to the Texture, where the Sprite Sheet is stored as a frame within an Atlas.
  91137. *
  91138. * In Phaser terminology a Sprite Sheet is a texture containing different frames, but each frame is the exact
  91139. * same size and cannot be trimmed or rotated.
  91140. *
  91141. * @function Phaser.Textures.Parsers.SpriteSheetFromAtlas
  91142. * @memberOf Phaser.Textures.Parsers
  91143. * @private
  91144. * @since 3.0.0
  91145. *
  91146. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  91147. * @param {Phaser.Textures.Frame} frame - The Frame that contains the Sprite Sheet.
  91148. * @param {object} config - An object describing how to parse the Sprite Sheet.
  91149. * @param {number} config.frameWidth - Width in pixels of a single frame in the sprite sheet.
  91150. * @param {number} [config.frameHeight] - Height in pixels of a single frame in the sprite sheet. Defaults to frameWidth if not provided.
  91151. * @param {number} [config.startFrame=0] - [description]
  91152. * @param {number} [config.endFrame=-1] - [description]
  91153. * @param {number} [config.margin=0] - If the frames have been drawn with a margin, specify the amount here.
  91154. * @param {number} [config.spacing=0] - If the frames have been drawn with spacing between them, specify the amount here.
  91155. *
  91156. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  91157. */
  91158. var SpriteSheetFromAtlas = function (texture, frame, config)
  91159. {
  91160. var frameWidth = GetFastValue(config, 'frameWidth', null);
  91161. var frameHeight = GetFastValue(config, 'frameHeight', frameWidth);
  91162. // If missing we can't proceed
  91163. if (!frameWidth)
  91164. {
  91165. throw new Error('TextureManager.SpriteSheetFromAtlas: Invalid frameWidth given.');
  91166. }
  91167. // Add in a __BASE entry (for the entire atlas)
  91168. // var source = texture.source[sourceIndex];
  91169. // texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  91170. var startFrame = GetFastValue(config, 'startFrame', 0);
  91171. var endFrame = GetFastValue(config, 'endFrame', -1);
  91172. var margin = GetFastValue(config, 'margin', 0);
  91173. var spacing = GetFastValue(config, 'spacing', 0);
  91174. var x = frame.cutX;
  91175. var y = frame.cutY;
  91176. var cutWidth = frame.cutWidth;
  91177. var cutHeight = frame.cutHeight;
  91178. var sheetWidth = frame.realWidth;
  91179. var sheetHeight = frame.realHeight;
  91180. var row = Math.floor((sheetWidth - margin + spacing) / (frameWidth + spacing));
  91181. var column = Math.floor((sheetHeight - margin + spacing) / (frameHeight + spacing));
  91182. var total = row * column;
  91183. // trim offsets
  91184. var leftPad = frame.x;
  91185. var leftWidth = frameWidth - leftPad;
  91186. var rightWidth = frameWidth - ((sheetWidth - cutWidth) - leftPad);
  91187. var topPad = frame.y;
  91188. var topHeight = frameHeight - topPad;
  91189. var bottomHeight = frameHeight - ((sheetHeight - cutHeight) - topPad);
  91190. // console.log('x / y', x, y);
  91191. // console.log('cutW / H', cutWidth, cutHeight);
  91192. // console.log('sheetW / H', sheetWidth, sheetHeight);
  91193. // console.log('row', row, 'column', column, 'total', total);
  91194. // console.log('LW', leftWidth, 'RW', rightWidth, 'TH', topHeight, 'BH', bottomHeight);
  91195. if (startFrame > total || startFrame < -total)
  91196. {
  91197. startFrame = 0;
  91198. }
  91199. if (startFrame < 0)
  91200. {
  91201. // Allow negative skipframes.
  91202. startFrame = total + startFrame;
  91203. }
  91204. if (endFrame !== -1)
  91205. {
  91206. total = startFrame + (endFrame + 1);
  91207. }
  91208. var sheetFrame;
  91209. var frameX = margin;
  91210. var frameY = margin;
  91211. var frameIndex = 0;
  91212. var sourceIndex = frame.sourceIndex;
  91213. for (var sheetY = 0; sheetY < column; sheetY++)
  91214. {
  91215. var topRow = (sheetY === 0);
  91216. var bottomRow = (sheetY === column - 1);
  91217. for (var sheetX = 0; sheetX < row; sheetX++)
  91218. {
  91219. var leftRow = (sheetX === 0);
  91220. var rightRow = (sheetX === row - 1);
  91221. sheetFrame = texture.add(frameIndex, sourceIndex, x + frameX, y + frameY, frameWidth, frameHeight);
  91222. if (leftRow || topRow || rightRow || bottomRow)
  91223. {
  91224. var destX = (leftRow) ? leftPad : 0;
  91225. var destY = (topRow) ? topPad : 0;
  91226. var destWidth = frameWidth;
  91227. var destHeight = frameHeight;
  91228. if (leftRow)
  91229. {
  91230. destWidth = leftWidth;
  91231. }
  91232. else if (rightRow)
  91233. {
  91234. destWidth = rightWidth;
  91235. }
  91236. if (topRow)
  91237. {
  91238. destHeight = topHeight;
  91239. }
  91240. else if (bottomRow)
  91241. {
  91242. destHeight = bottomHeight;
  91243. }
  91244. sheetFrame.cutWidth = destWidth;
  91245. sheetFrame.cutHeight = destHeight;
  91246. sheetFrame.setTrim(frameWidth, frameHeight, destX, destY, destWidth, destHeight);
  91247. }
  91248. frameX += spacing;
  91249. if (leftRow)
  91250. {
  91251. frameX += leftWidth;
  91252. }
  91253. else if (rightRow)
  91254. {
  91255. frameX += rightRow;
  91256. }
  91257. else
  91258. {
  91259. frameX += frameWidth;
  91260. }
  91261. frameIndex++;
  91262. }
  91263. frameX = margin;
  91264. frameY += spacing;
  91265. if (topRow)
  91266. {
  91267. frameY += topHeight;
  91268. }
  91269. else if (bottomRow)
  91270. {
  91271. frameY += bottomHeight;
  91272. }
  91273. else
  91274. {
  91275. frameY += frameHeight;
  91276. }
  91277. }
  91278. return texture;
  91279. };
  91280. module.exports = SpriteSheetFromAtlas;
  91281. /***/ }),
  91282. /* 479 */
  91283. /***/ (function(module, exports, __webpack_require__) {
  91284. /**
  91285. * @author Richard Davey <rich@photonstorm.com>
  91286. * @copyright 2018 Photon Storm Ltd.
  91287. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91288. */
  91289. var GetFastValue = __webpack_require__(1);
  91290. /**
  91291. * Parses a Sprite Sheet and adds the Frames to the Texture.
  91292. *
  91293. * In Phaser terminology a Sprite Sheet is a texture containing different frames, but each frame is the exact
  91294. * same size and cannot be trimmed or rotated.
  91295. *
  91296. * @function Phaser.Textures.Parsers.SpriteSheet
  91297. * @memberOf Phaser.Textures.Parsers
  91298. * @private
  91299. * @since 3.0.0
  91300. *
  91301. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  91302. * @param {integer} sourceIndex - The index of the TextureSource.
  91303. * @param {integer} x - [description]
  91304. * @param {integer} y - [description]
  91305. * @param {integer} width - [description]
  91306. * @param {integer} height - [description]
  91307. * @param {object} config - An object describing how to parse the Sprite Sheet.
  91308. * @param {number} config.frameWidth - Width in pixels of a single frame in the sprite sheet.
  91309. * @param {number} [config.frameHeight] - Height in pixels of a single frame in the sprite sheet. Defaults to frameWidth if not provided.
  91310. * @param {number} [config.startFrame=0] - [description]
  91311. * @param {number} [config.endFrame=-1] - [description]
  91312. * @param {number} [config.margin=0] - If the frames have been drawn with a margin, specify the amount here.
  91313. * @param {number} [config.spacing=0] - If the frames have been drawn with spacing between them, specify the amount here.
  91314. *
  91315. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  91316. */
  91317. var SpriteSheet = function (texture, sourceIndex, x, y, width, height, config)
  91318. {
  91319. var frameWidth = GetFastValue(config, 'frameWidth', null);
  91320. var frameHeight = GetFastValue(config, 'frameHeight', frameWidth);
  91321. // If missing we can't proceed
  91322. if (frameWidth === null)
  91323. {
  91324. throw new Error('TextureManager.SpriteSheet: Invalid frameWidth given.');
  91325. }
  91326. // Add in a __BASE entry (for the entire atlas)
  91327. var source = texture.source[sourceIndex];
  91328. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  91329. var startFrame = GetFastValue(config, 'startFrame', 0);
  91330. var endFrame = GetFastValue(config, 'endFrame', -1);
  91331. var margin = GetFastValue(config, 'margin', 0);
  91332. var spacing = GetFastValue(config, 'spacing', 0);
  91333. var row = Math.floor((width - margin + spacing) / (frameWidth + spacing));
  91334. var column = Math.floor((height - margin + spacing) / (frameHeight + spacing));
  91335. var total = row * column;
  91336. if (total === 0)
  91337. {
  91338. console.warn('SpriteSheet frame dimensions will result in zero frames.');
  91339. }
  91340. if (startFrame > total || startFrame < -total)
  91341. {
  91342. startFrame = 0;
  91343. }
  91344. if (startFrame < 0)
  91345. {
  91346. // Allow negative skipframes.
  91347. startFrame = total + startFrame;
  91348. }
  91349. if (endFrame !== -1)
  91350. {
  91351. total = startFrame + (endFrame + 1);
  91352. }
  91353. var fx = margin;
  91354. var fy = margin;
  91355. var ax = 0;
  91356. var ay = 0;
  91357. for (var i = 0; i < total; i++)
  91358. {
  91359. ax = 0;
  91360. ay = 0;
  91361. var w = fx + frameWidth;
  91362. var h = fy + frameHeight;
  91363. if (w > width)
  91364. {
  91365. ax = w - width;
  91366. }
  91367. if (h > height)
  91368. {
  91369. ay = h - height;
  91370. }
  91371. texture.add(i, sourceIndex, x + fx, y + fy, frameWidth - ax, frameHeight - ay);
  91372. fx += frameWidth + spacing;
  91373. if (fx + frameWidth > width)
  91374. {
  91375. fx = margin;
  91376. fy += frameHeight + spacing;
  91377. }
  91378. }
  91379. return texture;
  91380. };
  91381. module.exports = SpriteSheet;
  91382. /***/ }),
  91383. /* 480 */
  91384. /***/ (function(module, exports, __webpack_require__) {
  91385. /**
  91386. * @author Richard Davey <rich@photonstorm.com>
  91387. * @copyright 2018 Photon Storm Ltd.
  91388. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91389. */
  91390. var Clone = __webpack_require__(34);
  91391. /**
  91392. * Parses a Texture Atlas JSON Hash and adds the Frames to the Texture.
  91393. * JSON format expected to match that defined by Texture Packer, with the frames property containing an object of Frames.
  91394. *
  91395. * @function Phaser.Textures.Parsers.JSONHash
  91396. * @memberOf Phaser.Textures.Parsers
  91397. * @private
  91398. * @since 3.0.0
  91399. *
  91400. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  91401. * @param {integer} sourceIndex - The index of the TextureSource.
  91402. * @param {object} json - The JSON data.
  91403. *
  91404. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  91405. */
  91406. var JSONHash = function (texture, sourceIndex, json)
  91407. {
  91408. // Malformed?
  91409. if (!json['frames'])
  91410. {
  91411. console.warn('Invalid Texture Atlas JSON Hash given, missing \'frames\' Object');
  91412. return;
  91413. }
  91414. // Add in a __BASE entry (for the entire atlas)
  91415. var source = texture.source[sourceIndex];
  91416. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  91417. // By this stage frames is a fully parsed Object
  91418. var frames = json['frames'];
  91419. var newFrame;
  91420. for (var key in frames)
  91421. {
  91422. var src = frames[key];
  91423. // The frame values are the exact coordinates to cut the frame out of the atlas from
  91424. newFrame = texture.add(key, sourceIndex, src.frame.x, src.frame.y, src.frame.w, src.frame.h);
  91425. // These are the original (non-trimmed) sprite values
  91426. if (src.trimmed)
  91427. {
  91428. newFrame.setTrim(
  91429. src.sourceSize.w,
  91430. src.sourceSize.h,
  91431. src.spriteSourceSize.x,
  91432. src.spriteSourceSize.y,
  91433. src.spriteSourceSize.w,
  91434. src.spriteSourceSize.h
  91435. );
  91436. }
  91437. if (src.rotated)
  91438. {
  91439. newFrame.rotated = true;
  91440. newFrame.updateUVsInverted();
  91441. }
  91442. // Copy over any extra data
  91443. newFrame.customData = Clone(src);
  91444. }
  91445. // Copy over any additional data that was in the JSON to Texture.customData
  91446. for (var dataKey in json)
  91447. {
  91448. if (dataKey === 'frames')
  91449. {
  91450. continue;
  91451. }
  91452. if (Array.isArray(json[dataKey]))
  91453. {
  91454. texture.customData[dataKey] = json[dataKey].slice(0);
  91455. }
  91456. else
  91457. {
  91458. texture.customData[dataKey] = json[dataKey];
  91459. }
  91460. }
  91461. return texture;
  91462. };
  91463. module.exports = JSONHash;
  91464. /***/ }),
  91465. /* 481 */
  91466. /***/ (function(module, exports, __webpack_require__) {
  91467. /**
  91468. * @author Richard Davey <rich@photonstorm.com>
  91469. * @copyright 2018 Photon Storm Ltd.
  91470. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91471. */
  91472. var Clone = __webpack_require__(34);
  91473. /**
  91474. * Parses a Texture Atlas JSON Array and adds the Frames to the Texture.
  91475. * JSON format expected to match that defined by Texture Packer, with the frames property containing an array of Frames.
  91476. *
  91477. * @function Phaser.Textures.Parsers.JSONArray
  91478. * @memberOf Phaser.Textures.Parsers
  91479. * @private
  91480. * @since 3.0.0
  91481. *
  91482. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  91483. * @param {integer} sourceIndex - The index of the TextureSource.
  91484. * @param {object} json - The JSON data.
  91485. *
  91486. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  91487. */
  91488. var JSONArray = function (texture, sourceIndex, json)
  91489. {
  91490. // Malformed?
  91491. if (!json['frames'] && !json['textures'])
  91492. {
  91493. console.warn('Invalid Texture Atlas JSON Array');
  91494. return;
  91495. }
  91496. // Add in a __BASE entry (for the entire atlas)
  91497. var source = texture.source[sourceIndex];
  91498. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  91499. // By this stage frames is a fully parsed array
  91500. var frames = (Array.isArray(json.textures)) ? json.textures[sourceIndex].frames : json.frames;
  91501. var newFrame;
  91502. for (var i = 0; i < frames.length; i++)
  91503. {
  91504. var src = frames[i];
  91505. // The frame values are the exact coordinates to cut the frame out of the atlas from
  91506. newFrame = texture.add(src.filename, sourceIndex, src.frame.x, src.frame.y, src.frame.w, src.frame.h);
  91507. // These are the original (non-trimmed) sprite values
  91508. if (src.trimmed)
  91509. {
  91510. newFrame.setTrim(
  91511. src.sourceSize.w,
  91512. src.sourceSize.h,
  91513. src.spriteSourceSize.x,
  91514. src.spriteSourceSize.y,
  91515. src.spriteSourceSize.w,
  91516. src.spriteSourceSize.h
  91517. );
  91518. }
  91519. if (src.rotated)
  91520. {
  91521. newFrame.rotated = true;
  91522. newFrame.updateUVsInverted();
  91523. }
  91524. if (src.anchor)
  91525. {
  91526. newFrame.customPivot = true;
  91527. newFrame.pivotX = src.anchor.x;
  91528. newFrame.pivotY = src.anchor.y;
  91529. }
  91530. // Copy over any extra data
  91531. newFrame.customData = Clone(src);
  91532. }
  91533. // Copy over any additional data that was in the JSON to Texture.customData
  91534. for (var dataKey in json)
  91535. {
  91536. if (dataKey === 'frames')
  91537. {
  91538. continue;
  91539. }
  91540. if (Array.isArray(json[dataKey]))
  91541. {
  91542. texture.customData[dataKey] = json[dataKey].slice(0);
  91543. }
  91544. else
  91545. {
  91546. texture.customData[dataKey] = json[dataKey];
  91547. }
  91548. }
  91549. return texture;
  91550. };
  91551. module.exports = JSONArray;
  91552. /***/ }),
  91553. /* 482 */
  91554. /***/ (function(module, exports) {
  91555. /**
  91556. * @author Richard Davey <rich@photonstorm.com>
  91557. * @copyright 2018 Photon Storm Ltd.
  91558. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91559. */
  91560. /**
  91561. * Adds an Image Element to a Texture.
  91562. *
  91563. * @function Phaser.Textures.Parsers.Image
  91564. * @memberOf Phaser.Textures.Parsers
  91565. * @private
  91566. * @since 3.0.0
  91567. *
  91568. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  91569. * @param {integer} sourceIndex - The index of the TextureSource.
  91570. *
  91571. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  91572. */
  91573. var Image = function (texture, sourceIndex)
  91574. {
  91575. var source = texture.source[sourceIndex];
  91576. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  91577. return texture;
  91578. };
  91579. module.exports = Image;
  91580. /***/ }),
  91581. /* 483 */
  91582. /***/ (function(module, exports) {
  91583. /**
  91584. * @author Richard Davey <rich@photonstorm.com>
  91585. * @copyright 2018 Photon Storm Ltd.
  91586. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91587. */
  91588. /**
  91589. * Adds a Canvas Element to a Texture.
  91590. *
  91591. * @function Phaser.Textures.Parsers.Canvas
  91592. * @memberOf Phaser.Textures.Parsers
  91593. * @private
  91594. * @since 3.0.0
  91595. *
  91596. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  91597. * @param {integer} sourceIndex - The index of the TextureSource.
  91598. *
  91599. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  91600. */
  91601. var Canvas = function (texture, sourceIndex)
  91602. {
  91603. var source = texture.source[sourceIndex];
  91604. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  91605. return texture;
  91606. };
  91607. module.exports = Canvas;
  91608. /***/ }),
  91609. /* 484 */
  91610. /***/ (function(module, exports) {
  91611. /**
  91612. * @author Richard Davey <rich@photonstorm.com>
  91613. * @copyright 2018 Photon Storm Ltd.
  91614. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91615. */
  91616. /**
  91617. * Parses an XML Texture Atlas object and adds all the Frames into a Texture.
  91618. *
  91619. * @function Phaser.Textures.Parsers.AtlasXML
  91620. * @memberOf Phaser.Textures.Parsers
  91621. * @private
  91622. * @since 3.7.0
  91623. *
  91624. * @param {Phaser.Textures.Texture} texture - The Texture to add the Frames to.
  91625. * @param {integer} sourceIndex - The index of the TextureSource.
  91626. * @param {*} xml - The XML data.
  91627. *
  91628. * @return {Phaser.Textures.Texture} The Texture modified by this parser.
  91629. */
  91630. var AtlasXML = function (texture, sourceIndex, xml)
  91631. {
  91632. // Malformed?
  91633. if (!xml.getElementsByTagName('TextureAtlas'))
  91634. {
  91635. console.warn('Invalid Texture Atlas XML given');
  91636. return;
  91637. }
  91638. // Add in a __BASE entry (for the entire atlas)
  91639. var source = texture.source[sourceIndex];
  91640. texture.add('__BASE', sourceIndex, 0, 0, source.width, source.height);
  91641. // By this stage frames is a fully parsed array
  91642. var frames = xml.getElementsByTagName('SubTexture');
  91643. var newFrame;
  91644. for (var i = 0; i < frames.length; i++)
  91645. {
  91646. var frame = frames[i].attributes;
  91647. var name = frame.name.value;
  91648. var x = parseInt(frame.x.value, 10);
  91649. var y = parseInt(frame.y.value, 10);
  91650. var width = parseInt(frame.width.value, 10);
  91651. var height = parseInt(frame.height.value, 10);
  91652. // The frame values are the exact coordinates to cut the frame out of the atlas from
  91653. newFrame = texture.add(name, sourceIndex, x, y, width, height);
  91654. // These are the original (non-trimmed) sprite values
  91655. if (frame.frameX)
  91656. {
  91657. var frameX = Math.abs(parseInt(frame.frameX.value, 10));
  91658. var frameY = Math.abs(parseInt(frame.frameY.value, 10));
  91659. var frameWidth = parseInt(frame.frameWidth.value, 10);
  91660. var frameHeight = parseInt(frame.frameHeight.value, 10);
  91661. newFrame.setTrim(
  91662. width,
  91663. height,
  91664. frameX,
  91665. frameY,
  91666. frameWidth,
  91667. frameHeight
  91668. );
  91669. }
  91670. }
  91671. return texture;
  91672. };
  91673. module.exports = AtlasXML;
  91674. /***/ }),
  91675. /* 485 */
  91676. /***/ (function(module, exports, __webpack_require__) {
  91677. /**
  91678. * @author Richard Davey <rich@photonstorm.com>
  91679. * @copyright 2018 Photon Storm Ltd.
  91680. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91681. */
  91682. var Class = __webpack_require__(0);
  91683. var IsSizePowerOfTwo = __webpack_require__(85);
  91684. var Texture = __webpack_require__(117);
  91685. /**
  91686. * @classdesc
  91687. * A Canvas Texture is a special kind of Texture that is backed by an HTML Canvas Element as its source.
  91688. *
  91689. * You can use the properties of this texture to draw to the canvas element directly, using all of the standard
  91690. * canvas operations available in the browser. Any Game Object can be given this texture and will render with it.
  91691. *
  91692. * Note: When running under WebGL the Canvas Texture needs to re-generate its base WebGLTexture and reupload it to
  91693. * the GPU every time you modify it, otherwise the changes you make to this texture will not be visible. To do this
  91694. * you should call `CanvasTexture.refresh()` once you are finished with your changes to the canvas. Try and keep
  91695. * this to a minimum, especially on large canvas sizes, or you may inadvertently thrash the GPU by constantly uploading
  91696. * texture data to it. This restriction does not apply if using the Canvas Renderer.
  91697. *
  91698. * It starts with only one frame that covers the whole of the canvas. You can add further frames, that specify
  91699. * sections of the canvas using the `add` method.
  91700. *
  91701. * Should you need to resize the canvas use the `setSize` method so that it accurately updates all of the underlying
  91702. * texture data as well. Forgetting to do this (i.e. by changing the canvas size directly from your code) could cause
  91703. * graphical errors.
  91704. *
  91705. * @class CanvasTexture
  91706. * @extends Phaser.Textures.Texture
  91707. * @memberOf Phaser.Textures
  91708. * @constructor
  91709. * @since 3.7.0
  91710. *
  91711. * @param {Phaser.Textures.TextureManager} manager - A reference to the Texture Manager this Texture belongs to.
  91712. * @param {string} key - The unique string-based key of this Texture.
  91713. * @param {HTMLCanvasElement} source - The canvas element that is used as the base of this texture.
  91714. * @param {integer} width - The width of the canvas.
  91715. * @param {integer} height - The height of the canvas.
  91716. */
  91717. var CanvasTexture = new Class({
  91718. Extends: Texture,
  91719. initialize:
  91720. function CanvasTexture (manager, key, source, width, height)
  91721. {
  91722. Texture.call(this, manager, key, source, width, height);
  91723. this.add('__BASE', 0, 0, 0, width, height);
  91724. /**
  91725. * A reference to the Texture Source of this Canvas.
  91726. *
  91727. * @name Phaser.Textures.TextureManager#_source
  91728. * @type {Phaser.Textures.TextureSource}
  91729. * @private
  91730. * @since 3.7.0
  91731. */
  91732. this._source = this.frames['__BASE'].source;
  91733. /**
  91734. * The source Canvas Element.
  91735. *
  91736. * @name Phaser.Textures.TextureManager#canvas
  91737. * @readOnly
  91738. * @type {HTMLCanvasElement}
  91739. * @since 3.7.0
  91740. */
  91741. this.canvas = this._source.image;
  91742. /**
  91743. * The 2D Canvas Rendering Context.
  91744. *
  91745. * @name Phaser.Textures.TextureManager#canvas
  91746. * @readOnly
  91747. * @type {CanvasRenderingContext2D}
  91748. * @since 3.7.0
  91749. */
  91750. this.context = this.canvas.getContext('2d');
  91751. /**
  91752. * The width of the Canvas.
  91753. * This property is read-only, if you wish to change use `setSize`.
  91754. *
  91755. * @name Phaser.Textures.TextureManager#width
  91756. * @readOnly
  91757. * @type {integer}
  91758. * @since 3.7.0
  91759. */
  91760. this.width = width;
  91761. /**
  91762. * The height of the Canvas.
  91763. * This property is read-only, if you wish to change use `setSize`.
  91764. *
  91765. * @name Phaser.Textures.TextureManager#height
  91766. * @readOnly
  91767. * @type {integer}
  91768. * @since 3.7.0
  91769. */
  91770. this.height = height;
  91771. },
  91772. /**
  91773. * This should be called manually if you are running under WebGL.
  91774. * It will refresh the WebGLTexture from the Canvas source. Only call this if you know that the
  91775. * canvas has changed, as there is a significant GPU texture allocation cost involved in doing so.
  91776. *
  91777. * @method Phaser.Textures.CanvasTexture#refresh
  91778. * @since 3.7.0
  91779. *
  91780. * @return {Phaser.Textures.CanvasTexture} This CanvasTexture.
  91781. */
  91782. refresh: function ()
  91783. {
  91784. this._source.update();
  91785. return this;
  91786. },
  91787. /**
  91788. * Gets the Canvas Element.
  91789. *
  91790. * @method Phaser.Textures.CanvasTexture#getCanvas
  91791. * @since 3.7.0
  91792. *
  91793. * @return {HTMLCanvasElement} The Canvas DOM element this texture is using.
  91794. */
  91795. getCanvas: function ()
  91796. {
  91797. return this.canvas;
  91798. },
  91799. /**
  91800. * Gets the 2D Canvas Rendering Context.
  91801. *
  91802. * @method Phaser.Textures.CanvasTexture#getContext
  91803. * @since 3.7.0
  91804. *
  91805. * @return {CanvasRenderingContext2D} The Canvas Rendering Context this texture is using.
  91806. */
  91807. getContext: function ()
  91808. {
  91809. return this.context;
  91810. },
  91811. /**
  91812. * Clears this Canvas Texture, resetting it back to transparent.
  91813. *
  91814. * @method Phaser.Textures.CanvasTexture#clear
  91815. * @since 3.7.0
  91816. *
  91817. * @return {Phaser.Textures.CanvasTexture} The Canvas Texture.
  91818. */
  91819. clear: function ()
  91820. {
  91821. this.context.clearRect(0, 0, this.width, this.height);
  91822. return this;
  91823. },
  91824. /**
  91825. * Changes the size of this Canvas Texture.
  91826. *
  91827. * @method Phaser.Textures.CanvasTexture#setSize
  91828. * @since 3.7.0
  91829. *
  91830. * @param {integer} width - The new width of the Canvas.
  91831. * @param {integer} [height] - The new height of the Canvas. If not given it will use the width as the height.
  91832. *
  91833. * @return {Phaser.Textures.CanvasTexture} The Canvas Texture.
  91834. */
  91835. setSize: function (width, height)
  91836. {
  91837. if (height === undefined) { height = width; }
  91838. if (width !== this.width || height !== this.height)
  91839. {
  91840. // Update the Canvas
  91841. this.canvas.width = width;
  91842. this.canvas.height = height;
  91843. // Update the Texture Source
  91844. this._source.width = width;
  91845. this._source.height = height;
  91846. this._source.isPowerOf2 = IsSizePowerOfTwo(width, height);
  91847. // Update the Frame
  91848. this.frames['__BASE'].setSize(width, height, 0, 0);
  91849. this.refresh();
  91850. }
  91851. return this;
  91852. }
  91853. });
  91854. module.exports = CanvasTexture;
  91855. /***/ }),
  91856. /* 486 */
  91857. /***/ (function(module, exports) {
  91858. /**
  91859. * @author Richard Davey <rich@photonstorm.com>
  91860. * @copyright 2018 Photon Storm Ltd.
  91861. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91862. */
  91863. // These properties get injected into the Scene and map to local systems
  91864. // The map value is the property that is injected into the Scene, the key is the Scene.Systems reference.
  91865. // These defaults can be modified via the Scene config object
  91866. // var config = {
  91867. // map: {
  91868. // add: 'makeStuff',
  91869. // load: 'loader'
  91870. // }
  91871. // };
  91872. var InjectionMap = {
  91873. game: 'game',
  91874. anims: 'anims',
  91875. cache: 'cache',
  91876. plugins: 'plugins',
  91877. registry: 'registry',
  91878. sound: 'sound',
  91879. textures: 'textures',
  91880. events: 'events',
  91881. cameras: 'cameras',
  91882. cameras3d: 'cameras3d',
  91883. add: 'add',
  91884. make: 'make',
  91885. scenePlugin: 'scene',
  91886. displayList: 'children',
  91887. lights: 'lights',
  91888. data: 'data',
  91889. input: 'input',
  91890. load: 'load',
  91891. time: 'time',
  91892. tweens: 'tweens',
  91893. arcadePhysics: 'physics',
  91894. impactPhysics: 'impact',
  91895. matterPhysics: 'matter'
  91896. };
  91897. module.exports = InjectionMap;
  91898. /***/ }),
  91899. /* 487 */
  91900. /***/ (function(module, exports, __webpack_require__) {
  91901. /**
  91902. * @author Richard Davey <rich@photonstorm.com>
  91903. * @copyright 2018 Photon Storm Ltd.
  91904. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91905. */
  91906. var GetFastValue = __webpack_require__(1);
  91907. /**
  91908. * Builds an array of which plugins (not including physics plugins) should be activated for the given Scene.
  91909. *
  91910. * @function Phaser.Scenes.GetScenePlugins
  91911. * @since 3.0.0
  91912. *
  91913. * @param {Phaser.Scenes.Systems} sys - [description]
  91914. *
  91915. * @return {array} [description]
  91916. */
  91917. var GetScenePlugins = function (sys)
  91918. {
  91919. var defaultPlugins = sys.plugins.getDefaultScenePlugins();
  91920. var scenePlugins = GetFastValue(sys.settings, 'plugins', false);
  91921. // Scene Plugins always override Default Plugins
  91922. if (Array.isArray(scenePlugins))
  91923. {
  91924. return scenePlugins;
  91925. }
  91926. else if (defaultPlugins)
  91927. {
  91928. return defaultPlugins;
  91929. }
  91930. else
  91931. {
  91932. // No default plugins or plugins in this scene
  91933. return [];
  91934. }
  91935. };
  91936. module.exports = GetScenePlugins;
  91937. /***/ }),
  91938. /* 488 */
  91939. /***/ (function(module, exports, __webpack_require__) {
  91940. /**
  91941. * @author Richard Davey <rich@photonstorm.com>
  91942. * @copyright 2018 Photon Storm Ltd.
  91943. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91944. */
  91945. var GetFastValue = __webpack_require__(1);
  91946. var UppercaseFirst = __webpack_require__(249);
  91947. /**
  91948. * Builds an array of which physics plugins should be activated for the given Scene.
  91949. *
  91950. * @function Phaser.Scenes.GetPhysicsPlugins
  91951. * @since 3.0.0
  91952. *
  91953. * @param {Phaser.Scenes.Systems} sys - The scene system to get the physics systems of.
  91954. *
  91955. * @return {array} An array of Physics systems to start for this Scene.
  91956. */
  91957. var GetPhysicsPlugins = function (sys)
  91958. {
  91959. var defaultSystem = sys.game.config.defaultPhysicsSystem;
  91960. var sceneSystems = GetFastValue(sys.settings, 'physics', false);
  91961. if (!defaultSystem && !sceneSystems)
  91962. {
  91963. // No default physics system or systems in this scene
  91964. return;
  91965. }
  91966. // Let's build the systems array
  91967. var output = [];
  91968. if (defaultSystem)
  91969. {
  91970. output.push(UppercaseFirst(defaultSystem + 'Physics'));
  91971. }
  91972. if (sceneSystems)
  91973. {
  91974. for (var key in sceneSystems)
  91975. {
  91976. key = UppercaseFirst(key.concat('Physics'));
  91977. if (output.indexOf(key) === -1)
  91978. {
  91979. output.push(key);
  91980. }
  91981. }
  91982. }
  91983. // An array of Physics systems to start for this Scene
  91984. return output;
  91985. };
  91986. module.exports = GetPhysicsPlugins;
  91987. /***/ }),
  91988. /* 489 */
  91989. /***/ (function(module, exports) {
  91990. /**
  91991. * @author Richard Davey <rich@photonstorm.com>
  91992. * @copyright 2018 Photon Storm Ltd.
  91993. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  91994. */
  91995. /**
  91996. * Determines the full screen support of the browser running this Phaser Game instance.
  91997. * These values are read-only and populated during the boot sequence of the game.
  91998. * They are then referenced by internal game systems and are available for you to access
  91999. * via `this.sys.game.device.fullscreen` from within any Scene.
  92000. *
  92001. * @typedef {object} Phaser.Device.Fullscreen
  92002. * @since 3.0.0
  92003. *
  92004. * @property {boolean} available - Does the browser support the Full Screen API?
  92005. * @property {boolean} keyboard - Does the browser support access to the Keyboard during Full Screen mode?
  92006. * @property {string} cancel - If the browser supports the Full Screen API this holds the call you need to use to cancel it.
  92007. * @property {string} request - If the browser supports the Full Screen API this holds the call you need to use to activate it.
  92008. */
  92009. var Fullscreen = {
  92010. available: false,
  92011. cancel: '',
  92012. keyboard: false,
  92013. request: ''
  92014. };
  92015. /**
  92016. * Checks for support of the Full Screen API.
  92017. */
  92018. function init ()
  92019. {
  92020. var i;
  92021. var fs = [
  92022. 'requestFullscreen',
  92023. 'requestFullScreen',
  92024. 'webkitRequestFullscreen',
  92025. 'webkitRequestFullScreen',
  92026. 'msRequestFullscreen',
  92027. 'msRequestFullScreen',
  92028. 'mozRequestFullScreen',
  92029. 'mozRequestFullscreen'
  92030. ];
  92031. var element = document.createElement('div');
  92032. for (i = 0; i < fs.length; i++)
  92033. {
  92034. if (element[fs[i]])
  92035. {
  92036. Fullscreen.available = true;
  92037. Fullscreen.request = fs[i];
  92038. break;
  92039. }
  92040. }
  92041. var cfs = [
  92042. 'cancelFullScreen',
  92043. 'exitFullscreen',
  92044. 'webkitCancelFullScreen',
  92045. 'webkitExitFullscreen',
  92046. 'msCancelFullScreen',
  92047. 'msExitFullscreen',
  92048. 'mozCancelFullScreen',
  92049. 'mozExitFullscreen'
  92050. ];
  92051. if (Fullscreen.available)
  92052. {
  92053. for (i = 0; i < cfs.length; i++)
  92054. {
  92055. if (document[cfs[i]])
  92056. {
  92057. Fullscreen.cancel = cfs[i];
  92058. break;
  92059. }
  92060. }
  92061. }
  92062. // Keyboard Input?
  92063. if (window['Element'] && Element['ALLOW_KEYBOARD_INPUT'])
  92064. {
  92065. Fullscreen.keyboard = true;
  92066. }
  92067. return Fullscreen;
  92068. }
  92069. module.exports = init();
  92070. /***/ }),
  92071. /* 490 */
  92072. /***/ (function(module, exports) {
  92073. /**
  92074. * @author Richard Davey <rich@photonstorm.com>
  92075. * @copyright 2018 Photon Storm Ltd.
  92076. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  92077. */
  92078. /**
  92079. * Determines the video support of the browser running this Phaser Game instance.
  92080. * These values are read-only and populated during the boot sequence of the game.
  92081. * They are then referenced by internal game systems and are available for you to access
  92082. * via `this.sys.game.device.video` from within any Scene.
  92083. *
  92084. * @typedef {object} Phaser.Device.Video
  92085. * @since 3.0.0
  92086. *
  92087. * @property {boolean} h264Video - Can this device play h264 mp4 video files?
  92088. * @property {boolean} hlsVideo - Can this device play hls video files?
  92089. * @property {boolean} mp4Video - Can this device play h264 mp4 video files?
  92090. * @property {boolean} oggVideo - Can this device play ogg video files?
  92091. * @property {boolean} vp9Video - Can this device play vp9 video files?
  92092. * @property {boolean} webmVideo - Can this device play webm video files?
  92093. */
  92094. var Video = {
  92095. h264Video: false,
  92096. hlsVideo: false,
  92097. mp4Video: false,
  92098. oggVideo: false,
  92099. vp9Video: false,
  92100. webmVideo: false
  92101. };
  92102. function init ()
  92103. {
  92104. var videoElement = document.createElement('video');
  92105. var result = !!videoElement.canPlayType;
  92106. try
  92107. {
  92108. if (result)
  92109. {
  92110. if (videoElement.canPlayType('video/ogg; codecs="theora"').replace(/^no$/, ''))
  92111. {
  92112. Video.oggVideo = true;
  92113. }
  92114. if (videoElement.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/, ''))
  92115. {
  92116. // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546
  92117. Video.h264Video = true;
  92118. Video.mp4Video = true;
  92119. }
  92120. if (videoElement.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/, ''))
  92121. {
  92122. Video.webmVideo = true;
  92123. }
  92124. if (videoElement.canPlayType('video/webm; codecs="vp9"').replace(/^no$/, ''))
  92125. {
  92126. Video.vp9Video = true;
  92127. }
  92128. if (videoElement.canPlayType('application/x-mpegURL; codecs="avc1.42E01E"').replace(/^no$/, ''))
  92129. {
  92130. Video.hlsVideo = true;
  92131. }
  92132. }
  92133. }
  92134. catch (e)
  92135. {
  92136. // Nothing to do
  92137. }
  92138. return Video;
  92139. }
  92140. module.exports = init();
  92141. /***/ }),
  92142. /* 491 */
  92143. /***/ (function(module, exports, __webpack_require__) {
  92144. /**
  92145. * @author Richard Davey <rich@photonstorm.com>
  92146. * @copyright 2018 Photon Storm Ltd.
  92147. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  92148. */
  92149. var Browser = __webpack_require__(80);
  92150. /**
  92151. * Determines the audio playback capabilities of the device running this Phaser Game instance.
  92152. * These values are read-only and populated during the boot sequence of the game.
  92153. * They are then referenced by internal game systems and are available for you to access
  92154. * via `this.sys.game.device.audio` from within any Scene.
  92155. *
  92156. * @typedef {object} Phaser.Device.Audio
  92157. * @since 3.0.0
  92158. *
  92159. * @property {boolean} audioData - Can this device play HTML Audio tags?
  92160. * @property {boolean} dolby - Can this device play EC-3 Dolby Digital Plus files?
  92161. * @property {boolean} m4a - Can this device can play m4a files.
  92162. * @property {boolean} mp3 - Can this device play mp3 files?
  92163. * @property {boolean} ogg - Can this device play ogg files?
  92164. * @property {boolean} opus - Can this device play opus files?
  92165. * @property {boolean} wav - Can this device play wav files?
  92166. * @property {boolean} webAudio - Does this device have the Web Audio API?
  92167. * @property {boolean} webm - Can this device play webm files?
  92168. */
  92169. var Audio = {
  92170. audioData: false,
  92171. dolby: false,
  92172. m4a: false,
  92173. mp3: false,
  92174. ogg: false,
  92175. opus: false,
  92176. wav: false,
  92177. webAudio: false,
  92178. webm: false
  92179. };
  92180. function init ()
  92181. {
  92182. Audio.audioData = !!(window['Audio']);
  92183. Audio.webAudio = !!(window['AudioContext'] || window['webkitAudioContext']);
  92184. var audioElement = document.createElement('audio');
  92185. var result = !!audioElement.canPlayType;
  92186. try
  92187. {
  92188. if (result)
  92189. {
  92190. if (audioElement.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/, ''))
  92191. {
  92192. Audio.ogg = true;
  92193. }
  92194. if (audioElement.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/, '') || audioElement.canPlayType('audio/opus;').replace(/^no$/, ''))
  92195. {
  92196. Audio.opus = true;
  92197. }
  92198. if (audioElement.canPlayType('audio/mpeg;').replace(/^no$/, ''))
  92199. {
  92200. Audio.mp3 = true;
  92201. }
  92202. // Mimetypes accepted:
  92203. // developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
  92204. // bit.ly/iphoneoscodecs
  92205. if (audioElement.canPlayType('audio/wav; codecs="1"').replace(/^no$/, ''))
  92206. {
  92207. Audio.wav = true;
  92208. }
  92209. if (audioElement.canPlayType('audio/x-m4a;') || audioElement.canPlayType('audio/aac;').replace(/^no$/, ''))
  92210. {
  92211. Audio.m4a = true;
  92212. }
  92213. if (audioElement.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/, ''))
  92214. {
  92215. Audio.webm = true;
  92216. }
  92217. if (audioElement.canPlayType('audio/mp4;codecs="ec-3"') !== '')
  92218. {
  92219. if (Browser.edge)
  92220. {
  92221. Audio.dolby = true;
  92222. }
  92223. else if (Browser.safari && Browser.safariVersion >= 9)
  92224. {
  92225. if ((/Mac OS X (\d+)_(\d+)/).test(navigator.userAgent))
  92226. {
  92227. var major = parseInt(RegExp.$1, 10);
  92228. var minor = parseInt(RegExp.$2, 10);
  92229. if ((major === 10 && minor >= 11) || major > 10)
  92230. {
  92231. Audio.dolby = true;
  92232. }
  92233. }
  92234. }
  92235. }
  92236. }
  92237. }
  92238. catch (e)
  92239. {
  92240. // Nothing to do here
  92241. }
  92242. return Audio;
  92243. }
  92244. module.exports = init();
  92245. /***/ }),
  92246. /* 492 */
  92247. /***/ (function(module, exports, __webpack_require__) {
  92248. /**
  92249. * @author Richard Davey <rich@photonstorm.com>
  92250. * @copyright 2018 Photon Storm Ltd.
  92251. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  92252. */
  92253. var OS = __webpack_require__(57);
  92254. var Browser = __webpack_require__(80);
  92255. /**
  92256. * Determines the input support of the browser running this Phaser Game instance.
  92257. * These values are read-only and populated during the boot sequence of the game.
  92258. * They are then referenced by internal game systems and are available for you to access
  92259. * via `this.sys.game.device.input` from within any Scene.
  92260. *
  92261. * @typedef {object} Phaser.Device.Input
  92262. * @since 3.0.0
  92263. *
  92264. * @property {?string} wheelType - The newest type of Wheel/Scroll event supported: 'wheel', 'mousewheel', 'DOMMouseScroll'
  92265. * @property {boolean} gamepads - Is navigator.getGamepads available?
  92266. * @property {boolean} mspointer - Is mspointer available?
  92267. * @property {boolean} touch - Is touch available?
  92268. */
  92269. var Input = {
  92270. gamepads: false,
  92271. mspointer: false,
  92272. touch: false,
  92273. wheelEvent: null
  92274. };
  92275. function init ()
  92276. {
  92277. if ('ontouchstart' in document.documentElement || (navigator.maxTouchPoints && navigator.maxTouchPoints >= 1))
  92278. {
  92279. Input.touch = true;
  92280. }
  92281. if (navigator.msPointerEnabled || navigator.pointerEnabled)
  92282. {
  92283. Input.mspointer = true;
  92284. }
  92285. if (navigator.getGamepads)
  92286. {
  92287. Input.gamepads = true;
  92288. }
  92289. if (!OS.cocoonJS)
  92290. {
  92291. // See https://developer.mozilla.org/en-US/docs/Web/Events/wheel
  92292. if ('onwheel' in window || (Browser.ie && 'WheelEvent' in window))
  92293. {
  92294. // DOM3 Wheel Event: FF 17+, IE 9+, Chrome 31+, Safari 7+
  92295. Input.wheelEvent = 'wheel';
  92296. }
  92297. else if ('onmousewheel' in window)
  92298. {
  92299. // Non-FF legacy: IE 6-9, Chrome 1-31, Safari 5-7.
  92300. Input.wheelEvent = 'mousewheel';
  92301. }
  92302. else if (Browser.firefox && 'MouseScrollEvent' in window)
  92303. {
  92304. // FF prior to 17. This should probably be scrubbed.
  92305. Input.wheelEvent = 'DOMMouseScroll';
  92306. }
  92307. }
  92308. return Input;
  92309. }
  92310. module.exports = init();
  92311. /***/ }),
  92312. /* 493 */
  92313. /***/ (function(module, exports, __webpack_require__) {
  92314. /**
  92315. * @author Richard Davey <rich@photonstorm.com>
  92316. * @copyright 2018 Photon Storm Ltd.
  92317. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  92318. */
  92319. // This singleton is instantiated as soon as Phaser loads,
  92320. // before a Phaser.Game instance has even been created.
  92321. // Which means all instances of Phaser Games can share it,
  92322. // without having to re-poll the device all over again
  92323. /**
  92324. * @namespace Phaser.Device
  92325. * @since 3.0.0
  92326. */
  92327. /**
  92328. * @typedef {object} Phaser.DeviceConf
  92329. *
  92330. * @property {Phaser.Device.OS} os - The OS Device functions.
  92331. * @property {Phaser.Device.Browser} browser - The Browser Device functions.
  92332. * @property {Phaser.Device.Features} features - The Features Device functions.
  92333. * @property {Phaser.Device.Input} input - The Input Device functions.
  92334. * @property {Phaser.Device.Audio} audio - The Audio Device functions.
  92335. * @property {Phaser.Device.Video} video - The Video Device functions.
  92336. * @property {Phaser.Device.Fullscreen} fullscreen - The Fullscreen Device functions.
  92337. * @property {Phaser.Device.CanvasFeatures} canvasFeatures - The Canvas Device functions.
  92338. */
  92339. module.exports = {
  92340. os: __webpack_require__(57),
  92341. browser: __webpack_require__(80),
  92342. features: __webpack_require__(120),
  92343. input: __webpack_require__(492),
  92344. audio: __webpack_require__(491),
  92345. video: __webpack_require__(490),
  92346. fullscreen: __webpack_require__(489),
  92347. canvasFeatures: __webpack_require__(208)
  92348. };
  92349. /***/ }),
  92350. /* 494 */
  92351. /***/ (function(module, exports, __webpack_require__) {
  92352. /**
  92353. * @author Richard Davey <rich@photonstorm.com>
  92354. * @copyright 2018 Photon Storm Ltd.
  92355. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  92356. */
  92357. var CONST = __webpack_require__(22);
  92358. /**
  92359. * Called automatically by Phaser.Game and responsible for creating the console.log debug header.
  92360. *
  92361. * You can customize or disable the header via the Game Config object.
  92362. *
  92363. * @function Phaser.Boot.DebugHeader
  92364. * @since 3.0.0
  92365. *
  92366. * @param {Phaser.Game} game - The Phaser.Game instance which will output this debug header.
  92367. */
  92368. var DebugHeader = function (game)
  92369. {
  92370. var config = game.config;
  92371. if (config.hideBanner)
  92372. {
  92373. return;
  92374. }
  92375. var renderType = 'WebGL';
  92376. if (config.renderType === CONST.CANVAS)
  92377. {
  92378. renderType = 'Canvas';
  92379. }
  92380. else if (config.renderType === CONST.HEADLESS)
  92381. {
  92382. renderType = 'Headless';
  92383. }
  92384. var audioConfig = config.audio;
  92385. var deviceAudio = game.device.audio;
  92386. var audioType;
  92387. if (deviceAudio.webAudio && !(audioConfig && audioConfig.disableWebAudio))
  92388. {
  92389. audioType = 'Web Audio';
  92390. }
  92391. else if ((audioConfig && audioConfig.noAudio) || (!deviceAudio.webAudio && !deviceAudio.audioData))
  92392. {
  92393. audioType = 'No Audio';
  92394. }
  92395. else
  92396. {
  92397. audioType = 'HTML5 Audio';
  92398. }
  92399. if (!game.device.browser.ie)
  92400. {
  92401. var c = '';
  92402. var args = [ c ];
  92403. if (Array.isArray(config.bannerBackgroundColor))
  92404. {
  92405. var lastColor;
  92406. config.bannerBackgroundColor.forEach(function (color)
  92407. {
  92408. c = c.concat('%c ');
  92409. args.push('background: ' + color);
  92410. lastColor = color;
  92411. });
  92412. // inject the text color
  92413. args[args.length - 1] = 'color: ' + config.bannerTextColor + '; background: ' + lastColor;
  92414. }
  92415. else
  92416. {
  92417. c = c.concat('%c ');
  92418. args.push('color: ' + config.bannerTextColor + '; background: ' + config.bannerBackgroundColor);
  92419. }
  92420. // URL link background color (always white)
  92421. args.push('background: #fff');
  92422. if (config.gameTitle)
  92423. {
  92424. c = c.concat(config.gameTitle);
  92425. if (config.gameVersion)
  92426. {
  92427. c = c.concat(' v' + config.gameVersion);
  92428. }
  92429. if (!config.hidePhaser)
  92430. {
  92431. c = c.concat(' / ');
  92432. }
  92433. }
  92434. if (!config.hidePhaser)
  92435. {
  92436. c = c.concat('Phaser v' + CONST.VERSION + ' (' + renderType + ' | ' + audioType + ')');
  92437. }
  92438. c = c.concat(' %c ' + config.gameURL);
  92439. // Inject the new string back into the args array
  92440. args[0] = c;
  92441. console.log.apply(console, args);
  92442. }
  92443. else if (window['console'])
  92444. {
  92445. console.log('Phaser v' + CONST.VERSION + ' / https://phaser.io');
  92446. }
  92447. };
  92448. module.exports = DebugHeader;
  92449. /***/ }),
  92450. /* 495 */
  92451. /***/ (function(module, exports) {
  92452. module.exports = [
  92453. '#define SHADER_NAME PHASER_TEXTURE_TINT_VS',
  92454. '',
  92455. 'precision mediump float;',
  92456. '',
  92457. 'uniform mat4 uProjectionMatrix;',
  92458. 'uniform mat4 uViewMatrix;',
  92459. 'uniform mat4 uModelMatrix;',
  92460. '',
  92461. 'attribute vec2 inPosition;',
  92462. 'attribute vec2 inTexCoord;',
  92463. 'attribute float inTintEffect;',
  92464. 'attribute vec4 inTint;',
  92465. '',
  92466. 'varying vec2 outTexCoord;',
  92467. 'varying float outTintEffect;',
  92468. 'varying vec4 outTint;',
  92469. '',
  92470. 'void main ()',
  92471. '{',
  92472. ' gl_Position = uProjectionMatrix * uViewMatrix * uModelMatrix * vec4(inPosition, 1.0, 1.0);',
  92473. '',
  92474. ' outTexCoord = inTexCoord;',
  92475. ' outTint = inTint;',
  92476. ' outTintEffect = inTintEffect;',
  92477. '}',
  92478. '',
  92479. ''
  92480. ].join('\n');
  92481. /***/ }),
  92482. /* 496 */
  92483. /***/ (function(module, exports) {
  92484. module.exports = [
  92485. '#define SHADER_NAME PHASER_TEXTURE_TINT_FS',
  92486. '',
  92487. 'precision mediump float;',
  92488. '',
  92489. 'uniform sampler2D uMainSampler;',
  92490. '',
  92491. 'varying vec2 outTexCoord;',
  92492. 'varying float outTintEffect;',
  92493. 'varying vec4 outTint;',
  92494. '',
  92495. 'void main()',
  92496. '{',
  92497. ' vec4 texel = texture2D(uMainSampler, outTexCoord);',
  92498. '',
  92499. ' if (outTintEffect == 1.0)',
  92500. ' {',
  92501. ' texel.rgb = mix(texel.rgb, outTint.rgb, texel.a);',
  92502. ' }',
  92503. ' else',
  92504. ' {',
  92505. ' texel *= vec4(outTint.rgb * outTint.a, outTint.a);',
  92506. ' }',
  92507. '',
  92508. ' gl_FragColor = texel;',
  92509. '}',
  92510. ''
  92511. ].join('\n');
  92512. /***/ }),
  92513. /* 497 */
  92514. /***/ (function(module, exports) {
  92515. module.exports = [
  92516. '#define SHADER_NAME PHASER_FORWARD_DIFFUSE_FS',
  92517. '',
  92518. 'precision mediump float;',
  92519. '',
  92520. 'struct Light',
  92521. '{',
  92522. ' vec2 position;',
  92523. ' vec3 color;',
  92524. ' float intensity;',
  92525. ' float radius;',
  92526. '};',
  92527. '',
  92528. 'const int kMaxLights = %LIGHT_COUNT%;',
  92529. '',
  92530. 'uniform vec4 uCamera; /* x, y, rotation, zoom */',
  92531. 'uniform vec2 uResolution;',
  92532. 'uniform sampler2D uMainSampler;',
  92533. 'uniform sampler2D uNormSampler;',
  92534. 'uniform vec3 uAmbientLightColor;',
  92535. 'uniform Light uLights[kMaxLights];',
  92536. '',
  92537. 'varying vec2 outTexCoord;',
  92538. 'varying vec4 outTint;',
  92539. '',
  92540. 'void main()',
  92541. '{',
  92542. ' vec3 finalColor = vec3(0.0, 0.0, 0.0);',
  92543. ' vec4 color = texture2D(uMainSampler, outTexCoord) * vec4(outTint.rgb * outTint.a, outTint.a);',
  92544. ' vec3 normalMap = texture2D(uNormSampler, outTexCoord).rgb;',
  92545. ' vec3 normal = normalize(vec3(normalMap * 2.0 - 1.0));',
  92546. ' vec2 res = vec2(min(uResolution.x, uResolution.y)) * uCamera.w;',
  92547. '',
  92548. ' for (int index = 0; index < kMaxLights; ++index)',
  92549. ' {',
  92550. ' Light light = uLights[index];',
  92551. ' vec3 lightDir = vec3((light.position.xy / res) - (gl_FragCoord.xy / res), 0.1);',
  92552. ' vec3 lightNormal = normalize(lightDir);',
  92553. ' float distToSurf = length(lightDir) * uCamera.w;',
  92554. ' float diffuseFactor = max(dot(normal, lightNormal), 0.0);',
  92555. ' float radius = (light.radius / res.x * uCamera.w) * uCamera.w;',
  92556. ' float attenuation = clamp(1.0 - distToSurf * distToSurf / (radius * radius), 0.0, 1.0);',
  92557. ' vec3 diffuse = light.color * diffuseFactor;',
  92558. ' finalColor += (attenuation * diffuse) * light.intensity;',
  92559. ' }',
  92560. '',
  92561. ' vec4 colorOutput = vec4(uAmbientLightColor + finalColor, 1.0);',
  92562. ' gl_FragColor = color * vec4(colorOutput.rgb * colorOutput.a, colorOutput.a);',
  92563. '',
  92564. '}',
  92565. ''
  92566. ].join('\n');
  92567. /***/ }),
  92568. /* 498 */
  92569. /***/ (function(module, exports) {
  92570. module.exports = [
  92571. '#define SHADER_NAME PHASER_FLAT_TINT_VS',
  92572. '',
  92573. 'precision mediump float;',
  92574. '',
  92575. 'uniform mat4 uProjectionMatrix;',
  92576. 'uniform mat4 uViewMatrix;',
  92577. 'uniform mat4 uModelMatrix;',
  92578. '',
  92579. 'attribute vec2 inPosition;',
  92580. 'attribute vec4 inTint;',
  92581. '',
  92582. 'varying vec4 outTint;',
  92583. '',
  92584. 'void main () {',
  92585. ' gl_Position = uProjectionMatrix * uViewMatrix * uModelMatrix * vec4(inPosition, 1.0, 1.0);',
  92586. ' outTint = inTint;',
  92587. '}',
  92588. ''
  92589. ].join('\n');
  92590. /***/ }),
  92591. /* 499 */
  92592. /***/ (function(module, exports) {
  92593. module.exports = [
  92594. '#define SHADER_NAME PHASER_FLAT_TINT_FS',
  92595. '',
  92596. 'precision mediump float;',
  92597. '',
  92598. 'varying vec4 outTint;',
  92599. '',
  92600. 'void main() {',
  92601. ' gl_FragColor = vec4(outTint.rgb * outTint.a, outTint.a);',
  92602. '}',
  92603. ''
  92604. ].join('\n');
  92605. /***/ }),
  92606. /* 500 */
  92607. /***/ (function(module, exports) {
  92608. module.exports = [
  92609. '#define SHADER_NAME PHASER_BITMAP_MASK_VS',
  92610. '',
  92611. 'precision mediump float;',
  92612. '',
  92613. 'attribute vec2 inPosition;',
  92614. '',
  92615. 'void main()',
  92616. '{',
  92617. ' gl_Position = vec4(inPosition, 0.0, 1.0);',
  92618. '}',
  92619. ''
  92620. ].join('\n');
  92621. /***/ }),
  92622. /* 501 */
  92623. /***/ (function(module, exports) {
  92624. module.exports = [
  92625. '#define SHADER_NAME PHASER_BITMAP_MASK_FS',
  92626. '',
  92627. 'precision mediump float;',
  92628. '',
  92629. 'uniform vec2 uResolution;',
  92630. 'uniform sampler2D uMainSampler;',
  92631. 'uniform sampler2D uMaskSampler;',
  92632. 'uniform bool uInvertMaskAlpha;',
  92633. '',
  92634. 'void main()',
  92635. '{',
  92636. ' vec2 uv = gl_FragCoord.xy / uResolution;',
  92637. ' vec4 mainColor = texture2D(uMainSampler, uv);',
  92638. ' vec4 maskColor = texture2D(uMaskSampler, uv);',
  92639. ' float alpha = mainColor.a;',
  92640. '',
  92641. ' if (!uInvertMaskAlpha)',
  92642. ' {',
  92643. ' alpha *= (maskColor.a);',
  92644. ' }',
  92645. ' else',
  92646. ' {',
  92647. ' alpha *= (1.0 - maskColor.a);',
  92648. ' }',
  92649. '',
  92650. ' gl_FragColor = vec4(mainColor.rgb * alpha, alpha);',
  92651. '}',
  92652. ''
  92653. ].join('\n');
  92654. /***/ }),
  92655. /* 502 */
  92656. /***/ (function(module, exports, __webpack_require__) {
  92657. /**
  92658. * @author Richard Davey <rich@photonstorm.com>
  92659. * @copyright 2018 Photon Storm Ltd.
  92660. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  92661. */
  92662. var CanvasInterpolation = __webpack_require__(266);
  92663. var CanvasPool = __webpack_require__(24);
  92664. var CONST = __webpack_require__(22);
  92665. var Features = __webpack_require__(120);
  92666. /**
  92667. * Called automatically by Phaser.Game and responsible for creating the renderer it will use.
  92668. *
  92669. * Relies upon two webpack global flags to be defined: `WEBGL_RENDERER` and `CANVAS_RENDERER` during build time, but not at run-time.
  92670. *
  92671. * @function Phaser.Boot.CreateRenderer
  92672. * @since 3.0.0
  92673. *
  92674. * @param {Phaser.Game} game - The Phaser.Game instance on which the renderer will be set.
  92675. */
  92676. var CreateRenderer = function (game)
  92677. {
  92678. var config = game.config;
  92679. // Game either requested Canvas,
  92680. // or requested AUTO or WEBGL but the browser doesn't support it, so fall back to Canvas
  92681. if (config.renderType !== CONST.HEADLESS)
  92682. {
  92683. if (config.renderType === CONST.CANVAS || (config.renderType !== CONST.CANVAS && !Features.webGL))
  92684. {
  92685. if (Features.canvas)
  92686. {
  92687. // They requested Canvas and their browser supports it
  92688. config.renderType = CONST.CANVAS;
  92689. }
  92690. else
  92691. {
  92692. throw new Error('Cannot create Canvas or WebGL context, aborting.');
  92693. }
  92694. }
  92695. else
  92696. {
  92697. // Game requested WebGL and browser says it supports it
  92698. config.renderType = CONST.WEBGL;
  92699. }
  92700. }
  92701. // Pixel Art mode?
  92702. if (!config.antialias)
  92703. {
  92704. CanvasPool.disableSmoothing();
  92705. }
  92706. // Does the game config provide its own canvas element to use?
  92707. if (config.canvas)
  92708. {
  92709. game.canvas = config.canvas;
  92710. }
  92711. else
  92712. {
  92713. game.canvas = CanvasPool.create(game, config.width, config.height, config.renderType);
  92714. }
  92715. // Does the game config provide some canvas css styles to use?
  92716. if (config.canvasStyle)
  92717. {
  92718. game.canvas.style = config.canvasStyle;
  92719. }
  92720. // Pixel Art mode?
  92721. if (!config.antialias)
  92722. {
  92723. CanvasInterpolation.setCrisp(game.canvas);
  92724. }
  92725. // Zoomed?
  92726. if (config.zoom !== 1)
  92727. {
  92728. game.canvas.style.width = (config.width * config.zoom).toString() + 'px';
  92729. game.canvas.style.height = (config.height * config.zoom).toString() + 'px';
  92730. }
  92731. if (config.renderType === CONST.HEADLESS)
  92732. {
  92733. // Nothing more to do here
  92734. return;
  92735. }
  92736. var CanvasRenderer;
  92737. var WebGLRenderer;
  92738. if (true)
  92739. {
  92740. CanvasRenderer = __webpack_require__(261);
  92741. WebGLRenderer = __webpack_require__(256);
  92742. // Let the config pick the renderer type, as both are included
  92743. if (config.renderType === CONST.WEBGL)
  92744. {
  92745. game.renderer = new WebGLRenderer(game);
  92746. // The WebGL Renderer sets this value during its init, not on construction
  92747. game.context = null;
  92748. }
  92749. else
  92750. {
  92751. game.renderer = new CanvasRenderer(game);
  92752. game.context = game.renderer.gameContext;
  92753. }
  92754. }
  92755. if (false)
  92756. {}
  92757. if (false)
  92758. {}
  92759. };
  92760. module.exports = CreateRenderer;
  92761. /***/ }),
  92762. /* 503 */
  92763. /***/ (function(module, exports, __webpack_require__) {
  92764. /**
  92765. * @author Richard Davey <rich@photonstorm.com>
  92766. * @copyright 2018 Photon Storm Ltd.
  92767. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  92768. */
  92769. var Class = __webpack_require__(0);
  92770. var CONST = __webpack_require__(22);
  92771. var GetFastValue = __webpack_require__(1);
  92772. var GetValue = __webpack_require__(4);
  92773. var IsPlainObject = __webpack_require__(8);
  92774. var MATH = __webpack_require__(15);
  92775. var NOOP = __webpack_require__(3);
  92776. var DefaultPlugins = __webpack_require__(121);
  92777. var ValueToColor = __webpack_require__(133);
  92778. /**
  92779. * This callback type is completely empty, a no-operation.
  92780. *
  92781. * @callback NOOP
  92782. */
  92783. /**
  92784. * @callback BootCallback
  92785. *
  92786. * @param {Phaser.Game} game - [description]
  92787. */
  92788. /**
  92789. * @typedef {object} FPSConfig
  92790. *
  92791. * @property {integer} [min=10] - [description]
  92792. * @property {integer} [target=60] - [description]
  92793. * @property {boolean} [forceSetTimeOut=false] - [description]
  92794. * @property {integer} [deltaHistory=10] - [description]
  92795. * @property {integer} [panicMax=120] - [description]
  92796. */
  92797. /**
  92798. * @typedef {object} LoaderConfig
  92799. *
  92800. * @property {string} [baseURL] - [description]
  92801. * @property {string} [path] - [description]
  92802. * @property {integer} [maxParallelDownloads=32] - [description]
  92803. * @property {(string|undefined)} [crossOrigin=undefined] - [description]
  92804. * @property {string} [responseType] - [description]
  92805. * @property {boolean} [async=true] - [description]
  92806. * @property {string} [user] - [description]
  92807. * @property {string} [password] - [description]
  92808. * @property {integer} [timeout=0] - [description]
  92809. */
  92810. /**
  92811. * @typedef {object} GameConfig
  92812. *
  92813. * @property {(integer|string)} [width=1024] - [description]
  92814. * @property {(integer|string)} [height=768] - [description]
  92815. * @property {number} [zoom=1] - [description]
  92816. * @property {number} [resolution=1] - [description]
  92817. * @property {number} [type=CONST.AUTO] - [description]
  92818. * @property {*} [parent=null] - [description]
  92819. * @property {HTMLCanvasElement} [canvas=null] - Provide your own Canvas element for Phaser to use instead of creating one.
  92820. * @property {string} [canvasStyle=null] - [description]
  92821. * @property {CanvasRenderingContext2D} [context] - Provide your own Canvas Context for Phaser to use, instead of creating one.
  92822. * @property {object} [scene=null] - [description]
  92823. * @property {string[]} [seed] - [description]
  92824. * @property {string} [title=''] - [description]
  92825. * @property {string} [url='http://phaser.io'] - [description]
  92826. * @property {string} [version=''] - [description]
  92827. * @property {boolean} [autoFocus=true] - Automatically call window.focus() when the game boots.
  92828. * @property {(boolean|object)} [input] - [description]
  92829. * @property {boolean} [input.keyboard=true] - [description]
  92830. * @property {*} [input.keyboard.target=window] - [description]
  92831. * @property {(boolean|object)} [input.mouse=true] - [description]
  92832. * @property {*} [input.mouse.target=null] - [description]
  92833. * @property {boolean} [input.touch=true] - [description]
  92834. * @property {integer} [input.activePointers=1] - [description]
  92835. * @property {*} [input.touch.target=null] - [description]
  92836. * @property {boolean} [input.touch.capture=true] - [description]
  92837. * @property {(boolean|object)} [input.gamepad=false] - [description]
  92838. * @property {boolean} [disableContextMenu=false] - [description]
  92839. * @property {(boolean|object)} [banner=false] - [description]
  92840. * @property {boolean} [banner.hidePhaser=false] - [description]
  92841. * @property {string} [banner.text='#ffffff'] - [description]
  92842. * @property {string[]} [banner.background] - [description]
  92843. * @property {FPSConfig} [fps] - [description]
  92844. * @property {boolean} [render.antialias=true] - [description]
  92845. * @property {boolean} [render.pixelArt=false] - [description]
  92846. * @property {boolean} [render.autoResize=false] - [description]
  92847. * @property {boolean} [render.roundPixels=false] - [description]
  92848. * @property {boolean} [render.transparent=false] - [description]
  92849. * @property {boolean} [render.clearBeforeRender=true] - [description]
  92850. * @property {boolean} [render.premultipliedAlpha=true] - [description]
  92851. * @property {boolean} [render.preserveDrawingBuffer=false] - [description]
  92852. * @property {boolean} [render.failIfMajorPerformanceCaveat=false] - [description]
  92853. * @property {string} [render.powerPreference='default'] - "high-performance", "low-power" or "default"
  92854. * @property {integer} [render.batchSize=2000] - The default WebGL batch size.
  92855. * @property {(string|number)} [backgroundColor=0x000000] - [description]
  92856. * @property {object} [callbacks] - [description]
  92857. * @property {BootCallback} [callbacks.preBoot=NOOP] - [description]
  92858. * @property {BootCallback} [callbacks.postBoot=NOOP] - [description]
  92859. * @property {LoaderConfig} [loader] - [description]
  92860. * @property {object} [images] - [description]
  92861. * @property {string} [images.default] - [description]
  92862. * @property {string} [images.missing] - [description]
  92863. * @property {object} [physics] - [description]
  92864. */
  92865. /**
  92866. * @classdesc
  92867. * [description]
  92868. *
  92869. * @class Config
  92870. * @memberOf Phaser.Boot
  92871. * @constructor
  92872. * @since 3.0.0
  92873. *
  92874. * @param {GameConfig} [GameConfig] - The configuration object for your Phaser Game instance.
  92875. */
  92876. var Config = new Class({
  92877. initialize:
  92878. function Config (config)
  92879. {
  92880. if (config === undefined) { config = {}; }
  92881. var defaultBannerColor = [
  92882. '#ff0000',
  92883. '#ffff00',
  92884. '#00ff00',
  92885. '#00ffff',
  92886. '#000000'
  92887. ];
  92888. var defaultBannerTextColor = '#ffffff';
  92889. /**
  92890. * @const {(integer|string)} Phaser.Boot.Config#width - [description]
  92891. */
  92892. this.width = GetValue(config, 'width', 1024);
  92893. /**
  92894. * @const {(integer|string)} Phaser.Boot.Config#height - [description]
  92895. */
  92896. this.height = GetValue(config, 'height', 768);
  92897. /**
  92898. * @const {number} Phaser.Boot.Config#zoom - [description]
  92899. */
  92900. this.zoom = GetValue(config, 'zoom', 1);
  92901. /**
  92902. * @const {number} Phaser.Boot.Config#resolution - [description]
  92903. */
  92904. this.resolution = GetValue(config, 'resolution', 1);
  92905. /**
  92906. * @const {number} Phaser.Boot.Config#renderType - [description]
  92907. */
  92908. this.renderType = GetValue(config, 'type', CONST.AUTO);
  92909. /**
  92910. * @const {?*} Phaser.Boot.Config#parent - [description]
  92911. */
  92912. this.parent = GetValue(config, 'parent', null);
  92913. /**
  92914. * @const {?HTMLCanvasElement} Phaser.Boot.Config#canvas - Force Phaser to use your own Canvas element instead of creating one.
  92915. */
  92916. this.canvas = GetValue(config, 'canvas', null);
  92917. /**
  92918. * @const {?(CanvasRenderingContext2D|WebGLRenderingContext)} Phaser.Boot.Config#context - Force Phaser to use your own Canvas context instead of creating one.
  92919. */
  92920. this.context = GetValue(config, 'context', null);
  92921. /**
  92922. * @const {?string} Phaser.Boot.Config#canvasStyle - [description]
  92923. */
  92924. this.canvasStyle = GetValue(config, 'canvasStyle', null);
  92925. /**
  92926. * @const {?object} Phaser.Boot.Config#sceneConfig - [description]
  92927. */
  92928. this.sceneConfig = GetValue(config, 'scene', null);
  92929. /**
  92930. * @const {string[]} Phaser.Boot.Config#seed - [description]
  92931. */
  92932. this.seed = GetValue(config, 'seed', [ (Date.now() * Math.random()).toString() ]);
  92933. MATH.RND.init(this.seed);
  92934. /**
  92935. * @const {string} Phaser.Boot.Config#gameTitle - [description]
  92936. */
  92937. this.gameTitle = GetValue(config, 'title', '');
  92938. /**
  92939. * @const {string} Phaser.Boot.Config#gameURL - [description]
  92940. */
  92941. this.gameURL = GetValue(config, 'url', 'https://phaser.io');
  92942. /**
  92943. * @const {string} Phaser.Boot.Config#gameVersion - [description]
  92944. */
  92945. this.gameVersion = GetValue(config, 'version', '');
  92946. /**
  92947. * @const {boolean} Phaser.Boot.Config#autoFocus - [description]
  92948. */
  92949. this.autoFocus = GetValue(config, 'autoFocus', true);
  92950. // Input
  92951. /**
  92952. * @const {boolean} Phaser.Boot.Config#inputKeyboard - [description]
  92953. */
  92954. this.inputKeyboard = GetValue(config, 'input.keyboard', true);
  92955. /**
  92956. * @const {*} Phaser.Boot.Config#inputKeyboardEventTarget - [description]
  92957. */
  92958. this.inputKeyboardEventTarget = GetValue(config, 'input.keyboard.target', window);
  92959. /**
  92960. * @const {(boolean|object)} Phaser.Boot.Config#inputMouse - [description]
  92961. */
  92962. this.inputMouse = GetValue(config, 'input.mouse', true);
  92963. /**
  92964. * @const {?*} Phaser.Boot.Config#inputMouseEventTarget - [description]
  92965. */
  92966. this.inputMouseEventTarget = GetValue(config, 'input.mouse.target', null);
  92967. /**
  92968. * @const {boolean} Phaser.Boot.Config#inputMouseCapture - [description]
  92969. */
  92970. this.inputMouseCapture = GetValue(config, 'input.mouse.capture', true);
  92971. /**
  92972. * @const {boolean} Phaser.Boot.Config#inputTouch - [description]
  92973. */
  92974. this.inputTouch = GetValue(config, 'input.touch', true);
  92975. /**
  92976. * @const {?*} Phaser.Boot.Config#inputTouchEventTarget - [description]
  92977. */
  92978. this.inputTouchEventTarget = GetValue(config, 'input.touch.target', null);
  92979. /**
  92980. * @const {boolean} Phaser.Boot.Config#inputTouchCapture - [description]
  92981. */
  92982. this.inputTouchCapture = GetValue(config, 'input.touch.capture', true);
  92983. /**
  92984. * @const {integer} Phaser.Boot.Config#inputActivePointers - [description]
  92985. */
  92986. this.inputActivePointers = GetValue(config, 'input.activePointers', 1);
  92987. /**
  92988. * @const {boolean} Phaser.Boot.Config#inputGamepad - [description]
  92989. */
  92990. this.inputGamepad = GetValue(config, 'input.gamepad', false);
  92991. /**
  92992. * @const {*} Phaser.Boot.Config#inputGamepadEventTarget - [description]
  92993. */
  92994. this.inputGamepadEventTarget = GetValue(config, 'input.gamepad.target', window);
  92995. /**
  92996. * @const {boolean} Phaser.Boot.Config#disableContextMenu - [description]
  92997. */
  92998. this.disableContextMenu = GetValue(config, 'disableContextMenu', false);
  92999. /**
  93000. * @const {any} Phaser.Boot.Config#audio - [description]
  93001. */
  93002. this.audio = GetValue(config, 'audio');
  93003. // If you do: { banner: false } it won't display any banner at all
  93004. /**
  93005. * @const {boolean} Phaser.Boot.Config#hideBanner - [description]
  93006. */
  93007. this.hideBanner = (GetValue(config, 'banner', null) === false);
  93008. /**
  93009. * @const {boolean} Phaser.Boot.Config#hidePhaser - [description]
  93010. */
  93011. this.hidePhaser = GetValue(config, 'banner.hidePhaser', false);
  93012. /**
  93013. * @const {string} Phaser.Boot.Config#bannerTextColor - [description]
  93014. */
  93015. this.bannerTextColor = GetValue(config, 'banner.text', defaultBannerTextColor);
  93016. /**
  93017. * @const {string[]} Phaser.Boot.Config#bannerBackgroundColor - [description]
  93018. */
  93019. this.bannerBackgroundColor = GetValue(config, 'banner.background', defaultBannerColor);
  93020. if (this.gameTitle === '' && this.hidePhaser)
  93021. {
  93022. this.hideBanner = true;
  93023. }
  93024. // Frame Rate config
  93025. // fps: {
  93026. // min: 10,
  93027. // target: 60,
  93028. // forceSetTimeOut: false,
  93029. // deltaHistory: 10
  93030. // }
  93031. /**
  93032. * @const {?FPSConfig} Phaser.Boot.Config#fps - [description]
  93033. */
  93034. this.fps = GetValue(config, 'fps', null);
  93035. // Renderer Settings
  93036. // These can either be in a `render` object within the Config, or specified on their own
  93037. var renderConfig = GetValue(config, 'render', config);
  93038. /**
  93039. * @const {boolean} Phaser.Boot.Config#autoResize - [description]
  93040. */
  93041. this.autoResize = GetValue(renderConfig, 'autoResize', false);
  93042. /**
  93043. * @const {boolean} Phaser.Boot.Config#antialias - [description]
  93044. */
  93045. this.antialias = GetValue(renderConfig, 'antialias', true);
  93046. /**
  93047. * @const {boolean} Phaser.Boot.Config#roundPixels - [description]
  93048. */
  93049. this.roundPixels = GetValue(renderConfig, 'roundPixels', false);
  93050. /**
  93051. * @const {boolean} Phaser.Boot.Config#pixelArt - [description]
  93052. */
  93053. this.pixelArt = GetValue(renderConfig, 'pixelArt', false);
  93054. if (this.pixelArt)
  93055. {
  93056. this.antialias = false;
  93057. this.roundPixels = true;
  93058. }
  93059. /**
  93060. * @const {boolean} Phaser.Boot.Config#transparent - [description]
  93061. */
  93062. this.transparent = GetValue(renderConfig, 'transparent', false);
  93063. /**
  93064. * @const {boolean} Phaser.Boot.Config#clearBeforeRender - [description]
  93065. */
  93066. this.clearBeforeRender = GetValue(renderConfig, 'clearBeforeRender', true);
  93067. /**
  93068. * @const {boolean} Phaser.Boot.Config#premultipliedAlpha - [description]
  93069. */
  93070. this.premultipliedAlpha = GetValue(renderConfig, 'premultipliedAlpha', true);
  93071. /**
  93072. * @const {boolean} Phaser.Boot.Config#preserveDrawingBuffer - [description]
  93073. */
  93074. this.preserveDrawingBuffer = GetValue(renderConfig, 'preserveDrawingBuffer', false);
  93075. /**
  93076. * @const {boolean} Phaser.Boot.Config#failIfMajorPerformanceCaveat - [description]
  93077. */
  93078. this.failIfMajorPerformanceCaveat = GetValue(renderConfig, 'failIfMajorPerformanceCaveat', false);
  93079. /**
  93080. * @const {string} Phaser.Boot.Config#powerPreference - [description]
  93081. */
  93082. this.powerPreference = GetValue(renderConfig, 'powerPreference', 'default');
  93083. /**
  93084. * @const {integer} Phaser.Boot.Config#batchSize - The default WebGL Batch size.
  93085. */
  93086. this.batchSize = GetValue(renderConfig, 'batchSize', 2000);
  93087. var bgc = GetValue(config, 'backgroundColor', 0);
  93088. /**
  93089. * @const {Phaser.Display.Color} Phaser.Boot.Config#backgroundColor - [description]
  93090. */
  93091. this.backgroundColor = ValueToColor(bgc);
  93092. if (bgc === 0 && this.transparent)
  93093. {
  93094. this.backgroundColor.alpha = 0;
  93095. }
  93096. // Callbacks
  93097. /**
  93098. * @const {BootCallback} Phaser.Boot.Config#preBoot - [description]
  93099. */
  93100. this.preBoot = GetValue(config, 'callbacks.preBoot', NOOP);
  93101. /**
  93102. * @const {BootCallback} Phaser.Boot.Config#postBoot - [description]
  93103. */
  93104. this.postBoot = GetValue(config, 'callbacks.postBoot', NOOP);
  93105. // Physics
  93106. // physics: {
  93107. // system: 'impact',
  93108. // setBounds: true,
  93109. // gravity: 0,
  93110. // cellSize: 64
  93111. // }
  93112. /**
  93113. * @const {object} Phaser.Boot.Config#physics - [description]
  93114. */
  93115. this.physics = GetValue(config, 'physics', {});
  93116. /**
  93117. * @const {boolean} Phaser.Boot.Config#defaultPhysicsSystem - [description]
  93118. */
  93119. this.defaultPhysicsSystem = GetValue(this.physics, 'default', false);
  93120. // Loader Defaults
  93121. /**
  93122. * @const {string} Phaser.Boot.Config#loaderBaseURL - [description]
  93123. */
  93124. this.loaderBaseURL = GetValue(config, 'loader.baseURL', '');
  93125. /**
  93126. * @const {string} Phaser.Boot.Config#loaderPath - [description]
  93127. */
  93128. this.loaderPath = GetValue(config, 'loader.path', '');
  93129. /**
  93130. * @const {integer} Phaser.Boot.Config#loaderMaxParallelDownloads - [description]
  93131. */
  93132. this.loaderMaxParallelDownloads = GetValue(config, 'loader.maxParallelDownloads', 32);
  93133. /**
  93134. * @const {(string|undefined)} Phaser.Boot.Config#loaderCrossOrigin - [description]
  93135. */
  93136. this.loaderCrossOrigin = GetValue(config, 'loader.crossOrigin', undefined);
  93137. /**
  93138. * @const {string} Phaser.Boot.Config#loaderResponseType - [description]
  93139. */
  93140. this.loaderResponseType = GetValue(config, 'loader.responseType', '');
  93141. /**
  93142. * @const {boolean} Phaser.Boot.Config#loaderAsync - [description]
  93143. */
  93144. this.loaderAsync = GetValue(config, 'loader.async', true);
  93145. /**
  93146. * @const {string} Phaser.Boot.Config#loaderUser - [description]
  93147. */
  93148. this.loaderUser = GetValue(config, 'loader.user', '');
  93149. /**
  93150. * @const {string} Phaser.Boot.Config#loaderPassword - [description]
  93151. */
  93152. this.loaderPassword = GetValue(config, 'loader.password', '');
  93153. /**
  93154. * @const {integer} Phaser.Boot.Config#loaderTimeout - [description]
  93155. */
  93156. this.loaderTimeout = GetValue(config, 'loader.timeout', 0);
  93157. // Plugins
  93158. /*
  93159. * Allows `plugins` property to either be an array, in which case it just replaces
  93160. * the default plugins like previously, or a config object.
  93161. *
  93162. * plugins: {
  93163. * global: [
  93164. * { key: 'TestPlugin', plugin: TestPlugin, start: true },
  93165. * ],
  93166. * scene: [
  93167. * { key: 'WireFramePlugin', plugin: WireFramePlugin, systemKey: 'wireFramePlugin', sceneKey: 'wireframe' }
  93168. * ],
  93169. * default: [], OR
  93170. * defaultMerge: {
  93171. * 'ModPlayer'
  93172. * }
  93173. * }
  93174. */
  93175. /**
  93176. * @const {any} Phaser.Boot.Config#installGlobalPlugins - [description]
  93177. */
  93178. this.installGlobalPlugins = [];
  93179. /**
  93180. * @const {any} Phaser.Boot.Config#installScenePlugins - [description]
  93181. */
  93182. this.installScenePlugins = [];
  93183. var plugins = GetValue(config, 'plugins', null);
  93184. var defaultPlugins = DefaultPlugins.DefaultScene;
  93185. if (plugins)
  93186. {
  93187. // Old 3.7 array format?
  93188. if (Array.isArray(plugins))
  93189. {
  93190. this.defaultPlugins = plugins;
  93191. }
  93192. else if (IsPlainObject(plugins))
  93193. {
  93194. this.installGlobalPlugins = GetFastValue(plugins, 'global', []);
  93195. this.installScenePlugins = GetFastValue(plugins, 'scene', []);
  93196. if (Array.isArray(plugins.default))
  93197. {
  93198. defaultPlugins = plugins.default;
  93199. }
  93200. else if (Array.isArray(plugins.defaultMerge))
  93201. {
  93202. defaultPlugins = defaultPlugins.concat(plugins.defaultMerge);
  93203. }
  93204. }
  93205. }
  93206. /**
  93207. * @const {any} Phaser.Boot.Config#defaultPlugins - The plugins installed into every Scene (in addition to CoreScene and Global).
  93208. */
  93209. this.defaultPlugins = defaultPlugins;
  93210. // Default / Missing Images
  93211. var pngPrefix = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAg';
  93212. /**
  93213. * @const {string} Phaser.Boot.Config#defaultImage - [description]
  93214. */
  93215. this.defaultImage = GetValue(config, 'images.default', pngPrefix + 'AQMAAABJtOi3AAAAA1BMVEX///+nxBvIAAAAAXRSTlMAQObYZgAAABVJREFUeF7NwIEAAAAAgKD9qdeocAMAoAABm3DkcAAAAABJRU5ErkJggg==');
  93216. /**
  93217. * @const {string} Phaser.Boot.Config#missingImage - [description]
  93218. */
  93219. this.missingImage = GetValue(config, 'images.missing', pngPrefix + 'CAIAAAD8GO2jAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJ9JREFUeNq01ssOwyAMRFG46v//Mt1ESmgh+DFmE2GPOBARKb2NVjo+17PXLD8a1+pl5+A+wSgFygymWYHBb0FtsKhJDdZlncG2IzJ4ayoMDv20wTmSMzClEgbWYNTAkQ0Z+OJ+A/eWnAaR9+oxCF4Os0H8htsMUp+pwcgBBiMNnAwF8GqIgL2hAzaGFFgZauDPKABmowZ4GL369/0rwACp2yA/ttmvsQAAAABJRU5ErkJggg==');
  93220. }
  93221. });
  93222. module.exports = Config;
  93223. /***/ }),
  93224. /* 504 */
  93225. /***/ (function(module, exports, __webpack_require__) {
  93226. /**
  93227. * @author Richard Davey <rich@photonstorm.com>
  93228. * @copyright 2018 Photon Storm Ltd.
  93229. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  93230. */
  93231. var AddToDOM = __webpack_require__(131);
  93232. var AnimationManager = __webpack_require__(212);
  93233. var CacheManager = __webpack_require__(210);
  93234. var CanvasPool = __webpack_require__(24);
  93235. var Class = __webpack_require__(0);
  93236. var Config = __webpack_require__(503);
  93237. var CreateRenderer = __webpack_require__(502);
  93238. var DataManager = __webpack_require__(81);
  93239. var DebugHeader = __webpack_require__(494);
  93240. var Device = __webpack_require__(493);
  93241. var DOMContentLoaded = __webpack_require__(265);
  93242. var EventEmitter = __webpack_require__(9);
  93243. var InputManager = __webpack_require__(206);
  93244. var PluginManager = __webpack_require__(201);
  93245. var SceneManager = __webpack_require__(199);
  93246. var SoundManagerCreator = __webpack_require__(196);
  93247. var TextureManager = __webpack_require__(189);
  93248. var TimeStep = __webpack_require__(476);
  93249. var VisibilityHandler = __webpack_require__(475);
  93250. /**
  93251. * @classdesc
  93252. * The Phaser.Game instance is the main controller for the entire Phaser game. It is responsible
  93253. * for handling the boot process, parsing the configuration values, creating the renderer,
  93254. * and setting-up all of the global Phaser systems, such as sound and input.
  93255. * Once that is complete it will start the Scene Manager and then begin the main game loop.
  93256. *
  93257. * You should generally avoid accessing any of the systems created by Game, and instead use those
  93258. * made available to you via the Phaser.Scene Systems class instead.
  93259. *
  93260. * @class Game
  93261. * @memberOf Phaser
  93262. * @constructor
  93263. * @since 3.0.0
  93264. *
  93265. * @param {GameConfig} [GameConfig] - The configuration object for your Phaser Game instance.
  93266. */
  93267. var Game = new Class({
  93268. initialize:
  93269. function Game (config)
  93270. {
  93271. /**
  93272. * The parsed Game Configuration object.
  93273. *
  93274. * The values stored within this object are read-only and should not be changed at run-time.
  93275. *
  93276. * @name Phaser.Game#config
  93277. * @type {Phaser.Boot.Config}
  93278. * @readOnly
  93279. * @since 3.0.0
  93280. */
  93281. this.config = new Config(config);
  93282. /**
  93283. * A reference to either the Canvas or WebGL Renderer that this Game is using.
  93284. *
  93285. * @name Phaser.Game#renderer
  93286. * @type {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)}
  93287. * @since 3.0.0
  93288. */
  93289. this.renderer = null;
  93290. /**
  93291. * A reference to the HTML Canvas Element that Phaser uses to render the game.
  93292. * This is created automatically by Phaser unless you provide a `canvas` property
  93293. * in your Game Config.
  93294. *
  93295. * @name Phaser.Game#canvas
  93296. * @type {HTMLCanvasElement}
  93297. * @since 3.0.0
  93298. */
  93299. this.canvas = null;
  93300. /**
  93301. * A reference to the Rendering Context belonging to the Canvas Element this game is rendering to.
  93302. * If the game is running under Canvas it will be a 2d Canvas Rendering Context.
  93303. * If the game is running under WebGL it will be a WebGL Rendering Context.
  93304. * This context is created automatically by Phaser unless you provide a `context` property
  93305. * in your Game Config.
  93306. *
  93307. * @name Phaser.Game#context
  93308. * @type {(CanvasRenderingContext2D|WebGLRenderingContext)}
  93309. * @since 3.0.0
  93310. */
  93311. this.context = null;
  93312. /**
  93313. * A flag indicating when this Game instance has finished its boot process.
  93314. *
  93315. * @name Phaser.Game#isBooted
  93316. * @type {boolean}
  93317. * @readOnly
  93318. * @since 3.0.0
  93319. */
  93320. this.isBooted = false;
  93321. /**
  93322. * A flag indicating if this Game is currently running its game step or not.
  93323. *
  93324. * @name Phaser.Game#isRunning
  93325. * @type {boolean}
  93326. * @readOnly
  93327. * @since 3.0.0
  93328. */
  93329. this.isRunning = false;
  93330. /**
  93331. * An Event Emitter which is used to broadcast game-level events from the global systems.
  93332. *
  93333. * @name Phaser.Game#events
  93334. * @type {Phaser.Events.EventEmitter}
  93335. * @since 3.0.0
  93336. */
  93337. this.events = new EventEmitter();
  93338. /**
  93339. * An instance of the Animation Manager.
  93340. *
  93341. * The Animation Manager is a global system responsible for managing all animations used within your game.
  93342. *
  93343. * @name Phaser.Game#anims
  93344. * @type {Phaser.Animations.AnimationManager}
  93345. * @since 3.0.0
  93346. */
  93347. this.anims = new AnimationManager(this);
  93348. /**
  93349. * An instance of the Texture Manager.
  93350. *
  93351. * The Texture Manager is a global system responsible for managing all textures being used by your game.
  93352. *
  93353. * @name Phaser.Game#textures
  93354. * @type {Phaser.Textures.TextureManager}
  93355. * @since 3.0.0
  93356. */
  93357. this.textures = new TextureManager(this);
  93358. /**
  93359. * An instance of the Cache Manager.
  93360. *
  93361. * The Cache Manager is a global system responsible for caching, accessing and releasing external game assets.
  93362. *
  93363. * @name Phaser.Game#cache
  93364. * @type {Phaser.Cache.CacheManager}
  93365. * @since 3.0.0
  93366. */
  93367. this.cache = new CacheManager(this);
  93368. /**
  93369. * An instance of the Data Manager
  93370. *
  93371. * @name Phaser.Game#registry
  93372. * @type {Phaser.Data.DataManager}
  93373. * @since 3.0.0
  93374. */
  93375. this.registry = new DataManager(this);
  93376. /**
  93377. * An instance of the Input Manager.
  93378. *
  93379. * The Input Manager is a global system responsible for the capture of browser-level input events.
  93380. *
  93381. * @name Phaser.Game#input
  93382. * @type {Phaser.Input.InputManager}
  93383. * @since 3.0.0
  93384. */
  93385. this.input = new InputManager(this, this.config);
  93386. /**
  93387. * An instance of the Scene Manager.
  93388. *
  93389. * The Scene Manager is a global system responsible for creating, modifying and updating the Scenes in your game.
  93390. *
  93391. * @name Phaser.Game#scene
  93392. * @type {Phaser.Scenes.SceneManager}
  93393. * @since 3.0.0
  93394. */
  93395. this.scene = new SceneManager(this, this.config.sceneConfig);
  93396. /**
  93397. * A reference to the Device inspector.
  93398. *
  93399. * Contains information about the device running this game, such as OS, browser vendor and feature support.
  93400. * Used by various systems to determine capabilities and code paths.
  93401. *
  93402. * @name Phaser.Game#device
  93403. * @type {Phaser.DeviceConf}
  93404. * @since 3.0.0
  93405. */
  93406. this.device = Device;
  93407. /**
  93408. * An instance of the base Sound Manager.
  93409. *
  93410. * The Sound Manager is a global system responsible for the playback and updating of all audio in your game.
  93411. *
  93412. * @name Phaser.Game#sound
  93413. * @type {Phaser.Sound.BaseSoundManager}
  93414. * @since 3.0.0
  93415. */
  93416. this.sound = SoundManagerCreator.create(this);
  93417. /**
  93418. * An instance of the Time Step.
  93419. *
  93420. * The Time Step is a global system responsible for setting-up and responding to the browser frame events, processing
  93421. * them and calculating delta values. It then automatically calls the game step.
  93422. *
  93423. * @name Phaser.Game#loop
  93424. * @type {Phaser.Boot.TimeStep}
  93425. * @since 3.0.0
  93426. */
  93427. this.loop = new TimeStep(this, this.config.fps);
  93428. /**
  93429. * An instance of the Plugin Manager.
  93430. *
  93431. * The Plugin Manager is a global system that allows plugins to register themselves with it, and can then install
  93432. * those plugins into Scenes as required.
  93433. *
  93434. * @name Phaser.Game#plugins
  93435. * @type {Phaser.Plugins.PluginManager}
  93436. * @since 3.0.0
  93437. */
  93438. this.plugins = new PluginManager(this, this.config);
  93439. /**
  93440. * Is this Game pending destruction at the start of the next frame?
  93441. *
  93442. * @name Phaser.Game#pendingDestroy
  93443. * @type {boolean}
  93444. * @private
  93445. * @since 3.5.0
  93446. */
  93447. this.pendingDestroy = false;
  93448. /**
  93449. * Remove the Canvas once the destroy is over?
  93450. *
  93451. * @name Phaser.Game#removeCanvas
  93452. * @type {boolean}
  93453. * @private
  93454. * @since 3.5.0
  93455. */
  93456. this.removeCanvas = false;
  93457. /**
  93458. * Does the window the game is running in currently have focus or not?
  93459. * This is modified by the VisibilityHandler.
  93460. *
  93461. * @name Phaser.Game#hasFocus
  93462. * @type {boolean}
  93463. * @readOnly
  93464. * @since 3.9.0
  93465. */
  93466. this.hasFocus = false;
  93467. /**
  93468. * Is the mouse pointer currently over the game canvas or not?
  93469. * This is modified by the VisibilityHandler.
  93470. *
  93471. * @name Phaser.Game#isOver
  93472. * @type {boolean}
  93473. * @readOnly
  93474. * @since 3.10.0
  93475. */
  93476. this.isOver = true;
  93477. // Wait for the DOM Ready event, then call boot.
  93478. DOMContentLoaded(this.boot.bind(this));
  93479. },
  93480. /**
  93481. * Game boot event.
  93482. *
  93483. * This is an internal event dispatched when the game has finished booting, but before it is ready to start running.
  93484. * The global systems use this event to know when to set themselves up, dispatching their own `ready` events as required.
  93485. *
  93486. * @event Phaser.Game#boot
  93487. */
  93488. /**
  93489. * This method is called automatically when the DOM is ready. It is responsible for creating the renderer,
  93490. * displaying the Debug Header, adding the game canvas to the DOM and emitting the 'boot' event.
  93491. * It listens for a 'ready' event from the base systems and once received it will call `Game.start`.
  93492. *
  93493. * @method Phaser.Game#boot
  93494. * @protected
  93495. * @fires Phaser.Game#boot
  93496. * @since 3.0.0
  93497. */
  93498. boot: function ()
  93499. {
  93500. this.isBooted = true;
  93501. this.config.preBoot(this);
  93502. CreateRenderer(this);
  93503. DebugHeader(this);
  93504. AddToDOM(this.canvas, this.config.parent);
  93505. this.events.emit('boot');
  93506. // The Texture Manager has to wait on a couple of non-blocking events before it's fully ready, so it will emit this event
  93507. this.events.once('ready', this.start, this);
  93508. },
  93509. /**
  93510. * Called automatically by Game.boot once all of the global systems have finished setting themselves up.
  93511. * By this point the Game is now ready to start the main loop running.
  93512. * It will also enable the Visibility Handler.
  93513. *
  93514. * @method Phaser.Game#start
  93515. * @protected
  93516. * @since 3.0.0
  93517. */
  93518. start: function ()
  93519. {
  93520. this.isRunning = true;
  93521. this.config.postBoot(this);
  93522. if (this.renderer)
  93523. {
  93524. this.loop.start(this.step.bind(this));
  93525. }
  93526. else
  93527. {
  93528. this.loop.start(this.headlessStep.bind(this));
  93529. }
  93530. VisibilityHandler(this);
  93531. var eventEmitter = this.events;
  93532. eventEmitter.on('hidden', this.onHidden, this);
  93533. eventEmitter.on('visible', this.onVisible, this);
  93534. eventEmitter.on('blur', this.onBlur, this);
  93535. eventEmitter.on('focus', this.onFocus, this);
  93536. },
  93537. /**
  93538. * Game Pre-Step event.
  93539. *
  93540. * This event is dispatched before the main Step starts.
  93541. * By this point none of the Scene updates have happened.
  93542. * Hook into it from plugins or systems that need to update before the Scene Manager does.
  93543. *
  93544. * @event Phaser.Game#prestepEvent
  93545. * @param {number} time - [description]
  93546. * @param {number} delta - [description]
  93547. */
  93548. /**
  93549. * Game Step event.
  93550. *
  93551. * This event is dispatched after Pre-Step and before the Scene Manager steps.
  93552. * Hook into it from plugins or systems that need to update before the Scene Manager does, but after core Systems.
  93553. *
  93554. * @event Phaser.Game#stepEvent
  93555. * @param {number} time - [description]
  93556. * @param {number} delta - [description]
  93557. */
  93558. /**
  93559. * Game Post-Step event.
  93560. *
  93561. * This event is dispatched after the Scene Manager has updated.
  93562. * Hook into it from plugins or systems that need to do things before the render starts.
  93563. *
  93564. * @event Phaser.Game#poststepEvent
  93565. * @param {number} time - [description]
  93566. * @param {number} delta - [description]
  93567. */
  93568. /**
  93569. * Game Pre-Render event.
  93570. *
  93571. * This event is dispatched immediately before any of the Scenes have started to render.
  93572. * The renderer will already have been initialized this frame, clearing itself and preparing to receive
  93573. * the Scenes for rendering, but it won't have actually drawn anything yet.
  93574. *
  93575. * @event Phaser.Game#prerenderEvent
  93576. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - A reference to the current renderer.
  93577. */
  93578. /**
  93579. * Game Post-Render event.
  93580. *
  93581. * This event is dispatched right at the end of the render process.
  93582. * Every Scene will have rendered and drawn to the canvas.
  93583. *
  93584. * @event Phaser.Game#postrenderEvent
  93585. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - A reference to the current renderer.
  93586. */
  93587. /**
  93588. * The main Game Step. Called automatically by the Time Step, once per browser frame (typically as a result of
  93589. * Request Animation Frame, or Set Timeout on very old browsers.)
  93590. *
  93591. * The step will update the global managers first, then proceed to update each Scene in turn, via the Scene Manager.
  93592. *
  93593. * It will then render each Scene in turn, via the Renderer. This process emits `prerender` and `postrender` events.
  93594. *
  93595. * @method Phaser.Game#step
  93596. * @fires Phaser.Game#prestepEvent
  93597. * @fires Phaser.Game#stepEvent
  93598. * @fires Phaser.Game#poststepEvent
  93599. * @fires Phaser.Game#prerenderEvent
  93600. * @fires Phaser.Game#postrenderEvent
  93601. * @since 3.0.0
  93602. *
  93603. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  93604. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  93605. */
  93606. step: function (time, delta)
  93607. {
  93608. if (this.pendingDestroy)
  93609. {
  93610. return this.runDestroy();
  93611. }
  93612. var eventEmitter = this.events;
  93613. // Global Managers like Input and Sound update in the prestep
  93614. eventEmitter.emit('prestep', time, delta);
  93615. // This is mostly meant for user-land code and plugins
  93616. eventEmitter.emit('step', time, delta);
  93617. // Update the Scene Manager and all active Scenes
  93618. this.scene.update(time, delta);
  93619. // Our final event before rendering starts
  93620. eventEmitter.emit('poststep', time, delta);
  93621. var renderer = this.renderer;
  93622. // Run the Pre-render (clearing the canvas, setting background colors, etc)
  93623. renderer.preRender();
  93624. eventEmitter.emit('prerender', renderer, time, delta);
  93625. // The main render loop. Iterates all Scenes and all Cameras in those scenes, rendering to the renderer instance.
  93626. this.scene.render(renderer);
  93627. // The Post-Render call. Tidies up loose end, takes snapshots, etc.
  93628. renderer.postRender();
  93629. // The final event before the step repeats. Your last chance to do anything to the canvas before it all starts again.
  93630. eventEmitter.emit('postrender', renderer, time, delta);
  93631. },
  93632. /**
  93633. * A special version of the Game Step for the HEADLESS renderer only.
  93634. *
  93635. * The main Game Step. Called automatically by the Time Step, once per browser frame (typically as a result of
  93636. * Request Animation Frame, or Set Timeout on very old browsers.)
  93637. *
  93638. * The step will update the global managers first, then proceed to update each Scene in turn, via the Scene Manager.
  93639. *
  93640. * This process emits `prerender` and `postrender` events, even though nothing actually displays.
  93641. *
  93642. * @method Phaser.Game#headlessStep
  93643. * @fires Phaser.Game#prerenderEvent
  93644. * @fires Phaser.Game#postrenderEvent
  93645. * @since 3.2.0
  93646. *
  93647. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  93648. * @param {number} delta - The delta time elapsed since the last frame.
  93649. */
  93650. headlessStep: function (time, delta)
  93651. {
  93652. var eventEmitter = this.events;
  93653. // Global Managers
  93654. eventEmitter.emit('prestep', time, delta);
  93655. eventEmitter.emit('step', time, delta);
  93656. // Scenes
  93657. this.scene.update(time, delta);
  93658. eventEmitter.emit('poststep', time, delta);
  93659. // Render
  93660. eventEmitter.emit('prerender');
  93661. eventEmitter.emit('postrender');
  93662. },
  93663. /**
  93664. * Game Pause event.
  93665. *
  93666. * This event is dispatched when the game loop enters a paused state, usually as a result of the Visibility Handler.
  93667. *
  93668. * @event Phaser.Game#pauseEvent
  93669. */
  93670. /**
  93671. * Called automatically by the Visibility Handler.
  93672. * This will pause the main loop and then emit a pause event.
  93673. *
  93674. * @method Phaser.Game#onHidden
  93675. * @protected
  93676. * @fires Phaser.Game#pauseEvent
  93677. * @since 3.0.0
  93678. */
  93679. onHidden: function ()
  93680. {
  93681. this.loop.pause();
  93682. this.events.emit('pause');
  93683. },
  93684. /**
  93685. * Game Resume event.
  93686. *
  93687. * This event is dispatched when the game loop leaves a paused state and resumes running.
  93688. *
  93689. * @event Phaser.Game#resumeEvent
  93690. */
  93691. /**
  93692. * Called automatically by the Visibility Handler.
  93693. * This will resume the main loop and then emit a resume event.
  93694. *
  93695. * @method Phaser.Game#onVisible
  93696. * @protected
  93697. * @fires Phaser.Game#resumeEvent
  93698. * @since 3.0.0
  93699. */
  93700. onVisible: function ()
  93701. {
  93702. this.loop.resume();
  93703. this.events.emit('resume');
  93704. },
  93705. /**
  93706. * Called automatically by the Visibility Handler.
  93707. * This will set the main loop into a 'blurred' state, which pauses it.
  93708. *
  93709. * @method Phaser.Game#onBlur
  93710. * @protected
  93711. * @since 3.0.0
  93712. */
  93713. onBlur: function ()
  93714. {
  93715. this.hasFocus = false;
  93716. this.loop.blur();
  93717. },
  93718. /**
  93719. * Called automatically by the Visibility Handler.
  93720. * This will set the main loop into a 'focused' state, which resumes it.
  93721. *
  93722. * @method Phaser.Game#onFocus
  93723. * @protected
  93724. * @since 3.0.0
  93725. */
  93726. onFocus: function ()
  93727. {
  93728. this.hasFocus = true;
  93729. this.loop.focus();
  93730. },
  93731. /**
  93732. * Game Resize event.
  93733. *
  93734. * @event Phaser.Game#resizeEvent
  93735. * @param {number} width - The new width of the Game.
  93736. * @param {number} height - The new height of the Game.
  93737. */
  93738. /**
  93739. * Updates the Game Config with the new width and height values given.
  93740. * Then resizes the Renderer and Input Manager scale.
  93741. *
  93742. * @method Phaser.Game#resize
  93743. * @since 3.2.0
  93744. *
  93745. * @param {number} width - The new width of the game.
  93746. * @param {number} height - The new height of the game.
  93747. */
  93748. resize: function (width, height)
  93749. {
  93750. this.config.width = width;
  93751. this.config.height = height;
  93752. this.renderer.resize(width, height);
  93753. this.input.resize();
  93754. this.scene.resize(width, height);
  93755. this.events.emit('resize', width, height);
  93756. },
  93757. /**
  93758. * Flags this Game instance as needing to be destroyed on the next frame.
  93759. * It will wait until the current frame has completed and then call `runDestroy` internally.
  93760. *
  93761. * @method Phaser.Game#destroy
  93762. * @since 3.0.0
  93763. *
  93764. * @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.
  93765. */
  93766. destroy: function (removeCanvas)
  93767. {
  93768. this.pendingDestroy = true;
  93769. this.removeCanvas = removeCanvas;
  93770. },
  93771. /**
  93772. * Destroys this Phaser.Game instance, all global systems, all sub-systems and all Scenes.
  93773. *
  93774. * @method Phaser.Game#runDestroy
  93775. * @private
  93776. * @since 3.5.0
  93777. */
  93778. runDestroy: function ()
  93779. {
  93780. this.events.emit('destroy');
  93781. this.events.removeAllListeners();
  93782. this.scene.destroy();
  93783. if (this.renderer)
  93784. {
  93785. this.renderer.destroy();
  93786. }
  93787. if (this.removeCanvas && this.canvas)
  93788. {
  93789. CanvasPool.remove(this.canvas);
  93790. if (this.canvas.parentNode)
  93791. {
  93792. this.canvas.parentNode.removeChild(this.canvas);
  93793. }
  93794. }
  93795. this.loop.destroy();
  93796. this.pendingDestroy = false;
  93797. }
  93798. });
  93799. module.exports = Game;
  93800. /***/ }),
  93801. /* 505 */
  93802. /***/ (function(module, exports, __webpack_require__) {
  93803. /**
  93804. * @author Richard Davey <rich@photonstorm.com>
  93805. * @copyright 2018 Photon Storm Ltd.
  93806. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  93807. */
  93808. var Class = __webpack_require__(0);
  93809. var EE = __webpack_require__(9);
  93810. var PluginCache = __webpack_require__(12);
  93811. /**
  93812. * @classdesc
  93813. * EventEmitter is a Scene Systems plugin compatible version of eventemitter3.
  93814. *
  93815. * @class EventEmitter
  93816. * @memberOf Phaser.Events
  93817. * @constructor
  93818. * @since 3.0.0
  93819. */
  93820. var EventEmitter = new Class({
  93821. Extends: EE,
  93822. initialize:
  93823. function EventEmitter ()
  93824. {
  93825. EE.call(this);
  93826. },
  93827. /**
  93828. * Removes all listeners.
  93829. *
  93830. * @method Phaser.Events.EventEmitter#shutdown
  93831. * @since 3.0.0
  93832. */
  93833. shutdown: function ()
  93834. {
  93835. this.removeAllListeners();
  93836. },
  93837. /**
  93838. * Removes all listeners.
  93839. *
  93840. * @method Phaser.Events.EventEmitter#destroy
  93841. * @since 3.0.0
  93842. */
  93843. destroy: function ()
  93844. {
  93845. this.removeAllListeners();
  93846. }
  93847. });
  93848. /**
  93849. * Return an array listing the events for which the emitter has registered listeners.
  93850. *
  93851. * @method Phaser.Events.EventEmitter#eventNames
  93852. * @since 3.0.0
  93853. *
  93854. * @return {array}
  93855. */
  93856. /**
  93857. * Return the listeners registered for a given event.
  93858. *
  93859. * @method Phaser.Events.EventEmitter#listeners
  93860. * @since 3.0.0
  93861. *
  93862. * @param {(string|symbol)} event - The event name.
  93863. *
  93864. * @return {array} The registered listeners.
  93865. */
  93866. /**
  93867. * Return the number of listeners listening to a given event.
  93868. *
  93869. * @method Phaser.Events.EventEmitter#listenerCount
  93870. * @since 3.0.0
  93871. *
  93872. * @param {(string|symbol)} event - The event name.
  93873. *
  93874. * @return {number} The number of listeners.
  93875. */
  93876. /**
  93877. * Calls each of the listeners registered for a given event.
  93878. *
  93879. * @method Phaser.Events.EventEmitter#emit
  93880. * @since 3.0.0
  93881. *
  93882. * @param {(string|symbol)} event - The event name.
  93883. * @param {...*} [args] - Additional arguments that will be passed to the event handler.
  93884. *
  93885. * @return {boolean} `true` if the event had listeners, else `false`.
  93886. */
  93887. /**
  93888. * Add a listener for a given event.
  93889. *
  93890. * @method Phaser.Events.EventEmitter#on
  93891. * @since 3.0.0
  93892. *
  93893. * @param {(string|symbol)} event - The event name.
  93894. * @param {function} fn - The listener function.
  93895. * @param {*} [context=this] - The context to invoke the listener with.
  93896. *
  93897. * @return {Phaser.Events.EventEmitter} `this`.
  93898. */
  93899. /**
  93900. * Add a listener for a given event.
  93901. *
  93902. * @method Phaser.Events.EventEmitter#addListener
  93903. * @since 3.0.0
  93904. *
  93905. * @param {(string|symbol)} event - The event name.
  93906. * @param {function} fn - The listener function.
  93907. * @param {*} [context=this] - The context to invoke the listener with.
  93908. *
  93909. * @return {Phaser.Events.EventEmitter} `this`.
  93910. */
  93911. /**
  93912. * Add a one-time listener for a given event.
  93913. *
  93914. * @method Phaser.Events.EventEmitter#once
  93915. * @since 3.0.0
  93916. *
  93917. * @param {(string|symbol)} event - The event name.
  93918. * @param {function} fn - The listener function.
  93919. * @param {*} [context=this] - The context to invoke the listener with.
  93920. *
  93921. * @return {Phaser.Events.EventEmitter} `this`.
  93922. */
  93923. /**
  93924. * Remove the listeners of a given event.
  93925. *
  93926. * @method Phaser.Events.EventEmitter#removeListener
  93927. * @since 3.0.0
  93928. *
  93929. * @param {(string|symbol)} event - The event name.
  93930. * @param {function} fn - Only remove the listeners that match this function.
  93931. * @param {*} context - Only remove the listeners that have this context.
  93932. * @param {boolean} once - Only remove one-time listeners.
  93933. *
  93934. * @return {Phaser.Events.EventEmitter} `this`.
  93935. */
  93936. /**
  93937. * Remove the listeners of a given event.
  93938. *
  93939. * @method Phaser.Events.EventEmitter#off
  93940. * @since 3.0.0
  93941. *
  93942. * @param {(string|symbol)} event - The event name.
  93943. * @param {function} fn - Only remove the listeners that match this function.
  93944. * @param {*} context - Only remove the listeners that have this context.
  93945. * @param {boolean} once - Only remove one-time listeners.
  93946. *
  93947. * @return {Phaser.Events.EventEmitter} `this`.
  93948. */
  93949. /**
  93950. * Remove all listeners, or those of the specified event.
  93951. *
  93952. * @method Phaser.Events.EventEmitter#removeAllListeners
  93953. * @since 3.0.0
  93954. *
  93955. * @param {(string|symbol)} [event] - The event name.
  93956. *
  93957. * @return {Phaser.Events.EventEmitter} `this`.
  93958. */
  93959. PluginCache.register('EventEmitter', EventEmitter, 'events');
  93960. module.exports = EventEmitter;
  93961. /***/ }),
  93962. /* 506 */
  93963. /***/ (function(module, exports, __webpack_require__) {
  93964. /**
  93965. * @author Richard Davey <rich@photonstorm.com>
  93966. * @copyright 2018 Photon Storm Ltd.
  93967. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  93968. */
  93969. /**
  93970. * @namespace Phaser.Events
  93971. */
  93972. module.exports = { EventEmitter: __webpack_require__(505) };
  93973. /***/ }),
  93974. /* 507 */
  93975. /***/ (function(module, exports) {
  93976. // shim for using process in browser
  93977. var process = module.exports = {};
  93978. // cached from whatever global is present so that test runners that stub it
  93979. // don't break things. But we need to wrap it in a try catch in case it is
  93980. // wrapped in strict mode code which doesn't define any globals. It's inside a
  93981. // function because try/catches deoptimize in certain engines.
  93982. var cachedSetTimeout;
  93983. var cachedClearTimeout;
  93984. function defaultSetTimout() {
  93985. throw new Error('setTimeout has not been defined');
  93986. }
  93987. function defaultClearTimeout () {
  93988. throw new Error('clearTimeout has not been defined');
  93989. }
  93990. (function () {
  93991. try {
  93992. if (typeof setTimeout === 'function') {
  93993. cachedSetTimeout = setTimeout;
  93994. } else {
  93995. cachedSetTimeout = defaultSetTimout;
  93996. }
  93997. } catch (e) {
  93998. cachedSetTimeout = defaultSetTimout;
  93999. }
  94000. try {
  94001. if (typeof clearTimeout === 'function') {
  94002. cachedClearTimeout = clearTimeout;
  94003. } else {
  94004. cachedClearTimeout = defaultClearTimeout;
  94005. }
  94006. } catch (e) {
  94007. cachedClearTimeout = defaultClearTimeout;
  94008. }
  94009. } ())
  94010. function runTimeout(fun) {
  94011. if (cachedSetTimeout === setTimeout) {
  94012. //normal enviroments in sane situations
  94013. return setTimeout(fun, 0);
  94014. }
  94015. // if setTimeout wasn't available but was latter defined
  94016. if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
  94017. cachedSetTimeout = setTimeout;
  94018. return setTimeout(fun, 0);
  94019. }
  94020. try {
  94021. // when when somebody has screwed with setTimeout but no I.E. maddness
  94022. return cachedSetTimeout(fun, 0);
  94023. } catch(e){
  94024. try {
  94025. // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
  94026. return cachedSetTimeout.call(null, fun, 0);
  94027. } catch(e){
  94028. // 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
  94029. return cachedSetTimeout.call(this, fun, 0);
  94030. }
  94031. }
  94032. }
  94033. function runClearTimeout(marker) {
  94034. if (cachedClearTimeout === clearTimeout) {
  94035. //normal enviroments in sane situations
  94036. return clearTimeout(marker);
  94037. }
  94038. // if clearTimeout wasn't available but was latter defined
  94039. if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
  94040. cachedClearTimeout = clearTimeout;
  94041. return clearTimeout(marker);
  94042. }
  94043. try {
  94044. // when when somebody has screwed with setTimeout but no I.E. maddness
  94045. return cachedClearTimeout(marker);
  94046. } catch (e){
  94047. try {
  94048. // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
  94049. return cachedClearTimeout.call(null, marker);
  94050. } catch (e){
  94051. // 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.
  94052. // Some versions of I.E. have different rules for clearTimeout vs setTimeout
  94053. return cachedClearTimeout.call(this, marker);
  94054. }
  94055. }
  94056. }
  94057. var queue = [];
  94058. var draining = false;
  94059. var currentQueue;
  94060. var queueIndex = -1;
  94061. function cleanUpNextTick() {
  94062. if (!draining || !currentQueue) {
  94063. return;
  94064. }
  94065. draining = false;
  94066. if (currentQueue.length) {
  94067. queue = currentQueue.concat(queue);
  94068. } else {
  94069. queueIndex = -1;
  94070. }
  94071. if (queue.length) {
  94072. drainQueue();
  94073. }
  94074. }
  94075. function drainQueue() {
  94076. if (draining) {
  94077. return;
  94078. }
  94079. var timeout = runTimeout(cleanUpNextTick);
  94080. draining = true;
  94081. var len = queue.length;
  94082. while(len) {
  94083. currentQueue = queue;
  94084. queue = [];
  94085. while (++queueIndex < len) {
  94086. if (currentQueue) {
  94087. currentQueue[queueIndex].run();
  94088. }
  94089. }
  94090. queueIndex = -1;
  94091. len = queue.length;
  94092. }
  94093. currentQueue = null;
  94094. draining = false;
  94095. runClearTimeout(timeout);
  94096. }
  94097. process.nextTick = function (fun) {
  94098. var args = new Array(arguments.length - 1);
  94099. if (arguments.length > 1) {
  94100. for (var i = 1; i < arguments.length; i++) {
  94101. args[i - 1] = arguments[i];
  94102. }
  94103. }
  94104. queue.push(new Item(fun, args));
  94105. if (queue.length === 1 && !draining) {
  94106. runTimeout(drainQueue);
  94107. }
  94108. };
  94109. // v8 likes predictible objects
  94110. function Item(fun, array) {
  94111. this.fun = fun;
  94112. this.array = array;
  94113. }
  94114. Item.prototype.run = function () {
  94115. this.fun.apply(null, this.array);
  94116. };
  94117. process.title = 'browser';
  94118. process.browser = true;
  94119. process.env = {};
  94120. process.argv = [];
  94121. process.version = ''; // empty string to avoid regexp issues
  94122. process.versions = {};
  94123. function noop() {}
  94124. process.on = noop;
  94125. process.addListener = noop;
  94126. process.once = noop;
  94127. process.off = noop;
  94128. process.removeListener = noop;
  94129. process.removeAllListeners = noop;
  94130. process.emit = noop;
  94131. process.prependListener = noop;
  94132. process.prependOnceListener = noop;
  94133. process.listeners = function (name) { return [] }
  94134. process.binding = function (name) {
  94135. throw new Error('process.binding is not supported');
  94136. };
  94137. process.cwd = function () { return '/' };
  94138. process.chdir = function (dir) {
  94139. throw new Error('process.chdir is not supported');
  94140. };
  94141. process.umask = function() { return 0; };
  94142. /***/ }),
  94143. /* 508 */
  94144. /***/ (function(module, exports, __webpack_require__) {
  94145. /**
  94146. * @author Richard Davey <rich@photonstorm.com>
  94147. * @copyright 2018 Photon Storm Ltd.
  94148. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94149. */
  94150. /**
  94151. * @namespace Phaser.Display.Masks
  94152. */
  94153. module.exports = {
  94154. BitmapMask: __webpack_require__(219),
  94155. GeometryMask: __webpack_require__(218)
  94156. };
  94157. /***/ }),
  94158. /* 509 */
  94159. /***/ (function(module, exports, __webpack_require__) {
  94160. /**
  94161. * @author Richard Davey <rich@photonstorm.com>
  94162. * @copyright 2018 Photon Storm Ltd.
  94163. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94164. */
  94165. var GetColor = __webpack_require__(155);
  94166. /**
  94167. * Converts an HSV (hue, saturation and value) color value to RGB.
  94168. * Conversion formula from http://en.wikipedia.org/wiki/HSL_color_space.
  94169. * Assumes HSV values are contained in the set [0, 1].
  94170. * Based on code by Michael Jackson (https://github.com/mjijackson)
  94171. *
  94172. * @function Phaser.Display.Color.HSVToRGB
  94173. * @since 3.0.0
  94174. *
  94175. * @param {number} h - The hue, in the range 0 - 1.
  94176. * @param {number} s - The saturation, in the range 0 - 1.
  94177. * @param {number} v - The value, in the range 0 - 1.
  94178. *
  94179. * @return {ColorObject} An object with the red, green and blue values set in the r, g and b properties.
  94180. */
  94181. var HSVToRGB = function (h, s, v)
  94182. {
  94183. if (s === undefined) { s = 1; }
  94184. if (v === undefined) { v = 1; }
  94185. var i = Math.floor(h * 6);
  94186. var f = h * 6 - i;
  94187. var p = Math.floor((v * (1 - s)) * 255);
  94188. var q = Math.floor((v * (1 - f * s)) * 255);
  94189. var t = Math.floor((v * (1 - (1 - f) * s)) * 255);
  94190. v = Math.floor(v *= 255);
  94191. var output = { r: v, g: v, b: v, color: 0 };
  94192. var r = i % 6;
  94193. if (r === 0)
  94194. {
  94195. output.g = t;
  94196. output.b = p;
  94197. }
  94198. else if (r === 1)
  94199. {
  94200. output.r = q;
  94201. output.b = p;
  94202. }
  94203. else if (r === 2)
  94204. {
  94205. output.r = p;
  94206. output.b = t;
  94207. }
  94208. else if (r === 3)
  94209. {
  94210. output.r = p;
  94211. output.g = q;
  94212. }
  94213. else if (r === 4)
  94214. {
  94215. output.r = t;
  94216. output.g = p;
  94217. }
  94218. else if (r === 5)
  94219. {
  94220. output.g = p;
  94221. output.b = q;
  94222. }
  94223. output.color = GetColor(output.r, output.g, output.b);
  94224. return output;
  94225. };
  94226. module.exports = HSVToRGB;
  94227. /***/ }),
  94228. /* 510 */
  94229. /***/ (function(module, exports) {
  94230. /**
  94231. * @author Richard Davey <rich@photonstorm.com>
  94232. * @copyright 2018 Photon Storm Ltd.
  94233. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94234. */
  94235. /**
  94236. * Converts a hue to an RGB color.
  94237. * Based on code by Michael Jackson (https://github.com/mjijackson)
  94238. *
  94239. * @function Phaser.Display.Color.HueToComponent
  94240. * @since 3.0.0
  94241. *
  94242. * @param {number} p
  94243. * @param {number} q
  94244. * @param {number} t
  94245. *
  94246. * @return {number} The combined color value.
  94247. */
  94248. var HueToComponent = function (p, q, t)
  94249. {
  94250. if (t < 0)
  94251. {
  94252. t += 1;
  94253. }
  94254. if (t > 1)
  94255. {
  94256. t -= 1;
  94257. }
  94258. if (t < 1 / 6)
  94259. {
  94260. return p + (q - p) * 6 * t;
  94261. }
  94262. if (t < 1 / 2)
  94263. {
  94264. return q;
  94265. }
  94266. if (t < 2 / 3)
  94267. {
  94268. return p + (q - p) * (2 / 3 - t) * 6;
  94269. }
  94270. return p;
  94271. };
  94272. module.exports = HueToComponent;
  94273. /***/ }),
  94274. /* 511 */
  94275. /***/ (function(module, exports) {
  94276. /**
  94277. * @author Richard Davey <rich@photonstorm.com>
  94278. * @copyright 2018 Photon Storm Ltd.
  94279. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94280. */
  94281. /**
  94282. * Returns a string containing a hex representation of the given color component.
  94283. *
  94284. * @function Phaser.Display.Color.ComponentToHex
  94285. * @since 3.0.0
  94286. *
  94287. * @param {integer} color - The color channel to get the hex value for, must be a value between 0 and 255.
  94288. *
  94289. * @return {string} A string of length 2 characters, i.e. 255 = ff, 100 = 64.
  94290. */
  94291. var ComponentToHex = function (color)
  94292. {
  94293. var hex = color.toString(16);
  94294. return (hex.length === 1) ? '0' + hex : hex;
  94295. };
  94296. module.exports = ComponentToHex;
  94297. /***/ }),
  94298. /* 512 */
  94299. /***/ (function(module, exports, __webpack_require__) {
  94300. /**
  94301. * @author Richard Davey <rich@photonstorm.com>
  94302. * @copyright 2018 Photon Storm Ltd.
  94303. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94304. */
  94305. /**
  94306. * @typedef {object} InputColorObject
  94307. *
  94308. * @property {number} [r] - The red color value in the range 0 to 255.
  94309. * @property {number} [g] - The green color value in the range 0 to 255.
  94310. * @property {number} [b] - The blue color value in the range 0 to 255.
  94311. * @property {number} [a] - The alpha color value in the range 0 to 255.
  94312. */
  94313. /**
  94314. * @typedef {Object} ColorObject
  94315. * @property {number} r - The red color value in the range 0 to 255.
  94316. * @property {number} g - The green color value in the range 0 to 255.
  94317. * @property {number} b - The blue color value in the range 0 to 255.
  94318. * @property {number} a - The alpha color value in the range 0 to 255.
  94319. */
  94320. var Color = __webpack_require__(30);
  94321. Color.ColorToRGBA = __webpack_require__(927);
  94322. Color.ComponentToHex = __webpack_require__(511);
  94323. Color.GetColor = __webpack_require__(155);
  94324. Color.GetColor32 = __webpack_require__(278);
  94325. Color.HexStringToColor = __webpack_require__(279);
  94326. Color.HSLToColor = __webpack_require__(926);
  94327. Color.HSVColorWheel = __webpack_require__(925);
  94328. Color.HSVToRGB = __webpack_require__(509);
  94329. Color.HueToComponent = __webpack_require__(510);
  94330. Color.IntegerToColor = __webpack_require__(277);
  94331. Color.IntegerToRGB = __webpack_require__(276);
  94332. Color.Interpolate = __webpack_require__(924);
  94333. Color.ObjectToColor = __webpack_require__(275);
  94334. Color.RandomRGB = __webpack_require__(923);
  94335. Color.RGBStringToColor = __webpack_require__(274);
  94336. Color.RGBToHSV = __webpack_require__(922);
  94337. Color.RGBToString = __webpack_require__(921);
  94338. Color.ValueToColor = __webpack_require__(133);
  94339. module.exports = Color;
  94340. /***/ }),
  94341. /* 513 */
  94342. /***/ (function(module, exports, __webpack_require__) {
  94343. /**
  94344. * @author Richard Davey <rich@photonstorm.com>
  94345. * @copyright 2018 Photon Storm Ltd.
  94346. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94347. */
  94348. var Class = __webpack_require__(0);
  94349. var DataManager = __webpack_require__(81);
  94350. var PluginCache = __webpack_require__(12);
  94351. /**
  94352. * @classdesc
  94353. * The Data Component features a means to store pieces of data specific to a Game Object, System or Plugin.
  94354. * You can then search, query it, and retrieve the data. The parent must either extend EventEmitter,
  94355. * or have a property called `events` that is an instance of it.
  94356. *
  94357. * @class DataManagerPlugin
  94358. * @extends Phaser.Data.DataManager
  94359. * @memberOf Phaser.Data
  94360. * @constructor
  94361. * @since 3.0.0
  94362. *
  94363. * @param {Phaser.Scene} scene - A reference to the Scene that this DataManager belongs to.
  94364. */
  94365. var DataManagerPlugin = new Class({
  94366. Extends: DataManager,
  94367. initialize:
  94368. function DataManagerPlugin (scene)
  94369. {
  94370. DataManager.call(this, scene, scene.sys.events);
  94371. /**
  94372. * A reference to the Scene that this DataManager belongs to.
  94373. *
  94374. * @name Phaser.Data.DataManagerPlugin#scene
  94375. * @type {Phaser.Scene}
  94376. * @since 3.0.0
  94377. */
  94378. this.scene = scene;
  94379. /**
  94380. * A reference to the Scene's Systems.
  94381. *
  94382. * @name Phaser.Data.DataManagerPlugin#systems
  94383. * @type {Phaser.Scenes.Systems}
  94384. * @since 3.0.0
  94385. */
  94386. this.systems = scene.sys;
  94387. scene.sys.events.once('boot', this.boot, this);
  94388. scene.sys.events.on('start', this.start, this);
  94389. },
  94390. /**
  94391. * This method is called automatically, only once, when the Scene is first created.
  94392. * Do not invoke it directly.
  94393. *
  94394. * @method Phaser.Data.DataManagerPlugin#boot
  94395. * @private
  94396. * @since 3.5.1
  94397. */
  94398. boot: function ()
  94399. {
  94400. this.events = this.systems.events;
  94401. this.events.once('destroy', this.destroy, this);
  94402. },
  94403. /**
  94404. * This method is called automatically by the Scene when it is starting up.
  94405. * It is responsible for creating local systems, properties and listening for Scene events.
  94406. * Do not invoke it directly.
  94407. *
  94408. * @method Phaser.Data.DataManagerPlugin#start
  94409. * @private
  94410. * @since 3.5.0
  94411. */
  94412. start: function ()
  94413. {
  94414. this.events.once('shutdown', this.shutdown, this);
  94415. },
  94416. /**
  94417. * The Scene that owns this plugin is shutting down.
  94418. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  94419. *
  94420. * @method Phaser.Data.DataManagerPlugin#shutdown
  94421. * @private
  94422. * @since 3.5.0
  94423. */
  94424. shutdown: function ()
  94425. {
  94426. this.systems.events.off('shutdown', this.shutdown, this);
  94427. },
  94428. /**
  94429. * The Scene that owns this plugin is being destroyed.
  94430. * We need to shutdown and then kill off all external references.
  94431. *
  94432. * @method Phaser.Data.DataManagerPlugin#destroy
  94433. * @since 3.5.0
  94434. */
  94435. destroy: function ()
  94436. {
  94437. DataManager.prototype.destroy.call(this);
  94438. this.events.off('start', this.start, this);
  94439. this.scene = null;
  94440. this.systems = null;
  94441. }
  94442. });
  94443. PluginCache.register('DataManagerPlugin', DataManagerPlugin, 'data');
  94444. module.exports = DataManagerPlugin;
  94445. /***/ }),
  94446. /* 514 */
  94447. /***/ (function(module, exports, __webpack_require__) {
  94448. /**
  94449. * @author Richard Davey <rich@photonstorm.com>
  94450. * @copyright 2018 Photon Storm Ltd.
  94451. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94452. */
  94453. /**
  94454. * @namespace Phaser.Data
  94455. */
  94456. module.exports = {
  94457. DataManager: __webpack_require__(81),
  94458. DataManagerPlugin: __webpack_require__(513)
  94459. };
  94460. /***/ }),
  94461. /* 515 */
  94462. /***/ (function(module, exports, __webpack_require__) {
  94463. /**
  94464. * @author Richard Davey <rich@photonstorm.com>
  94465. * @copyright 2018 Photon Storm Ltd.
  94466. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94467. */
  94468. // Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
  94469. var CatmullRom = __webpack_require__(267);
  94470. var Class = __webpack_require__(0);
  94471. var Curve = __webpack_require__(86);
  94472. var Vector2 = __webpack_require__(6);
  94473. /**
  94474. * @classdesc
  94475. * [description]
  94476. *
  94477. * @class Spline
  94478. * @extends Phaser.Curves.Curve
  94479. * @memberOf Phaser.Curves
  94480. * @constructor
  94481. * @since 3.0.0
  94482. *
  94483. * @param {Phaser.Math.Vector2[]} [points] - [description]
  94484. */
  94485. var SplineCurve = new Class({
  94486. Extends: Curve,
  94487. initialize:
  94488. function SplineCurve (points)
  94489. {
  94490. if (points === undefined) { points = []; }
  94491. Curve.call(this, 'SplineCurve');
  94492. /**
  94493. * [description]
  94494. *
  94495. * @name Phaser.Curves.Spline#points
  94496. * @type {Phaser.Math.Vector2[]}
  94497. * @default []
  94498. * @since 3.0.0
  94499. */
  94500. this.points = [];
  94501. this.addPoints(points);
  94502. },
  94503. /**
  94504. * [description]
  94505. *
  94506. * @method Phaser.Curves.Spline#addPoints
  94507. * @since 3.0.0
  94508. *
  94509. * @param {(Phaser.Math.Vector2[]|number[]|number[][])} points - [description]
  94510. *
  94511. * @return {Phaser.Curves.Spline} This curve object.
  94512. */
  94513. addPoints: function (points)
  94514. {
  94515. for (var i = 0; i < points.length; i++)
  94516. {
  94517. var p = new Vector2();
  94518. if (typeof points[i] === 'number')
  94519. {
  94520. p.x = points[i];
  94521. p.y = points[i + 1];
  94522. i++;
  94523. }
  94524. else if (Array.isArray(points[i]))
  94525. {
  94526. // An array of arrays?
  94527. p.x = points[i][0];
  94528. p.y = points[i][1];
  94529. }
  94530. else
  94531. {
  94532. p.x = points[i].x;
  94533. p.y = points[i].y;
  94534. }
  94535. this.points.push(p);
  94536. }
  94537. return this;
  94538. },
  94539. /**
  94540. * [description]
  94541. *
  94542. * @method Phaser.Curves.Spline#addPoint
  94543. * @since 3.0.0
  94544. *
  94545. * @param {number} x - [description]
  94546. * @param {number} y - [description]
  94547. *
  94548. * @return {Phaser.Math.Vector2} [description]
  94549. */
  94550. addPoint: function (x, y)
  94551. {
  94552. var vec = new Vector2(x, y);
  94553. this.points.push(vec);
  94554. return vec;
  94555. },
  94556. /**
  94557. * Gets the starting point on the curve.
  94558. *
  94559. * @method Phaser.Curves.Spline#getStartPoint
  94560. * @since 3.0.0
  94561. *
  94562. * @generic {Phaser.Math.Vector2} O - [out,$return]
  94563. *
  94564. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  94565. *
  94566. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  94567. */
  94568. getStartPoint: function (out)
  94569. {
  94570. if (out === undefined) { out = new Vector2(); }
  94571. return out.copy(this.points[0]);
  94572. },
  94573. /**
  94574. * [description]
  94575. *
  94576. * @method Phaser.Curves.Spline#getResolution
  94577. * @since 3.0.0
  94578. *
  94579. * @param {number} divisions - [description]
  94580. *
  94581. * @return {number} [description]
  94582. */
  94583. getResolution: function (divisions)
  94584. {
  94585. return divisions * this.points.length;
  94586. },
  94587. /**
  94588. * Get point at relative position in curve according to length.
  94589. *
  94590. * @method Phaser.Curves.Spline#getPoint
  94591. * @since 3.0.0
  94592. *
  94593. * @generic {Phaser.Math.Vector2} O - [out,$return]
  94594. *
  94595. * @param {number} t - The position along the curve to return. Where 0 is the start and 1 is the end.
  94596. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  94597. *
  94598. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  94599. */
  94600. getPoint: function (t, out)
  94601. {
  94602. if (out === undefined) { out = new Vector2(); }
  94603. var points = this.points;
  94604. var point = (points.length - 1) * t;
  94605. var intPoint = Math.floor(point);
  94606. var weight = point - intPoint;
  94607. var p0 = points[(intPoint === 0) ? intPoint : intPoint - 1];
  94608. var p1 = points[intPoint];
  94609. var p2 = points[(intPoint > points.length - 2) ? points.length - 1 : intPoint + 1];
  94610. var p3 = points[(intPoint > points.length - 3) ? points.length - 1 : intPoint + 2];
  94611. return out.set(CatmullRom(weight, p0.x, p1.x, p2.x, p3.x), CatmullRom(weight, p0.y, p1.y, p2.y, p3.y));
  94612. },
  94613. /**
  94614. * [description]
  94615. *
  94616. * @method Phaser.Curves.Spline#toJSON
  94617. * @since 3.0.0
  94618. *
  94619. * @return {JSONCurve} The JSON object containing this curve data.
  94620. */
  94621. toJSON: function ()
  94622. {
  94623. var points = [];
  94624. for (var i = 0; i < this.points.length; i++)
  94625. {
  94626. points.push(this.points[i].x);
  94627. points.push(this.points[i].y);
  94628. }
  94629. return {
  94630. type: this.type,
  94631. points: points
  94632. };
  94633. }
  94634. });
  94635. /**
  94636. * [description]
  94637. *
  94638. * @function Phaser.Curves.Spline.fromJSON
  94639. * @since 3.0.0
  94640. *
  94641. * @param {JSONCurve} data - The JSON object containing this curve data.
  94642. *
  94643. * @return {Phaser.Curves.Spline} [description]
  94644. */
  94645. SplineCurve.fromJSON = function (data)
  94646. {
  94647. return new SplineCurve(data.points);
  94648. };
  94649. module.exports = SplineCurve;
  94650. /***/ }),
  94651. /* 516 */
  94652. /***/ (function(module, exports) {
  94653. /**
  94654. * @author Richard Davey <rich@photonstorm.com>
  94655. * @copyright 2018 Photon Storm Ltd.
  94656. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94657. */
  94658. function P0 (t, p)
  94659. {
  94660. var k = 1 - t;
  94661. return k * k * p;
  94662. }
  94663. function P1 (t, p)
  94664. {
  94665. return 2 * (1 - t) * t * p;
  94666. }
  94667. function P2 (t, p)
  94668. {
  94669. return t * t * p;
  94670. }
  94671. // p0 = start point
  94672. // p1 = control point 1
  94673. // p2 = end point
  94674. // https://github.com/mrdoob/three.js/blob/master/src/extras/core/Interpolations.js
  94675. /**
  94676. * A quadratic bezier interpolation method.
  94677. *
  94678. * @function Phaser.Math.Interpolation.QuadraticBezier
  94679. * @since 3.2.0
  94680. *
  94681. * @param {number} t - The percentage of interpolation, between 0 and 1.
  94682. * @param {number} p0 - The start point.
  94683. * @param {number} p1 - The control point.
  94684. * @param {number} p2 - The end point.
  94685. *
  94686. * @return {number} The interpolated value.
  94687. */
  94688. var QuadraticBezierInterpolation = function (t, p0, p1, p2)
  94689. {
  94690. return P0(t, p0) + P1(t, p1) + P2(t, p2);
  94691. };
  94692. module.exports = QuadraticBezierInterpolation;
  94693. /***/ }),
  94694. /* 517 */
  94695. /***/ (function(module, exports, __webpack_require__) {
  94696. /**
  94697. * @author Richard Davey <rich@photonstorm.com>
  94698. * @copyright 2018 Photon Storm Ltd.
  94699. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94700. */
  94701. var Class = __webpack_require__(0);
  94702. var Curve = __webpack_require__(86);
  94703. var QuadraticBezierInterpolation = __webpack_require__(516);
  94704. var Vector2 = __webpack_require__(6);
  94705. /**
  94706. * @classdesc
  94707. * [description]
  94708. *
  94709. * @class QuadraticBezier
  94710. * @extends Phaser.Curves.Curve
  94711. * @memberOf Phaser.Curves
  94712. * @constructor
  94713. * @since 3.2.0
  94714. *
  94715. * @param {(Phaser.Math.Vector2|number[])} p0 - Start point, or an array of point pairs.
  94716. * @param {Phaser.Math.Vector2} p1 - Control Point 1.
  94717. * @param {Phaser.Math.Vector2} p2 - Control Point 2.
  94718. */
  94719. var QuadraticBezier = new Class({
  94720. Extends: Curve,
  94721. initialize:
  94722. function QuadraticBezier (p0, p1, p2)
  94723. {
  94724. Curve.call(this, 'QuadraticBezier');
  94725. if (Array.isArray(p0))
  94726. {
  94727. p2 = new Vector2(p0[4], p0[5]);
  94728. p1 = new Vector2(p0[2], p0[3]);
  94729. p0 = new Vector2(p0[0], p0[1]);
  94730. }
  94731. /**
  94732. * [description]
  94733. *
  94734. * @name Phaser.Curves.QuadraticBezier#p0
  94735. * @type {Phaser.Math.Vector2}
  94736. * @since 3.2.0
  94737. */
  94738. this.p0 = p0;
  94739. /**
  94740. * [description]
  94741. *
  94742. * @name Phaser.Curves.QuadraticBezier#p1
  94743. * @type {Phaser.Math.Vector2}
  94744. * @since 3.2.0
  94745. */
  94746. this.p1 = p1;
  94747. /**
  94748. * [description]
  94749. *
  94750. * @name Phaser.Curves.QuadraticBezier#p2
  94751. * @type {Phaser.Math.Vector2}
  94752. * @since 3.2.0
  94753. */
  94754. this.p2 = p2;
  94755. },
  94756. /**
  94757. * Gets the starting point on the curve.
  94758. *
  94759. * @method Phaser.Curves.QuadraticBezier#getStartPoint
  94760. * @since 3.2.0
  94761. *
  94762. * @generic {Phaser.Math.Vector2} O - [out,$return]
  94763. *
  94764. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  94765. *
  94766. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  94767. */
  94768. getStartPoint: function (out)
  94769. {
  94770. if (out === undefined) { out = new Vector2(); }
  94771. return out.copy(this.p0);
  94772. },
  94773. /**
  94774. * [description]
  94775. *
  94776. * @method Phaser.Curves.QuadraticBezier#getResolution
  94777. * @since 3.2.0
  94778. *
  94779. * @param {number} divisions - [description]
  94780. *
  94781. * @return {number} [description]
  94782. */
  94783. getResolution: function (divisions)
  94784. {
  94785. return divisions;
  94786. },
  94787. /**
  94788. * Get point at relative position in curve according to length.
  94789. *
  94790. * @method Phaser.Curves.QuadraticBezier#getPoint
  94791. * @since 3.2.0
  94792. *
  94793. * @generic {Phaser.Math.Vector2} O - [out,$return]
  94794. *
  94795. * @param {number} t - The position along the curve to return. Where 0 is the start and 1 is the end.
  94796. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  94797. *
  94798. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  94799. */
  94800. getPoint: function (t, out)
  94801. {
  94802. if (out === undefined) { out = new Vector2(); }
  94803. var p0 = this.p0;
  94804. var p1 = this.p1;
  94805. var p2 = this.p2;
  94806. return out.set(
  94807. QuadraticBezierInterpolation(t, p0.x, p1.x, p2.x),
  94808. QuadraticBezierInterpolation(t, p0.y, p1.y, p2.y)
  94809. );
  94810. },
  94811. /**
  94812. * [description]
  94813. *
  94814. * @method Phaser.Curves.QuadraticBezier#draw
  94815. * @since 3.2.0
  94816. *
  94817. * @generic {Phaser.GameObjects.Graphics} G - [graphics,$return]
  94818. *
  94819. * @param {Phaser.GameObjects.Graphics} graphics - [description]
  94820. * @param {integer} [pointsTotal=32] - [description]
  94821. *
  94822. * @return {Phaser.GameObjects.Graphics} [description]
  94823. */
  94824. draw: function (graphics, pointsTotal)
  94825. {
  94826. if (pointsTotal === undefined) { pointsTotal = 32; }
  94827. var points = this.getPoints(pointsTotal);
  94828. graphics.beginPath();
  94829. graphics.moveTo(this.p0.x, this.p0.y);
  94830. for (var i = 1; i < points.length; i++)
  94831. {
  94832. graphics.lineTo(points[i].x, points[i].y);
  94833. }
  94834. graphics.strokePath();
  94835. // So you can chain graphics calls
  94836. return graphics;
  94837. },
  94838. /**
  94839. * [description]
  94840. *
  94841. * @method Phaser.Curves.QuadraticBezier#toJSON
  94842. * @since 3.2.0
  94843. *
  94844. * @return {JSONCurve} The JSON object containing this curve data.
  94845. */
  94846. toJSON: function ()
  94847. {
  94848. return {
  94849. type: this.type,
  94850. points: [
  94851. this.p0.x, this.p0.y,
  94852. this.p1.x, this.p1.y,
  94853. this.p2.x, this.p2.y
  94854. ]
  94855. };
  94856. }
  94857. });
  94858. /**
  94859. * [description]
  94860. *
  94861. * @function Phaser.Curves.QuadraticBezier.fromJSON
  94862. * @since 3.2.0
  94863. *
  94864. * @param {JSONCurve} data - The JSON object containing this curve data.
  94865. *
  94866. * @return {Phaser.Curves.QuadraticBezier} [description]
  94867. */
  94868. QuadraticBezier.fromJSON = function (data)
  94869. {
  94870. var points = data.points;
  94871. var p0 = new Vector2(points[0], points[1]);
  94872. var p1 = new Vector2(points[2], points[3]);
  94873. var p2 = new Vector2(points[4], points[5]);
  94874. return new QuadraticBezier(p0, p1, p2);
  94875. };
  94876. module.exports = QuadraticBezier;
  94877. /***/ }),
  94878. /* 518 */
  94879. /***/ (function(module, exports, __webpack_require__) {
  94880. /**
  94881. * @author Richard Davey <rich@photonstorm.com>
  94882. * @copyright 2018 Photon Storm Ltd.
  94883. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  94884. */
  94885. // Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
  94886. var Class = __webpack_require__(0);
  94887. var Curve = __webpack_require__(86);
  94888. var FromPoints = __webpack_require__(268);
  94889. var Rectangle = __webpack_require__(13);
  94890. var Vector2 = __webpack_require__(6);
  94891. var tmpVec2 = new Vector2();
  94892. /**
  94893. * @classdesc
  94894. * [description]
  94895. *
  94896. * @class Line
  94897. * @extends Phaser.Curves.Curve
  94898. * @memberOf Phaser.Curves
  94899. * @constructor
  94900. * @since 3.0.0
  94901. *
  94902. * @param {(Phaser.Math.Vector2|number[])} p0 - [description]
  94903. * @param {Phaser.Math.Vector2} [p1] - [description]
  94904. */
  94905. var LineCurve = new Class({
  94906. Extends: Curve,
  94907. initialize:
  94908. // vec2s or array
  94909. function LineCurve (p0, p1)
  94910. {
  94911. Curve.call(this, 'LineCurve');
  94912. if (Array.isArray(p0))
  94913. {
  94914. p1 = new Vector2(p0[2], p0[3]);
  94915. p0 = new Vector2(p0[0], p0[1]);
  94916. }
  94917. /**
  94918. * [description]
  94919. *
  94920. * @name Phaser.Curves.Line#p0
  94921. * @type {Phaser.Math.Vector2}
  94922. * @since 3.0.0
  94923. */
  94924. this.p0 = p0;
  94925. /**
  94926. * [description]
  94927. *
  94928. * @name Phaser.Curves.Line#p1
  94929. * @type {Phaser.Math.Vector2}
  94930. * @since 3.0.0
  94931. */
  94932. this.p1 = p1;
  94933. },
  94934. /**
  94935. * Returns a Rectangle where the position and dimensions match the bounds of this Curve.
  94936. *
  94937. * @method Phaser.Curves.Line#getBounds
  94938. * @since 3.0.0
  94939. *
  94940. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  94941. *
  94942. * @param {Phaser.Geom.Rectangle} [out] - A Rectangle object to store the bounds in. If not given a new Rectangle will be created.
  94943. *
  94944. * @return {Phaser.Geom.Rectangle} A Rectangle object holding the bounds of this curve. If `out` was given it will be this object.
  94945. */
  94946. getBounds: function (out)
  94947. {
  94948. if (out === undefined) { out = new Rectangle(); }
  94949. return FromPoints([ this.p0, this.p1 ], out);
  94950. },
  94951. /**
  94952. * Gets the starting point on the curve.
  94953. *
  94954. * @method Phaser.Curves.Line#getStartPoint
  94955. * @since 3.0.0
  94956. *
  94957. * @generic {Phaser.Math.Vector2} O - [out,$return]
  94958. *
  94959. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  94960. *
  94961. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  94962. */
  94963. getStartPoint: function (out)
  94964. {
  94965. if (out === undefined) { out = new Vector2(); }
  94966. return out.copy(this.p0);
  94967. },
  94968. /**
  94969. * [description]
  94970. *
  94971. * @method Phaser.Curves.Line#getResolution
  94972. * @since 3.0.0
  94973. *
  94974. * @param {number} [divisions=1] - [description]
  94975. *
  94976. * @return {number} [description]
  94977. */
  94978. getResolution: function (divisions)
  94979. {
  94980. if (divisions === undefined) { divisions = 1; }
  94981. return divisions;
  94982. },
  94983. /**
  94984. * Get point at relative position in curve according to length.
  94985. *
  94986. * @method Phaser.Curves.Line#getPoint
  94987. * @since 3.0.0
  94988. *
  94989. * @generic {Phaser.Math.Vector2} O - [out,$return]
  94990. *
  94991. * @param {number} t - The position along the curve to return. Where 0 is the start and 1 is the end.
  94992. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  94993. *
  94994. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  94995. */
  94996. getPoint: function (t, out)
  94997. {
  94998. if (out === undefined) { out = new Vector2(); }
  94999. if (t === 1)
  95000. {
  95001. return out.copy(this.p1);
  95002. }
  95003. out.copy(this.p1).subtract(this.p0).scale(t).add(this.p0);
  95004. return out;
  95005. },
  95006. // Line curve is linear, so we can overwrite default getPointAt
  95007. /**
  95008. * [description]
  95009. *
  95010. * @method Phaser.Curves.Line#getPointAt
  95011. * @since 3.0.0
  95012. *
  95013. * @generic {Phaser.Math.Vector2} O - [out,$return]
  95014. *
  95015. * @param {number} u - The position along the curve to return. Where 0 is the start and 1 is the end.
  95016. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  95017. *
  95018. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  95019. */
  95020. getPointAt: function (u, out)
  95021. {
  95022. return this.getPoint(u, out);
  95023. },
  95024. /**
  95025. * [description]
  95026. *
  95027. * @method Phaser.Curves.Line#getTangent
  95028. * @since 3.0.0
  95029. *
  95030. * @generic {Phaser.Math.Vector2} O - [out,$return]
  95031. *
  95032. * @return {Phaser.Math.Vector2} [description]
  95033. */
  95034. getTangent: function ()
  95035. {
  95036. var tangent = tmpVec2.copy(this.p1).subtract(this.p0);
  95037. return tangent.normalize();
  95038. },
  95039. // Override default Curve.draw because this is better than calling getPoints on a line!
  95040. /**
  95041. * Draws this curve on the given Graphics object.
  95042. *
  95043. * The curve is drawn using `Graphics.lineBetween` so will be drawn at whatever the present Graphics line color is.
  95044. * The Graphics object is not cleared before the draw, so the curve will appear on-top of anything else already rendered to it.
  95045. *
  95046. * @method Phaser.Curves.Line#draw
  95047. * @since 3.0.0
  95048. *
  95049. * @generic {Phaser.GameObjects.Graphics} G - [graphics,$return]
  95050. *
  95051. * @param {Phaser.GameObjects.Graphics} graphics - The Graphics instance onto which this curve will be drawn.
  95052. *
  95053. * @return {Phaser.GameObjects.Graphics} The Graphics object to which the curve was drawn.
  95054. */
  95055. draw: function (graphics)
  95056. {
  95057. graphics.lineBetween(this.p0.x, this.p0.y, this.p1.x, this.p1.y);
  95058. // So you can chain graphics calls
  95059. return graphics;
  95060. },
  95061. /**
  95062. * [description]
  95063. *
  95064. * @method Phaser.Curves.Line#toJSON
  95065. * @since 3.0.0
  95066. *
  95067. * @return {JSONCurve} The JSON object containing this curve data.
  95068. */
  95069. toJSON: function ()
  95070. {
  95071. return {
  95072. type: this.type,
  95073. points: [
  95074. this.p0.x, this.p0.y,
  95075. this.p1.x, this.p1.y
  95076. ]
  95077. };
  95078. }
  95079. });
  95080. /**
  95081. * [description]
  95082. *
  95083. * @function Phaser.Curves.Line.fromJSON
  95084. * @since 3.0.0
  95085. *
  95086. * @param {JSONCurve} data - The JSON object containing this curve data.
  95087. *
  95088. * @return {Phaser.Curves.Line} [description]
  95089. */
  95090. LineCurve.fromJSON = function (data)
  95091. {
  95092. var points = data.points;
  95093. var p0 = new Vector2(points[0], points[1]);
  95094. var p1 = new Vector2(points[2], points[3]);
  95095. return new LineCurve(p0, p1);
  95096. };
  95097. module.exports = LineCurve;
  95098. /***/ }),
  95099. /* 519 */
  95100. /***/ (function(module, exports, __webpack_require__) {
  95101. /**
  95102. * @author Richard Davey <rich@photonstorm.com>
  95103. * @copyright 2018 Photon Storm Ltd.
  95104. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95105. */
  95106. // Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
  95107. var Class = __webpack_require__(0);
  95108. var Curve = __webpack_require__(86);
  95109. var DegToRad = __webpack_require__(39);
  95110. var GetValue = __webpack_require__(4);
  95111. var RadToDeg = __webpack_require__(153);
  95112. var Vector2 = __webpack_require__(6);
  95113. /**
  95114. * @typedef {object} JSONEllipseCurve
  95115. *
  95116. * @property {string} type - The of the curve.
  95117. * @property {number} x - [description]
  95118. * @property {number} y - [description]
  95119. * @property {number} xRadius - The horizontal radius of ellipse.
  95120. * @property {number} yRadius - The vertical radius of ellipse.
  95121. * @property {integer} startAngle - The start angle of ellipse.
  95122. * @property {integer} endAngle - The end angle of ellipse.
  95123. * @property {boolean} clockwise - The clockwise of ellipse.
  95124. * @property {integer} rotation - The rotation of ellipse.
  95125. */
  95126. /**
  95127. * @typedef {object} EllipseCurveConfig
  95128. *
  95129. * @property {number} [x=0] - [description]
  95130. * @property {number} [y=0] - [description]
  95131. * @property {number} [xRadius=0] - [description]
  95132. * @property {number} [yRadius=0] - [description]
  95133. * @property {integer} [startAngle=0] - [description]
  95134. * @property {integer} [endAngle=360] - [description]
  95135. * @property {boolean} [clockwise=false] - [description]
  95136. * @property {integer} [rotation=0] - [description]
  95137. */
  95138. /**
  95139. * @classdesc
  95140. * [description]
  95141. *
  95142. * @class Ellipse
  95143. * @extends Phaser.Curves.Curve
  95144. * @memberOf Phaser.Curves
  95145. * @constructor
  95146. * @since 3.0.0
  95147. *
  95148. * @param {(number|EllipseCurveConfig)} [x=0] - [description]
  95149. * @param {number} [y=0] - [description]
  95150. * @param {number} [xRadius=0] - [description]
  95151. * @param {number} [yRadius=0] - [description]
  95152. * @param {integer} [startAngle=0] - [description]
  95153. * @param {integer} [endAngle=360] - [description]
  95154. * @param {boolean} [clockwise=false] - [description]
  95155. * @param {integer} [rotation=0] - [description]
  95156. */
  95157. var EllipseCurve = new Class({
  95158. Extends: Curve,
  95159. initialize:
  95160. function EllipseCurve (x, y, xRadius, yRadius, startAngle, endAngle, clockwise, rotation)
  95161. {
  95162. if (typeof x === 'object')
  95163. {
  95164. var config = x;
  95165. x = GetValue(config, 'x', 0);
  95166. y = GetValue(config, 'y', 0);
  95167. xRadius = GetValue(config, 'xRadius', 0);
  95168. yRadius = GetValue(config, 'yRadius', xRadius);
  95169. startAngle = GetValue(config, 'startAngle', 0);
  95170. endAngle = GetValue(config, 'endAngle', 360);
  95171. clockwise = GetValue(config, 'clockwise', false);
  95172. rotation = GetValue(config, 'rotation', 0);
  95173. }
  95174. else
  95175. {
  95176. if (yRadius === undefined) { yRadius = xRadius; }
  95177. if (startAngle === undefined) { startAngle = 0; }
  95178. if (endAngle === undefined) { endAngle = 360; }
  95179. if (clockwise === undefined) { clockwise = false; }
  95180. if (rotation === undefined) { rotation = 0; }
  95181. }
  95182. Curve.call(this, 'EllipseCurve');
  95183. // Center point
  95184. /**
  95185. * [description]
  95186. *
  95187. * @name Phaser.Curves.Ellipse#p0
  95188. * @type {Phaser.Math.Vector2}
  95189. * @since 3.0.0
  95190. */
  95191. this.p0 = new Vector2(x, y);
  95192. /**
  95193. * [description]
  95194. *
  95195. * @name Phaser.Curves.Ellipse#_xRadius
  95196. * @type {number}
  95197. * @private
  95198. * @since 3.0.0
  95199. */
  95200. this._xRadius = xRadius;
  95201. /**
  95202. * [description]
  95203. *
  95204. * @name Phaser.Curves.Ellipse#_yRadius
  95205. * @type {number}
  95206. * @private
  95207. * @since 3.0.0
  95208. */
  95209. this._yRadius = yRadius;
  95210. // Radians
  95211. /**
  95212. * [description]
  95213. *
  95214. * @name Phaser.Curves.Ellipse#_startAngle
  95215. * @type {number}
  95216. * @private
  95217. * @since 3.0.0
  95218. */
  95219. this._startAngle = DegToRad(startAngle);
  95220. /**
  95221. * [description]
  95222. *
  95223. * @name Phaser.Curves.Ellipse#_endAngle
  95224. * @type {number}
  95225. * @private
  95226. * @since 3.0.0
  95227. */
  95228. this._endAngle = DegToRad(endAngle);
  95229. /**
  95230. * Anti-clockwise direction.
  95231. *
  95232. * @name Phaser.Curves.Ellipse#_clockwise
  95233. * @type {boolean}
  95234. * @private
  95235. * @since 3.0.0
  95236. */
  95237. this._clockwise = clockwise;
  95238. /**
  95239. * The rotation of the arc.
  95240. *
  95241. * @name Phaser.Curves.Ellipse#_rotation
  95242. * @type {number}
  95243. * @private
  95244. * @since 3.0.0
  95245. */
  95246. this._rotation = DegToRad(rotation);
  95247. },
  95248. /**
  95249. * Gets the starting point on the curve.
  95250. *
  95251. * @method Phaser.Curves.Ellipse#getStartPoint
  95252. * @since 3.0.0
  95253. *
  95254. * @generic {Phaser.Math.Vector2} O - [out,$return]
  95255. *
  95256. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  95257. *
  95258. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  95259. */
  95260. getStartPoint: function (out)
  95261. {
  95262. if (out === undefined) { out = new Vector2(); }
  95263. return this.getPoint(0, out);
  95264. },
  95265. /**
  95266. * [description]
  95267. *
  95268. * @method Phaser.Curves.Ellipse#getResolution
  95269. * @since 3.0.0
  95270. *
  95271. * @param {number} divisions - [description]
  95272. *
  95273. * @return {number} [description]
  95274. */
  95275. getResolution: function (divisions)
  95276. {
  95277. return divisions * 2;
  95278. },
  95279. /**
  95280. * Get point at relative position in curve according to length.
  95281. *
  95282. * @method Phaser.Curves.Ellipse#getPoint
  95283. * @since 3.0.0
  95284. *
  95285. * @generic {Phaser.Math.Vector2} O - [out,$return]
  95286. *
  95287. * @param {number} t - The position along the curve to return. Where 0 is the start and 1 is the end.
  95288. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  95289. *
  95290. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  95291. */
  95292. getPoint: function (t, out)
  95293. {
  95294. if (out === undefined) { out = new Vector2(); }
  95295. var twoPi = Math.PI * 2;
  95296. var deltaAngle = this._endAngle - this._startAngle;
  95297. var samePoints = Math.abs(deltaAngle) < Number.EPSILON;
  95298. // ensures that deltaAngle is 0 .. 2 PI
  95299. while (deltaAngle < 0)
  95300. {
  95301. deltaAngle += twoPi;
  95302. }
  95303. while (deltaAngle > twoPi)
  95304. {
  95305. deltaAngle -= twoPi;
  95306. }
  95307. if (deltaAngle < Number.EPSILON)
  95308. {
  95309. if (samePoints)
  95310. {
  95311. deltaAngle = 0;
  95312. }
  95313. else
  95314. {
  95315. deltaAngle = twoPi;
  95316. }
  95317. }
  95318. if (this._clockwise && !samePoints)
  95319. {
  95320. if (deltaAngle === twoPi)
  95321. {
  95322. deltaAngle = - twoPi;
  95323. }
  95324. else
  95325. {
  95326. deltaAngle = deltaAngle - twoPi;
  95327. }
  95328. }
  95329. var angle = this._startAngle + t * deltaAngle;
  95330. var x = this.p0.x + this._xRadius * Math.cos(angle);
  95331. var y = this.p0.y + this._yRadius * Math.sin(angle);
  95332. if (this._rotation !== 0)
  95333. {
  95334. var cos = Math.cos(this._rotation);
  95335. var sin = Math.sin(this._rotation);
  95336. var tx = x - this.p0.x;
  95337. var ty = y - this.p0.y;
  95338. // Rotate the point about the center of the ellipse.
  95339. x = tx * cos - ty * sin + this.p0.x;
  95340. y = tx * sin + ty * cos + this.p0.y;
  95341. }
  95342. return out.set(x, y);
  95343. },
  95344. /**
  95345. * Sets the horizontal radius of this curve.
  95346. *
  95347. * @method Phaser.Curves.Ellipse#setXRadius
  95348. * @since 3.0.0
  95349. *
  95350. * @param {number} value - The horizontal radius of this curve.
  95351. *
  95352. * @return {Phaser.Curves.Ellipse} This curve object.
  95353. */
  95354. setXRadius: function (value)
  95355. {
  95356. this.xRadius = value;
  95357. return this;
  95358. },
  95359. /**
  95360. * Sets the vertical radius of this curve.
  95361. *
  95362. * @method Phaser.Curves.Ellipse#setYRadius
  95363. * @since 3.0.0
  95364. *
  95365. * @param {number} value - The vertical radius of this curve.
  95366. *
  95367. * @return {Phaser.Curves.Ellipse} This curve object.
  95368. */
  95369. setYRadius: function (value)
  95370. {
  95371. this.yRadius = value;
  95372. return this;
  95373. },
  95374. /**
  95375. * Sets the width of this curve.
  95376. *
  95377. * @method Phaser.Curves.Ellipse#setWidth
  95378. * @since 3.0.0
  95379. *
  95380. * @param {number} value - The width of this curve.
  95381. *
  95382. * @return {Phaser.Curves.Ellipse} This curve object.
  95383. */
  95384. setWidth: function (value)
  95385. {
  95386. this.xRadius = value * 2;
  95387. return this;
  95388. },
  95389. /**
  95390. * Sets the height of this curve.
  95391. *
  95392. * @method Phaser.Curves.Ellipse#setHeight
  95393. * @since 3.0.0
  95394. *
  95395. * @param {number} value - The height of this curve.
  95396. *
  95397. * @return {Phaser.Curves.Ellipse} This curve object.
  95398. */
  95399. setHeight: function (value)
  95400. {
  95401. this.yRadius = value * 2;
  95402. return this;
  95403. },
  95404. /**
  95405. * Sets the start angle of this curve.
  95406. *
  95407. * @method Phaser.Curves.Ellipse#setStartAngle
  95408. * @since 3.0.0
  95409. *
  95410. * @param {number} value - The start angle of this curve, in radians.
  95411. *
  95412. * @return {Phaser.Curves.Ellipse} This curve object.
  95413. */
  95414. setStartAngle: function (value)
  95415. {
  95416. this.startAngle = value;
  95417. return this;
  95418. },
  95419. /**
  95420. * Sets the end angle of this curve.
  95421. *
  95422. * @method Phaser.Curves.Ellipse#setEndAngle
  95423. * @since 3.0.0
  95424. *
  95425. * @param {number} value - The end angle of this curve, in radians.
  95426. *
  95427. * @return {Phaser.Curves.Ellipse} This curve object.
  95428. */
  95429. setEndAngle: function (value)
  95430. {
  95431. this.endAngle = value;
  95432. return this;
  95433. },
  95434. /**
  95435. * Sets if this curve extends clockwise or anti-clockwise.
  95436. *
  95437. * @method Phaser.Curves.Ellipse#setClockwise
  95438. * @since 3.0.0
  95439. *
  95440. * @param {boolean} value - The clockwise state of this curve.
  95441. *
  95442. * @return {Phaser.Curves.Ellipse} This curve object.
  95443. */
  95444. setClockwise: function (value)
  95445. {
  95446. this.clockwise = value;
  95447. return this;
  95448. },
  95449. /**
  95450. * Sets the rotation of this curve.
  95451. *
  95452. * @method Phaser.Curves.Ellipse#setRotation
  95453. * @since 3.0.0
  95454. *
  95455. * @param {number} value - The rotation of this curve, in radians.
  95456. *
  95457. * @return {Phaser.Curves.Ellipse} This curve object.
  95458. */
  95459. setRotation: function (value)
  95460. {
  95461. this.rotation = value;
  95462. return this;
  95463. },
  95464. /**
  95465. * [description]
  95466. *
  95467. * @name Phaser.Curves.Ellipse#x
  95468. * @type {number}
  95469. * @since 3.0.0
  95470. */
  95471. x: {
  95472. get: function ()
  95473. {
  95474. return this.p0.x;
  95475. },
  95476. set: function (value)
  95477. {
  95478. this.p0.x = value;
  95479. }
  95480. },
  95481. /**
  95482. * [description]
  95483. *
  95484. * @name Phaser.Curves.Ellipse#y
  95485. * @type {number}
  95486. * @since 3.0.0
  95487. */
  95488. y: {
  95489. get: function ()
  95490. {
  95491. return this.p0.y;
  95492. },
  95493. set: function (value)
  95494. {
  95495. this.p0.y = value;
  95496. }
  95497. },
  95498. /**
  95499. * [description]
  95500. *
  95501. * @name Phaser.Curves.Ellipse#xRadius
  95502. * @type {number}
  95503. * @since 3.0.0
  95504. */
  95505. xRadius: {
  95506. get: function ()
  95507. {
  95508. return this._xRadius;
  95509. },
  95510. set: function (value)
  95511. {
  95512. this._xRadius = value;
  95513. }
  95514. },
  95515. /**
  95516. * [description]
  95517. *
  95518. * @name Phaser.Curves.Ellipse#yRadius
  95519. * @type {number}
  95520. * @since 3.0.0
  95521. */
  95522. yRadius: {
  95523. get: function ()
  95524. {
  95525. return this._yRadius;
  95526. },
  95527. set: function (value)
  95528. {
  95529. this._yRadius = value;
  95530. }
  95531. },
  95532. /**
  95533. * [description]
  95534. *
  95535. * @name Phaser.Curves.Ellipse#startAngle
  95536. * @type {number}
  95537. * @since 3.0.0
  95538. */
  95539. startAngle: {
  95540. get: function ()
  95541. {
  95542. return RadToDeg(this._startAngle);
  95543. },
  95544. set: function (value)
  95545. {
  95546. this._startAngle = DegToRad(value);
  95547. }
  95548. },
  95549. /**
  95550. * [description]
  95551. *
  95552. * @name Phaser.Curves.Ellipse#endAngle
  95553. * @type {number}
  95554. * @since 3.0.0
  95555. */
  95556. endAngle: {
  95557. get: function ()
  95558. {
  95559. return RadToDeg(this._endAngle);
  95560. },
  95561. set: function (value)
  95562. {
  95563. this._endAngle = DegToRad(value);
  95564. }
  95565. },
  95566. /**
  95567. * [description]
  95568. *
  95569. * @name Phaser.Curves.Ellipse#clockwise
  95570. * @type {boolean}
  95571. * @since 3.0.0
  95572. */
  95573. clockwise: {
  95574. get: function ()
  95575. {
  95576. return this._clockwise;
  95577. },
  95578. set: function (value)
  95579. {
  95580. this._clockwise = value;
  95581. }
  95582. },
  95583. /**
  95584. * [description]
  95585. *
  95586. * @name Phaser.Curves.Ellipse#rotation
  95587. * @type {number}
  95588. * @since 3.0.0
  95589. */
  95590. rotation: {
  95591. get: function ()
  95592. {
  95593. return this._rotation;
  95594. },
  95595. set: function (value)
  95596. {
  95597. this._rotation = DegToRad(value);
  95598. }
  95599. },
  95600. /**
  95601. * [description]
  95602. *
  95603. * @method Phaser.Curves.Ellipse#toJSON
  95604. * @since 3.0.0
  95605. *
  95606. * @return {JSONEllipseCurve} The JSON object containing this curve data.
  95607. */
  95608. toJSON: function ()
  95609. {
  95610. return {
  95611. type: this.type,
  95612. x: this.p0.x,
  95613. y: this.p0.y,
  95614. xRadius: this._xRadius,
  95615. yRadius: this._yRadius,
  95616. startAngle: RadToDeg(this._startAngle),
  95617. endAngle: RadToDeg(this._endAngle),
  95618. clockwise: this._clockwise,
  95619. rotation: RadToDeg(this._rotation)
  95620. };
  95621. }
  95622. });
  95623. /**
  95624. * [description]
  95625. *
  95626. * @function Phaser.Curves.Ellipse.fromJSON
  95627. * @since 3.0.0
  95628. *
  95629. * @param {JSONEllipseCurve} data - The JSON object containing this curve data.
  95630. *
  95631. * @return {Phaser.Curves.Ellipse} [description]
  95632. */
  95633. EllipseCurve.fromJSON = function (data)
  95634. {
  95635. return new EllipseCurve(data);
  95636. };
  95637. module.exports = EllipseCurve;
  95638. /***/ }),
  95639. /* 520 */
  95640. /***/ (function(module, exports) {
  95641. /**
  95642. * @author Richard Davey <rich@photonstorm.com>
  95643. * @copyright 2018 Photon Storm Ltd.
  95644. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95645. */
  95646. function P0 (t, p)
  95647. {
  95648. var k = 1 - t;
  95649. return k * k * k * p;
  95650. }
  95651. function P1 (t, p)
  95652. {
  95653. var k = 1 - t;
  95654. return 3 * k * k * t * p;
  95655. }
  95656. function P2 (t, p)
  95657. {
  95658. return 3 * (1 - t) * t * t * p;
  95659. }
  95660. function P3 (t, p)
  95661. {
  95662. return t * t * t * p;
  95663. }
  95664. // p0 = start point
  95665. // p1 = control point 1
  95666. // p2 = control point 2
  95667. // p3 = end point
  95668. // https://medium.com/@adrian_cooney/bezier-interpolation-13b68563313a
  95669. /**
  95670. * A cubic bezier interpolation method.
  95671. *
  95672. * @function Phaser.Math.Interpolation.CubicBezier
  95673. * @since 3.0.0
  95674. *
  95675. * @param {number} t - The percentage of interpolation, between 0 and 1.
  95676. * @param {number} p0 - The start point.
  95677. * @param {number} p1 - The first control point.
  95678. * @param {number} p2 - The second control point.
  95679. * @param {number} p3 - The end point.
  95680. *
  95681. * @return {number} The interpolated value.
  95682. */
  95683. var CubicBezierInterpolation = function (t, p0, p1, p2, p3)
  95684. {
  95685. return P0(t, p0) + P1(t, p1) + P2(t, p2) + P3(t, p3);
  95686. };
  95687. module.exports = CubicBezierInterpolation;
  95688. /***/ }),
  95689. /* 521 */
  95690. /***/ (function(module, exports, __webpack_require__) {
  95691. /**
  95692. * @author Richard Davey <rich@photonstorm.com>
  95693. * @copyright 2018 Photon Storm Ltd.
  95694. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95695. */
  95696. // Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
  95697. var Class = __webpack_require__(0);
  95698. var CubicBezier = __webpack_require__(520);
  95699. var Curve = __webpack_require__(86);
  95700. var Vector2 = __webpack_require__(6);
  95701. /**
  95702. * @classdesc
  95703. * [description]
  95704. *
  95705. * @class CubicBezier
  95706. * @extends Phaser.Curves.Curve
  95707. * @memberOf Phaser.Curves
  95708. * @constructor
  95709. * @since 3.0.0
  95710. *
  95711. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector2[])} p0 - Start point, or an array of point pairs.
  95712. * @param {Phaser.Math.Vector2} p1 - Control Point 1.
  95713. * @param {Phaser.Math.Vector2} p2 - Control Point 2.
  95714. * @param {Phaser.Math.Vector2} p3 - End Point.
  95715. */
  95716. var CubicBezierCurve = new Class({
  95717. Extends: Curve,
  95718. initialize:
  95719. function CubicBezierCurve (p0, p1, p2, p3)
  95720. {
  95721. Curve.call(this, 'CubicBezierCurve');
  95722. if (Array.isArray(p0))
  95723. {
  95724. p3 = new Vector2(p0[6], p0[7]);
  95725. p2 = new Vector2(p0[4], p0[5]);
  95726. p1 = new Vector2(p0[2], p0[3]);
  95727. p0 = new Vector2(p0[0], p0[1]);
  95728. }
  95729. /**
  95730. * [description]
  95731. *
  95732. * @name Phaser.Curves.CubicBezier#p0
  95733. * @type {Phaser.Math.Vector2}
  95734. * @since 3.0.0
  95735. */
  95736. this.p0 = p0;
  95737. /**
  95738. * [description]
  95739. *
  95740. * @name Phaser.Curves.CubicBezier#p1
  95741. * @type {Phaser.Math.Vector2}
  95742. * @since 3.0.0
  95743. */
  95744. this.p1 = p1;
  95745. /**
  95746. * [description]
  95747. *
  95748. * @name Phaser.Curves.CubicBezier#p2
  95749. * @type {Phaser.Math.Vector2}
  95750. * @since 3.0.0
  95751. */
  95752. this.p2 = p2;
  95753. /**
  95754. * [description]
  95755. *
  95756. * @name Phaser.Curves.CubicBezier#p3
  95757. * @type {Phaser.Math.Vector2}
  95758. * @since 3.0.0
  95759. */
  95760. this.p3 = p3;
  95761. },
  95762. /**
  95763. * Gets the starting point on the curve.
  95764. *
  95765. * @method Phaser.Curves.CubicBezier#getStartPoint
  95766. * @since 3.0.0
  95767. *
  95768. * @generic {Phaser.Math.Vector2} O - [out,$return]
  95769. *
  95770. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  95771. *
  95772. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  95773. */
  95774. getStartPoint: function (out)
  95775. {
  95776. if (out === undefined) { out = new Vector2(); }
  95777. return out.copy(this.p0);
  95778. },
  95779. /**
  95780. * [description]
  95781. *
  95782. * @method Phaser.Curves.CubicBezier#getResolution
  95783. * @since 3.0.0
  95784. *
  95785. * @param {number} divisions - The amount of divisions used by this curve.
  95786. *
  95787. * @return {number} The resolution of the curve.
  95788. */
  95789. getResolution: function (divisions)
  95790. {
  95791. return divisions;
  95792. },
  95793. /**
  95794. * Get point at relative position in curve according to length.
  95795. *
  95796. * @method Phaser.Curves.CubicBezier#getPoint
  95797. * @since 3.0.0
  95798. *
  95799. * @generic {Phaser.Math.Vector2} O - [out,$return]
  95800. *
  95801. * @param {number} t - The position along the curve to return. Where 0 is the start and 1 is the end.
  95802. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  95803. *
  95804. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  95805. */
  95806. getPoint: function (t, out)
  95807. {
  95808. if (out === undefined) { out = new Vector2(); }
  95809. var p0 = this.p0;
  95810. var p1 = this.p1;
  95811. var p2 = this.p2;
  95812. var p3 = this.p3;
  95813. return out.set(CubicBezier(t, p0.x, p1.x, p2.x, p3.x), CubicBezier(t, p0.y, p1.y, p2.y, p3.y));
  95814. },
  95815. /**
  95816. * [description]
  95817. *
  95818. * @method Phaser.Curves.CubicBezier#draw
  95819. * @since 3.0.0
  95820. *
  95821. * @generic {Phaser.GameObjects.Graphics} G - [graphics,$return]
  95822. *
  95823. * @param {Phaser.GameObjects.Graphics} graphics - [description]
  95824. * @param {integer} [pointsTotal=32] - [description]
  95825. *
  95826. * @return {Phaser.GameObjects.Graphics} [description]
  95827. */
  95828. draw: function (graphics, pointsTotal)
  95829. {
  95830. if (pointsTotal === undefined) { pointsTotal = 32; }
  95831. var points = this.getPoints(pointsTotal);
  95832. graphics.beginPath();
  95833. graphics.moveTo(this.p0.x, this.p0.y);
  95834. for (var i = 1; i < points.length; i++)
  95835. {
  95836. graphics.lineTo(points[i].x, points[i].y);
  95837. }
  95838. graphics.strokePath();
  95839. // So you can chain graphics calls
  95840. return graphics;
  95841. },
  95842. /**
  95843. * [description]
  95844. *
  95845. * @method Phaser.Curves.CubicBezier#toJSON
  95846. * @since 3.0.0
  95847. *
  95848. * @return {JSONCurve} The JSON object containing this curve data.
  95849. */
  95850. toJSON: function ()
  95851. {
  95852. return {
  95853. type: this.type,
  95854. points: [
  95855. this.p0.x, this.p0.y,
  95856. this.p1.x, this.p1.y,
  95857. this.p2.x, this.p2.y,
  95858. this.p3.x, this.p3.y
  95859. ]
  95860. };
  95861. }
  95862. });
  95863. /**
  95864. * [description]
  95865. *
  95866. * @function Phaser.Curves.CubicBezier.fromJSON
  95867. * @since 3.0.0
  95868. *
  95869. * @param {JSONCurve} data - The JSON object containing this curve data.
  95870. *
  95871. * @return {Phaser.Curves.CubicBezier} [description]
  95872. */
  95873. CubicBezierCurve.fromJSON = function (data)
  95874. {
  95875. var points = data.points;
  95876. var p0 = new Vector2(points[0], points[1]);
  95877. var p1 = new Vector2(points[2], points[3]);
  95878. var p2 = new Vector2(points[4], points[5]);
  95879. var p3 = new Vector2(points[6], points[7]);
  95880. return new CubicBezierCurve(p0, p1, p2, p3);
  95881. };
  95882. module.exports = CubicBezierCurve;
  95883. /***/ }),
  95884. /* 522 */
  95885. /***/ (function(module, exports, __webpack_require__) {
  95886. /**
  95887. * @author Richard Davey <rich@photonstorm.com>
  95888. * @copyright 2018 Photon Storm Ltd.
  95889. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  95890. */
  95891. var Camera = __webpack_require__(273);
  95892. var Class = __webpack_require__(0);
  95893. var Vector3 = __webpack_require__(87);
  95894. // Local cache vars
  95895. var tmpVec3 = new Vector3();
  95896. /**
  95897. * @classdesc
  95898. * [description]
  95899. *
  95900. * @class PerspectiveCamera
  95901. * @extends Phaser.Cameras.Sprite3D.Camera
  95902. * @memberOf Phaser.Cameras.Sprite3D
  95903. * @constructor
  95904. * @since 3.0.0
  95905. *
  95906. * @param {Phaser.Scene} scene - [description]
  95907. * @param {integer} [fieldOfView=80] - [description]
  95908. * @param {integer} [viewportWidth=0] - [description]
  95909. * @param {integer} [viewportHeight=0] - [description]
  95910. */
  95911. var PerspectiveCamera = new Class({
  95912. Extends: Camera,
  95913. // FOV is converted to radians automatically
  95914. initialize:
  95915. function PerspectiveCamera (scene, fieldOfView, viewportWidth, viewportHeight)
  95916. {
  95917. if (fieldOfView === undefined) { fieldOfView = 80; }
  95918. if (viewportWidth === undefined) { viewportWidth = 0; }
  95919. if (viewportHeight === undefined) { viewportHeight = 0; }
  95920. Camera.call(this, scene);
  95921. /**
  95922. * [description]
  95923. *
  95924. * @name Phaser.Cameras.Sprite3D.PerspectiveCamera#viewportWidth
  95925. * @type {integer}
  95926. * @default 0
  95927. * @since 3.0.0
  95928. */
  95929. this.viewportWidth = viewportWidth;
  95930. /**
  95931. * [description]
  95932. *
  95933. * @name Phaser.Cameras.Sprite3D.PerspectiveCamera#viewportHeight
  95934. * @type {integer}
  95935. * @default 0
  95936. * @since 3.0.0
  95937. */
  95938. this.viewportHeight = viewportHeight;
  95939. /**
  95940. * [description]
  95941. *
  95942. * @name Phaser.Cameras.Sprite3D.PerspectiveCamera#fieldOfView
  95943. * @type {integer}
  95944. * @default 80
  95945. * @since 3.0.0
  95946. */
  95947. this.fieldOfView = fieldOfView * Math.PI / 180;
  95948. this.update();
  95949. },
  95950. /**
  95951. * [description]
  95952. *
  95953. * @method Phaser.Cameras.Sprite3D.PerspectiveCamera#setFOV
  95954. * @since 3.0.0
  95955. *
  95956. * @param {number} value - [description]
  95957. *
  95958. * @return {Phaser.Cameras.Sprite3D.PerspectiveCamera} [description]
  95959. */
  95960. setFOV: function (value)
  95961. {
  95962. this.fieldOfView = value * Math.PI / 180;
  95963. return this;
  95964. },
  95965. /**
  95966. * [description]
  95967. *
  95968. * @method Phaser.Cameras.Sprite3D.PerspectiveCamera#update
  95969. * @since 3.0.0
  95970. *
  95971. * @return {Phaser.Cameras.Sprite3D.PerspectiveCamera} [description]
  95972. */
  95973. update: function ()
  95974. {
  95975. var aspect = this.viewportWidth / this.viewportHeight;
  95976. // Create a perspective matrix for our camera
  95977. this.projection.perspective(
  95978. this.fieldOfView,
  95979. aspect,
  95980. Math.abs(this.near),
  95981. Math.abs(this.far)
  95982. );
  95983. // Build the view matrix
  95984. tmpVec3.copy(this.position).add(this.direction);
  95985. this.view.lookAt(this.position, tmpVec3, this.up);
  95986. // Projection * view matrix
  95987. this.combined.copy(this.projection).multiply(this.view);
  95988. // Invert combined matrix, used for unproject
  95989. this.invProjectionView.copy(this.combined).invert();
  95990. this.billboardMatrixDirty = true;
  95991. this.updateChildren();
  95992. return this;
  95993. }
  95994. });
  95995. module.exports = PerspectiveCamera;
  95996. /***/ }),
  95997. /* 523 */
  95998. /***/ (function(module, exports, __webpack_require__) {
  95999. /**
  96000. * @author Richard Davey <rich@photonstorm.com>
  96001. * @copyright 2018 Photon Storm Ltd.
  96002. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96003. */
  96004. var Camera = __webpack_require__(273);
  96005. var Class = __webpack_require__(0);
  96006. var Vector3 = __webpack_require__(87);
  96007. // Local cache vars
  96008. var tmpVec3 = new Vector3();
  96009. /**
  96010. * @classdesc
  96011. * [description]
  96012. *
  96013. * @class OrthographicCamera
  96014. * @extends Phaser.Cameras.Sprite3D.Camera
  96015. * @memberOf Phaser.Cameras.Sprite3D
  96016. * @constructor
  96017. * @since 3.0.0
  96018. *
  96019. * @param {Phaser.Scene} scene - [description]
  96020. * @param {integer} [viewportWidth=0] - [description]
  96021. * @param {integer} [viewportHeight=0] - [description]
  96022. */
  96023. var OrthographicCamera = new Class({
  96024. Extends: Camera,
  96025. initialize:
  96026. function OrthographicCamera (scene, viewportWidth, viewportHeight)
  96027. {
  96028. if (viewportWidth === undefined) { viewportWidth = 0; }
  96029. if (viewportHeight === undefined) { viewportHeight = 0; }
  96030. Camera.call(this, scene);
  96031. /**
  96032. * [description]
  96033. *
  96034. * @name Phaser.Cameras.Sprite3D.OrthographicCamera#viewportWidth
  96035. * @type {integer}
  96036. * @since 3.0.0
  96037. */
  96038. this.viewportWidth = viewportWidth;
  96039. /**
  96040. * [description]
  96041. *
  96042. * @name Phaser.Cameras.Sprite3D.OrthographicCamera#viewportHeight
  96043. * @type {integer}
  96044. * @since 3.0.0
  96045. */
  96046. this.viewportHeight = viewportHeight;
  96047. /**
  96048. * [description]
  96049. *
  96050. * @name Phaser.Cameras.Sprite3D.OrthographicCamera#_zoom
  96051. * @type {number}
  96052. * @private
  96053. * @since 3.0.0
  96054. */
  96055. this._zoom = 1.0;
  96056. /**
  96057. * [description]
  96058. *
  96059. * @name Phaser.Cameras.Sprite3D.OrthographicCamera#near
  96060. * @type {number}
  96061. * @default 0
  96062. * @since 3.0.0
  96063. */
  96064. this.near = 0;
  96065. this.update();
  96066. },
  96067. /**
  96068. * [description]
  96069. *
  96070. * @method Phaser.Cameras.Sprite3D.OrthographicCamera#setToOrtho
  96071. * @since 3.0.0
  96072. *
  96073. * @param {number} yDown - [description]
  96074. * @param {number} [viewportWidth] - [description]
  96075. * @param {number} [viewportHeight] - [description]
  96076. *
  96077. * @return {Phaser.Cameras.Sprite3D.OrthographicCamera} [description]
  96078. */
  96079. setToOrtho: function (yDown, viewportWidth, viewportHeight)
  96080. {
  96081. if (viewportWidth === undefined) { viewportWidth = this.viewportWidth; }
  96082. if (viewportHeight === undefined) { viewportHeight = this.viewportHeight; }
  96083. var zoom = this.zoom;
  96084. this.up.set(0, (yDown) ? -1 : 1, 0);
  96085. this.direction.set(0, 0, (yDown) ? 1 : -1);
  96086. this.position.set(zoom * viewportWidth / 2, zoom * viewportHeight / 2, 0);
  96087. this.viewportWidth = viewportWidth;
  96088. this.viewportHeight = viewportHeight;
  96089. return this.update();
  96090. },
  96091. /**
  96092. * [description]
  96093. *
  96094. * @method Phaser.Cameras.Sprite3D.OrthographicCamera#update
  96095. * @since 3.0.0
  96096. *
  96097. * @return {Phaser.Cameras.Sprite3D.OrthographicCamera} [description]
  96098. */
  96099. update: function ()
  96100. {
  96101. var w = this.viewportWidth;
  96102. var h = this.viewportHeight;
  96103. var near = Math.abs(this.near);
  96104. var far = Math.abs(this.far);
  96105. var zoom = this.zoom;
  96106. if (w === 0 || h === 0)
  96107. {
  96108. // What to do here... hmm?
  96109. return this;
  96110. }
  96111. this.projection.ortho(
  96112. zoom * -w / 2, zoom * w / 2,
  96113. zoom * -h / 2, zoom * h / 2,
  96114. near,
  96115. far
  96116. );
  96117. // Build the view matrix
  96118. tmpVec3.copy(this.position).add(this.direction);
  96119. this.view.lookAt(this.position, tmpVec3, this.up);
  96120. // Projection * view matrix
  96121. this.combined.copy(this.projection).multiply(this.view);
  96122. // Invert combined matrix, used for unproject
  96123. this.invProjectionView.copy(this.combined).invert();
  96124. this.billboardMatrixDirty = true;
  96125. this.updateChildren();
  96126. return this;
  96127. },
  96128. /**
  96129. * [description]
  96130. *
  96131. * @name Phaser.Cameras.Sprite3D.OrthographicCamera#zoom
  96132. * @type {number}
  96133. * @since 3.0.0
  96134. */
  96135. zoom: {
  96136. get: function ()
  96137. {
  96138. return this._zoom;
  96139. },
  96140. set: function (value)
  96141. {
  96142. this._zoom = value;
  96143. this.update();
  96144. }
  96145. }
  96146. });
  96147. module.exports = OrthographicCamera;
  96148. /***/ }),
  96149. /* 524 */
  96150. /***/ (function(module, exports, __webpack_require__) {
  96151. /**
  96152. * @author Richard Davey <rich@photonstorm.com>
  96153. * @copyright 2018 Photon Storm Ltd.
  96154. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96155. */
  96156. var GameObject = __webpack_require__(2);
  96157. /**
  96158. * Renders this Game Object with the Canvas Renderer to the given Camera.
  96159. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  96160. * This method should not be called directly. It is a utility function of the Render module.
  96161. *
  96162. * @method Phaser.GameObjects.Sprite#renderCanvas
  96163. * @since 3.0.0
  96164. * @private
  96165. *
  96166. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  96167. * @param {Phaser.GameObjects.Sprite} src - The Game Object being rendered in this call.
  96168. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  96169. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  96170. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  96171. */
  96172. var SpriteCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  96173. {
  96174. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  96175. {
  96176. return;
  96177. }
  96178. renderer.drawImage(src, camera, parentMatrix);
  96179. };
  96180. module.exports = SpriteCanvasRenderer;
  96181. /***/ }),
  96182. /* 525 */
  96183. /***/ (function(module, exports, __webpack_require__) {
  96184. /**
  96185. * @author Richard Davey <rich@photonstorm.com>
  96186. * @copyright 2018 Photon Storm Ltd.
  96187. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96188. */
  96189. var GameObject = __webpack_require__(2);
  96190. /**
  96191. * Renders this Game Object with the WebGL Renderer to the given Camera.
  96192. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  96193. * This method should not be called directly. It is a utility function of the Render module.
  96194. *
  96195. * @method Phaser.GameObjects.Sprite#renderWebGL
  96196. * @since 3.0.0
  96197. * @private
  96198. *
  96199. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  96200. * @param {Phaser.GameObjects.Sprite} src - The Game Object being rendered in this call.
  96201. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  96202. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  96203. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  96204. */
  96205. var SpriteWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  96206. {
  96207. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  96208. {
  96209. return;
  96210. }
  96211. this.pipeline.batchSprite(src, camera, parentMatrix);
  96212. };
  96213. module.exports = SpriteWebGLRenderer;
  96214. /***/ }),
  96215. /* 526 */
  96216. /***/ (function(module, exports, __webpack_require__) {
  96217. /**
  96218. * @author Richard Davey <rich@photonstorm.com>
  96219. * @copyright 2018 Photon Storm Ltd.
  96220. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96221. */
  96222. var renderWebGL = __webpack_require__(3);
  96223. var renderCanvas = __webpack_require__(3);
  96224. if (true)
  96225. {
  96226. renderWebGL = __webpack_require__(525);
  96227. }
  96228. if (true)
  96229. {
  96230. renderCanvas = __webpack_require__(524);
  96231. }
  96232. module.exports = {
  96233. renderWebGL: renderWebGL,
  96234. renderCanvas: renderCanvas
  96235. };
  96236. /***/ }),
  96237. /* 527 */
  96238. /***/ (function(module, exports, __webpack_require__) {
  96239. /**
  96240. * @author Richard Davey <rich@photonstorm.com>
  96241. * @copyright 2018 Photon Storm Ltd.
  96242. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96243. */
  96244. // Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji
  96245. // and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl
  96246. var Class = __webpack_require__(0);
  96247. /**
  96248. * @classdesc
  96249. * A three-dimensional matrix.
  96250. *
  96251. * Defaults to the identity matrix when instantiated.
  96252. *
  96253. * @class Matrix3
  96254. * @memberOf Phaser.Math
  96255. * @constructor
  96256. * @since 3.0.0
  96257. *
  96258. * @param {Phaser.Math.Matrix3} [m] - Optional Matrix3 to copy values from.
  96259. */
  96260. var Matrix3 = new Class({
  96261. initialize:
  96262. function Matrix3 (m)
  96263. {
  96264. /**
  96265. * The matrix values.
  96266. *
  96267. * @name Phaser.Math.Matrix3#val
  96268. * @type {Float32Array}
  96269. * @since 3.0.0
  96270. */
  96271. this.val = new Float32Array(9);
  96272. if (m)
  96273. {
  96274. // Assume Matrix3 with val:
  96275. this.copy(m);
  96276. }
  96277. else
  96278. {
  96279. // Default to identity
  96280. this.identity();
  96281. }
  96282. },
  96283. /**
  96284. * Make a clone of this Matrix3.
  96285. *
  96286. * @method Phaser.Math.Matrix3#clone
  96287. * @since 3.0.0
  96288. *
  96289. * @return {Phaser.Math.Matrix3} A clone of this Matrix3.
  96290. */
  96291. clone: function ()
  96292. {
  96293. return new Matrix3(this);
  96294. },
  96295. /**
  96296. * This method is an alias for `Matrix3.copy`.
  96297. *
  96298. * @method Phaser.Math.Matrix3#set
  96299. * @since 3.0.0
  96300. *
  96301. * @param {Phaser.Math.Matrix3} src - The Matrix to set the values of this Matrix's from.
  96302. *
  96303. * @return {Phaser.Math.Matrix3} This Matrix3.
  96304. */
  96305. set: function (src)
  96306. {
  96307. return this.copy(src);
  96308. },
  96309. /**
  96310. * Copy the values of a given Matrix into this Matrix.
  96311. *
  96312. * @method Phaser.Math.Matrix3#copy
  96313. * @since 3.0.0
  96314. *
  96315. * @param {Phaser.Math.Matrix3} src - The Matrix to copy the values from.
  96316. *
  96317. * @return {Phaser.Math.Matrix3} This Matrix3.
  96318. */
  96319. copy: function (src)
  96320. {
  96321. var out = this.val;
  96322. var a = src.val;
  96323. out[0] = a[0];
  96324. out[1] = a[1];
  96325. out[2] = a[2];
  96326. out[3] = a[3];
  96327. out[4] = a[4];
  96328. out[5] = a[5];
  96329. out[6] = a[6];
  96330. out[7] = a[7];
  96331. out[8] = a[8];
  96332. return this;
  96333. },
  96334. /**
  96335. * Copy the values of a given Matrix4 into this Matrix3.
  96336. *
  96337. * @method Phaser.Math.Matrix3#fromMat4
  96338. * @since 3.0.0
  96339. *
  96340. * @param {Phaser.Math.Matrix4} m - The Matrix4 to copy the values from.
  96341. *
  96342. * @return {Phaser.Math.Matrix3} This Matrix3.
  96343. */
  96344. fromMat4: function (m)
  96345. {
  96346. var a = m.val;
  96347. var out = this.val;
  96348. out[0] = a[0];
  96349. out[1] = a[1];
  96350. out[2] = a[2];
  96351. out[3] = a[4];
  96352. out[4] = a[5];
  96353. out[5] = a[6];
  96354. out[6] = a[8];
  96355. out[7] = a[9];
  96356. out[8] = a[10];
  96357. return this;
  96358. },
  96359. /**
  96360. * Set the values of this Matrix from the given array.
  96361. *
  96362. * @method Phaser.Math.Matrix3#fromArray
  96363. * @since 3.0.0
  96364. *
  96365. * @param {array} a - The array to copy the values from.
  96366. *
  96367. * @return {Phaser.Math.Matrix3} This Matrix3.
  96368. */
  96369. fromArray: function (a)
  96370. {
  96371. var out = this.val;
  96372. out[0] = a[0];
  96373. out[1] = a[1];
  96374. out[2] = a[2];
  96375. out[3] = a[3];
  96376. out[4] = a[4];
  96377. out[5] = a[5];
  96378. out[6] = a[6];
  96379. out[7] = a[7];
  96380. out[8] = a[8];
  96381. return this;
  96382. },
  96383. /**
  96384. * Reset this Matrix to an identity (default) matrix.
  96385. *
  96386. * @method Phaser.Math.Matrix3#identity
  96387. * @since 3.0.0
  96388. *
  96389. * @return {Phaser.Math.Matrix3} This Matrix3.
  96390. */
  96391. identity: function ()
  96392. {
  96393. var out = this.val;
  96394. out[0] = 1;
  96395. out[1] = 0;
  96396. out[2] = 0;
  96397. out[3] = 0;
  96398. out[4] = 1;
  96399. out[5] = 0;
  96400. out[6] = 0;
  96401. out[7] = 0;
  96402. out[8] = 1;
  96403. return this;
  96404. },
  96405. /**
  96406. * Transpose this Matrix.
  96407. *
  96408. * @method Phaser.Math.Matrix3#transpose
  96409. * @since 3.0.0
  96410. *
  96411. * @return {Phaser.Math.Matrix3} This Matrix3.
  96412. */
  96413. transpose: function ()
  96414. {
  96415. var a = this.val;
  96416. var a01 = a[1];
  96417. var a02 = a[2];
  96418. var a12 = a[5];
  96419. a[1] = a[3];
  96420. a[2] = a[6];
  96421. a[3] = a01;
  96422. a[5] = a[7];
  96423. a[6] = a02;
  96424. a[7] = a12;
  96425. return this;
  96426. },
  96427. /**
  96428. * Invert this Matrix.
  96429. *
  96430. * @method Phaser.Math.Matrix3#invert
  96431. * @since 3.0.0
  96432. *
  96433. * @return {Phaser.Math.Matrix3} This Matrix3.
  96434. */
  96435. invert: function ()
  96436. {
  96437. var a = this.val;
  96438. var a00 = a[0];
  96439. var a01 = a[1];
  96440. var a02 = a[2];
  96441. var a10 = a[3];
  96442. var a11 = a[4];
  96443. var a12 = a[5];
  96444. var a20 = a[6];
  96445. var a21 = a[7];
  96446. var a22 = a[8];
  96447. var b01 = a22 * a11 - a12 * a21;
  96448. var b11 = -a22 * a10 + a12 * a20;
  96449. var b21 = a21 * a10 - a11 * a20;
  96450. // Calculate the determinant
  96451. var det = a00 * b01 + a01 * b11 + a02 * b21;
  96452. if (!det)
  96453. {
  96454. return null;
  96455. }
  96456. det = 1 / det;
  96457. a[0] = b01 * det;
  96458. a[1] = (-a22 * a01 + a02 * a21) * det;
  96459. a[2] = (a12 * a01 - a02 * a11) * det;
  96460. a[3] = b11 * det;
  96461. a[4] = (a22 * a00 - a02 * a20) * det;
  96462. a[5] = (-a12 * a00 + a02 * a10) * det;
  96463. a[6] = b21 * det;
  96464. a[7] = (-a21 * a00 + a01 * a20) * det;
  96465. a[8] = (a11 * a00 - a01 * a10) * det;
  96466. return this;
  96467. },
  96468. /**
  96469. * Calculate the adjoint, or adjugate, of this Matrix.
  96470. *
  96471. * @method Phaser.Math.Matrix3#adjoint
  96472. * @since 3.0.0
  96473. *
  96474. * @return {Phaser.Math.Matrix3} This Matrix3.
  96475. */
  96476. adjoint: function ()
  96477. {
  96478. var a = this.val;
  96479. var a00 = a[0];
  96480. var a01 = a[1];
  96481. var a02 = a[2];
  96482. var a10 = a[3];
  96483. var a11 = a[4];
  96484. var a12 = a[5];
  96485. var a20 = a[6];
  96486. var a21 = a[7];
  96487. var a22 = a[8];
  96488. a[0] = (a11 * a22 - a12 * a21);
  96489. a[1] = (a02 * a21 - a01 * a22);
  96490. a[2] = (a01 * a12 - a02 * a11);
  96491. a[3] = (a12 * a20 - a10 * a22);
  96492. a[4] = (a00 * a22 - a02 * a20);
  96493. a[5] = (a02 * a10 - a00 * a12);
  96494. a[6] = (a10 * a21 - a11 * a20);
  96495. a[7] = (a01 * a20 - a00 * a21);
  96496. a[8] = (a00 * a11 - a01 * a10);
  96497. return this;
  96498. },
  96499. /**
  96500. * Calculate the determinant of this Matrix.
  96501. *
  96502. * @method Phaser.Math.Matrix3#determinant
  96503. * @since 3.0.0
  96504. *
  96505. * @return {number} The determinant of this Matrix.
  96506. */
  96507. determinant: function ()
  96508. {
  96509. var a = this.val;
  96510. var a00 = a[0];
  96511. var a01 = a[1];
  96512. var a02 = a[2];
  96513. var a10 = a[3];
  96514. var a11 = a[4];
  96515. var a12 = a[5];
  96516. var a20 = a[6];
  96517. var a21 = a[7];
  96518. var a22 = a[8];
  96519. return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);
  96520. },
  96521. /**
  96522. * Multiply this Matrix by the given Matrix.
  96523. *
  96524. * @method Phaser.Math.Matrix3#multiply
  96525. * @since 3.0.0
  96526. *
  96527. * @param {Phaser.Math.Matrix3} src - The Matrix to multiply this Matrix by.
  96528. *
  96529. * @return {Phaser.Math.Matrix3} This Matrix3.
  96530. */
  96531. multiply: function (src)
  96532. {
  96533. var a = this.val;
  96534. var a00 = a[0];
  96535. var a01 = a[1];
  96536. var a02 = a[2];
  96537. var a10 = a[3];
  96538. var a11 = a[4];
  96539. var a12 = a[5];
  96540. var a20 = a[6];
  96541. var a21 = a[7];
  96542. var a22 = a[8];
  96543. var b = src.val;
  96544. var b00 = b[0];
  96545. var b01 = b[1];
  96546. var b02 = b[2];
  96547. var b10 = b[3];
  96548. var b11 = b[4];
  96549. var b12 = b[5];
  96550. var b20 = b[6];
  96551. var b21 = b[7];
  96552. var b22 = b[8];
  96553. a[0] = b00 * a00 + b01 * a10 + b02 * a20;
  96554. a[1] = b00 * a01 + b01 * a11 + b02 * a21;
  96555. a[2] = b00 * a02 + b01 * a12 + b02 * a22;
  96556. a[3] = b10 * a00 + b11 * a10 + b12 * a20;
  96557. a[4] = b10 * a01 + b11 * a11 + b12 * a21;
  96558. a[5] = b10 * a02 + b11 * a12 + b12 * a22;
  96559. a[6] = b20 * a00 + b21 * a10 + b22 * a20;
  96560. a[7] = b20 * a01 + b21 * a11 + b22 * a21;
  96561. a[8] = b20 * a02 + b21 * a12 + b22 * a22;
  96562. return this;
  96563. },
  96564. /**
  96565. * Translate this Matrix using the given Vector.
  96566. *
  96567. * @method Phaser.Math.Matrix3#translate
  96568. * @since 3.0.0
  96569. *
  96570. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to translate this Matrix with.
  96571. *
  96572. * @return {Phaser.Math.Matrix3} This Matrix3.
  96573. */
  96574. translate: function (v)
  96575. {
  96576. var a = this.val;
  96577. var x = v.x;
  96578. var y = v.y;
  96579. a[6] = x * a[0] + y * a[3] + a[6];
  96580. a[7] = x * a[1] + y * a[4] + a[7];
  96581. a[8] = x * a[2] + y * a[5] + a[8];
  96582. return this;
  96583. },
  96584. /**
  96585. * Apply a rotation transformation to this Matrix.
  96586. *
  96587. * @method Phaser.Math.Matrix3#rotate
  96588. * @since 3.0.0
  96589. *
  96590. * @param {number} rad - The angle in radians to rotate by.
  96591. *
  96592. * @return {Phaser.Math.Matrix3} This Matrix3.
  96593. */
  96594. rotate: function (rad)
  96595. {
  96596. var a = this.val;
  96597. var a00 = a[0];
  96598. var a01 = a[1];
  96599. var a02 = a[2];
  96600. var a10 = a[3];
  96601. var a11 = a[4];
  96602. var a12 = a[5];
  96603. var s = Math.sin(rad);
  96604. var c = Math.cos(rad);
  96605. a[0] = c * a00 + s * a10;
  96606. a[1] = c * a01 + s * a11;
  96607. a[2] = c * a02 + s * a12;
  96608. a[3] = c * a10 - s * a00;
  96609. a[4] = c * a11 - s * a01;
  96610. a[5] = c * a12 - s * a02;
  96611. return this;
  96612. },
  96613. /**
  96614. * Apply a scale transformation to this Matrix.
  96615. *
  96616. * Uses the `x` and `y` components of the given Vector to scale the Matrix.
  96617. *
  96618. * @method Phaser.Math.Matrix3#scale
  96619. * @since 3.0.0
  96620. *
  96621. * @param {(Phaser.Math.Vector2|Phaser.Math.Vector3|Phaser.Math.Vector4)} v - The Vector to scale this Matrix with.
  96622. *
  96623. * @return {Phaser.Math.Matrix3} This Matrix3.
  96624. */
  96625. scale: function (v)
  96626. {
  96627. var a = this.val;
  96628. var x = v.x;
  96629. var y = v.y;
  96630. a[0] = x * a[0];
  96631. a[1] = x * a[1];
  96632. a[2] = x * a[2];
  96633. a[3] = y * a[3];
  96634. a[4] = y * a[4];
  96635. a[5] = y * a[5];
  96636. return this;
  96637. },
  96638. /**
  96639. * Set the values of this Matrix from the given Quaternion.
  96640. *
  96641. * @method Phaser.Math.Matrix3#fromQuat
  96642. * @since 3.0.0
  96643. *
  96644. * @param {Phaser.Math.Quaternion} q - The Quaternion to set the values of this Matrix from.
  96645. *
  96646. * @return {Phaser.Math.Matrix3} This Matrix3.
  96647. */
  96648. fromQuat: function (q)
  96649. {
  96650. var x = q.x;
  96651. var y = q.y;
  96652. var z = q.z;
  96653. var w = q.w;
  96654. var x2 = x + x;
  96655. var y2 = y + y;
  96656. var z2 = z + z;
  96657. var xx = x * x2;
  96658. var xy = x * y2;
  96659. var xz = x * z2;
  96660. var yy = y * y2;
  96661. var yz = y * z2;
  96662. var zz = z * z2;
  96663. var wx = w * x2;
  96664. var wy = w * y2;
  96665. var wz = w * z2;
  96666. var out = this.val;
  96667. out[0] = 1 - (yy + zz);
  96668. out[3] = xy + wz;
  96669. out[6] = xz - wy;
  96670. out[1] = xy - wz;
  96671. out[4] = 1 - (xx + zz);
  96672. out[7] = yz + wx;
  96673. out[2] = xz + wy;
  96674. out[5] = yz - wx;
  96675. out[8] = 1 - (xx + yy);
  96676. return this;
  96677. },
  96678. /**
  96679. * [description]
  96680. *
  96681. * @method Phaser.Math.Matrix3#normalFromMat4
  96682. * @since 3.0.0
  96683. *
  96684. * @param {Phaser.Math.Matrix4} m - [description]
  96685. *
  96686. * @return {Phaser.Math.Matrix3} This Matrix3.
  96687. */
  96688. normalFromMat4: function (m)
  96689. {
  96690. var a = m.val;
  96691. var out = this.val;
  96692. var a00 = a[0];
  96693. var a01 = a[1];
  96694. var a02 = a[2];
  96695. var a03 = a[3];
  96696. var a10 = a[4];
  96697. var a11 = a[5];
  96698. var a12 = a[6];
  96699. var a13 = a[7];
  96700. var a20 = a[8];
  96701. var a21 = a[9];
  96702. var a22 = a[10];
  96703. var a23 = a[11];
  96704. var a30 = a[12];
  96705. var a31 = a[13];
  96706. var a32 = a[14];
  96707. var a33 = a[15];
  96708. var b00 = a00 * a11 - a01 * a10;
  96709. var b01 = a00 * a12 - a02 * a10;
  96710. var b02 = a00 * a13 - a03 * a10;
  96711. var b03 = a01 * a12 - a02 * a11;
  96712. var b04 = a01 * a13 - a03 * a11;
  96713. var b05 = a02 * a13 - a03 * a12;
  96714. var b06 = a20 * a31 - a21 * a30;
  96715. var b07 = a20 * a32 - a22 * a30;
  96716. var b08 = a20 * a33 - a23 * a30;
  96717. var b09 = a21 * a32 - a22 * a31;
  96718. var b10 = a21 * a33 - a23 * a31;
  96719. var b11 = a22 * a33 - a23 * a32;
  96720. // Calculate the determinant
  96721. var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
  96722. if (!det)
  96723. {
  96724. return null;
  96725. }
  96726. det = 1 / det;
  96727. out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;
  96728. out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;
  96729. out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;
  96730. out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;
  96731. out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;
  96732. out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;
  96733. out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;
  96734. out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;
  96735. out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;
  96736. return this;
  96737. }
  96738. });
  96739. module.exports = Matrix3;
  96740. /***/ }),
  96741. /* 528 */
  96742. /***/ (function(module, exports, __webpack_require__) {
  96743. /**
  96744. * @author Richard Davey <rich@photonstorm.com>
  96745. * @copyright 2018 Photon Storm Ltd.
  96746. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  96747. */
  96748. // Adapted from [gl-matrix](https://github.com/toji/gl-matrix) by toji
  96749. // and [vecmath](https://github.com/mattdesl/vecmath) by mattdesl
  96750. var Class = __webpack_require__(0);
  96751. var Vector3 = __webpack_require__(87);
  96752. var Matrix3 = __webpack_require__(527);
  96753. var EPSILON = 0.000001;
  96754. // Some shared 'private' arrays
  96755. var siNext = new Int8Array([ 1, 2, 0 ]);
  96756. var tmp = new Float32Array([ 0, 0, 0 ]);
  96757. var xUnitVec3 = new Vector3(1, 0, 0);
  96758. var yUnitVec3 = new Vector3(0, 1, 0);
  96759. var tmpvec = new Vector3();
  96760. var tmpMat3 = new Matrix3();
  96761. /**
  96762. * @classdesc
  96763. * A quaternion.
  96764. *
  96765. * @class Quaternion
  96766. * @memberOf Phaser.Math
  96767. * @constructor
  96768. * @since 3.0.0
  96769. *
  96770. * @param {number} [x] - The x component.
  96771. * @param {number} [y] - The y component.
  96772. * @param {number} [z] - The z component.
  96773. * @param {number} [w] - The w component.
  96774. */
  96775. var Quaternion = new Class({
  96776. initialize:
  96777. function Quaternion (x, y, z, w)
  96778. {
  96779. /**
  96780. * The x component of this Quaternion.
  96781. *
  96782. * @name Phaser.Math.Quaternion#x
  96783. * @type {number}
  96784. * @default 0
  96785. * @since 3.0.0
  96786. */
  96787. /**
  96788. * The y component of this Quaternion.
  96789. *
  96790. * @name Phaser.Math.Quaternion#y
  96791. * @type {number}
  96792. * @default 0
  96793. * @since 3.0.0
  96794. */
  96795. /**
  96796. * The z component of this Quaternion.
  96797. *
  96798. * @name Phaser.Math.Quaternion#z
  96799. * @type {number}
  96800. * @default 0
  96801. * @since 3.0.0
  96802. */
  96803. /**
  96804. * The w component of this Quaternion.
  96805. *
  96806. * @name Phaser.Math.Quaternion#w
  96807. * @type {number}
  96808. * @default 0
  96809. * @since 3.0.0
  96810. */
  96811. if (typeof x === 'object')
  96812. {
  96813. this.x = x.x || 0;
  96814. this.y = x.y || 0;
  96815. this.z = x.z || 0;
  96816. this.w = x.w || 0;
  96817. }
  96818. else
  96819. {
  96820. this.x = x || 0;
  96821. this.y = y || 0;
  96822. this.z = z || 0;
  96823. this.w = w || 0;
  96824. }
  96825. },
  96826. /**
  96827. * Copy the components of a given Quaternion or Vector into this Quaternion.
  96828. *
  96829. * @method Phaser.Math.Quaternion#copy
  96830. * @since 3.0.0
  96831. *
  96832. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} src - The Quaternion or Vector to copy the components from.
  96833. *
  96834. * @return {Phaser.Math.Quaternion} This Quaternion.
  96835. */
  96836. copy: function (src)
  96837. {
  96838. this.x = src.x;
  96839. this.y = src.y;
  96840. this.z = src.z;
  96841. this.w = src.w;
  96842. return this;
  96843. },
  96844. /**
  96845. * Set the components of this Quaternion.
  96846. *
  96847. * @method Phaser.Math.Quaternion#set
  96848. * @since 3.0.0
  96849. *
  96850. * @param {(number|object)} [x=0] - The x component, or an object containing x, y, z, and w components.
  96851. * @param {number} [y=0] - The y component.
  96852. * @param {number} [z=0] - The z component.
  96853. * @param {number} [w=0] - The w component.
  96854. *
  96855. * @return {Phaser.Math.Quaternion} This Quaternion.
  96856. */
  96857. set: function (x, y, z, w)
  96858. {
  96859. if (typeof x === 'object')
  96860. {
  96861. this.x = x.x || 0;
  96862. this.y = x.y || 0;
  96863. this.z = x.z || 0;
  96864. this.w = x.w || 0;
  96865. }
  96866. else
  96867. {
  96868. this.x = x || 0;
  96869. this.y = y || 0;
  96870. this.z = z || 0;
  96871. this.w = w || 0;
  96872. }
  96873. return this;
  96874. },
  96875. /**
  96876. * Add a given Quaternion or Vector to this Quaternion. Addition is component-wise.
  96877. *
  96878. * @method Phaser.Math.Quaternion#add
  96879. * @since 3.0.0
  96880. *
  96881. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} v - The Quaternion or Vector to add to this Quaternion.
  96882. *
  96883. * @return {Phaser.Math.Quaternion} This Quaternion.
  96884. */
  96885. add: function (v)
  96886. {
  96887. this.x += v.x;
  96888. this.y += v.y;
  96889. this.z += v.z;
  96890. this.w += v.w;
  96891. return this;
  96892. },
  96893. /**
  96894. * Subtract a given Quaternion or Vector from this Quaternion. Subtraction is component-wise.
  96895. *
  96896. * @method Phaser.Math.Quaternion#subtract
  96897. * @since 3.0.0
  96898. *
  96899. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} v - The Quaternion or Vector to subtract from this Quaternion.
  96900. *
  96901. * @return {Phaser.Math.Quaternion} This Quaternion.
  96902. */
  96903. subtract: function (v)
  96904. {
  96905. this.x -= v.x;
  96906. this.y -= v.y;
  96907. this.z -= v.z;
  96908. this.w -= v.w;
  96909. return this;
  96910. },
  96911. /**
  96912. * Scale this Quaternion by the given value.
  96913. *
  96914. * @method Phaser.Math.Quaternion#scale
  96915. * @since 3.0.0
  96916. *
  96917. * @param {number} scale - The value to scale this Quaternion by.
  96918. *
  96919. * @return {Phaser.Math.Quaternion} This Quaternion.
  96920. */
  96921. scale: function (scale)
  96922. {
  96923. this.x *= scale;
  96924. this.y *= scale;
  96925. this.z *= scale;
  96926. this.w *= scale;
  96927. return this;
  96928. },
  96929. /**
  96930. * Calculate the length of this Quaternion.
  96931. *
  96932. * @method Phaser.Math.Quaternion#length
  96933. * @since 3.0.0
  96934. *
  96935. * @return {number} The length of this Quaternion.
  96936. */
  96937. length: function ()
  96938. {
  96939. var x = this.x;
  96940. var y = this.y;
  96941. var z = this.z;
  96942. var w = this.w;
  96943. return Math.sqrt(x * x + y * y + z * z + w * w);
  96944. },
  96945. /**
  96946. * Calculate the length of this Quaternion squared.
  96947. *
  96948. * @method Phaser.Math.Quaternion#lengthSq
  96949. * @since 3.0.0
  96950. *
  96951. * @return {number} The length of this Quaternion, squared.
  96952. */
  96953. lengthSq: function ()
  96954. {
  96955. var x = this.x;
  96956. var y = this.y;
  96957. var z = this.z;
  96958. var w = this.w;
  96959. return x * x + y * y + z * z + w * w;
  96960. },
  96961. /**
  96962. * Normalize this Quaternion.
  96963. *
  96964. * @method Phaser.Math.Quaternion#normalize
  96965. * @since 3.0.0
  96966. *
  96967. * @return {Phaser.Math.Quaternion} This Quaternion.
  96968. */
  96969. normalize: function ()
  96970. {
  96971. var x = this.x;
  96972. var y = this.y;
  96973. var z = this.z;
  96974. var w = this.w;
  96975. var len = x * x + y * y + z * z + w * w;
  96976. if (len > 0)
  96977. {
  96978. len = 1 / Math.sqrt(len);
  96979. this.x = x * len;
  96980. this.y = y * len;
  96981. this.z = z * len;
  96982. this.w = w * len;
  96983. }
  96984. return this;
  96985. },
  96986. /**
  96987. * Calculate the dot product of this Quaternion and the given Quaternion or Vector.
  96988. *
  96989. * @method Phaser.Math.Quaternion#dot
  96990. * @since 3.0.0
  96991. *
  96992. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} v - The Quaternion or Vector to dot product with this Quaternion.
  96993. *
  96994. * @return {number} The dot product of this Quaternion and the given Quaternion or Vector.
  96995. */
  96996. dot: function (v)
  96997. {
  96998. return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;
  96999. },
  97000. /**
  97001. * Linearly interpolate this Quaternion towards the given Quaternion or Vector.
  97002. *
  97003. * @method Phaser.Math.Quaternion#lerp
  97004. * @since 3.0.0
  97005. *
  97006. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} v - The Quaternion or Vector to interpolate towards.
  97007. * @param {number} [t=0] - The percentage of interpolation.
  97008. *
  97009. * @return {Phaser.Math.Quaternion} This Quaternion.
  97010. */
  97011. lerp: function (v, t)
  97012. {
  97013. if (t === undefined) { t = 0; }
  97014. var ax = this.x;
  97015. var ay = this.y;
  97016. var az = this.z;
  97017. var aw = this.w;
  97018. this.x = ax + t * (v.x - ax);
  97019. this.y = ay + t * (v.y - ay);
  97020. this.z = az + t * (v.z - az);
  97021. this.w = aw + t * (v.w - aw);
  97022. return this;
  97023. },
  97024. /**
  97025. * [description]
  97026. *
  97027. * @method Phaser.Math.Quaternion#rotationTo
  97028. * @since 3.0.0
  97029. *
  97030. * @param {Phaser.Math.Vector3} a - [description]
  97031. * @param {Phaser.Math.Vector3} b - [description]
  97032. *
  97033. * @return {Phaser.Math.Quaternion} This Quaternion.
  97034. */
  97035. rotationTo: function (a, b)
  97036. {
  97037. var dot = a.x * b.x + a.y * b.y + a.z * b.z;
  97038. if (dot < -0.999999)
  97039. {
  97040. if (tmpvec.copy(xUnitVec3).cross(a).length() < EPSILON)
  97041. {
  97042. tmpvec.copy(yUnitVec3).cross(a);
  97043. }
  97044. tmpvec.normalize();
  97045. return this.setAxisAngle(tmpvec, Math.PI);
  97046. }
  97047. else if (dot > 0.999999)
  97048. {
  97049. this.x = 0;
  97050. this.y = 0;
  97051. this.z = 0;
  97052. this.w = 1;
  97053. return this;
  97054. }
  97055. else
  97056. {
  97057. tmpvec.copy(a).cross(b);
  97058. this.x = tmpvec.x;
  97059. this.y = tmpvec.y;
  97060. this.z = tmpvec.z;
  97061. this.w = 1 + dot;
  97062. return this.normalize();
  97063. }
  97064. },
  97065. /**
  97066. * Set the axes of this Quaternion.
  97067. *
  97068. * @method Phaser.Math.Quaternion#setAxes
  97069. * @since 3.0.0
  97070. *
  97071. * @param {Phaser.Math.Vector3} view - The view axis.
  97072. * @param {Phaser.Math.Vector3} right - The right axis.
  97073. * @param {Phaser.Math.Vector3} up - The upwards axis.
  97074. *
  97075. * @return {Phaser.Math.Quaternion} This Quaternion.
  97076. */
  97077. setAxes: function (view, right, up)
  97078. {
  97079. var m = tmpMat3.val;
  97080. m[0] = right.x;
  97081. m[3] = right.y;
  97082. m[6] = right.z;
  97083. m[1] = up.x;
  97084. m[4] = up.y;
  97085. m[7] = up.z;
  97086. m[2] = -view.x;
  97087. m[5] = -view.y;
  97088. m[8] = -view.z;
  97089. return this.fromMat3(tmpMat3).normalize();
  97090. },
  97091. /**
  97092. * Reset this Matrix to an identity (default) Quaternion.
  97093. *
  97094. * @method Phaser.Math.Quaternion#identity
  97095. * @since 3.0.0
  97096. *
  97097. * @return {Phaser.Math.Quaternion} This Quaternion.
  97098. */
  97099. identity: function ()
  97100. {
  97101. this.x = 0;
  97102. this.y = 0;
  97103. this.z = 0;
  97104. this.w = 1;
  97105. return this;
  97106. },
  97107. /**
  97108. * Set the axis angle of this Quaternion.
  97109. *
  97110. * @method Phaser.Math.Quaternion#setAxisAngle
  97111. * @since 3.0.0
  97112. *
  97113. * @param {Phaser.Math.Vector3} axis - The axis.
  97114. * @param {number} rad - The angle in radians.
  97115. *
  97116. * @return {Phaser.Math.Quaternion} This Quaternion.
  97117. */
  97118. setAxisAngle: function (axis, rad)
  97119. {
  97120. rad = rad * 0.5;
  97121. var s = Math.sin(rad);
  97122. this.x = s * axis.x;
  97123. this.y = s * axis.y;
  97124. this.z = s * axis.z;
  97125. this.w = Math.cos(rad);
  97126. return this;
  97127. },
  97128. /**
  97129. * Multiply this Quaternion by the given Quaternion or Vector.
  97130. *
  97131. * @method Phaser.Math.Quaternion#multiply
  97132. * @since 3.0.0
  97133. *
  97134. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} b - The Quaternion or Vector to multiply this Quaternion by.
  97135. *
  97136. * @return {Phaser.Math.Quaternion} This Quaternion.
  97137. */
  97138. multiply: function (b)
  97139. {
  97140. var ax = this.x;
  97141. var ay = this.y;
  97142. var az = this.z;
  97143. var aw = this.w;
  97144. var bx = b.x;
  97145. var by = b.y;
  97146. var bz = b.z;
  97147. var bw = b.w;
  97148. this.x = ax * bw + aw * bx + ay * bz - az * by;
  97149. this.y = ay * bw + aw * by + az * bx - ax * bz;
  97150. this.z = az * bw + aw * bz + ax * by - ay * bx;
  97151. this.w = aw * bw - ax * bx - ay * by - az * bz;
  97152. return this;
  97153. },
  97154. /**
  97155. * Smoothly linearly interpolate this Quaternion towards the given Quaternion or Vector.
  97156. *
  97157. * @method Phaser.Math.Quaternion#slerp
  97158. * @since 3.0.0
  97159. *
  97160. * @param {(Phaser.Math.Quaternion|Phaser.Math.Vector4)} b - The Quaternion or Vector to interpolate towards.
  97161. * @param {number} t - The percentage of interpolation.
  97162. *
  97163. * @return {Phaser.Math.Quaternion} This Quaternion.
  97164. */
  97165. slerp: function (b, t)
  97166. {
  97167. // benchmarks: http://jsperf.com/quaternion-slerp-implementations
  97168. var ax = this.x;
  97169. var ay = this.y;
  97170. var az = this.z;
  97171. var aw = this.w;
  97172. var bx = b.x;
  97173. var by = b.y;
  97174. var bz = b.z;
  97175. var bw = b.w;
  97176. // calc cosine
  97177. var cosom = ax * bx + ay * by + az * bz + aw * bw;
  97178. // adjust signs (if necessary)
  97179. if (cosom < 0)
  97180. {
  97181. cosom = -cosom;
  97182. bx = - bx;
  97183. by = - by;
  97184. bz = - bz;
  97185. bw = - bw;
  97186. }
  97187. // "from" and "to" quaternions are very close
  97188. // ... so we can do a linear interpolation
  97189. var scale0 = 1 - t;
  97190. var scale1 = t;
  97191. // calculate coefficients
  97192. if ((1 - cosom) > EPSILON)
  97193. {
  97194. // standard case (slerp)
  97195. var omega = Math.acos(cosom);
  97196. var sinom = Math.sin(omega);
  97197. scale0 = Math.sin((1.0 - t) * omega) / sinom;
  97198. scale1 = Math.sin(t * omega) / sinom;
  97199. }
  97200. // calculate final values
  97201. this.x = scale0 * ax + scale1 * bx;
  97202. this.y = scale0 * ay + scale1 * by;
  97203. this.z = scale0 * az + scale1 * bz;
  97204. this.w = scale0 * aw + scale1 * bw;
  97205. return this;
  97206. },
  97207. /**
  97208. * Invert this Quaternion.
  97209. *
  97210. * @method Phaser.Math.Quaternion#invert
  97211. * @since 3.0.0
  97212. *
  97213. * @return {Phaser.Math.Quaternion} This Quaternion.
  97214. */
  97215. invert: function ()
  97216. {
  97217. var a0 = this.x;
  97218. var a1 = this.y;
  97219. var a2 = this.z;
  97220. var a3 = this.w;
  97221. var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;
  97222. var invDot = (dot) ? 1 / dot : 0;
  97223. // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0
  97224. this.x = -a0 * invDot;
  97225. this.y = -a1 * invDot;
  97226. this.z = -a2 * invDot;
  97227. this.w = a3 * invDot;
  97228. return this;
  97229. },
  97230. /**
  97231. * Convert this Quaternion into its conjugate.
  97232. *
  97233. * Sets the x, y and z components.
  97234. *
  97235. * @method Phaser.Math.Quaternion#conjugate
  97236. * @since 3.0.0
  97237. *
  97238. * @return {Phaser.Math.Quaternion} This Quaternion.
  97239. */
  97240. conjugate: function ()
  97241. {
  97242. this.x = -this.x;
  97243. this.y = -this.y;
  97244. this.z = -this.z;
  97245. return this;
  97246. },
  97247. /**
  97248. * Rotate this Quaternion on the X axis.
  97249. *
  97250. * @method Phaser.Math.Quaternion#rotateX
  97251. * @since 3.0.0
  97252. *
  97253. * @param {number} rad - The rotation angle in radians.
  97254. *
  97255. * @return {Phaser.Math.Quaternion} This Quaternion.
  97256. */
  97257. rotateX: function (rad)
  97258. {
  97259. rad *= 0.5;
  97260. var ax = this.x;
  97261. var ay = this.y;
  97262. var az = this.z;
  97263. var aw = this.w;
  97264. var bx = Math.sin(rad);
  97265. var bw = Math.cos(rad);
  97266. this.x = ax * bw + aw * bx;
  97267. this.y = ay * bw + az * bx;
  97268. this.z = az * bw - ay * bx;
  97269. this.w = aw * bw - ax * bx;
  97270. return this;
  97271. },
  97272. /**
  97273. * Rotate this Quaternion on the Y axis.
  97274. *
  97275. * @method Phaser.Math.Quaternion#rotateY
  97276. * @since 3.0.0
  97277. *
  97278. * @param {number} rad - The rotation angle in radians.
  97279. *
  97280. * @return {Phaser.Math.Quaternion} This Quaternion.
  97281. */
  97282. rotateY: function (rad)
  97283. {
  97284. rad *= 0.5;
  97285. var ax = this.x;
  97286. var ay = this.y;
  97287. var az = this.z;
  97288. var aw = this.w;
  97289. var by = Math.sin(rad);
  97290. var bw = Math.cos(rad);
  97291. this.x = ax * bw - az * by;
  97292. this.y = ay * bw + aw * by;
  97293. this.z = az * bw + ax * by;
  97294. this.w = aw * bw - ay * by;
  97295. return this;
  97296. },
  97297. /**
  97298. * Rotate this Quaternion on the Z axis.
  97299. *
  97300. * @method Phaser.Math.Quaternion#rotateZ
  97301. * @since 3.0.0
  97302. *
  97303. * @param {number} rad - The rotation angle in radians.
  97304. *
  97305. * @return {Phaser.Math.Quaternion} This Quaternion.
  97306. */
  97307. rotateZ: function (rad)
  97308. {
  97309. rad *= 0.5;
  97310. var ax = this.x;
  97311. var ay = this.y;
  97312. var az = this.z;
  97313. var aw = this.w;
  97314. var bz = Math.sin(rad);
  97315. var bw = Math.cos(rad);
  97316. this.x = ax * bw + ay * bz;
  97317. this.y = ay * bw - ax * bz;
  97318. this.z = az * bw + aw * bz;
  97319. this.w = aw * bw - az * bz;
  97320. return this;
  97321. },
  97322. /**
  97323. * Create a unit (or rotation) Quaternion from its x, y, and z components.
  97324. *
  97325. * Sets the w component.
  97326. *
  97327. * @method Phaser.Math.Quaternion#calculateW
  97328. * @since 3.0.0
  97329. *
  97330. * @return {Phaser.Math.Quaternion} This Quaternion.
  97331. */
  97332. calculateW: function ()
  97333. {
  97334. var x = this.x;
  97335. var y = this.y;
  97336. var z = this.z;
  97337. this.w = -Math.sqrt(1.0 - x * x - y * y - z * z);
  97338. return this;
  97339. },
  97340. /**
  97341. * Convert the given Matrix into this Quaternion.
  97342. *
  97343. * @method Phaser.Math.Quaternion#fromMat3
  97344. * @since 3.0.0
  97345. *
  97346. * @param {Phaser.Math.Matrix3} mat - The Matrix to convert from.
  97347. *
  97348. * @return {Phaser.Math.Quaternion} This Quaternion.
  97349. */
  97350. fromMat3: function (mat)
  97351. {
  97352. // benchmarks:
  97353. // http://jsperf.com/typed-array-access-speed
  97354. // http://jsperf.com/conversion-of-3x3-matrix-to-quaternion
  97355. // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes
  97356. // article "Quaternion Calculus and Fast Animation".
  97357. var m = mat.val;
  97358. var fTrace = m[0] + m[4] + m[8];
  97359. var fRoot;
  97360. if (fTrace > 0)
  97361. {
  97362. // |w| > 1/2, may as well choose w > 1/2
  97363. fRoot = Math.sqrt(fTrace + 1.0); // 2w
  97364. this.w = 0.5 * fRoot;
  97365. fRoot = 0.5 / fRoot; // 1/(4w)
  97366. this.x = (m[7] - m[5]) * fRoot;
  97367. this.y = (m[2] - m[6]) * fRoot;
  97368. this.z = (m[3] - m[1]) * fRoot;
  97369. }
  97370. else
  97371. {
  97372. // |w| <= 1/2
  97373. var i = 0;
  97374. if (m[4] > m[0])
  97375. {
  97376. i = 1;
  97377. }
  97378. if (m[8] > m[i * 3 + i])
  97379. {
  97380. i = 2;
  97381. }
  97382. var j = siNext[i];
  97383. var k = siNext[j];
  97384. // This isn't quite as clean without array access
  97385. fRoot = Math.sqrt(m[i * 3 + i] - m[j * 3 + j] - m[k * 3 + k] + 1);
  97386. tmp[i] = 0.5 * fRoot;
  97387. fRoot = 0.5 / fRoot;
  97388. tmp[j] = (m[j * 3 + i] + m[i * 3 + j]) * fRoot;
  97389. tmp[k] = (m[k * 3 + i] + m[i * 3 + k]) * fRoot;
  97390. this.x = tmp[0];
  97391. this.y = tmp[1];
  97392. this.z = tmp[2];
  97393. this.w = (m[k * 3 + j] - m[j * 3 + k]) * fRoot;
  97394. }
  97395. return this;
  97396. }
  97397. });
  97398. module.exports = Quaternion;
  97399. /***/ }),
  97400. /* 529 */
  97401. /***/ (function(module, exports, __webpack_require__) {
  97402. /**
  97403. * @author Richard Davey <rich@photonstorm.com>
  97404. * @copyright 2018 Photon Storm Ltd.
  97405. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97406. */
  97407. var Vector3 = __webpack_require__(87);
  97408. var Matrix4 = __webpack_require__(272);
  97409. var Quaternion = __webpack_require__(528);
  97410. var tmpMat4 = new Matrix4();
  97411. var tmpQuat = new Quaternion();
  97412. var tmpVec3 = new Vector3();
  97413. /**
  97414. * Rotates a vector in place by axis angle.
  97415. *
  97416. * This is the same as transforming a point by an
  97417. * axis-angle quaternion, but it has higher precision.
  97418. *
  97419. * @function Phaser.Math.RotateVec3
  97420. * @since 3.0.0
  97421. *
  97422. * @param {Phaser.Math.Vector3} vec - The vector to be rotated.
  97423. * @param {Phaser.Math.Vector3} axis - The axis to rotate around.
  97424. * @param {number} radians - The angle of rotation in radians.
  97425. *
  97426. * @return {Phaser.Math.Vector3} The given vector.
  97427. */
  97428. var RotateVec3 = function (vec, axis, radians)
  97429. {
  97430. // Set the quaternion to our axis angle
  97431. tmpQuat.setAxisAngle(axis, radians);
  97432. // Create a rotation matrix from the axis angle
  97433. tmpMat4.fromRotationTranslation(tmpQuat, tmpVec3.set(0, 0, 0));
  97434. // Multiply our vector by the rotation matrix
  97435. return vec.transformMat4(tmpMat4);
  97436. };
  97437. module.exports = RotateVec3;
  97438. /***/ }),
  97439. /* 530 */
  97440. /***/ (function(module, exports) {
  97441. /**
  97442. * @author Richard Davey <rich@photonstorm.com>
  97443. * @copyright 2018 Photon Storm Ltd.
  97444. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97445. */
  97446. /**
  97447. * Compute a random four-dimensional vector.
  97448. *
  97449. * @function Phaser.Math.RandomXYZW
  97450. * @since 3.0.0
  97451. *
  97452. * @param {Phaser.Math.Vector4} vec4 - The Vector to compute random values for.
  97453. * @param {number} [scale=1] - The scale of the random values.
  97454. *
  97455. * @return {Phaser.Math.Vector4} The given Vector.
  97456. */
  97457. var RandomXYZW = function (vec4, scale)
  97458. {
  97459. if (scale === undefined) { scale = 1; }
  97460. // TODO: Not spherical; should fix this for more uniform distribution
  97461. vec4.x = (Math.random() * 2 - 1) * scale;
  97462. vec4.y = (Math.random() * 2 - 1) * scale;
  97463. vec4.z = (Math.random() * 2 - 1) * scale;
  97464. vec4.w = (Math.random() * 2 - 1) * scale;
  97465. return vec4;
  97466. };
  97467. module.exports = RandomXYZW;
  97468. /***/ }),
  97469. /* 531 */
  97470. /***/ (function(module, exports) {
  97471. /**
  97472. * @author Richard Davey <rich@photonstorm.com>
  97473. * @copyright 2018 Photon Storm Ltd.
  97474. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97475. */
  97476. /**
  97477. * Compute a random position vector in a spherical area, optionally defined by the given radius.
  97478. *
  97479. * @function Phaser.Math.RandomXYZ
  97480. * @since 3.0.0
  97481. *
  97482. * @param {Phaser.Math.Vector3} vec3 - The Vector to compute random values for.
  97483. * @param {number} [radius=1] - The radius.
  97484. *
  97485. * @return {Phaser.Math.Vector3} The given Vector.
  97486. */
  97487. var RandomXYZ = function (vec3, radius)
  97488. {
  97489. if (radius === undefined) { radius = 1; }
  97490. var r = Math.random() * 2 * Math.PI;
  97491. var z = (Math.random() * 2) - 1;
  97492. var zScale = Math.sqrt(1 - z * z) * radius;
  97493. vec3.x = Math.cos(r) * zScale;
  97494. vec3.y = Math.sin(r) * zScale;
  97495. vec3.z = z * radius;
  97496. return vec3;
  97497. };
  97498. module.exports = RandomXYZ;
  97499. /***/ }),
  97500. /* 532 */
  97501. /***/ (function(module, exports, __webpack_require__) {
  97502. /**
  97503. * @author Richard Davey <rich@photonstorm.com>
  97504. * @copyright 2018 Photon Storm Ltd.
  97505. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  97506. */
  97507. var Camera = __webpack_require__(124);
  97508. var Class = __webpack_require__(0);
  97509. var GetFastValue = __webpack_require__(1);
  97510. var PluginCache = __webpack_require__(12);
  97511. var RectangleContains = __webpack_require__(31);
  97512. /**
  97513. * @typedef {object} InputJSONCameraObject
  97514. *
  97515. * @property {string} [name=''] - The name of the Camera.
  97516. * @property {integer} [x=0] - The horizontal position of the Camera viewport.
  97517. * @property {integer} [y=0] - The vertical position of the Camera viewport.
  97518. * @property {integer} [width] - The width of the Camera viewport.
  97519. * @property {integer} [height] - The height of the Camera viewport.
  97520. * @property {number} [zoom=1] - The default zoom level of the Camera.
  97521. * @property {number} [rotation=0] - The rotation of the Camera, in radians.
  97522. * @property {boolean} [roundPixels=false] - Should the Camera round pixels before rendering?
  97523. * @property {number} [scrollX=0] - The horizontal scroll position of the Camera.
  97524. * @property {number} [scrollY=0] - The vertical scroll position of the Camera.
  97525. * @property {(false|string)} [backgroundColor=false] - A CSS color string controlling the Camera background color.
  97526. * @property {?object} [bounds] - Defines the Camera bounds.
  97527. * @property {number} [bounds.x=0] - The top-left extent of the Camera bounds.
  97528. * @property {number} [bounds.y=0] - The top-left extent of the Camera bounds.
  97529. * @property {number} [bounds.width] - The width of the Camera bounds.
  97530. * @property {number} [bounds.height] - The height of the Camera bounds.
  97531. */
  97532. /**
  97533. * @classdesc
  97534. * The Camera Manager is a plugin that belongs to a Scene and is responsible for managing all of the Scene Cameras.
  97535. *
  97536. * By default you can access the Camera Manager from within a Scene using `this.cameras`, although this can be changed
  97537. * in your game config.
  97538. *
  97539. * Create new Cameras using the `add` method. Or extend the Camera class with your own addition code and then add
  97540. * the new Camera in using the `addExisting` method.
  97541. *
  97542. * Cameras provide a view into your game world, and can be positioned, rotated, zoomed and scrolled accordingly.
  97543. *
  97544. * A Camera consists of two elements: The viewport and the scroll values.
  97545. *
  97546. * The viewport is the physical position and size of the Camera within your game. Cameras, by default, are
  97547. * created the same size as your game, but their position and size can be set to anything. This means if you
  97548. * wanted to create a camera that was 320x200 in size, positioned in the bottom-right corner of your game,
  97549. * you'd adjust the viewport to do that (using methods like `setViewport` and `setSize`).
  97550. *
  97551. * If you wish to change where the Camera is looking in your game, then you scroll it. You can do this
  97552. * via the properties `scrollX` and `scrollY` or the method `setScroll`. Scrolling has no impact on the
  97553. * viewport, and changing the viewport has no impact on the scrolling.
  97554. *
  97555. * By default a Camera will render all Game Objects it can see. You can change this using the `ignore` method,
  97556. * allowing you to filter Game Objects out on a per-Camera basis. The Camera Manager can manage up to 31 unique
  97557. * 'Game Object ignore capable' Cameras. Any Cameras beyond 31 that you create will all be given a Camera ID of
  97558. * zero, meaning that they cannot be used for Game Object exclusion. This means if you need your Camera to ignore
  97559. * Game Objects, make sure it's one of the first 31 created.
  97560. *
  97561. * A Camera also has built-in special effects including Fade, Flash, Camera Shake, Pan and Zoom.
  97562. *
  97563. * @class CameraManager
  97564. * @memberOf Phaser.Cameras.Scene2D
  97565. * @constructor
  97566. * @since 3.0.0
  97567. *
  97568. * @param {Phaser.Scene} scene - The Scene that owns the Camera Manager plugin.
  97569. */
  97570. var CameraManager = new Class({
  97571. initialize:
  97572. function CameraManager (scene)
  97573. {
  97574. /**
  97575. * The Scene that owns the Camera Manager plugin.
  97576. *
  97577. * @name Phaser.Cameras.Scene2D.CameraManager#scene
  97578. * @type {Phaser.Scene}
  97579. * @since 3.0.0
  97580. */
  97581. this.scene = scene;
  97582. /**
  97583. * A reference to the Scene.Systems handler for the Scene that owns the Camera Manager.
  97584. *
  97585. * @name Phaser.Cameras.Scene2D.CameraManager#systems
  97586. * @type {Phaser.Scenes.Systems}
  97587. * @since 3.0.0
  97588. */
  97589. this.systems = scene.sys;
  97590. /**
  97591. * All Cameras created by, or added to, this Camera Manager, will have their `roundPixels`
  97592. * property set to match this value. By default it is set to match the value set in the
  97593. * game configuration, but can be changed at any point. Equally, individual cameras can
  97594. * also be changed as needed.
  97595. *
  97596. * @name Phaser.Cameras.Scene2D.CameraManager#roundPixels
  97597. * @type {boolean}
  97598. * @since 3.11.0
  97599. */
  97600. this.roundPixels = scene.sys.game.config.roundPixels;
  97601. /**
  97602. * An Array of the Camera objects being managed by this Camera Manager.
  97603. * The Cameras are updated and rendered in the same order in which they appear in this array.
  97604. * Do not directly add or remove entries to this array. However, you can move the contents
  97605. * around the array should you wish to adjust the display order.
  97606. *
  97607. * @name Phaser.Cameras.Scene2D.CameraManager#cameras
  97608. * @type {Phaser.Cameras.Scene2D.Camera[]}
  97609. * @since 3.0.0
  97610. */
  97611. this.cameras = [];
  97612. /**
  97613. * A handy reference to the 'main' camera. By default this is the first Camera the
  97614. * Camera Manager creates. You can also set it directly, or use the `makeMain` argument
  97615. * in the `add` and `addExisting` methods. It allows you to access it from your game:
  97616. *
  97617. * ```javascript
  97618. * var cam = this.cameras.main;
  97619. * ```
  97620. *
  97621. * Also see the properties `camera1`, `camera2` and so on.
  97622. *
  97623. * @name Phaser.Cameras.Scene2D.CameraManager#main
  97624. * @type {Phaser.Cameras.Scene2D.Camera}
  97625. * @since 3.0.0
  97626. */
  97627. this.main;
  97628. /**
  97629. * This scale affects all cameras. It's used by the Scale Manager.
  97630. *
  97631. * @name Phaser.Cameras.Scene2D.CameraManager#baseScale
  97632. * @type {number}
  97633. * @since 3.0.0
  97634. */
  97635. this.baseScale = 1;
  97636. scene.sys.events.once('boot', this.boot, this);
  97637. scene.sys.events.on('start', this.start, this);
  97638. },
  97639. /**
  97640. * This method is called automatically, only once, when the Scene is first created.
  97641. * Do not invoke it directly.
  97642. *
  97643. * @method Phaser.Cameras.Scene2D.CameraManager#boot
  97644. * @private
  97645. * @since 3.5.1
  97646. */
  97647. boot: function ()
  97648. {
  97649. var sys = this.systems;
  97650. if (sys.settings.cameras)
  97651. {
  97652. // We have cameras to create
  97653. this.fromJSON(sys.settings.cameras);
  97654. }
  97655. else
  97656. {
  97657. // Make one
  97658. this.add();
  97659. }
  97660. this.main = this.cameras[0];
  97661. this.systems.events.once('destroy', this.destroy, this);
  97662. },
  97663. /**
  97664. * This method is called automatically by the Scene when it is starting up.
  97665. * It is responsible for creating local systems, properties and listening for Scene events.
  97666. * Do not invoke it directly.
  97667. *
  97668. * @method Phaser.Cameras.Scene2D.CameraManager#start
  97669. * @private
  97670. * @since 3.5.0
  97671. */
  97672. start: function ()
  97673. {
  97674. if (!this.main)
  97675. {
  97676. this.boot();
  97677. }
  97678. var eventEmitter = this.systems.events;
  97679. eventEmitter.on('update', this.update, this);
  97680. eventEmitter.once('shutdown', this.shutdown, this);
  97681. },
  97682. /**
  97683. * Adds a new Camera into the Camera Manager. The Camera Manager can support up to 31 different Cameras.
  97684. *
  97685. * Each Camera has its own viewport, which controls the size of the Camera and its position within the canvas.
  97686. *
  97687. * Use the `Camera.scrollX` and `Camera.scrollY` properties to change where the Camera is looking, or the
  97688. * Camera methods such as `centerOn`. Cameras also have built in special effects, such as fade, flash, shake,
  97689. * pan and zoom.
  97690. *
  97691. * By default Cameras are transparent and will render anything that they can see based on their `scrollX`
  97692. * and `scrollY` values. Game Objects can be set to be ignored by a Camera by using the `Camera.ignore` method.
  97693. *
  97694. * The Camera will have its `roundPixels` propery set to whatever `CameraManager.roundPixels` is. You can change
  97695. * it after creation if required.
  97696. *
  97697. * See the Camera class documentation for more details.
  97698. *
  97699. * @method Phaser.Cameras.Scene2D.CameraManager#add
  97700. * @since 3.0.0
  97701. *
  97702. * @param {integer} [x=0] - The horizontal position of the Camera viewport.
  97703. * @param {integer} [y=0] - The vertical position of the Camera viewport.
  97704. * @param {integer} [width] - The width of the Camera viewport. If not given it'll be the game config size.
  97705. * @param {integer} [height] - The height of the Camera viewport. If not given it'll be the game config size.
  97706. * @param {boolean} [makeMain=false] - Set this Camera as being the 'main' camera. This just makes the property `main` a reference to it.
  97707. * @param {string} [name=''] - The name of the Camera.
  97708. *
  97709. * @return {Phaser.Cameras.Scene2D.Camera} The newly created Camera.
  97710. */
  97711. add: function (x, y, width, height, makeMain, name)
  97712. {
  97713. if (x === undefined) { x = 0; }
  97714. if (y === undefined) { y = 0; }
  97715. if (width === undefined) { width = this.scene.sys.game.config.width; }
  97716. if (height === undefined) { height = this.scene.sys.game.config.height; }
  97717. if (makeMain === undefined) { makeMain = false; }
  97718. if (name === undefined) { name = ''; }
  97719. var camera = new Camera(x, y, width, height);
  97720. camera.setName(name);
  97721. camera.setScene(this.scene);
  97722. camera.setRoundPixels(this.roundPixels);
  97723. camera.id = this.getNextID();
  97724. this.cameras.push(camera);
  97725. if (makeMain)
  97726. {
  97727. this.main = camera;
  97728. }
  97729. return camera;
  97730. },
  97731. /**
  97732. * Adds an existing Camera into the Camera Manager.
  97733. *
  97734. * The Camera should either be a `Phaser.Cameras.Scene2D.Camera` instance, or a class that extends from it.
  97735. *
  97736. * The Camera will have its `roundPixels` propery set to whatever `CameraManager.roundPixels` is. You can change
  97737. * it after addition if required.
  97738. *
  97739. * The Camera will be assigned an ID, which is used for Game Object exclusion and then added to the
  97740. * manager. As long as it doesn't already exist in the manager it will be added then returned.
  97741. *
  97742. * If this method returns `null` then the Camera already exists in this Camera Manager.
  97743. *
  97744. * @method Phaser.Cameras.Scene2D.CameraManager#addExisting
  97745. * @since 3.0.0
  97746. *
  97747. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to be added to the Camera Manager.
  97748. * @param {boolean} [makeMain=false] - Set this Camera as being the 'main' camera. This just makes the property `main` a reference to it.
  97749. *
  97750. * @return {?Phaser.Cameras.Scene2D.Camera} The Camera that was added to the Camera Manager, or `null` if it couldn't be added.
  97751. */
  97752. addExisting: function (camera, makeMain)
  97753. {
  97754. if (makeMain === undefined) { makeMain = false; }
  97755. var index = this.cameras.indexOf(camera);
  97756. if (index === -1)
  97757. {
  97758. camera.id = this.getNextID();
  97759. camera.setRoundPixels(this.roundPixels);
  97760. this.cameras.push(camera);
  97761. if (makeMain)
  97762. {
  97763. this.main = camera;
  97764. }
  97765. return camera;
  97766. }
  97767. return null;
  97768. },
  97769. /**
  97770. * Gets the next available Camera ID number.
  97771. *
  97772. * The Camera Manager supports up to 31 unique cameras, after which the ID returned will always be zero.
  97773. * You can create additional cameras beyond 31, but they cannot be used for Game Object exclusion.
  97774. *
  97775. * @method Phaser.Cameras.Scene2D.CameraManager#getNextID
  97776. * @private
  97777. * @since 3.11.0
  97778. *
  97779. * @return {number} The next available Camera ID, or 0 if they're all already in use.
  97780. */
  97781. getNextID: function ()
  97782. {
  97783. var cameras = this.cameras;
  97784. var testID = 1;
  97785. // Find the first free camera ID we can use
  97786. for (var t = 0; t < 32; t++)
  97787. {
  97788. var found = false;
  97789. for (var i = 0; i < cameras.length; i++)
  97790. {
  97791. var camera = cameras[i];
  97792. if (camera && camera.id === testID)
  97793. {
  97794. found = true;
  97795. continue;
  97796. }
  97797. }
  97798. if (found)
  97799. {
  97800. testID = testID << 1;
  97801. }
  97802. else
  97803. {
  97804. return testID;
  97805. }
  97806. }
  97807. return 0;
  97808. },
  97809. /**
  97810. * Gets the total number of Cameras in this Camera Manager.
  97811. *
  97812. * If the optional `isVisible` argument is set it will only count Cameras that are currently visible.
  97813. *
  97814. * @method Phaser.Cameras.Scene2D.CameraManager#getTotal
  97815. * @since 3.11.0
  97816. *
  97817. * @param {boolean} [isVisible=false] - Set the `true` to only include visible Cameras in the total.
  97818. *
  97819. * @return {integer} The total number of Cameras in this Camera Manager.
  97820. */
  97821. getTotal: function (isVisible)
  97822. {
  97823. if (isVisible === undefined) { isVisible = false; }
  97824. var total = 0;
  97825. var cameras = this.cameras;
  97826. for (var i = 0; i < cameras.length; i++)
  97827. {
  97828. var camera = cameras[i];
  97829. if (!isVisible || (isVisible && camera.visible))
  97830. {
  97831. total++;
  97832. }
  97833. }
  97834. return total;
  97835. },
  97836. /**
  97837. * Populates this Camera Manager based on the given configuration object, or an array of config objects.
  97838. *
  97839. * See the `InputJSONCameraObject` documentation for details of the object structure.
  97840. *
  97841. * @method Phaser.Cameras.Scene2D.CameraManager#fromJSON
  97842. * @since 3.0.0
  97843. *
  97844. * @param {(InputJSONCameraObject|InputJSONCameraObject[])} config - A Camera configuration object, or an array of them, to be added to this Camera Manager.
  97845. *
  97846. * @return {Phaser.Cameras.Scene2D.CameraManager} This Camera Manager instance.
  97847. */
  97848. fromJSON: function (config)
  97849. {
  97850. if (!Array.isArray(config))
  97851. {
  97852. config = [ config ];
  97853. }
  97854. var gameWidth = this.scene.sys.game.config.width;
  97855. var gameHeight = this.scene.sys.game.config.height;
  97856. for (var i = 0; i < config.length; i++)
  97857. {
  97858. var cameraConfig = config[i];
  97859. var x = GetFastValue(cameraConfig, 'x', 0);
  97860. var y = GetFastValue(cameraConfig, 'y', 0);
  97861. var width = GetFastValue(cameraConfig, 'width', gameWidth);
  97862. var height = GetFastValue(cameraConfig, 'height', gameHeight);
  97863. var camera = this.add(x, y, width, height);
  97864. // Direct properties
  97865. camera.name = GetFastValue(cameraConfig, 'name', '');
  97866. camera.zoom = GetFastValue(cameraConfig, 'zoom', 1);
  97867. camera.rotation = GetFastValue(cameraConfig, 'rotation', 0);
  97868. camera.scrollX = GetFastValue(cameraConfig, 'scrollX', 0);
  97869. camera.scrollY = GetFastValue(cameraConfig, 'scrollY', 0);
  97870. camera.roundPixels = GetFastValue(cameraConfig, 'roundPixels', false);
  97871. camera.visible = GetFastValue(cameraConfig, 'visible', true);
  97872. // Background Color
  97873. var backgroundColor = GetFastValue(cameraConfig, 'backgroundColor', false);
  97874. if (backgroundColor)
  97875. {
  97876. camera.setBackgroundColor(backgroundColor);
  97877. }
  97878. // Bounds
  97879. var boundsConfig = GetFastValue(cameraConfig, 'bounds', null);
  97880. if (boundsConfig)
  97881. {
  97882. var bx = GetFastValue(boundsConfig, 'x', 0);
  97883. var by = GetFastValue(boundsConfig, 'y', 0);
  97884. var bwidth = GetFastValue(boundsConfig, 'width', gameWidth);
  97885. var bheight = GetFastValue(boundsConfig, 'height', gameHeight);
  97886. camera.setBounds(bx, by, bwidth, bheight);
  97887. }
  97888. }
  97889. return this;
  97890. },
  97891. /**
  97892. * Gets a Camera based on its name.
  97893. *
  97894. * Camera names are optional and don't have to be set, so this method is only of any use if you
  97895. * have given your Cameras unique names.
  97896. *
  97897. * @method Phaser.Cameras.Scene2D.CameraManager#getCamera
  97898. * @since 3.0.0
  97899. *
  97900. * @param {string} name - The name of the Camera.
  97901. *
  97902. * @return {?Phaser.Cameras.Scene2D.Camera} The first Camera with a name matching the given string, otherwise `null`.
  97903. */
  97904. getCamera: function (name)
  97905. {
  97906. var cameras = this.cameras;
  97907. for (var i = 0; i < cameras.length; i++)
  97908. {
  97909. if (cameras[i].name === name)
  97910. {
  97911. return cameras[i];
  97912. }
  97913. }
  97914. return null;
  97915. },
  97916. /**
  97917. * Returns an array of all cameras below the given Pointer.
  97918. *
  97919. * The first camera in the array is the top-most camera in the camera list.
  97920. *
  97921. * @method Phaser.Cameras.Scene2D.CameraManager#getCamerasBelowPointer
  97922. * @since 3.10.0
  97923. *
  97924. * @param {Phaser.Input.Pointer} pointer - The Pointer to check against.
  97925. *
  97926. * @return {Phaser.Cameras.Scene2D.Camera[]} An array of cameras below the Pointer.
  97927. */
  97928. getCamerasBelowPointer: function (pointer)
  97929. {
  97930. var cameras = this.cameras;
  97931. var x = pointer.x;
  97932. var y = pointer.y;
  97933. var output = [];
  97934. for (var i = 0; i < cameras.length; i++)
  97935. {
  97936. var camera = cameras[i];
  97937. if (camera.visible && camera.inputEnabled && RectangleContains(camera, x, y))
  97938. {
  97939. // So the top-most camera is at the top of the search array
  97940. output.unshift(camera);
  97941. }
  97942. }
  97943. return output;
  97944. },
  97945. /**
  97946. * Removes the given Camera, or an array of Cameras, from this Camera Manager.
  97947. *
  97948. * If found in the Camera Manager it will be immediately removed from the local cameras array.
  97949. * If also currently the 'main' camera, 'main' will be reset to be camera 0.
  97950. *
  97951. * The removed Camera is not destroyed. If you also wish to destroy the Camera, you should call
  97952. * `Camera.destroy` on it, so that it clears all references to the Camera Manager.
  97953. *
  97954. * @method Phaser.Cameras.Scene2D.CameraManager#remove
  97955. * @since 3.0.0
  97956. *
  97957. * @param {(Phaser.Cameras.Scene2D.Camera|Phaser.Cameras.Scene2D.Camera[])} camera - The Camera, or an array of Cameras, to be removed from this Camera Manager.
  97958. *
  97959. * @return {integer} The total number of Cameras removed.
  97960. */
  97961. remove: function (camera)
  97962. {
  97963. if (!Array.isArray(camera))
  97964. {
  97965. camera = [ camera ];
  97966. }
  97967. var total = 0;
  97968. var cameras = this.cameras;
  97969. for (var i = 0; i < camera.length; i++)
  97970. {
  97971. var index = cameras.indexOf(camera[i]);
  97972. if (index !== -1)
  97973. {
  97974. cameras.splice(index, 1);
  97975. total++;
  97976. }
  97977. }
  97978. if (!this.main)
  97979. {
  97980. this.main = cameras[0];
  97981. }
  97982. return total;
  97983. },
  97984. /**
  97985. * The internal render method. This is called automatically by the Scene and should not be invoked directly.
  97986. *
  97987. * It will iterate through all local cameras and render them in turn, as long as they're visible and have
  97988. * an alpha level > 0.
  97989. *
  97990. * @method Phaser.Cameras.Scene2D.CameraManager#render
  97991. * @protected
  97992. * @since 3.0.0
  97993. *
  97994. * @param {(Phaser.Renderer.Canvas.CanvasRenderer|Phaser.Renderer.WebGL.WebGLRenderer)} renderer - The Renderer that will render the children to this camera.
  97995. * @param {Phaser.GameObjects.GameObject[]} children - An array of renderable Game Objects.
  97996. * @param {number} interpolation - Interpolation value. Reserved for future use.
  97997. */
  97998. render: function (renderer, children, interpolation)
  97999. {
  98000. var scene = this.scene;
  98001. var cameras = this.cameras;
  98002. var baseScale = this.baseScale;
  98003. var resolution = renderer.config.resolution;
  98004. for (var i = 0; i < this.cameras.length; i++)
  98005. {
  98006. var camera = cameras[i];
  98007. if (camera.visible && camera.alpha > 0)
  98008. {
  98009. camera.preRender(baseScale, resolution);
  98010. renderer.render(scene, children, interpolation, camera);
  98011. }
  98012. }
  98013. },
  98014. /**
  98015. * Resets this Camera Manager.
  98016. *
  98017. * This will iterate through all current Cameras, destroying them all, then it will reset the
  98018. * cameras array, reset the ID counter and create 1 new single camera using the default values.
  98019. *
  98020. * @method Phaser.Cameras.Scene2D.CameraManager#resetAll
  98021. * @since 3.0.0
  98022. *
  98023. * @return {Phaser.Cameras.Scene2D.Camera} The freshly created main Camera.
  98024. */
  98025. resetAll: function ()
  98026. {
  98027. for (var i = 0; i < this.cameras.length; i++)
  98028. {
  98029. this.cameras[i].destroy();
  98030. }
  98031. this.cameras = [];
  98032. this.main = this.add();
  98033. return this.main;
  98034. },
  98035. /**
  98036. * The main update loop. Called automatically when the Scene steps.
  98037. *
  98038. * @method Phaser.Cameras.Scene2D.CameraManager#update
  98039. * @protected
  98040. * @since 3.0.0
  98041. *
  98042. * @param {number} timestep - The timestep value.
  98043. * @param {number} delta - The delta value since the last frame.
  98044. */
  98045. update: function (timestep, delta)
  98046. {
  98047. for (var i = 0; i < this.cameras.length; i++)
  98048. {
  98049. this.cameras[i].update(timestep, delta);
  98050. }
  98051. },
  98052. /**
  98053. * Resizes all cameras to the given dimensions.
  98054. *
  98055. * @method Phaser.Cameras.Scene2D.CameraManager#resize
  98056. * @since 3.2.0
  98057. *
  98058. * @param {number} width - The new width of the camera.
  98059. * @param {number} height - The new height of the camera.
  98060. */
  98061. resize: function (width, height)
  98062. {
  98063. for (var i = 0; i < this.cameras.length; i++)
  98064. {
  98065. this.cameras[i].setSize(width, height);
  98066. }
  98067. },
  98068. /**
  98069. * The Scene that owns this plugin is shutting down.
  98070. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  98071. *
  98072. * @method Phaser.Cameras.Scene2D.CameraManager#shutdown
  98073. * @private
  98074. * @since 3.0.0
  98075. */
  98076. shutdown: function ()
  98077. {
  98078. this.main = undefined;
  98079. for (var i = 0; i < this.cameras.length; i++)
  98080. {
  98081. this.cameras[i].destroy();
  98082. }
  98083. this.cameras = [];
  98084. var eventEmitter = this.systems.events;
  98085. eventEmitter.off('update', this.update, this);
  98086. eventEmitter.off('shutdown', this.shutdown, this);
  98087. },
  98088. /**
  98089. * The Scene that owns this plugin is being destroyed.
  98090. * We need to shutdown and then kill off all external references.
  98091. *
  98092. * @method Phaser.Cameras.Scene2D.CameraManager#destroy
  98093. * @private
  98094. * @since 3.0.0
  98095. */
  98096. destroy: function ()
  98097. {
  98098. this.shutdown();
  98099. this.scene.sys.events.off('start', this.start, this);
  98100. this.scene = null;
  98101. this.systems = null;
  98102. }
  98103. });
  98104. PluginCache.register('CameraManager', CameraManager, 'cameras');
  98105. module.exports = CameraManager;
  98106. /***/ }),
  98107. /* 533 */
  98108. /***/ (function(module, exports, __webpack_require__) {
  98109. /**
  98110. * @author Richard Davey <rich@photonstorm.com>
  98111. * @copyright 2018 Photon Storm Ltd.
  98112. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98113. */
  98114. var Clamp = __webpack_require__(19);
  98115. var Class = __webpack_require__(0);
  98116. var EaseMap = __webpack_require__(123);
  98117. /**
  98118. * @classdesc
  98119. * A Camera Zoom effect.
  98120. *
  98121. * This effect will zoom the Camera to the given scale, over the duration and with the ease specified.
  98122. *
  98123. * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback,
  98124. * which is invoked each frame for the duration of the effect if required.
  98125. *
  98126. * @class Zoom
  98127. * @memberOf Phaser.Cameras.Scene2D.Effects
  98128. * @constructor
  98129. * @since 3.11.0
  98130. *
  98131. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera this effect is acting upon.
  98132. */
  98133. var Zoom = new Class({
  98134. initialize:
  98135. function Zoom (camera)
  98136. {
  98137. /**
  98138. * The Camera this effect belongs to.
  98139. *
  98140. * @name Phaser.Cameras.Scene2D.Effects.Zoom#camera
  98141. * @type {Phaser.Cameras.Scene2D.Camera}
  98142. * @readOnly
  98143. * @since 3.11.0
  98144. */
  98145. this.camera = camera;
  98146. /**
  98147. * Is this effect actively running?
  98148. *
  98149. * @name Phaser.Cameras.Scene2D.Effects.Zoom#isRunning
  98150. * @type {boolean}
  98151. * @readOnly
  98152. * @default false
  98153. * @since 3.11.0
  98154. */
  98155. this.isRunning = false;
  98156. /**
  98157. * The duration of the effect, in milliseconds.
  98158. *
  98159. * @name Phaser.Cameras.Scene2D.Effects.Zoom#duration
  98160. * @type {integer}
  98161. * @readOnly
  98162. * @default 0
  98163. * @since 3.11.0
  98164. */
  98165. this.duration = 0;
  98166. /**
  98167. * The starting zoom value;
  98168. *
  98169. * @name Phaser.Cameras.Scene2D.Effects.Zoom#source
  98170. * @type {number}
  98171. * @since 3.11.0
  98172. */
  98173. this.source = 1;
  98174. /**
  98175. * The destination zoom value.
  98176. *
  98177. * @name Phaser.Cameras.Scene2D.Effects.Zoom#destination
  98178. * @type {number}
  98179. * @since 3.11.0
  98180. */
  98181. this.destination = 1;
  98182. /**
  98183. * The ease function to use during the zoom.
  98184. *
  98185. * @name Phaser.Cameras.Scene2D.Effects.Zoom#ease
  98186. * @type {function}
  98187. * @since 3.11.0
  98188. */
  98189. this.ease;
  98190. /**
  98191. * If this effect is running this holds the current percentage of the progress, a value between 0 and 1.
  98192. *
  98193. * @name Phaser.Cameras.Scene2D.Effects.Zoom#progress
  98194. * @type {number}
  98195. * @since 3.11.0
  98196. */
  98197. this.progress = 0;
  98198. /**
  98199. * Effect elapsed timer.
  98200. *
  98201. * @name Phaser.Cameras.Scene2D.Effects.Zoom#_elapsed
  98202. * @type {number}
  98203. * @private
  98204. * @since 3.11.0
  98205. */
  98206. this._elapsed = 0;
  98207. /**
  98208. * @callback CameraZoomCallback
  98209. *
  98210. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera on which the effect is running.
  98211. * @param {number} progress - The progress of the effect. A value between 0 and 1.
  98212. * @param {number} zoom - The Camera's new zoom value.
  98213. */
  98214. /**
  98215. * This callback is invoked every frame for the duration of the effect.
  98216. *
  98217. * @name Phaser.Cameras.Scene2D.Effects.Zoom#_onUpdate
  98218. * @type {?CameraZoomCallback}
  98219. * @private
  98220. * @default null
  98221. * @since 3.11.0
  98222. */
  98223. this._onUpdate;
  98224. /**
  98225. * On Complete callback scope.
  98226. *
  98227. * @name Phaser.Cameras.Scene2D.Effects.Zoom#_onUpdateScope
  98228. * @type {any}
  98229. * @private
  98230. * @since 3.11.0
  98231. */
  98232. this._onUpdateScope;
  98233. },
  98234. /**
  98235. * This event is fired when the Zoom effect begins to run on a camera.
  98236. *
  98237. * @event CameraZoomStartEvent
  98238. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  98239. * @param {Phaser.Cameras.Scene2D.Effects.Zoom} effect - A reference to the effect instance.
  98240. * @param {integer} duration - The duration of the effect.
  98241. * @param {number} zoom - The destination zoom value.
  98242. */
  98243. /**
  98244. * This event is fired when the Zoom effect completes.
  98245. *
  98246. * @event CameraZoomCompleteEvent
  98247. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  98248. * @param {Phaser.Cameras.Scene2D.Effects.Zoom} effect - A reference to the effect instance.
  98249. */
  98250. /**
  98251. * This effect will zoom the Camera to the given scale, over the duration and with the ease specified.
  98252. *
  98253. * @method Phaser.Cameras.Scene2D.Effects.Zoom#start
  98254. * @fires CameraZoomStartEvent
  98255. * @fires CameraZoomCompleteEvent
  98256. * @since 3.11.0
  98257. *
  98258. * @param {number} zoom - The target Camera zoom value.
  98259. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  98260. * @param {(string|function)} [ease='Linear'] - The ease to use for the Zoom. Can be any of the Phaser Easing constants or a custom function.
  98261. * @param {boolean} [force=false] - Force the shake effect to start immediately, even if already running.
  98262. * @param {CameraZoomCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  98263. * It is sent three arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is,
  98264. * and the current camera zoom value.
  98265. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  98266. *
  98267. * @return {Phaser.Cameras.Scene2D.Camera} The Camera on which the effect was started.
  98268. */
  98269. start: function (zoom, duration, ease, force, callback, context)
  98270. {
  98271. if (duration === undefined) { duration = 1000; }
  98272. if (ease === undefined) { ease = EaseMap.Linear; }
  98273. if (force === undefined) { force = false; }
  98274. if (callback === undefined) { callback = null; }
  98275. if (context === undefined) { context = this.camera.scene; }
  98276. var cam = this.camera;
  98277. if (!force && this.isRunning)
  98278. {
  98279. return cam;
  98280. }
  98281. this.isRunning = true;
  98282. this.duration = duration;
  98283. this.progress = 0;
  98284. // Starting from
  98285. this.source = cam.zoom;
  98286. // Zooming to
  98287. this.destination = zoom;
  98288. // Using this ease
  98289. if (typeof ease === 'string' && EaseMap.hasOwnProperty(ease))
  98290. {
  98291. this.ease = EaseMap[ease];
  98292. }
  98293. else if (typeof ease === 'function')
  98294. {
  98295. this.ease = ease;
  98296. }
  98297. this._elapsed = 0;
  98298. this._onUpdate = callback;
  98299. this._onUpdateScope = context;
  98300. this.camera.emit('camerazoomstart', this.camera, this, duration, zoom);
  98301. return cam;
  98302. },
  98303. /**
  98304. * The main update loop for this effect. Called automatically by the Camera.
  98305. *
  98306. * @method Phaser.Cameras.Scene2D.Effects.Zoom#update
  98307. * @since 3.11.0
  98308. *
  98309. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  98310. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  98311. */
  98312. update: function (time, delta)
  98313. {
  98314. if (!this.isRunning)
  98315. {
  98316. return;
  98317. }
  98318. this._elapsed += delta;
  98319. this.progress = Clamp(this._elapsed / this.duration, 0, 1);
  98320. if (this._elapsed < this.duration)
  98321. {
  98322. this.camera.zoom = this.source + ((this.destination - this.source) * this.ease(this.progress));
  98323. if (this._onUpdate)
  98324. {
  98325. this._onUpdate.call(this._onUpdateScope, this.camera, this.progress, this.camera.zoom);
  98326. }
  98327. }
  98328. else
  98329. {
  98330. this.camera.zoom = this.destination;
  98331. if (this._onUpdate)
  98332. {
  98333. this._onUpdate.call(this._onUpdateScope, this.camera, this.progress, this.destination);
  98334. }
  98335. this.effectComplete();
  98336. }
  98337. },
  98338. /**
  98339. * Called internally when the effect completes.
  98340. *
  98341. * @method Phaser.Cameras.Scene2D.Effects.Zoom#effectComplete
  98342. * @since 3.11.0
  98343. */
  98344. effectComplete: function ()
  98345. {
  98346. this._onUpdate = null;
  98347. this._onUpdateScope = null;
  98348. this.isRunning = false;
  98349. this.camera.emit('camerazoomcomplete', this.camera, this);
  98350. },
  98351. /**
  98352. * Resets this camera effect.
  98353. * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event.
  98354. *
  98355. * @method Phaser.Cameras.Scene2D.Effects.Zoom#reset
  98356. * @since 3.11.0
  98357. */
  98358. reset: function ()
  98359. {
  98360. this.isRunning = false;
  98361. this._onUpdate = null;
  98362. this._onUpdateScope = null;
  98363. },
  98364. /**
  98365. * Destroys this effect, releasing it from the Camera.
  98366. *
  98367. * @method Phaser.Cameras.Scene2D.Effects.Zoom#destroy
  98368. * @since 3.11.0
  98369. */
  98370. destroy: function ()
  98371. {
  98372. this.reset();
  98373. this.camera = null;
  98374. }
  98375. });
  98376. module.exports = Zoom;
  98377. /***/ }),
  98378. /* 534 */
  98379. /***/ (function(module, exports, __webpack_require__) {
  98380. /**
  98381. * @author Richard Davey <rich@photonstorm.com>
  98382. * @copyright 2018 Photon Storm Ltd.
  98383. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98384. */
  98385. var Clamp = __webpack_require__(19);
  98386. var Class = __webpack_require__(0);
  98387. var Vector2 = __webpack_require__(6);
  98388. /**
  98389. * @classdesc
  98390. * A Camera Shake effect.
  98391. *
  98392. * This effect will shake the camera viewport by a random amount, bounded by the specified intensity, each frame.
  98393. *
  98394. * Only the camera viewport is moved. None of the objects it is displaying are impacted, i.e. their positions do
  98395. * not change.
  98396. *
  98397. * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback,
  98398. * which is invoked each frame for the duration of the effect if required.
  98399. *
  98400. * @class Shake
  98401. * @memberOf Phaser.Cameras.Scene2D.Effects
  98402. * @constructor
  98403. * @since 3.5.0
  98404. *
  98405. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera this effect is acting upon.
  98406. */
  98407. var Shake = new Class({
  98408. initialize:
  98409. function Shake (camera)
  98410. {
  98411. /**
  98412. * The Camera this effect belongs to.
  98413. *
  98414. * @name Phaser.Cameras.Scene2D.Effects.Shake#camera
  98415. * @type {Phaser.Cameras.Scene2D.Camera}
  98416. * @readOnly
  98417. * @since 3.5.0
  98418. */
  98419. this.camera = camera;
  98420. /**
  98421. * Is this effect actively running?
  98422. *
  98423. * @name Phaser.Cameras.Scene2D.Effects.Shake#isRunning
  98424. * @type {boolean}
  98425. * @readOnly
  98426. * @default false
  98427. * @since 3.5.0
  98428. */
  98429. this.isRunning = false;
  98430. /**
  98431. * The duration of the effect, in milliseconds.
  98432. *
  98433. * @name Phaser.Cameras.Scene2D.Effects.Shake#duration
  98434. * @type {integer}
  98435. * @readOnly
  98436. * @default 0
  98437. * @since 3.5.0
  98438. */
  98439. this.duration = 0;
  98440. /**
  98441. * The intensity of the effect. Use small float values. The default when the effect starts is 0.05.
  98442. * This is a Vector2 object, allowing you to control the shake intensity independently across x and y.
  98443. * You can modify this value while the effect is active to create more varied shake effects.
  98444. *
  98445. * @name Phaser.Cameras.Scene2D.Effects.Shake#intensity
  98446. * @type {Phaser.Math.Vector2}
  98447. * @since 3.5.0
  98448. */
  98449. this.intensity = new Vector2();
  98450. /**
  98451. * If this effect is running this holds the current percentage of the progress, a value between 0 and 1.
  98452. *
  98453. * @name Phaser.Cameras.Scene2D.Effects.Shake#progress
  98454. * @type {number}
  98455. * @since 3.5.0
  98456. */
  98457. this.progress = 0;
  98458. /**
  98459. * Effect elapsed timer.
  98460. *
  98461. * @name Phaser.Cameras.Scene2D.Effects.Shake#_elapsed
  98462. * @type {number}
  98463. * @private
  98464. * @since 3.5.0
  98465. */
  98466. this._elapsed = 0;
  98467. /**
  98468. * How much to offset the camera by horizontally.
  98469. *
  98470. * @name Phaser.Cameras.Scene2D.Effects.Shake#_offsetX
  98471. * @type {number}
  98472. * @private
  98473. * @default 0
  98474. * @since 3.0.0
  98475. */
  98476. this._offsetX = 0;
  98477. /**
  98478. * How much to offset the camera by vertically.
  98479. *
  98480. * @name Phaser.Cameras.Scene2D.Effects.Shake#_offsetY
  98481. * @type {number}
  98482. * @private
  98483. * @default 0
  98484. * @since 3.0.0
  98485. */
  98486. this._offsetY = 0;
  98487. /**
  98488. * @callback CameraShakeCallback
  98489. *
  98490. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera on which the effect is running.
  98491. * @param {number} progress - The progress of the effect. A value between 0 and 1.
  98492. */
  98493. /**
  98494. * This callback is invoked every frame for the duration of the effect.
  98495. *
  98496. * @name Phaser.Cameras.Scene2D.Effects.Shake#_onUpdate
  98497. * @type {?CameraShakeCallback}
  98498. * @private
  98499. * @default null
  98500. * @since 3.5.0
  98501. */
  98502. this._onUpdate;
  98503. /**
  98504. * On Complete callback scope.
  98505. *
  98506. * @name Phaser.Cameras.Scene2D.Effects.Shake#_onUpdateScope
  98507. * @type {any}
  98508. * @private
  98509. * @since 3.5.0
  98510. */
  98511. this._onUpdateScope;
  98512. },
  98513. /**
  98514. * This event is fired when the shake effect begins to run on a camera.
  98515. *
  98516. * @event CameraShakeStartEvent
  98517. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  98518. * @param {Phaser.Cameras.Scene2D.Effects.Shake} effect - A reference to the effect instance.
  98519. * @param {integer} duration - The duration of the effect.
  98520. * @param {number} intensity - The intensity of the effect.
  98521. */
  98522. /**
  98523. * This event is fired when the shake effect completes.
  98524. *
  98525. * @event CameraShakeCompleteEvent
  98526. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  98527. * @param {Phaser.Cameras.Scene2D.Effects.Shake} effect - A reference to the effect instance.
  98528. */
  98529. /**
  98530. * Shakes the Camera by the given intensity over the duration specified.
  98531. *
  98532. * @method Phaser.Cameras.Scene2D.Effects.Shake#start
  98533. * @fires CameraShakeStartEvent
  98534. * @fires CameraShakeCompleteEvent
  98535. * @since 3.5.0
  98536. *
  98537. * @param {integer} [duration=100] - The duration of the effect in milliseconds.
  98538. * @param {number} [intensity=0.05] - The intensity of the shake.
  98539. * @param {boolean} [force=false] - Force the shake effect to start immediately, even if already running.
  98540. * @param {CameraShakeCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  98541. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  98542. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  98543. *
  98544. * @return {Phaser.Cameras.Scene2D.Camera} The Camera on which the effect was started.
  98545. */
  98546. start: function (duration, intensity, force, callback, context)
  98547. {
  98548. if (duration === undefined) { duration = 100; }
  98549. if (intensity === undefined) { intensity = 0.05; }
  98550. if (force === undefined) { force = false; }
  98551. if (callback === undefined) { callback = null; }
  98552. if (context === undefined) { context = this.camera.scene; }
  98553. if (!force && this.isRunning)
  98554. {
  98555. return this.camera;
  98556. }
  98557. this.isRunning = true;
  98558. this.duration = duration;
  98559. this.progress = 0;
  98560. if (typeof intensity === 'number')
  98561. {
  98562. this.intensity.set(intensity);
  98563. }
  98564. else
  98565. {
  98566. this.intensity.set(intensity.x, intensity.y);
  98567. }
  98568. this._elapsed = 0;
  98569. this._offsetX = 0;
  98570. this._offsetY = 0;
  98571. this._onUpdate = callback;
  98572. this._onUpdateScope = context;
  98573. this.camera.emit('camerashakestart', this.camera, this, duration, intensity);
  98574. return this.camera;
  98575. },
  98576. /**
  98577. * The pre-render step for this effect. Called automatically by the Camera.
  98578. *
  98579. * @method Phaser.Cameras.Scene2D.Effects.Shake#preRender
  98580. * @since 3.5.0
  98581. */
  98582. preRender: function ()
  98583. {
  98584. if (this.isRunning)
  98585. {
  98586. this.camera.matrix.translate(this._offsetX, this._offsetY);
  98587. }
  98588. },
  98589. /**
  98590. * The main update loop for this effect. Called automatically by the Camera.
  98591. *
  98592. * @method Phaser.Cameras.Scene2D.Effects.Shake#update
  98593. * @since 3.5.0
  98594. *
  98595. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  98596. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  98597. */
  98598. update: function (time, delta)
  98599. {
  98600. if (!this.isRunning)
  98601. {
  98602. return;
  98603. }
  98604. this._elapsed += delta;
  98605. this.progress = Clamp(this._elapsed / this.duration, 0, 1);
  98606. if (this._onUpdate)
  98607. {
  98608. this._onUpdate.call(this._onUpdateScope, this.camera, this.progress);
  98609. }
  98610. if (this._elapsed < this.duration)
  98611. {
  98612. var intensity = this.intensity;
  98613. var width = this.camera.width;
  98614. var height = this.camera.height;
  98615. var zoom = this.camera.zoom;
  98616. this._offsetX = (Math.random() * intensity.x * width * 2 - intensity.x * width) * zoom;
  98617. this._offsetY = (Math.random() * intensity.y * height * 2 - intensity.y * height) * zoom;
  98618. if (this.camera.roundPixels)
  98619. {
  98620. this._offsetX |= 0;
  98621. this._offsetY |= 0;
  98622. }
  98623. }
  98624. else
  98625. {
  98626. this.effectComplete();
  98627. }
  98628. },
  98629. /**
  98630. * Called internally when the effect completes.
  98631. *
  98632. * @method Phaser.Cameras.Scene2D.Effects.Shake#effectComplete
  98633. * @since 3.5.0
  98634. */
  98635. effectComplete: function ()
  98636. {
  98637. this._offsetX = 0;
  98638. this._offsetY = 0;
  98639. this._onUpdate = null;
  98640. this._onUpdateScope = null;
  98641. this.isRunning = false;
  98642. this.camera.emit('camerashakecomplete', this.camera, this);
  98643. },
  98644. /**
  98645. * Resets this camera effect.
  98646. * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event.
  98647. *
  98648. * @method Phaser.Cameras.Scene2D.Effects.Shake#reset
  98649. * @since 3.5.0
  98650. */
  98651. reset: function ()
  98652. {
  98653. this.isRunning = false;
  98654. this._offsetX = 0;
  98655. this._offsetY = 0;
  98656. this._onUpdate = null;
  98657. this._onUpdateScope = null;
  98658. },
  98659. /**
  98660. * Destroys this effect, releasing it from the Camera.
  98661. *
  98662. * @method Phaser.Cameras.Scene2D.Effects.Shake#destroy
  98663. * @since 3.5.0
  98664. */
  98665. destroy: function ()
  98666. {
  98667. this.reset();
  98668. this.camera = null;
  98669. this.intensity = null;
  98670. }
  98671. });
  98672. module.exports = Shake;
  98673. /***/ }),
  98674. /* 535 */
  98675. /***/ (function(module, exports) {
  98676. /**
  98677. * @author Richard Davey <rich@photonstorm.com>
  98678. * @copyright 2018 Photon Storm Ltd.
  98679. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98680. */
  98681. /**
  98682. * Stepped easing.
  98683. *
  98684. * @function Phaser.Math.Easing.Stepped.Stepped
  98685. * @since 3.0.0
  98686. *
  98687. * @param {number} v - The value to be tweened.
  98688. * @param {number} [steps=1] - The number of steps in the ease.
  98689. *
  98690. * @return {number} The tweened value.
  98691. */
  98692. var Stepped = function (v, steps)
  98693. {
  98694. if (steps === undefined) { steps = 1; }
  98695. if (v <= 0)
  98696. {
  98697. return 0;
  98698. }
  98699. else if (v >= 1)
  98700. {
  98701. return 1;
  98702. }
  98703. else
  98704. {
  98705. return (((steps * v) | 0) + 1) * (1 / steps);
  98706. }
  98707. };
  98708. module.exports = Stepped;
  98709. /***/ }),
  98710. /* 536 */
  98711. /***/ (function(module, exports) {
  98712. /**
  98713. * @author Richard Davey <rich@photonstorm.com>
  98714. * @copyright 2018 Photon Storm Ltd.
  98715. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98716. */
  98717. /**
  98718. * Sinusoidal ease-in/out.
  98719. *
  98720. * @function Phaser.Math.Easing.Sine.InOut
  98721. * @since 3.0.0
  98722. *
  98723. * @param {number} v - The value to be tweened.
  98724. *
  98725. * @return {number} The tweened value.
  98726. */
  98727. var InOut = function (v)
  98728. {
  98729. if (v === 0)
  98730. {
  98731. return 0;
  98732. }
  98733. else if (v === 1)
  98734. {
  98735. return 1;
  98736. }
  98737. else
  98738. {
  98739. return 0.5 * (1 - Math.cos(Math.PI * v));
  98740. }
  98741. };
  98742. module.exports = InOut;
  98743. /***/ }),
  98744. /* 537 */
  98745. /***/ (function(module, exports) {
  98746. /**
  98747. * @author Richard Davey <rich@photonstorm.com>
  98748. * @copyright 2018 Photon Storm Ltd.
  98749. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98750. */
  98751. /**
  98752. * Sinusoidal ease-out.
  98753. *
  98754. * @function Phaser.Math.Easing.Sine.Out
  98755. * @since 3.0.0
  98756. *
  98757. * @param {number} v - The value to be tweened.
  98758. *
  98759. * @return {number} The tweened value.
  98760. */
  98761. var Out = function (v)
  98762. {
  98763. if (v === 0)
  98764. {
  98765. return 0;
  98766. }
  98767. else if (v === 1)
  98768. {
  98769. return 1;
  98770. }
  98771. else
  98772. {
  98773. return Math.sin(v * Math.PI / 2);
  98774. }
  98775. };
  98776. module.exports = Out;
  98777. /***/ }),
  98778. /* 538 */
  98779. /***/ (function(module, exports) {
  98780. /**
  98781. * @author Richard Davey <rich@photonstorm.com>
  98782. * @copyright 2018 Photon Storm Ltd.
  98783. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98784. */
  98785. /**
  98786. * Sinusoidal ease-in.
  98787. *
  98788. * @function Phaser.Math.Easing.Sine.In
  98789. * @since 3.0.0
  98790. *
  98791. * @param {number} v - The value to be tweened.
  98792. *
  98793. * @return {number} The tweened value.
  98794. */
  98795. var In = function (v)
  98796. {
  98797. if (v === 0)
  98798. {
  98799. return 0;
  98800. }
  98801. else if (v === 1)
  98802. {
  98803. return 1;
  98804. }
  98805. else
  98806. {
  98807. return 1 - Math.cos(v * Math.PI / 2);
  98808. }
  98809. };
  98810. module.exports = In;
  98811. /***/ }),
  98812. /* 539 */
  98813. /***/ (function(module, exports) {
  98814. /**
  98815. * @author Richard Davey <rich@photonstorm.com>
  98816. * @copyright 2018 Photon Storm Ltd.
  98817. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98818. */
  98819. /**
  98820. * Quintic ease-in/out.
  98821. *
  98822. * @function Phaser.Math.Easing.Quintic.InOut
  98823. * @since 3.0.0
  98824. *
  98825. * @param {number} v - The value to be tweened.
  98826. *
  98827. * @return {number} The tweened value.
  98828. */
  98829. var InOut = function (v)
  98830. {
  98831. if ((v *= 2) < 1)
  98832. {
  98833. return 0.5 * v * v * v * v * v;
  98834. }
  98835. else
  98836. {
  98837. return 0.5 * ((v -= 2) * v * v * v * v + 2);
  98838. }
  98839. };
  98840. module.exports = InOut;
  98841. /***/ }),
  98842. /* 540 */
  98843. /***/ (function(module, exports) {
  98844. /**
  98845. * @author Richard Davey <rich@photonstorm.com>
  98846. * @copyright 2018 Photon Storm Ltd.
  98847. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98848. */
  98849. /**
  98850. * Quintic ease-out.
  98851. *
  98852. * @function Phaser.Math.Easing.Quintic.Out
  98853. * @since 3.0.0
  98854. *
  98855. * @param {number} v - The value to be tweened.
  98856. *
  98857. * @return {number} The tweened value.
  98858. */
  98859. var Out = function (v)
  98860. {
  98861. return --v * v * v * v * v + 1;
  98862. };
  98863. module.exports = Out;
  98864. /***/ }),
  98865. /* 541 */
  98866. /***/ (function(module, exports) {
  98867. /**
  98868. * @author Richard Davey <rich@photonstorm.com>
  98869. * @copyright 2018 Photon Storm Ltd.
  98870. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98871. */
  98872. /**
  98873. * Quintic ease-in.
  98874. *
  98875. * @function Phaser.Math.Easing.Quintic.In
  98876. * @since 3.0.0
  98877. *
  98878. * @param {number} v - The value to be tweened.
  98879. *
  98880. * @return {number} The tweened value.
  98881. */
  98882. var In = function (v)
  98883. {
  98884. return v * v * v * v * v;
  98885. };
  98886. module.exports = In;
  98887. /***/ }),
  98888. /* 542 */
  98889. /***/ (function(module, exports) {
  98890. /**
  98891. * @author Richard Davey <rich@photonstorm.com>
  98892. * @copyright 2018 Photon Storm Ltd.
  98893. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98894. */
  98895. /**
  98896. * Quartic ease-in/out.
  98897. *
  98898. * @function Phaser.Math.Easing.Quartic.InOut
  98899. * @since 3.0.0
  98900. *
  98901. * @param {number} v - The value to be tweened.
  98902. *
  98903. * @return {number} The tweened value.
  98904. */
  98905. var InOut = function (v)
  98906. {
  98907. if ((v *= 2) < 1)
  98908. {
  98909. return 0.5 * v * v * v * v;
  98910. }
  98911. else
  98912. {
  98913. return -0.5 * ((v -= 2) * v * v * v - 2);
  98914. }
  98915. };
  98916. module.exports = InOut;
  98917. /***/ }),
  98918. /* 543 */
  98919. /***/ (function(module, exports) {
  98920. /**
  98921. * @author Richard Davey <rich@photonstorm.com>
  98922. * @copyright 2018 Photon Storm Ltd.
  98923. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98924. */
  98925. /**
  98926. * Quartic ease-out.
  98927. *
  98928. * @function Phaser.Math.Easing.Quartic.Out
  98929. * @since 3.0.0
  98930. *
  98931. * @param {number} v - The value to be tweened.
  98932. *
  98933. * @return {number} The tweened value.
  98934. */
  98935. var Out = function (v)
  98936. {
  98937. return 1 - (--v * v * v * v);
  98938. };
  98939. module.exports = Out;
  98940. /***/ }),
  98941. /* 544 */
  98942. /***/ (function(module, exports) {
  98943. /**
  98944. * @author Richard Davey <rich@photonstorm.com>
  98945. * @copyright 2018 Photon Storm Ltd.
  98946. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98947. */
  98948. /**
  98949. * Quartic ease-in.
  98950. *
  98951. * @function Phaser.Math.Easing.Quartic.In
  98952. * @since 3.0.0
  98953. *
  98954. * @param {number} v - The value to be tweened.
  98955. *
  98956. * @return {number} The tweened value.
  98957. */
  98958. var In = function (v)
  98959. {
  98960. return v * v * v * v;
  98961. };
  98962. module.exports = In;
  98963. /***/ }),
  98964. /* 545 */
  98965. /***/ (function(module, exports) {
  98966. /**
  98967. * @author Richard Davey <rich@photonstorm.com>
  98968. * @copyright 2018 Photon Storm Ltd.
  98969. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  98970. */
  98971. /**
  98972. * Quadratic ease-in/out.
  98973. *
  98974. * @function Phaser.Math.Easing.Quadratic.InOut
  98975. * @since 3.0.0
  98976. *
  98977. * @param {number} v - The value to be tweened.
  98978. *
  98979. * @return {number} The tweened value.
  98980. */
  98981. var InOut = function (v)
  98982. {
  98983. if ((v *= 2) < 1)
  98984. {
  98985. return 0.5 * v * v;
  98986. }
  98987. else
  98988. {
  98989. return -0.5 * (--v * (v - 2) - 1);
  98990. }
  98991. };
  98992. module.exports = InOut;
  98993. /***/ }),
  98994. /* 546 */
  98995. /***/ (function(module, exports) {
  98996. /**
  98997. * @author Richard Davey <rich@photonstorm.com>
  98998. * @copyright 2018 Photon Storm Ltd.
  98999. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99000. */
  99001. /**
  99002. * Quadratic ease-out.
  99003. *
  99004. * @function Phaser.Math.Easing.Quadratic.Out
  99005. * @since 3.0.0
  99006. *
  99007. * @param {number} v - The value to be tweened.
  99008. *
  99009. * @return {number} The tweened value.
  99010. */
  99011. var Out = function (v)
  99012. {
  99013. return v * (2 - v);
  99014. };
  99015. module.exports = Out;
  99016. /***/ }),
  99017. /* 547 */
  99018. /***/ (function(module, exports) {
  99019. /**
  99020. * @author Richard Davey <rich@photonstorm.com>
  99021. * @copyright 2018 Photon Storm Ltd.
  99022. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99023. */
  99024. /**
  99025. * Quadratic ease-in.
  99026. *
  99027. * @function Phaser.Math.Easing.Quadratic.In
  99028. * @since 3.0.0
  99029. *
  99030. * @param {number} v - The value to be tweened.
  99031. *
  99032. * @return {number} The tweened value.
  99033. */
  99034. var In = function (v)
  99035. {
  99036. return v * v;
  99037. };
  99038. module.exports = In;
  99039. /***/ }),
  99040. /* 548 */
  99041. /***/ (function(module, exports) {
  99042. /**
  99043. * @author Richard Davey <rich@photonstorm.com>
  99044. * @copyright 2018 Photon Storm Ltd.
  99045. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99046. */
  99047. /**
  99048. * Linear easing (no variation).
  99049. *
  99050. * @function Phaser.Math.Easing.Linear.Linear
  99051. * @since 3.0.0
  99052. *
  99053. * @param {number} v - The value to be tweened.
  99054. *
  99055. * @return {number} The tweened value.
  99056. */
  99057. var Linear = function (v)
  99058. {
  99059. return v;
  99060. };
  99061. module.exports = Linear;
  99062. /***/ }),
  99063. /* 549 */
  99064. /***/ (function(module, exports) {
  99065. /**
  99066. * @author Richard Davey <rich@photonstorm.com>
  99067. * @copyright 2018 Photon Storm Ltd.
  99068. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99069. */
  99070. /**
  99071. * Exponential ease-in/out.
  99072. *
  99073. * @function Phaser.Math.Easing.Expo.InOut
  99074. * @since 3.0.0
  99075. *
  99076. * @param {number} v - The value to be tweened.
  99077. *
  99078. * @return {number} The tweened value.
  99079. */
  99080. var InOut = function (v)
  99081. {
  99082. if ((v *= 2) < 1)
  99083. {
  99084. return 0.5 * Math.pow(2, 10 * (v - 1));
  99085. }
  99086. else
  99087. {
  99088. return 0.5 * (2 - Math.pow(2, -10 * (v - 1)));
  99089. }
  99090. };
  99091. module.exports = InOut;
  99092. /***/ }),
  99093. /* 550 */
  99094. /***/ (function(module, exports) {
  99095. /**
  99096. * @author Richard Davey <rich@photonstorm.com>
  99097. * @copyright 2018 Photon Storm Ltd.
  99098. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99099. */
  99100. /**
  99101. * Exponential ease-out.
  99102. *
  99103. * @function Phaser.Math.Easing.Expo.Out
  99104. * @since 3.0.0
  99105. *
  99106. * @param {number} v - The value to be tweened.
  99107. *
  99108. * @return {number} The tweened value.
  99109. */
  99110. var Out = function (v)
  99111. {
  99112. return 1 - Math.pow(2, -10 * v);
  99113. };
  99114. module.exports = Out;
  99115. /***/ }),
  99116. /* 551 */
  99117. /***/ (function(module, exports) {
  99118. /**
  99119. * @author Richard Davey <rich@photonstorm.com>
  99120. * @copyright 2018 Photon Storm Ltd.
  99121. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99122. */
  99123. /**
  99124. * Exponential ease-in.
  99125. *
  99126. * @function Phaser.Math.Easing.Expo.In
  99127. * @since 3.0.0
  99128. *
  99129. * @param {number} v - The value to be tweened.
  99130. *
  99131. * @return {number} The tweened value.
  99132. */
  99133. var In = function (v)
  99134. {
  99135. return Math.pow(2, 10 * (v - 1)) - 0.001;
  99136. };
  99137. module.exports = In;
  99138. /***/ }),
  99139. /* 552 */
  99140. /***/ (function(module, exports) {
  99141. /**
  99142. * @author Richard Davey <rich@photonstorm.com>
  99143. * @copyright 2018 Photon Storm Ltd.
  99144. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99145. */
  99146. /**
  99147. * Elastic ease-in/out.
  99148. *
  99149. * @function Phaser.Math.Easing.Elastic.InOut
  99150. * @since 3.0.0
  99151. *
  99152. * @param {number} v - The value to be tweened.
  99153. * @param {number} [amplitude=0.1] - The amplitude of the elastic ease.
  99154. * @param {number} [period=0.1] - [description]
  99155. *
  99156. * @return {number} The tweened value.
  99157. */
  99158. var InOut = function (v, amplitude, period)
  99159. {
  99160. if (amplitude === undefined) { amplitude = 0.1; }
  99161. if (period === undefined) { period = 0.1; }
  99162. if (v === 0)
  99163. {
  99164. return 0;
  99165. }
  99166. else if (v === 1)
  99167. {
  99168. return 1;
  99169. }
  99170. else
  99171. {
  99172. var s = period / 4;
  99173. if (amplitude < 1)
  99174. {
  99175. amplitude = 1;
  99176. }
  99177. else
  99178. {
  99179. s = period * Math.asin(1 / amplitude) / (2 * Math.PI);
  99180. }
  99181. if ((v *= 2) < 1)
  99182. {
  99183. return -0.5 * (amplitude * Math.pow(2, 10 * (v -= 1)) * Math.sin((v - s) * (2 * Math.PI) / period));
  99184. }
  99185. else
  99186. {
  99187. return amplitude * Math.pow(2, -10 * (v -= 1)) * Math.sin((v - s) * (2 * Math.PI) / period) * 0.5 + 1;
  99188. }
  99189. }
  99190. };
  99191. module.exports = InOut;
  99192. /***/ }),
  99193. /* 553 */
  99194. /***/ (function(module, exports) {
  99195. /**
  99196. * @author Richard Davey <rich@photonstorm.com>
  99197. * @copyright 2018 Photon Storm Ltd.
  99198. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99199. */
  99200. /**
  99201. * Elastic ease-out.
  99202. *
  99203. * @function Phaser.Math.Easing.Elastic.Out
  99204. * @since 3.0.0
  99205. *
  99206. * @param {number} v - The value to be tweened.
  99207. * @param {number} [amplitude=0.1] - The amplitude of the elastic ease.
  99208. * @param {number} [period=0.1] - [description]
  99209. *
  99210. * @return {number} The tweened value.
  99211. */
  99212. var Out = function (v, amplitude, period)
  99213. {
  99214. if (amplitude === undefined) { amplitude = 0.1; }
  99215. if (period === undefined) { period = 0.1; }
  99216. if (v === 0)
  99217. {
  99218. return 0;
  99219. }
  99220. else if (v === 1)
  99221. {
  99222. return 1;
  99223. }
  99224. else
  99225. {
  99226. var s = period / 4;
  99227. if (amplitude < 1)
  99228. {
  99229. amplitude = 1;
  99230. }
  99231. else
  99232. {
  99233. s = period * Math.asin(1 / amplitude) / (2 * Math.PI);
  99234. }
  99235. return (amplitude * Math.pow(2, -10 * v) * Math.sin((v - s) * (2 * Math.PI) / period) + 1);
  99236. }
  99237. };
  99238. module.exports = Out;
  99239. /***/ }),
  99240. /* 554 */
  99241. /***/ (function(module, exports) {
  99242. /**
  99243. * @author Richard Davey <rich@photonstorm.com>
  99244. * @copyright 2018 Photon Storm Ltd.
  99245. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99246. */
  99247. /**
  99248. * Elastic ease-in.
  99249. *
  99250. * @function Phaser.Math.Easing.Elastic.In
  99251. * @since 3.0.0
  99252. *
  99253. * @param {number} v - The value to be tweened.
  99254. * @param {number} [amplitude=0.1] - The amplitude of the elastic ease.
  99255. * @param {number} [period=0.1] - [description]
  99256. *
  99257. * @return {number} The tweened value.
  99258. */
  99259. var In = function (v, amplitude, period)
  99260. {
  99261. if (amplitude === undefined) { amplitude = 0.1; }
  99262. if (period === undefined) { period = 0.1; }
  99263. if (v === 0)
  99264. {
  99265. return 0;
  99266. }
  99267. else if (v === 1)
  99268. {
  99269. return 1;
  99270. }
  99271. else
  99272. {
  99273. var s = period / 4;
  99274. if (amplitude < 1)
  99275. {
  99276. amplitude = 1;
  99277. }
  99278. else
  99279. {
  99280. s = period * Math.asin(1 / amplitude) / (2 * Math.PI);
  99281. }
  99282. return -(amplitude * Math.pow(2, 10 * (v -= 1)) * Math.sin((v - s) * (2 * Math.PI) / period));
  99283. }
  99284. };
  99285. module.exports = In;
  99286. /***/ }),
  99287. /* 555 */
  99288. /***/ (function(module, exports) {
  99289. /**
  99290. * @author Richard Davey <rich@photonstorm.com>
  99291. * @copyright 2018 Photon Storm Ltd.
  99292. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99293. */
  99294. /**
  99295. * Cubic ease-in/out.
  99296. *
  99297. * @function Phaser.Math.Easing.Cubic.InOut
  99298. * @since 3.0.0
  99299. *
  99300. * @param {number} v - The value to be tweened.
  99301. *
  99302. * @return {number} The tweened value.
  99303. */
  99304. var InOut = function (v)
  99305. {
  99306. if ((v *= 2) < 1)
  99307. {
  99308. return 0.5 * v * v * v;
  99309. }
  99310. else
  99311. {
  99312. return 0.5 * ((v -= 2) * v * v + 2);
  99313. }
  99314. };
  99315. module.exports = InOut;
  99316. /***/ }),
  99317. /* 556 */
  99318. /***/ (function(module, exports) {
  99319. /**
  99320. * @author Richard Davey <rich@photonstorm.com>
  99321. * @copyright 2018 Photon Storm Ltd.
  99322. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99323. */
  99324. /**
  99325. * Cubic ease-out.
  99326. *
  99327. * @function Phaser.Math.Easing.Cubic.Out
  99328. * @since 3.0.0
  99329. *
  99330. * @param {number} v - The value to be tweened.
  99331. *
  99332. * @return {number} The tweened value.
  99333. */
  99334. var Out = function (v)
  99335. {
  99336. return --v * v * v + 1;
  99337. };
  99338. module.exports = Out;
  99339. /***/ }),
  99340. /* 557 */
  99341. /***/ (function(module, exports) {
  99342. /**
  99343. * @author Richard Davey <rich@photonstorm.com>
  99344. * @copyright 2018 Photon Storm Ltd.
  99345. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99346. */
  99347. /**
  99348. * Cubic ease-in.
  99349. *
  99350. * @function Phaser.Math.Easing.Cubic.In
  99351. * @since 3.0.0
  99352. *
  99353. * @param {number} v - The value to be tweened.
  99354. *
  99355. * @return {number} The tweened value.
  99356. */
  99357. var In = function (v)
  99358. {
  99359. return v * v * v;
  99360. };
  99361. module.exports = In;
  99362. /***/ }),
  99363. /* 558 */
  99364. /***/ (function(module, exports) {
  99365. /**
  99366. * @author Richard Davey <rich@photonstorm.com>
  99367. * @copyright 2018 Photon Storm Ltd.
  99368. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99369. */
  99370. /**
  99371. * Circular ease-in/out.
  99372. *
  99373. * @function Phaser.Math.Easing.Circular.InOut
  99374. * @since 3.0.0
  99375. *
  99376. * @param {number} v - The value to be tweened.
  99377. *
  99378. * @return {number} The tweened value.
  99379. */
  99380. var InOut = function (v)
  99381. {
  99382. if ((v *= 2) < 1)
  99383. {
  99384. return -0.5 * (Math.sqrt(1 - v * v) - 1);
  99385. }
  99386. else
  99387. {
  99388. return 0.5 * (Math.sqrt(1 - (v -= 2) * v) + 1);
  99389. }
  99390. };
  99391. module.exports = InOut;
  99392. /***/ }),
  99393. /* 559 */
  99394. /***/ (function(module, exports) {
  99395. /**
  99396. * @author Richard Davey <rich@photonstorm.com>
  99397. * @copyright 2018 Photon Storm Ltd.
  99398. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99399. */
  99400. /**
  99401. * Circular ease-out.
  99402. *
  99403. * @function Phaser.Math.Easing.Circular.Out
  99404. * @since 3.0.0
  99405. *
  99406. * @param {number} v - The value to be tweened.
  99407. *
  99408. * @return {number} The tweened value.
  99409. */
  99410. var Out = function (v)
  99411. {
  99412. return Math.sqrt(1 - (--v * v));
  99413. };
  99414. module.exports = Out;
  99415. /***/ }),
  99416. /* 560 */
  99417. /***/ (function(module, exports) {
  99418. /**
  99419. * @author Richard Davey <rich@photonstorm.com>
  99420. * @copyright 2018 Photon Storm Ltd.
  99421. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99422. */
  99423. /**
  99424. * Circular ease-in.
  99425. *
  99426. * @function Phaser.Math.Easing.Circular.In
  99427. * @since 3.0.0
  99428. *
  99429. * @param {number} v - The value to be tweened.
  99430. *
  99431. * @return {number} The tweened value.
  99432. */
  99433. var In = function (v)
  99434. {
  99435. return 1 - Math.sqrt(1 - v * v);
  99436. };
  99437. module.exports = In;
  99438. /***/ }),
  99439. /* 561 */
  99440. /***/ (function(module, exports) {
  99441. /**
  99442. * @author Richard Davey <rich@photonstorm.com>
  99443. * @copyright 2018 Photon Storm Ltd.
  99444. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99445. */
  99446. /**
  99447. * Bounce ease-in/out.
  99448. *
  99449. * @function Phaser.Math.Easing.Bounce.InOut
  99450. * @since 3.0.0
  99451. *
  99452. * @param {number} v - The value to be tweened.
  99453. *
  99454. * @return {number} The tweened value.
  99455. */
  99456. var InOut = function (v)
  99457. {
  99458. var reverse = false;
  99459. if (v < 0.5)
  99460. {
  99461. v = 1 - (v * 2);
  99462. reverse = true;
  99463. }
  99464. else
  99465. {
  99466. v = (v * 2) - 1;
  99467. }
  99468. if (v < 1 / 2.75)
  99469. {
  99470. v = 7.5625 * v * v;
  99471. }
  99472. else if (v < 2 / 2.75)
  99473. {
  99474. v = 7.5625 * (v -= 1.5 / 2.75) * v + 0.75;
  99475. }
  99476. else if (v < 2.5 / 2.75)
  99477. {
  99478. v = 7.5625 * (v -= 2.25 / 2.75) * v + 0.9375;
  99479. }
  99480. else
  99481. {
  99482. v = 7.5625 * (v -= 2.625 / 2.75) * v + 0.984375;
  99483. }
  99484. if (reverse)
  99485. {
  99486. return (1 - v) * 0.5;
  99487. }
  99488. else
  99489. {
  99490. return v * 0.5 + 0.5;
  99491. }
  99492. };
  99493. module.exports = InOut;
  99494. /***/ }),
  99495. /* 562 */
  99496. /***/ (function(module, exports) {
  99497. /**
  99498. * @author Richard Davey <rich@photonstorm.com>
  99499. * @copyright 2018 Photon Storm Ltd.
  99500. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99501. */
  99502. /**
  99503. * Bounce ease-out.
  99504. *
  99505. * @function Phaser.Math.Easing.Bounce.Out
  99506. * @since 3.0.0
  99507. *
  99508. * @param {number} v - The value to be tweened.
  99509. *
  99510. * @return {number} The tweened value.
  99511. */
  99512. var Out = function (v)
  99513. {
  99514. if (v < 1 / 2.75)
  99515. {
  99516. return 7.5625 * v * v;
  99517. }
  99518. else if (v < 2 / 2.75)
  99519. {
  99520. return 7.5625 * (v -= 1.5 / 2.75) * v + 0.75;
  99521. }
  99522. else if (v < 2.5 / 2.75)
  99523. {
  99524. return 7.5625 * (v -= 2.25 / 2.75) * v + 0.9375;
  99525. }
  99526. else
  99527. {
  99528. return 7.5625 * (v -= 2.625 / 2.75) * v + 0.984375;
  99529. }
  99530. };
  99531. module.exports = Out;
  99532. /***/ }),
  99533. /* 563 */
  99534. /***/ (function(module, exports) {
  99535. /**
  99536. * @author Richard Davey <rich@photonstorm.com>
  99537. * @copyright 2018 Photon Storm Ltd.
  99538. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99539. */
  99540. /**
  99541. * Bounce ease-in.
  99542. *
  99543. * @function Phaser.Math.Easing.Bounce.In
  99544. * @since 3.0.0
  99545. *
  99546. * @param {number} v - The value to be tweened.
  99547. *
  99548. * @return {number} The tweened value.
  99549. */
  99550. var In = function (v)
  99551. {
  99552. v = 1 - v;
  99553. if (v < 1 / 2.75)
  99554. {
  99555. return 1 - (7.5625 * v * v);
  99556. }
  99557. else if (v < 2 / 2.75)
  99558. {
  99559. return 1 - (7.5625 * (v -= 1.5 / 2.75) * v + 0.75);
  99560. }
  99561. else if (v < 2.5 / 2.75)
  99562. {
  99563. return 1 - (7.5625 * (v -= 2.25 / 2.75) * v + 0.9375);
  99564. }
  99565. else
  99566. {
  99567. return 1 - (7.5625 * (v -= 2.625 / 2.75) * v + 0.984375);
  99568. }
  99569. };
  99570. module.exports = In;
  99571. /***/ }),
  99572. /* 564 */
  99573. /***/ (function(module, exports) {
  99574. /**
  99575. * @author Richard Davey <rich@photonstorm.com>
  99576. * @copyright 2018 Photon Storm Ltd.
  99577. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99578. */
  99579. /**
  99580. * Back ease-in/out.
  99581. *
  99582. * @function Phaser.Math.Easing.Back.InOut
  99583. * @since 3.0.0
  99584. *
  99585. * @param {number} v - The value to be tweened.
  99586. * @param {number} [overshoot=1.70158] - The overshoot amount.
  99587. *
  99588. * @return {number} The tweened value.
  99589. */
  99590. var InOut = function (v, overshoot)
  99591. {
  99592. if (overshoot === undefined) { overshoot = 1.70158; }
  99593. var s = overshoot * 1.525;
  99594. if ((v *= 2) < 1)
  99595. {
  99596. return 0.5 * (v * v * ((s + 1) * v - s));
  99597. }
  99598. else
  99599. {
  99600. return 0.5 * ((v -= 2) * v * ((s + 1) * v + s) + 2);
  99601. }
  99602. };
  99603. module.exports = InOut;
  99604. /***/ }),
  99605. /* 565 */
  99606. /***/ (function(module, exports) {
  99607. /**
  99608. * @author Richard Davey <rich@photonstorm.com>
  99609. * @copyright 2018 Photon Storm Ltd.
  99610. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99611. */
  99612. /**
  99613. * Back ease-out.
  99614. *
  99615. * @function Phaser.Math.Easing.Back.Out
  99616. * @since 3.0.0
  99617. *
  99618. * @param {number} v - The value to be tweened.
  99619. * @param {number} [overshoot=1.70158] - The overshoot amount.
  99620. *
  99621. * @return {number} The tweened value.
  99622. */
  99623. var Out = function (v, overshoot)
  99624. {
  99625. if (overshoot === undefined) { overshoot = 1.70158; }
  99626. return --v * v * ((overshoot + 1) * v + overshoot) + 1;
  99627. };
  99628. module.exports = Out;
  99629. /***/ }),
  99630. /* 566 */
  99631. /***/ (function(module, exports) {
  99632. /**
  99633. * @author Richard Davey <rich@photonstorm.com>
  99634. * @copyright 2018 Photon Storm Ltd.
  99635. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99636. */
  99637. /**
  99638. * Back ease-in.
  99639. *
  99640. * @function Phaser.Math.Easing.Back.In
  99641. * @since 3.0.0
  99642. *
  99643. * @param {number} v - The value to be tweened.
  99644. * @param {number} [overshoot=1.70158] - The overshoot amount.
  99645. *
  99646. * @return {number} The tweened value.
  99647. */
  99648. var In = function (v, overshoot)
  99649. {
  99650. if (overshoot === undefined) { overshoot = 1.70158; }
  99651. return v * v * ((overshoot + 1) * v - overshoot);
  99652. };
  99653. module.exports = In;
  99654. /***/ }),
  99655. /* 567 */
  99656. /***/ (function(module, exports, __webpack_require__) {
  99657. /**
  99658. * @author Richard Davey <rich@photonstorm.com>
  99659. * @copyright 2018 Photon Storm Ltd.
  99660. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99661. */
  99662. var Clamp = __webpack_require__(19);
  99663. var Class = __webpack_require__(0);
  99664. var Vector2 = __webpack_require__(6);
  99665. var EaseMap = __webpack_require__(123);
  99666. /**
  99667. * @classdesc
  99668. * A Camera Pan effect.
  99669. *
  99670. * This effect will scroll the Camera so that the center of its viewport finishes at the given destination,
  99671. * over the duration and with the ease specified.
  99672. *
  99673. * Only the camera scroll is moved. None of the objects it is displaying are impacted, i.e. their positions do
  99674. * not change.
  99675. *
  99676. * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback,
  99677. * which is invoked each frame for the duration of the effect if required.
  99678. *
  99679. * @class Pan
  99680. * @memberOf Phaser.Cameras.Scene2D.Effects
  99681. * @constructor
  99682. * @since 3.11.0
  99683. *
  99684. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera this effect is acting upon.
  99685. */
  99686. var Pan = new Class({
  99687. initialize:
  99688. function Pan (camera)
  99689. {
  99690. /**
  99691. * The Camera this effect belongs to.
  99692. *
  99693. * @name Phaser.Cameras.Scene2D.Effects.Pan#camera
  99694. * @type {Phaser.Cameras.Scene2D.Camera}
  99695. * @readOnly
  99696. * @since 3.11.0
  99697. */
  99698. this.camera = camera;
  99699. /**
  99700. * Is this effect actively running?
  99701. *
  99702. * @name Phaser.Cameras.Scene2D.Effects.Pan#isRunning
  99703. * @type {boolean}
  99704. * @readOnly
  99705. * @default false
  99706. * @since 3.11.0
  99707. */
  99708. this.isRunning = false;
  99709. /**
  99710. * The duration of the effect, in milliseconds.
  99711. *
  99712. * @name Phaser.Cameras.Scene2D.Effects.Pan#duration
  99713. * @type {integer}
  99714. * @readOnly
  99715. * @default 0
  99716. * @since 3.11.0
  99717. */
  99718. this.duration = 0;
  99719. /**
  99720. * The starting scroll coordinates to pan the camera from.
  99721. *
  99722. * @name Phaser.Cameras.Scene2D.Effects.Pan#source
  99723. * @type {Phaser.Math.Vector2}
  99724. * @since 3.11.0
  99725. */
  99726. this.source = new Vector2();
  99727. /**
  99728. * The constantly updated value based on zoom.
  99729. *
  99730. * @name Phaser.Cameras.Scene2D.Effects.Pan#current
  99731. * @type {Phaser.Math.Vector2}
  99732. * @since 3.11.0
  99733. */
  99734. this.current = new Vector2();
  99735. /**
  99736. * The destination scroll coordinates to pan the camera to.
  99737. *
  99738. * @name Phaser.Cameras.Scene2D.Effects.Pan#destination
  99739. * @type {Phaser.Math.Vector2}
  99740. * @since 3.11.0
  99741. */
  99742. this.destination = new Vector2();
  99743. /**
  99744. * The ease function to use during the pan.
  99745. *
  99746. * @name Phaser.Cameras.Scene2D.Effects.Pan#ease
  99747. * @type {function}
  99748. * @since 3.11.0
  99749. */
  99750. this.ease;
  99751. /**
  99752. * If this effect is running this holds the current percentage of the progress, a value between 0 and 1.
  99753. *
  99754. * @name Phaser.Cameras.Scene2D.Effects.Pan#progress
  99755. * @type {number}
  99756. * @since 3.11.0
  99757. */
  99758. this.progress = 0;
  99759. /**
  99760. * Effect elapsed timer.
  99761. *
  99762. * @name Phaser.Cameras.Scene2D.Effects.Pan#_elapsed
  99763. * @type {number}
  99764. * @private
  99765. * @since 3.11.0
  99766. */
  99767. this._elapsed = 0;
  99768. /**
  99769. * @callback CameraPanCallback
  99770. *
  99771. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera on which the effect is running.
  99772. * @param {number} progress - The progress of the effect. A value between 0 and 1.
  99773. * @param {number} x - The Camera's new scrollX coordinate.
  99774. * @param {number} y - The Camera's new scrollY coordinate.
  99775. */
  99776. /**
  99777. * This callback is invoked every frame for the duration of the effect.
  99778. *
  99779. * @name Phaser.Cameras.Scene2D.Effects.Pan#_onUpdate
  99780. * @type {?CameraPanCallback}
  99781. * @private
  99782. * @default null
  99783. * @since 3.11.0
  99784. */
  99785. this._onUpdate;
  99786. /**
  99787. * On Complete callback scope.
  99788. *
  99789. * @name Phaser.Cameras.Scene2D.Effects.Pan#_onUpdateScope
  99790. * @type {any}
  99791. * @private
  99792. * @since 3.11.0
  99793. */
  99794. this._onUpdateScope;
  99795. },
  99796. /**
  99797. * This event is fired when the pan effect begins to run on a camera.
  99798. *
  99799. * @event CameraPanStartEvent
  99800. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  99801. * @param {Phaser.Cameras.Scene2D.Effects.Pan} effect - A reference to the effect instance.
  99802. * @param {integer} duration - The duration of the effect.
  99803. * @param {number} x - The destination scroll x coordinate.
  99804. * @param {number} y - The destination scroll y coordinate.
  99805. */
  99806. /**
  99807. * This event is fired when the pan effect completes.
  99808. *
  99809. * @event CameraPanCompleteEvent
  99810. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  99811. * @param {Phaser.Cameras.Scene2D.Effects.Pan} effect - A reference to the effect instance.
  99812. */
  99813. /**
  99814. * This effect will scroll the Camera so that the center of its viewport finishes at the given destination,
  99815. * over the duration and with the ease specified.
  99816. *
  99817. * @method Phaser.Cameras.Scene2D.Effects.Pan#start
  99818. * @fires CameraPanStartEvent
  99819. * @fires CameraPanCompleteEvent
  99820. * @since 3.11.0
  99821. *
  99822. * @param {number} x - The destination x coordinate to scroll the center of the Camera viewport to.
  99823. * @param {number} y - The destination y coordinate to scroll the center of the Camera viewport to.
  99824. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  99825. * @param {(string|function)} [ease='Linear'] - The ease to use for the pan. Can be any of the Phaser Easing constants or a custom function.
  99826. * @param {boolean} [force=false] - Force the shake effect to start immediately, even if already running.
  99827. * @param {CameraPanCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  99828. * It is sent four arguments: A reference to the camera, a progress amount between 0 and 1 indicating how complete the effect is,
  99829. * the current camera scroll x coordinate and the current camera scroll y coordinate.
  99830. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  99831. *
  99832. * @return {Phaser.Cameras.Scene2D.Camera} The Camera on which the effect was started.
  99833. */
  99834. start: function (x, y, duration, ease, force, callback, context)
  99835. {
  99836. if (duration === undefined) { duration = 1000; }
  99837. if (ease === undefined) { ease = EaseMap.Linear; }
  99838. if (force === undefined) { force = false; }
  99839. if (callback === undefined) { callback = null; }
  99840. if (context === undefined) { context = this.camera.scene; }
  99841. var cam = this.camera;
  99842. if (!force && this.isRunning)
  99843. {
  99844. return cam;
  99845. }
  99846. this.isRunning = true;
  99847. this.duration = duration;
  99848. this.progress = 0;
  99849. // Starting from
  99850. this.source.set(cam.scrollX, cam.scrollY);
  99851. // Destination
  99852. this.destination.set(x, y);
  99853. // Zoom factored version
  99854. cam.getScroll(x, y, this.current);
  99855. // Using this ease
  99856. if (typeof ease === 'string' && EaseMap.hasOwnProperty(ease))
  99857. {
  99858. this.ease = EaseMap[ease];
  99859. }
  99860. else if (typeof ease === 'function')
  99861. {
  99862. this.ease = ease;
  99863. }
  99864. this._elapsed = 0;
  99865. this._onUpdate = callback;
  99866. this._onUpdateScope = context;
  99867. this.camera.emit('camerapanstart', this.camera, this, duration, x, y);
  99868. return cam;
  99869. },
  99870. /**
  99871. * The main update loop for this effect. Called automatically by the Camera.
  99872. *
  99873. * @method Phaser.Cameras.Scene2D.Effects.Pan#update
  99874. * @since 3.11.0
  99875. *
  99876. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  99877. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  99878. */
  99879. update: function (time, delta)
  99880. {
  99881. if (!this.isRunning)
  99882. {
  99883. return;
  99884. }
  99885. this._elapsed += delta;
  99886. var progress = Clamp(this._elapsed / this.duration, 0, 1);
  99887. this.progress = progress;
  99888. var cam = this.camera;
  99889. if (this._elapsed < this.duration)
  99890. {
  99891. var v = this.ease(progress);
  99892. cam.getScroll(this.destination.x, this.destination.y, this.current);
  99893. var x = this.source.x + ((this.current.x - this.source.x) * v);
  99894. var y = this.source.y + ((this.current.y - this.source.y) * v);
  99895. cam.setScroll(x, y);
  99896. if (this._onUpdate)
  99897. {
  99898. this._onUpdate.call(this._onUpdateScope, cam, progress, x, y);
  99899. }
  99900. }
  99901. else
  99902. {
  99903. cam.centerOn(this.destination.x, this.destination.y);
  99904. if (this._onUpdate)
  99905. {
  99906. this._onUpdate.call(this._onUpdateScope, cam, progress, cam.scrollX, cam.scrollY);
  99907. }
  99908. this.effectComplete();
  99909. }
  99910. },
  99911. /**
  99912. * Called internally when the effect completes.
  99913. *
  99914. * @method Phaser.Cameras.Scene2D.Effects.Pan#effectComplete
  99915. * @since 3.11.0
  99916. */
  99917. effectComplete: function ()
  99918. {
  99919. this._onUpdate = null;
  99920. this._onUpdateScope = null;
  99921. this.isRunning = false;
  99922. this.camera.emit('camerapancomplete', this.camera, this);
  99923. },
  99924. /**
  99925. * Resets this camera effect.
  99926. * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event.
  99927. *
  99928. * @method Phaser.Cameras.Scene2D.Effects.Pan#reset
  99929. * @since 3.11.0
  99930. */
  99931. reset: function ()
  99932. {
  99933. this.isRunning = false;
  99934. this._onUpdate = null;
  99935. this._onUpdateScope = null;
  99936. },
  99937. /**
  99938. * Destroys this effect, releasing it from the Camera.
  99939. *
  99940. * @method Phaser.Cameras.Scene2D.Effects.Pan#destroy
  99941. * @since 3.11.0
  99942. */
  99943. destroy: function ()
  99944. {
  99945. this.reset();
  99946. this.camera = null;
  99947. this.source = null;
  99948. this.destination = null;
  99949. }
  99950. });
  99951. module.exports = Pan;
  99952. /***/ }),
  99953. /* 568 */
  99954. /***/ (function(module, exports, __webpack_require__) {
  99955. /**
  99956. * @author Richard Davey <rich@photonstorm.com>
  99957. * @copyright 2018 Photon Storm Ltd.
  99958. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  99959. */
  99960. var Clamp = __webpack_require__(19);
  99961. var Class = __webpack_require__(0);
  99962. /**
  99963. * @classdesc
  99964. * A Camera Flash effect.
  99965. *
  99966. * This effect will flash the camera viewport to the given color, over the duration specified.
  99967. *
  99968. * Only the camera viewport is flashed. None of the objects it is displaying are impacted, i.e. their colors do
  99969. * not change.
  99970. *
  99971. * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback,
  99972. * which is invoked each frame for the duration of the effect, if required.
  99973. *
  99974. * @class Flash
  99975. * @memberOf Phaser.Cameras.Scene2D.Effects
  99976. * @constructor
  99977. * @since 3.5.0
  99978. *
  99979. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera this effect is acting upon.
  99980. */
  99981. var Flash = new Class({
  99982. initialize:
  99983. function Flash (camera)
  99984. {
  99985. /**
  99986. * The Camera this effect belongs to.
  99987. *
  99988. * @name Phaser.Cameras.Scene2D.Effects.Flash#camera
  99989. * @type {Phaser.Cameras.Scene2D.Camera}
  99990. * @readOnly
  99991. * @since 3.5.0
  99992. */
  99993. this.camera = camera;
  99994. /**
  99995. * Is this effect actively running?
  99996. *
  99997. * @name Phaser.Cameras.Scene2D.Effects.Flash#isRunning
  99998. * @type {boolean}
  99999. * @readOnly
  100000. * @default false
  100001. * @since 3.5.0
  100002. */
  100003. this.isRunning = false;
  100004. /**
  100005. * The duration of the effect, in milliseconds.
  100006. *
  100007. * @name Phaser.Cameras.Scene2D.Effects.Flash#duration
  100008. * @type {integer}
  100009. * @readOnly
  100010. * @default 0
  100011. * @since 3.5.0
  100012. */
  100013. this.duration = 0;
  100014. /**
  100015. * The value of the red color channel the camera will use for the fade effect.
  100016. * A value between 0 and 255.
  100017. *
  100018. * @name Phaser.Cameras.Scene2D.Effects.Flash#red
  100019. * @type {integer}
  100020. * @private
  100021. * @since 3.5.0
  100022. */
  100023. this.red = 0;
  100024. /**
  100025. * The value of the green color channel the camera will use for the fade effect.
  100026. * A value between 0 and 255.
  100027. *
  100028. * @name Phaser.Cameras.Scene2D.Effects.Flash#green
  100029. * @type {integer}
  100030. * @private
  100031. * @since 3.5.0
  100032. */
  100033. this.green = 0;
  100034. /**
  100035. * The value of the blue color channel the camera will use for the fade effect.
  100036. * A value between 0 and 255.
  100037. *
  100038. * @name Phaser.Cameras.Scene2D.Effects.Flash#blue
  100039. * @type {integer}
  100040. * @private
  100041. * @since 3.5.0
  100042. */
  100043. this.blue = 0;
  100044. /**
  100045. * The value of the alpha channel used during the fade effect.
  100046. * A value between 0 and 1.
  100047. *
  100048. * @name Phaser.Cameras.Scene2D.Effects.Flash#alpha
  100049. * @type {number}
  100050. * @private
  100051. * @since 3.5.0
  100052. */
  100053. this.alpha = 0;
  100054. /**
  100055. * If this effect is running this holds the current percentage of the progress, a value between 0 and 1.
  100056. *
  100057. * @name Phaser.Cameras.Scene2D.Effects.Flash#progress
  100058. * @type {number}
  100059. * @since 3.5.0
  100060. */
  100061. this.progress = 0;
  100062. /**
  100063. * Effect elapsed timer.
  100064. *
  100065. * @name Phaser.Cameras.Scene2D.Effects.Flash#_elapsed
  100066. * @type {number}
  100067. * @private
  100068. * @since 3.5.0
  100069. */
  100070. this._elapsed = 0;
  100071. /**
  100072. * @callback CameraFlashCallback
  100073. *
  100074. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera on which the effect is running.
  100075. * @param {number} progress - The progress of the effect. A value between 0 and 1.
  100076. */
  100077. /**
  100078. * This callback is invoked every frame for the duration of the effect.
  100079. *
  100080. * @name Phaser.Cameras.Scene2D.Effects.Flash#_onUpdate
  100081. * @type {?CameraFlashCallback}
  100082. * @private
  100083. * @default null
  100084. * @since 3.5.0
  100085. */
  100086. this._onUpdate;
  100087. /**
  100088. * On Complete callback scope.
  100089. *
  100090. * @name Phaser.Cameras.Scene2D.Effects.Flash#_onUpdateScope
  100091. * @type {any}
  100092. * @private
  100093. * @since 3.5.0
  100094. */
  100095. this._onUpdateScope;
  100096. },
  100097. /**
  100098. * This event is fired when the flash effect begins to run on a camera.
  100099. *
  100100. * @event CameraFlashStartEvent
  100101. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  100102. * @param {Phaser.Cameras.Scene2D.Effects.Flash} effect - A reference to the effect instance.
  100103. * @param {integer} duration - The duration of the effect.
  100104. * @param {integer} red - The red color channel value.
  100105. * @param {integer} green - The green color channel value.
  100106. * @param {integer} blue - The blue color channel value.
  100107. */
  100108. /**
  100109. * This event is fired when the flash effect completes.
  100110. *
  100111. * @event CameraFlashCompleteEvent
  100112. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  100113. * @param {Phaser.Cameras.Scene2D.Effects.Flash} effect - A reference to the effect instance.
  100114. */
  100115. /**
  100116. * Flashes the Camera to or from the given color over the duration specified.
  100117. *
  100118. * @method Phaser.Cameras.Scene2D.Effects.Flash#start
  100119. * @fires CameraFlashStartEvent
  100120. * @fires CameraFlashCompleteEvent
  100121. * @since 3.5.0
  100122. *
  100123. * @param {integer} [duration=250] - The duration of the effect in milliseconds.
  100124. * @param {integer} [red=255] - The amount to fade the red channel towards. A value between 0 and 255.
  100125. * @param {integer} [green=255] - The amount to fade the green channel towards. A value between 0 and 255.
  100126. * @param {integer} [blue=255] - The amount to fade the blue channel towards. A value between 0 and 255.
  100127. * @param {boolean} [force=false] - Force the effect to start immediately, even if already running.
  100128. * @param {CameraFlashCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  100129. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  100130. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  100131. *
  100132. * @return {Phaser.Cameras.Scene2D.Camera} The Camera on which the effect was started.
  100133. */
  100134. start: function (duration, red, green, blue, force, callback, context)
  100135. {
  100136. if (duration === undefined) { duration = 250; }
  100137. if (red === undefined) { red = 255; }
  100138. if (green === undefined) { green = 255; }
  100139. if (blue === undefined) { blue = 255; }
  100140. if (force === undefined) { force = false; }
  100141. if (callback === undefined) { callback = null; }
  100142. if (context === undefined) { context = this.camera.scene; }
  100143. if (!force && this.isRunning)
  100144. {
  100145. return this.camera;
  100146. }
  100147. this.isRunning = true;
  100148. this.duration = duration;
  100149. this.progress = 0;
  100150. this.red = red;
  100151. this.green = green;
  100152. this.blue = blue;
  100153. this.alpha = 1;
  100154. this._elapsed = 0;
  100155. this._onUpdate = callback;
  100156. this._onUpdateScope = context;
  100157. this.camera.emit('cameraflashstart', this.camera, this, duration, red, green, blue);
  100158. return this.camera;
  100159. },
  100160. /**
  100161. * The main update loop for this effect. Called automatically by the Camera.
  100162. *
  100163. * @method Phaser.Cameras.Scene2D.Effects.Flash#update
  100164. * @since 3.5.0
  100165. *
  100166. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  100167. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  100168. */
  100169. update: function (time, delta)
  100170. {
  100171. if (!this.isRunning)
  100172. {
  100173. return;
  100174. }
  100175. this._elapsed += delta;
  100176. this.progress = Clamp(this._elapsed / this.duration, 0, 1);
  100177. if (this._onUpdate)
  100178. {
  100179. this._onUpdate.call(this._onUpdateScope, this.camera, this.progress);
  100180. }
  100181. if (this._elapsed < this.duration)
  100182. {
  100183. this.alpha = 1 - this.progress;
  100184. }
  100185. else
  100186. {
  100187. this.effectComplete();
  100188. }
  100189. },
  100190. /**
  100191. * Called internally by the Canvas Renderer.
  100192. *
  100193. * @method Phaser.Cameras.Scene2D.Effects.Flash#postRenderCanvas
  100194. * @since 3.5.0
  100195. *
  100196. * @param {CanvasRenderingContext2D} ctx - The Canvas context to render to.
  100197. *
  100198. * @return {boolean} `true` if the effect drew to the renderer, otherwise `false`.
  100199. */
  100200. postRenderCanvas: function (ctx)
  100201. {
  100202. if (!this.isRunning)
  100203. {
  100204. return false;
  100205. }
  100206. var camera = this.camera;
  100207. ctx.fillStyle = 'rgba(' + this.red + ',' + this.green + ',' + this.blue + ',' + this.alpha + ')';
  100208. ctx.fillRect(camera.x, camera.y, camera.width, camera.height);
  100209. return true;
  100210. },
  100211. /**
  100212. * Called internally by the WebGL Renderer.
  100213. *
  100214. * @method Phaser.Cameras.Scene2D.Effects.Flash#postRenderWebGL
  100215. * @since 3.5.0
  100216. *
  100217. * @param {Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline} pipeline - The WebGL Pipeline to render to.
  100218. * @param {function} getTintFunction - A function that will return the gl safe tint colors.
  100219. *
  100220. * @return {boolean} `true` if the effect drew to the renderer, otherwise `false`.
  100221. */
  100222. postRenderWebGL: function (pipeline, getTintFunction)
  100223. {
  100224. if (!this.isRunning)
  100225. {
  100226. return false;
  100227. }
  100228. var camera = this.camera;
  100229. var red = this.red / 255;
  100230. var blue = this.blue / 255;
  100231. var green = this.green / 255;
  100232. pipeline.batchFillRect(
  100233. 0, 0, 1, 1, 0,
  100234. camera.x, camera.y, camera.width, camera.height,
  100235. getTintFunction(red, green, blue, 1),
  100236. this.alpha,
  100237. 1, 0, 0, 1, 0, 0,
  100238. [ 1, 0, 0, 1, 0, 0 ]
  100239. );
  100240. return true;
  100241. },
  100242. /**
  100243. * Called internally when the effect completes.
  100244. *
  100245. * @method Phaser.Cameras.Scene2D.Effects.Flash#effectComplete
  100246. * @since 3.5.0
  100247. */
  100248. effectComplete: function ()
  100249. {
  100250. this._onUpdate = null;
  100251. this._onUpdateScope = null;
  100252. this.isRunning = false;
  100253. this.camera.emit('cameraflashcomplete', this.camera, this);
  100254. },
  100255. /**
  100256. * Resets this camera effect.
  100257. * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event.
  100258. *
  100259. * @method Phaser.Cameras.Scene2D.Effects.Flash#reset
  100260. * @since 3.5.0
  100261. */
  100262. reset: function ()
  100263. {
  100264. this.isRunning = false;
  100265. this._onUpdate = null;
  100266. this._onUpdateScope = null;
  100267. },
  100268. /**
  100269. * Destroys this effect, releasing it from the Camera.
  100270. *
  100271. * @method Phaser.Cameras.Scene2D.Effects.Flash#destroy
  100272. * @since 3.5.0
  100273. */
  100274. destroy: function ()
  100275. {
  100276. this.reset();
  100277. this.camera = null;
  100278. }
  100279. });
  100280. module.exports = Flash;
  100281. /***/ }),
  100282. /* 569 */
  100283. /***/ (function(module, exports, __webpack_require__) {
  100284. /**
  100285. * @author Richard Davey <rich@photonstorm.com>
  100286. * @copyright 2018 Photon Storm Ltd.
  100287. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100288. */
  100289. var Clamp = __webpack_require__(19);
  100290. var Class = __webpack_require__(0);
  100291. /**
  100292. * @classdesc
  100293. * A Camera Fade effect.
  100294. *
  100295. * This effect will fade the camera viewport to the given color, over the duration specified.
  100296. *
  100297. * Only the camera viewport is faded. None of the objects it is displaying are impacted, i.e. their colors do
  100298. * not change.
  100299. *
  100300. * The effect will dispatch several events on the Camera itself and you can also specify an `onUpdate` callback,
  100301. * which is invoked each frame for the duration of the effect, if required.
  100302. *
  100303. * @class Fade
  100304. * @memberOf Phaser.Cameras.Scene2D.Effects
  100305. * @constructor
  100306. * @since 3.5.0
  100307. *
  100308. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera this effect is acting upon.
  100309. */
  100310. var Fade = new Class({
  100311. initialize:
  100312. function Fade (camera)
  100313. {
  100314. /**
  100315. * The Camera this effect belongs to.
  100316. *
  100317. * @name Phaser.Cameras.Scene2D.Effects.Fade#camera
  100318. * @type {Phaser.Cameras.Scene2D.Camera}
  100319. * @readOnly
  100320. * @since 3.5.0
  100321. */
  100322. this.camera = camera;
  100323. /**
  100324. * Is this effect actively running?
  100325. *
  100326. * @name Phaser.Cameras.Scene2D.Effects.Fade#isRunning
  100327. * @type {boolean}
  100328. * @readOnly
  100329. * @default false
  100330. * @since 3.5.0
  100331. */
  100332. this.isRunning = false;
  100333. /**
  100334. * Has this effect finished running?
  100335. *
  100336. * This is different from `isRunning` because it remains set to `true` when the effect is over,
  100337. * until the effect is either reset or started again.
  100338. *
  100339. * @name Phaser.Cameras.Scene2D.Effects.Fade#isComplete
  100340. * @type {boolean}
  100341. * @readOnly
  100342. * @default false
  100343. * @since 3.5.0
  100344. */
  100345. this.isComplete = false;
  100346. /**
  100347. * The direction of the fade.
  100348. * `true` = fade out (transparent to color), `false` = fade in (color to transparent)
  100349. *
  100350. * @name Phaser.Cameras.Scene2D.Effects.Fade#direction
  100351. * @type {boolean}
  100352. * @readOnly
  100353. * @since 3.5.0
  100354. */
  100355. this.direction = true;
  100356. /**
  100357. * The duration of the effect, in milliseconds.
  100358. *
  100359. * @name Phaser.Cameras.Scene2D.Effects.Fade#duration
  100360. * @type {integer}
  100361. * @readOnly
  100362. * @default 0
  100363. * @since 3.5.0
  100364. */
  100365. this.duration = 0;
  100366. /**
  100367. * The value of the red color channel the camera will use for the fade effect.
  100368. * A value between 0 and 255.
  100369. *
  100370. * @name Phaser.Cameras.Scene2D.Effects.Fade#red
  100371. * @type {integer}
  100372. * @private
  100373. * @since 3.5.0
  100374. */
  100375. this.red = 0;
  100376. /**
  100377. * The value of the green color channel the camera will use for the fade effect.
  100378. * A value between 0 and 255.
  100379. *
  100380. * @name Phaser.Cameras.Scene2D.Effects.Fade#green
  100381. * @type {integer}
  100382. * @private
  100383. * @since 3.5.0
  100384. */
  100385. this.green = 0;
  100386. /**
  100387. * The value of the blue color channel the camera will use for the fade effect.
  100388. * A value between 0 and 255.
  100389. *
  100390. * @name Phaser.Cameras.Scene2D.Effects.Fade#blue
  100391. * @type {integer}
  100392. * @private
  100393. * @since 3.5.0
  100394. */
  100395. this.blue = 0;
  100396. /**
  100397. * The value of the alpha channel used during the fade effect.
  100398. * A value between 0 and 1.
  100399. *
  100400. * @name Phaser.Cameras.Scene2D.Effects.Fade#alpha
  100401. * @type {number}
  100402. * @private
  100403. * @since 3.5.0
  100404. */
  100405. this.alpha = 0;
  100406. /**
  100407. * If this effect is running this holds the current percentage of the progress, a value between 0 and 1.
  100408. *
  100409. * @name Phaser.Cameras.Scene2D.Effects.Fade#progress
  100410. * @type {number}
  100411. * @since 3.5.0
  100412. */
  100413. this.progress = 0;
  100414. /**
  100415. * Effect elapsed timer.
  100416. *
  100417. * @name Phaser.Cameras.Scene2D.Effects.Fade#_elapsed
  100418. * @type {number}
  100419. * @private
  100420. * @since 3.5.0
  100421. */
  100422. this._elapsed = 0;
  100423. /**
  100424. * @callback CameraFadeCallback
  100425. *
  100426. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera on which the effect is running.
  100427. * @param {number} progress - The progress of the effect. A value between 0 and 1.
  100428. */
  100429. /**
  100430. * This callback is invoked every frame for the duration of the effect.
  100431. *
  100432. * @name Phaser.Cameras.Scene2D.Effects.Fade#_onUpdate
  100433. * @type {?CameraFadeCallback}
  100434. * @private
  100435. * @default null
  100436. * @since 3.5.0
  100437. */
  100438. this._onUpdate;
  100439. /**
  100440. * On Complete callback scope.
  100441. *
  100442. * @name Phaser.Cameras.Scene2D.Effects.Fade#_onUpdateScope
  100443. * @type {any}
  100444. * @private
  100445. * @since 3.5.0
  100446. */
  100447. this._onUpdateScope;
  100448. },
  100449. /**
  100450. * This event is fired when the fade in effect begins to run on a camera.
  100451. *
  100452. * @event CameraFadeInStartEvent
  100453. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  100454. * @param {Phaser.Cameras.Scene2D.Effects.Fade} effect - A reference to the effect instance.
  100455. * @param {integer} duration - The duration of the effect.
  100456. * @param {integer} red - The red color channel value.
  100457. * @param {integer} green - The green color channel value.
  100458. * @param {integer} blue - The blue color channel value.
  100459. */
  100460. /**
  100461. * This event is fired when the fade out effect begins to run on a camera.
  100462. *
  100463. * @event CameraFadeOutStartEvent
  100464. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  100465. * @param {Phaser.Cameras.Scene2D.Effects.Fade} effect - A reference to the effect instance.
  100466. * @param {integer} duration - The duration of the effect.
  100467. * @param {integer} red - The red color channel value.
  100468. * @param {integer} green - The green color channel value.
  100469. * @param {integer} blue - The blue color channel value.
  100470. */
  100471. /**
  100472. * This event is fired when the fade in effect completes.
  100473. *
  100474. * @event CameraFadeInCompleteEvent
  100475. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  100476. * @param {Phaser.Cameras.Scene2D.Effects.Fade} effect - A reference to the effect instance.
  100477. */
  100478. /**
  100479. * This event is fired when the fade out effect completes.
  100480. *
  100481. * @event CameraFadeOutCompleteEvent
  100482. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera that the effect began on.
  100483. * @param {Phaser.Cameras.Scene2D.Effects.Fade} effect - A reference to the effect instance.
  100484. */
  100485. /**
  100486. * Fades the Camera to or from the given color over the duration specified.
  100487. *
  100488. * @method Phaser.Cameras.Scene2D.Effects.Fade#start
  100489. * @fires CameraFadeInStartEvent
  100490. * @fires CameraFadeInCompleteEvent
  100491. * @fires CameraFadeOutStartEvent
  100492. * @fires CameraFadeOutCompleteEvent
  100493. * @since 3.5.0
  100494. *
  100495. * @param {boolean} [direction=true] - The direction of the fade. `true` = fade out (transparent to color), `false` = fade in (color to transparent)
  100496. * @param {integer} [duration=1000] - The duration of the effect in milliseconds.
  100497. * @param {integer} [red=0] - The amount to fade the red channel towards. A value between 0 and 255.
  100498. * @param {integer} [green=0] - The amount to fade the green channel towards. A value between 0 and 255.
  100499. * @param {integer} [blue=0] - The amount to fade the blue channel towards. A value between 0 and 255.
  100500. * @param {boolean} [force=false] - Force the effect to start immediately, even if already running.
  100501. * @param {CameraFadeCallback} [callback] - This callback will be invoked every frame for the duration of the effect.
  100502. * It is sent two arguments: A reference to the camera and a progress amount between 0 and 1 indicating how complete the effect is.
  100503. * @param {any} [context] - The context in which the callback is invoked. Defaults to the Scene to which the Camera belongs.
  100504. *
  100505. * @return {Phaser.Cameras.Scene2D.Camera} The Camera on which the effect was started.
  100506. */
  100507. start: function (direction, duration, red, green, blue, force, callback, context)
  100508. {
  100509. if (direction === undefined) { direction = true; }
  100510. if (duration === undefined) { duration = 1000; }
  100511. if (red === undefined) { red = 0; }
  100512. if (green === undefined) { green = 0; }
  100513. if (blue === undefined) { blue = 0; }
  100514. if (force === undefined) { force = false; }
  100515. if (callback === undefined) { callback = null; }
  100516. if (context === undefined) { context = this.camera.scene; }
  100517. if (!force && this.isRunning)
  100518. {
  100519. return this.camera;
  100520. }
  100521. this.isRunning = true;
  100522. this.isComplete = false;
  100523. this.duration = duration;
  100524. this.direction = direction;
  100525. this.progress = 0;
  100526. this.red = red;
  100527. this.green = green;
  100528. this.blue = blue;
  100529. this.alpha = (direction) ? Number.MIN_VALUE : 1;
  100530. this._elapsed = 0;
  100531. this._onUpdate = callback;
  100532. this._onUpdateScope = context;
  100533. var eventName = (direction) ? 'camerafadeoutstart' : 'camerafadeinstart';
  100534. this.camera.emit(eventName, this.camera, this, duration, red, green, blue);
  100535. return this.camera;
  100536. },
  100537. /**
  100538. * The main update loop for this effect. Called automatically by the Camera.
  100539. *
  100540. * @method Phaser.Cameras.Scene2D.Effects.Fade#update
  100541. * @since 3.5.0
  100542. *
  100543. * @param {integer} time - The current timestamp as generated by the Request Animation Frame or SetTimeout.
  100544. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  100545. */
  100546. update: function (time, delta)
  100547. {
  100548. if (!this.isRunning)
  100549. {
  100550. return;
  100551. }
  100552. this._elapsed += delta;
  100553. this.progress = Clamp(this._elapsed / this.duration, 0, 1);
  100554. if (this._onUpdate)
  100555. {
  100556. this._onUpdate.call(this._onUpdateScope, this.camera, this.progress);
  100557. }
  100558. if (this._elapsed < this.duration)
  100559. {
  100560. this.alpha = (this.direction) ? this.progress : 1 - this.progress;
  100561. }
  100562. else
  100563. {
  100564. this.effectComplete();
  100565. }
  100566. },
  100567. /**
  100568. * Called internally by the Canvas Renderer.
  100569. *
  100570. * @method Phaser.Cameras.Scene2D.Effects.Fade#postRenderCanvas
  100571. * @since 3.5.0
  100572. *
  100573. * @param {CanvasRenderingContext2D} ctx - The Canvas context to render to.
  100574. *
  100575. * @return {boolean} `true` if the effect drew to the renderer, otherwise `false`.
  100576. */
  100577. postRenderCanvas: function (ctx)
  100578. {
  100579. if (!this.isRunning && !this.isComplete)
  100580. {
  100581. return false;
  100582. }
  100583. var camera = this.camera;
  100584. ctx.fillStyle = 'rgba(' + this.red + ',' + this.green + ',' + this.blue + ',' + this.alpha + ')';
  100585. ctx.fillRect(camera.x, camera.y, camera.width, camera.height);
  100586. return true;
  100587. },
  100588. /**
  100589. * Called internally by the WebGL Renderer.
  100590. *
  100591. * @method Phaser.Cameras.Scene2D.Effects.Fade#postRenderWebGL
  100592. * @since 3.5.0
  100593. *
  100594. * @param {Phaser.Renderer.WebGL.Pipelines.FlatTintPipeline} pipeline - The WebGL Pipeline to render to.
  100595. * @param {function} getTintFunction - A function that will return the gl safe tint colors.
  100596. *
  100597. * @return {boolean} `true` if the effect drew to the renderer, otherwise `false`.
  100598. */
  100599. postRenderWebGL: function (pipeline, getTintFunction)
  100600. {
  100601. if (!this.isRunning && !this.isComplete)
  100602. {
  100603. return false;
  100604. }
  100605. var camera = this.camera;
  100606. var red = this.red / 255;
  100607. var blue = this.blue / 255;
  100608. var green = this.green / 255;
  100609. pipeline.batchFillRect(
  100610. 0, 0, 1, 1, 0,
  100611. camera.x, camera.y, camera.width, camera.height,
  100612. getTintFunction(red, green, blue, 1),
  100613. this.alpha,
  100614. 1, 0, 0, 1, 0, 0,
  100615. [ 1, 0, 0, 1, 0, 0 ]
  100616. );
  100617. return true;
  100618. },
  100619. /**
  100620. * Called internally when the effect completes.
  100621. *
  100622. * @method Phaser.Cameras.Scene2D.Effects.Fade#effectComplete
  100623. * @since 3.5.0
  100624. */
  100625. effectComplete: function ()
  100626. {
  100627. this._onUpdate = null;
  100628. this._onUpdateScope = null;
  100629. this.isRunning = false;
  100630. this.isComplete = true;
  100631. var eventName = (this.direction) ? 'camerafadeoutcomplete' : 'camerafadeincomplete';
  100632. this.camera.emit(eventName, this.camera, this);
  100633. },
  100634. /**
  100635. * Resets this camera effect.
  100636. * If it was previously running, it stops instantly without calling its onComplete callback or emitting an event.
  100637. *
  100638. * @method Phaser.Cameras.Scene2D.Effects.Fade#reset
  100639. * @since 3.5.0
  100640. */
  100641. reset: function ()
  100642. {
  100643. this.isRunning = false;
  100644. this.isComplete = false;
  100645. this._onUpdate = null;
  100646. this._onUpdateScope = null;
  100647. },
  100648. /**
  100649. * Destroys this effect, releasing it from the Camera.
  100650. *
  100651. * @method Phaser.Cameras.Scene2D.Effects.Fade#destroy
  100652. * @since 3.5.0
  100653. */
  100654. destroy: function ()
  100655. {
  100656. this.reset();
  100657. this.camera = null;
  100658. }
  100659. });
  100660. module.exports = Fade;
  100661. /***/ }),
  100662. /* 570 */
  100663. /***/ (function(module, exports, __webpack_require__) {
  100664. /**
  100665. * @author Richard Davey <rich@photonstorm.com>
  100666. * @copyright 2018 Photon Storm Ltd.
  100667. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100668. */
  100669. /**
  100670. * @namespace Phaser.Cameras.Scene2D
  100671. */
  100672. module.exports = {
  100673. Camera: __webpack_require__(124),
  100674. CameraManager: __webpack_require__(532),
  100675. Effects: __webpack_require__(209)
  100676. };
  100677. /***/ }),
  100678. /* 571 */
  100679. /***/ (function(module, exports, __webpack_require__) {
  100680. /**
  100681. * @author Richard Davey <rich@photonstorm.com>
  100682. * @copyright 2018 Photon Storm Ltd.
  100683. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100684. */
  100685. /**
  100686. * @namespace Phaser.Cache
  100687. */
  100688. module.exports = {
  100689. BaseCache: __webpack_require__(211),
  100690. CacheManager: __webpack_require__(210)
  100691. };
  100692. /***/ }),
  100693. /* 572 */
  100694. /***/ (function(module, exports, __webpack_require__) {
  100695. /**
  100696. * @author Richard Davey <rich@photonstorm.com>
  100697. * @copyright 2018 Photon Storm Ltd.
  100698. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100699. */
  100700. /**
  100701. * @namespace Phaser.Animations
  100702. */
  100703. module.exports = {
  100704. Animation: __webpack_require__(215),
  100705. AnimationFrame: __webpack_require__(213),
  100706. AnimationManager: __webpack_require__(212)
  100707. };
  100708. /***/ }),
  100709. /* 573 */
  100710. /***/ (function(module, exports) {
  100711. /**
  100712. * @author Richard Davey <rich@photonstorm.com>
  100713. * @copyright 2018 Photon Storm Ltd.
  100714. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100715. */
  100716. /**
  100717. * Using Bresenham's line algorithm this will return an array of all coordinates on this line.
  100718. *
  100719. * The `start` and `end` points are rounded before this runs as the algorithm works on integers.
  100720. *
  100721. * @function Phaser.Geom.Line.BresenhamPoints
  100722. * @since 3.0.0
  100723. *
  100724. * @param {Phaser.Geom.Line} line - The line.
  100725. * @param {integer} [stepRate=1] - The optional step rate for the points on the line.
  100726. * @param {array} [results] - An optional array to push the resulting coordinates into.
  100727. *
  100728. * @return {object[]} The array of coordinates on the line.
  100729. */
  100730. var BresenhamPoints = function (line, stepRate, results)
  100731. {
  100732. if (stepRate === undefined) { stepRate = 1; }
  100733. if (results === undefined) { results = []; }
  100734. var x1 = Math.round(line.x1);
  100735. var y1 = Math.round(line.y1);
  100736. var x2 = Math.round(line.x2);
  100737. var y2 = Math.round(line.y2);
  100738. var dx = Math.abs(x2 - x1);
  100739. var dy = Math.abs(y2 - y1);
  100740. var sx = (x1 < x2) ? 1 : -1;
  100741. var sy = (y1 < y2) ? 1 : -1;
  100742. var err = dx - dy;
  100743. results.push({ x: x1, y: y1 });
  100744. var i = 1;
  100745. while (!((x1 === x2) && (y1 === y2)))
  100746. {
  100747. var e2 = err << 1;
  100748. if (e2 > -dy)
  100749. {
  100750. err -= dy;
  100751. x1 += sx;
  100752. }
  100753. if (e2 < dx)
  100754. {
  100755. err += dx;
  100756. y1 += sy;
  100757. }
  100758. if (i % stepRate === 0)
  100759. {
  100760. results.push({ x: x1, y: y1 });
  100761. }
  100762. i++;
  100763. }
  100764. return results;
  100765. };
  100766. module.exports = BresenhamPoints;
  100767. /***/ }),
  100768. /* 574 */
  100769. /***/ (function(module, exports, __webpack_require__) {
  100770. /**
  100771. * @author Richard Davey <rich@photonstorm.com>
  100772. * @copyright 2018 Photon Storm Ltd.
  100773. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100774. */
  100775. var Perimeter = __webpack_require__(97);
  100776. var Point = __webpack_require__(5);
  100777. // Return an array of points from the perimeter of the rectangle
  100778. // each spaced out based on the quantity or step required
  100779. /**
  100780. * [description]
  100781. *
  100782. * @function Phaser.Geom.Rectangle.MarchingAnts
  100783. * @since 3.0.0
  100784. *
  100785. * @generic {Phaser.Geom.Point[]} O - [out,$return]
  100786. *
  100787. * @param {Phaser.Geom.Rectangle} rect - [description]
  100788. * @param {number} step - [description]
  100789. * @param {integer} quantity - [description]
  100790. * @param {(array|Phaser.Geom.Point[])} [out] - [description]
  100791. *
  100792. * @return {(array|Phaser.Geom.Point[])} [description]
  100793. */
  100794. var MarchingAnts = function (rect, step, quantity, out)
  100795. {
  100796. if (out === undefined) { out = []; }
  100797. if (!step && !quantity)
  100798. {
  100799. // Bail out
  100800. return out;
  100801. }
  100802. // If step is a falsey value (false, null, 0, undefined, etc) then we calculate
  100803. // it based on the quantity instead, otherwise we always use the step value
  100804. if (!step)
  100805. {
  100806. step = Perimeter(rect) / quantity;
  100807. }
  100808. else
  100809. {
  100810. quantity = Math.round(Perimeter(rect) / step);
  100811. }
  100812. var x = rect.x;
  100813. var y = rect.y;
  100814. var face = 0;
  100815. // Loop across each face of the rectangle
  100816. for (var i = 0; i < quantity; i++)
  100817. {
  100818. out.push(new Point(x, y));
  100819. switch (face)
  100820. {
  100821. // Top face
  100822. case 0:
  100823. x += step;
  100824. if (x >= rect.right)
  100825. {
  100826. face = 1;
  100827. y += (x - rect.right);
  100828. x = rect.right;
  100829. }
  100830. break;
  100831. // Right face
  100832. case 1:
  100833. y += step;
  100834. if (y >= rect.bottom)
  100835. {
  100836. face = 2;
  100837. x -= (y - rect.bottom);
  100838. y = rect.bottom;
  100839. }
  100840. break;
  100841. // Bottom face
  100842. case 2:
  100843. x -= step;
  100844. if (x <= rect.left)
  100845. {
  100846. face = 3;
  100847. y -= (rect.left - x);
  100848. x = rect.left;
  100849. }
  100850. break;
  100851. // Left face
  100852. case 3:
  100853. y -= step;
  100854. if (y <= rect.top)
  100855. {
  100856. face = 0;
  100857. y = rect.top;
  100858. }
  100859. break;
  100860. }
  100861. }
  100862. return out;
  100863. };
  100864. module.exports = MarchingAnts;
  100865. /***/ }),
  100866. /* 575 */
  100867. /***/ (function(module, exports) {
  100868. /**
  100869. * @author Richard Davey <rich@photonstorm.com>
  100870. * @copyright 2018 Photon Storm Ltd.
  100871. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100872. */
  100873. // bitmask flag for GameObject.renderMask
  100874. var _FLAG = 1; // 0001
  100875. /**
  100876. * Provides methods used for setting the visibility of a Game Object.
  100877. * Should be applied as a mixin and not used directly.
  100878. *
  100879. * @name Phaser.GameObjects.Components.Visible
  100880. * @since 3.0.0
  100881. */
  100882. var Visible = {
  100883. /**
  100884. * Private internal value. Holds the visible value.
  100885. *
  100886. * @name Phaser.GameObjects.Components.Visible#_visible
  100887. * @type {boolean}
  100888. * @private
  100889. * @default true
  100890. * @since 3.0.0
  100891. */
  100892. _visible: true,
  100893. /**
  100894. * The visible state of the Game Object.
  100895. *
  100896. * An invisible Game Object will skip rendering, but will still process update logic.
  100897. *
  100898. * @name Phaser.GameObjects.Components.Visible#visible
  100899. * @type {boolean}
  100900. * @since 3.0.0
  100901. */
  100902. visible: {
  100903. get: function ()
  100904. {
  100905. return this._visible;
  100906. },
  100907. set: function (value)
  100908. {
  100909. if (value)
  100910. {
  100911. this._visible = true;
  100912. this.renderFlags |= _FLAG;
  100913. }
  100914. else
  100915. {
  100916. this._visible = false;
  100917. this.renderFlags &= ~_FLAG;
  100918. }
  100919. }
  100920. },
  100921. /**
  100922. * Sets the visibility of this Game Object.
  100923. *
  100924. * An invisible Game Object will skip rendering, but will still process update logic.
  100925. *
  100926. * @method Phaser.GameObjects.Components.Visible#setVisible
  100927. * @since 3.0.0
  100928. *
  100929. * @param {boolean} value - The visible state of the Game Object.
  100930. *
  100931. * @return {this} This Game Object instance.
  100932. */
  100933. setVisible: function (value)
  100934. {
  100935. this.visible = value;
  100936. return this;
  100937. }
  100938. };
  100939. module.exports = Visible;
  100940. /***/ }),
  100941. /* 576 */
  100942. /***/ (function(module, exports, __webpack_require__) {
  100943. /**
  100944. * @author Richard Davey <rich@photonstorm.com>
  100945. * @copyright 2018 Photon Storm Ltd.
  100946. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  100947. */
  100948. var MATH_CONST = __webpack_require__(15);
  100949. var TransformMatrix = __webpack_require__(32);
  100950. var WrapAngle = __webpack_require__(217);
  100951. var WrapAngleDegrees = __webpack_require__(216);
  100952. // global bitmask flag for GameObject.renderMask (used by Scale)
  100953. var _FLAG = 4; // 0100
  100954. /**
  100955. * Provides methods used for getting and setting the position, scale and rotation of a Game Object.
  100956. *
  100957. * @name Phaser.GameObjects.Components.Transform
  100958. * @since 3.0.0
  100959. */
  100960. var Transform = {
  100961. /**
  100962. * Private internal value. Holds the horizontal scale value.
  100963. *
  100964. * @name Phaser.GameObjects.Components.Transform#_scaleX
  100965. * @type {number}
  100966. * @private
  100967. * @default 1
  100968. * @since 3.0.0
  100969. */
  100970. _scaleX: 1,
  100971. /**
  100972. * Private internal value. Holds the vertical scale value.
  100973. *
  100974. * @name Phaser.GameObjects.Components.Transform#_scaleY
  100975. * @type {number}
  100976. * @private
  100977. * @default 1
  100978. * @since 3.0.0
  100979. */
  100980. _scaleY: 1,
  100981. /**
  100982. * Private internal value. Holds the rotation value in radians.
  100983. *
  100984. * @name Phaser.GameObjects.Components.Transform#_rotation
  100985. * @type {number}
  100986. * @private
  100987. * @default 0
  100988. * @since 3.0.0
  100989. */
  100990. _rotation: 0,
  100991. /**
  100992. * The x position of this Game Object.
  100993. *
  100994. * @name Phaser.GameObjects.Components.Transform#x
  100995. * @type {number}
  100996. * @default 0
  100997. * @since 3.0.0
  100998. */
  100999. x: 0,
  101000. /**
  101001. * The y position of this Game Object.
  101002. *
  101003. * @name Phaser.GameObjects.Components.Transform#y
  101004. * @type {number}
  101005. * @default 0
  101006. * @since 3.0.0
  101007. */
  101008. y: 0,
  101009. /**
  101010. * The z position of this Game Object.
  101011. * Note: Do not use this value to set the z-index, instead see the `depth` property.
  101012. *
  101013. * @name Phaser.GameObjects.Components.Transform#z
  101014. * @type {number}
  101015. * @default 0
  101016. * @since 3.0.0
  101017. */
  101018. z: 0,
  101019. /**
  101020. * The w position of this Game Object.
  101021. *
  101022. * @name Phaser.GameObjects.Components.Transform#w
  101023. * @type {number}
  101024. * @default 0
  101025. * @since 3.0.0
  101026. */
  101027. w: 0,
  101028. /**
  101029. * The horizontal scale of this Game Object.
  101030. *
  101031. * @name Phaser.GameObjects.Components.Transform#scaleX
  101032. * @type {number}
  101033. * @default 1
  101034. * @since 3.0.0
  101035. */
  101036. scaleX: {
  101037. get: function ()
  101038. {
  101039. return this._scaleX;
  101040. },
  101041. set: function (value)
  101042. {
  101043. this._scaleX = value;
  101044. if (this._scaleX === 0)
  101045. {
  101046. this.renderFlags &= ~_FLAG;
  101047. }
  101048. else
  101049. {
  101050. this.renderFlags |= _FLAG;
  101051. }
  101052. }
  101053. },
  101054. /**
  101055. * The vertical scale of this Game Object.
  101056. *
  101057. * @name Phaser.GameObjects.Components.Transform#scaleY
  101058. * @type {number}
  101059. * @default 1
  101060. * @since 3.0.0
  101061. */
  101062. scaleY: {
  101063. get: function ()
  101064. {
  101065. return this._scaleY;
  101066. },
  101067. set: function (value)
  101068. {
  101069. this._scaleY = value;
  101070. if (this._scaleY === 0)
  101071. {
  101072. this.renderFlags &= ~_FLAG;
  101073. }
  101074. else
  101075. {
  101076. this.renderFlags |= _FLAG;
  101077. }
  101078. }
  101079. },
  101080. /**
  101081. * The angle of this Game Object as expressed in degrees.
  101082. *
  101083. * Where 0 is to the right, 90 is down, 180 is left.
  101084. *
  101085. * If you prefer to work in radians, see the `rotation` property instead.
  101086. *
  101087. * @name Phaser.GameObjects.Components.Transform#angle
  101088. * @type {integer}
  101089. * @default 0
  101090. * @since 3.0.0
  101091. */
  101092. angle: {
  101093. get: function ()
  101094. {
  101095. return WrapAngleDegrees(this._rotation * MATH_CONST.RAD_TO_DEG);
  101096. },
  101097. set: function (value)
  101098. {
  101099. // value is in degrees
  101100. this.rotation = WrapAngleDegrees(value) * MATH_CONST.DEG_TO_RAD;
  101101. }
  101102. },
  101103. /**
  101104. * The angle of this Game Object in radians.
  101105. *
  101106. * If you prefer to work in degrees, see the `angle` property instead.
  101107. *
  101108. * @name Phaser.GameObjects.Components.Transform#rotation
  101109. * @type {number}
  101110. * @default 1
  101111. * @since 3.0.0
  101112. */
  101113. rotation: {
  101114. get: function ()
  101115. {
  101116. return this._rotation;
  101117. },
  101118. set: function (value)
  101119. {
  101120. // value is in radians
  101121. this._rotation = WrapAngle(value);
  101122. }
  101123. },
  101124. /**
  101125. * Sets the position of this Game Object.
  101126. *
  101127. * @method Phaser.GameObjects.Components.Transform#setPosition
  101128. * @since 3.0.0
  101129. *
  101130. * @param {number} [x=0] - The x position of this Game Object.
  101131. * @param {number} [y=x] - The y position of this Game Object. If not set it will use the `x` value.
  101132. * @param {number} [z=0] - The z position of this Game Object.
  101133. * @param {number} [w=0] - The w position of this Game Object.
  101134. *
  101135. * @return {this} This Game Object instance.
  101136. */
  101137. setPosition: function (x, y, z, w)
  101138. {
  101139. if (x === undefined) { x = 0; }
  101140. if (y === undefined) { y = x; }
  101141. if (z === undefined) { z = 0; }
  101142. if (w === undefined) { w = 0; }
  101143. this.x = x;
  101144. this.y = y;
  101145. this.z = z;
  101146. this.w = w;
  101147. return this;
  101148. },
  101149. /**
  101150. * Sets the position of this Game Object to be a random position within the confines of
  101151. * the given area.
  101152. *
  101153. * If no area is specified a random position between 0 x 0 and the game width x height is used instead.
  101154. *
  101155. * The position does not factor in the size of this Game Object, meaning that only the origin is
  101156. * guaranteed to be within the area.
  101157. *
  101158. * @method Phaser.GameObjects.Components.Transform#setRandomPosition
  101159. * @since 3.8.0
  101160. *
  101161. * @param {number} [x=0] - The x position of the top-left of the random area.
  101162. * @param {number} [y=0] - The y position of the top-left of the random area.
  101163. * @param {number} [width] - The width of the random area.
  101164. * @param {number} [height] - The height of the random area.
  101165. *
  101166. * @return {this} This Game Object instance.
  101167. */
  101168. setRandomPosition: function (x, y, width, height)
  101169. {
  101170. if (x === undefined) { x = 0; }
  101171. if (y === undefined) { y = 0; }
  101172. if (width === undefined) { width = this.scene.sys.game.config.width; }
  101173. if (height === undefined) { height = this.scene.sys.game.config.height; }
  101174. this.x = x + (Math.random() * width);
  101175. this.y = y + (Math.random() * height);
  101176. return this;
  101177. },
  101178. /**
  101179. * Sets the rotation of this Game Object.
  101180. *
  101181. * @method Phaser.GameObjects.Components.Transform#setRotation
  101182. * @since 3.0.0
  101183. *
  101184. * @param {number} [radians=0] - The rotation of this Game Object, in radians.
  101185. *
  101186. * @return {this} This Game Object instance.
  101187. */
  101188. setRotation: function (radians)
  101189. {
  101190. if (radians === undefined) { radians = 0; }
  101191. this.rotation = radians;
  101192. return this;
  101193. },
  101194. /**
  101195. * Sets the angle of this Game Object.
  101196. *
  101197. * @method Phaser.GameObjects.Components.Transform#setAngle
  101198. * @since 3.0.0
  101199. *
  101200. * @param {number} [degrees=0] - The rotation of this Game Object, in degrees.
  101201. *
  101202. * @return {this} This Game Object instance.
  101203. */
  101204. setAngle: function (degrees)
  101205. {
  101206. if (degrees === undefined) { degrees = 0; }
  101207. this.angle = degrees;
  101208. return this;
  101209. },
  101210. /**
  101211. * Sets the scale of this Game Object.
  101212. *
  101213. * @method Phaser.GameObjects.Components.Transform#setScale
  101214. * @since 3.0.0
  101215. *
  101216. * @param {number} x - The horizontal scale of this Game Object.
  101217. * @param {number} [y=x] - The vertical scale of this Game Object. If not set it will use the `x` value.
  101218. *
  101219. * @return {this} This Game Object instance.
  101220. */
  101221. setScale: function (x, y)
  101222. {
  101223. if (x === undefined) { x = 1; }
  101224. if (y === undefined) { y = x; }
  101225. this.scaleX = x;
  101226. this.scaleY = y;
  101227. return this;
  101228. },
  101229. /**
  101230. * Sets the x position of this Game Object.
  101231. *
  101232. * @method Phaser.GameObjects.Components.Transform#setX
  101233. * @since 3.0.0
  101234. *
  101235. * @param {number} [value=0] - The x position of this Game Object.
  101236. *
  101237. * @return {this} This Game Object instance.
  101238. */
  101239. setX: function (value)
  101240. {
  101241. if (value === undefined) { value = 0; }
  101242. this.x = value;
  101243. return this;
  101244. },
  101245. /**
  101246. * Sets the y position of this Game Object.
  101247. *
  101248. * @method Phaser.GameObjects.Components.Transform#setY
  101249. * @since 3.0.0
  101250. *
  101251. * @param {number} [value=0] - The y position of this Game Object.
  101252. *
  101253. * @return {this} This Game Object instance.
  101254. */
  101255. setY: function (value)
  101256. {
  101257. if (value === undefined) { value = 0; }
  101258. this.y = value;
  101259. return this;
  101260. },
  101261. /**
  101262. * Sets the z position of this Game Object.
  101263. *
  101264. * @method Phaser.GameObjects.Components.Transform#setZ
  101265. * @since 3.0.0
  101266. *
  101267. * @param {number} [value=0] - The z position of this Game Object.
  101268. *
  101269. * @return {this} This Game Object instance.
  101270. */
  101271. setZ: function (value)
  101272. {
  101273. if (value === undefined) { value = 0; }
  101274. this.z = value;
  101275. return this;
  101276. },
  101277. /**
  101278. * Sets the w position of this Game Object.
  101279. *
  101280. * @method Phaser.GameObjects.Components.Transform#setW
  101281. * @since 3.0.0
  101282. *
  101283. * @param {number} [value=0] - The w position of this Game Object.
  101284. *
  101285. * @return {this} This Game Object instance.
  101286. */
  101287. setW: function (value)
  101288. {
  101289. if (value === undefined) { value = 0; }
  101290. this.w = value;
  101291. return this;
  101292. },
  101293. /**
  101294. * Gets the local transform matrix for this Game Object.
  101295. *
  101296. * @method Phaser.GameObjects.Components.Transform#getLocalTransformMatrix
  101297. * @since 3.4.0
  101298. *
  101299. * @param {Phaser.GameObjects.Components.TransformMatrix} [tempMatrix] - The matrix to populate with the values from this Game Object.
  101300. *
  101301. * @return {Phaser.GameObjects.Components.TransformMatrix} The populated Transform Matrix.
  101302. */
  101303. getLocalTransformMatrix: function (tempMatrix)
  101304. {
  101305. if (tempMatrix === undefined) { tempMatrix = new TransformMatrix(); }
  101306. return tempMatrix.applyITRS(this.x, this.y, this._rotation, this._scaleX, this._scaleY);
  101307. },
  101308. /**
  101309. * Gets the world transform matrix for this Game Object, factoring in any parent Containers.
  101310. *
  101311. * @method Phaser.GameObjects.Components.Transform#getWorldTransformMatrix
  101312. * @since 3.4.0
  101313. *
  101314. * @param {Phaser.GameObjects.Components.TransformMatrix} [tempMatrix] - The matrix to populate with the values from this Game Object.
  101315. *
  101316. * @return {Phaser.GameObjects.Components.TransformMatrix} The populated Transform Matrix.
  101317. */
  101318. getWorldTransformMatrix: function (tempMatrix)
  101319. {
  101320. if (tempMatrix === undefined) { tempMatrix = new TransformMatrix(); }
  101321. var parent = this.parentContainer;
  101322. if (!parent)
  101323. {
  101324. return this.getLocalTransformMatrix(tempMatrix);
  101325. }
  101326. var parents = [];
  101327. while (parent)
  101328. {
  101329. parents.unshift(parent);
  101330. parent = parent.parentContainer;
  101331. }
  101332. tempMatrix.loadIdentity();
  101333. var length = parents.length;
  101334. for (var i = 0; i < length; ++i)
  101335. {
  101336. parent = parents[i];
  101337. tempMatrix.translate(parent.x, parent.y);
  101338. tempMatrix.rotate(parent.rotation);
  101339. tempMatrix.scale(parent.scaleX, parent.scaleY);
  101340. }
  101341. tempMatrix.translate(this.x, this.y);
  101342. tempMatrix.rotate(this._rotation);
  101343. tempMatrix.scale(this._scaleX, this._scaleY);
  101344. return tempMatrix;
  101345. }
  101346. };
  101347. module.exports = Transform;
  101348. /***/ }),
  101349. /* 577 */
  101350. /***/ (function(module, exports) {
  101351. /**
  101352. * @author Richard Davey <rich@photonstorm.com>
  101353. * @copyright 2018 Photon Storm Ltd.
  101354. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  101355. */
  101356. /**
  101357. * @typedef {object} JSONGameObject
  101358. *
  101359. * @property {string} name - The name of this Game Object.
  101360. * @property {string} type - A textual representation of this Game Object, i.e. `sprite`.
  101361. * @property {number} x - The x position of this Game Object.
  101362. * @property {number} y - The y position of this Game Object.
  101363. * @property {object} scale - The scale of this Game Object
  101364. * @property {number} scale.x - The horizontal scale of this Game Object.
  101365. * @property {number} scale.y - The vertical scale of this Game Object.
  101366. * @property {object} origin - The origin of this Game Object.
  101367. * @property {number} origin.x - The horizontal origin of this Game Object.
  101368. * @property {number} origin.y - The vertical origin of this Game Object.
  101369. * @property {boolean} flipX - The horizontally flipped state of the Game Object.
  101370. * @property {boolean} flipY - The vertically flipped state of the Game Object.
  101371. * @property {number} rotation - The angle of this Game Object in radians.
  101372. * @property {number} alpha - The alpha value of the Game Object.
  101373. * @property {boolean} visible - The visible state of the Game Object.
  101374. * @property {integer} scaleMode - The Scale Mode being used by this Game Object.
  101375. * @property {(integer|string)} blendMode - Sets the Blend Mode being used by this Game Object.
  101376. * @property {string} textureKey - The texture key of this Game Object.
  101377. * @property {string} frameKey - The frame key of this Game Object.
  101378. * @property {object} data - The data of this Game Object.
  101379. */
  101380. /**
  101381. * Build a JSON representation of the given Game Object.
  101382. *
  101383. * This is typically extended further by Game Object specific implementations.
  101384. *
  101385. * @method Phaser.GameObjects.Components.ToJSON
  101386. * @since 3.0.0
  101387. *
  101388. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to export as JSON.
  101389. *
  101390. * @return {JSONGameObject} A JSON representation of the Game Object.
  101391. */
  101392. var ToJSON = function (gameObject)
  101393. {
  101394. var out = {
  101395. name: gameObject.name,
  101396. type: gameObject.type,
  101397. x: gameObject.x,
  101398. y: gameObject.y,
  101399. depth: gameObject.depth,
  101400. scale: {
  101401. x: gameObject.scaleX,
  101402. y: gameObject.scaleY
  101403. },
  101404. origin: {
  101405. x: gameObject.originX,
  101406. y: gameObject.originY
  101407. },
  101408. flipX: gameObject.flipX,
  101409. flipY: gameObject.flipY,
  101410. rotation: gameObject.rotation,
  101411. alpha: gameObject.alpha,
  101412. visible: gameObject.visible,
  101413. scaleMode: gameObject.scaleMode,
  101414. blendMode: gameObject.blendMode,
  101415. textureKey: '',
  101416. frameKey: '',
  101417. data: {}
  101418. };
  101419. if (gameObject.texture)
  101420. {
  101421. out.textureKey = gameObject.texture.key;
  101422. out.frameKey = gameObject.frame.name;
  101423. }
  101424. return out;
  101425. };
  101426. module.exports = ToJSON;
  101427. /***/ }),
  101428. /* 578 */
  101429. /***/ (function(module, exports) {
  101430. /**
  101431. * @author Richard Davey <rich@photonstorm.com>
  101432. * @copyright 2018 Photon Storm Ltd.
  101433. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  101434. */
  101435. /**
  101436. * @function GetColor
  101437. * @since 3.0.0
  101438. * @private
  101439. */
  101440. var GetColor = function (value)
  101441. {
  101442. return (value >> 16) + (value & 0xff00) + ((value & 0xff) << 16);
  101443. };
  101444. /**
  101445. * Provides methods used for setting the tint of a Game Object.
  101446. * Should be applied as a mixin and not used directly.
  101447. *
  101448. * @name Phaser.GameObjects.Components.Tint
  101449. * @webglOnly
  101450. * @since 3.0.0
  101451. */
  101452. var Tint = {
  101453. /**
  101454. * Private internal value. Holds the top-left tint value.
  101455. *
  101456. * @name Phaser.GameObjects.Components.Tint#_tintTL
  101457. * @type {number}
  101458. * @private
  101459. * @default 16777215
  101460. * @since 3.0.0
  101461. */
  101462. _tintTL: 16777215,
  101463. /**
  101464. * Private internal value. Holds the top-right tint value.
  101465. *
  101466. * @name Phaser.GameObjects.Components.Tint#_tintTR
  101467. * @type {number}
  101468. * @private
  101469. * @default 16777215
  101470. * @since 3.0.0
  101471. */
  101472. _tintTR: 16777215,
  101473. /**
  101474. * Private internal value. Holds the bottom-left tint value.
  101475. *
  101476. * @name Phaser.GameObjects.Components.Tint#_tintBL
  101477. * @type {number}
  101478. * @private
  101479. * @default 16777215
  101480. * @since 3.0.0
  101481. */
  101482. _tintBL: 16777215,
  101483. /**
  101484. * Private internal value. Holds the bottom-right tint value.
  101485. *
  101486. * @name Phaser.GameObjects.Components.Tint#_tintBR
  101487. * @type {number}
  101488. * @private
  101489. * @default 16777215
  101490. * @since 3.0.0
  101491. */
  101492. _tintBR: 16777215,
  101493. /**
  101494. * Private internal value. Holds if the Game Object is tinted or not.
  101495. *
  101496. * @name Phaser.GameObjects.Components.Tint#_isTinted
  101497. * @type {boolean}
  101498. * @private
  101499. * @default false
  101500. * @since 3.11.0
  101501. */
  101502. _isTinted: false,
  101503. /**
  101504. * Fill or additive?
  101505. *
  101506. * @name Phaser.GameObjects.Components.Tint#tintFill
  101507. * @type {boolean}
  101508. * @default false
  101509. * @since 3.11.0
  101510. */
  101511. tintFill: false,
  101512. /**
  101513. * Clears all tint values associated with this Game Object.
  101514. *
  101515. * Immediately sets the color values back to 0xffffff and the tint type to 'additive',
  101516. * which results in no visible change to the texture.
  101517. *
  101518. * @method Phaser.GameObjects.Components.Tint#clearTint
  101519. * @webglOnly
  101520. * @since 3.0.0
  101521. *
  101522. * @return {this} This Game Object instance.
  101523. */
  101524. clearTint: function ()
  101525. {
  101526. this.setTint(0xffffff);
  101527. this._isTinted = false;
  101528. return this;
  101529. },
  101530. /**
  101531. * Sets an additive tint on this Game Object.
  101532. *
  101533. * The tint works by taking the pixel color values from the Game Objects texture, and then
  101534. * multiplying it by the color value of the tint. You can provide either one color value,
  101535. * in which case the whole Game Object will be tinted in that color. Or you can provide a color
  101536. * per corner. The colors are blended together across the extent of the Game Object.
  101537. *
  101538. * To modify the tint color once set, either call this method again with new values or use the
  101539. * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight,
  101540. * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently.
  101541. *
  101542. * To remove a tint call `clearTint`.
  101543. *
  101544. * To swap this from being an additive tint to a fill based tint set the property `tintFill` to `true`.
  101545. *
  101546. * @method Phaser.GameObjects.Components.Tint#setTint
  101547. * @webglOnly
  101548. * @since 3.0.0
  101549. *
  101550. * @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.
  101551. * @param {integer} [topRight] - The tint being applied to the top-right of the Game Object.
  101552. * @param {integer} [bottomLeft] - The tint being applied to the bottom-left of the Game Object.
  101553. * @param {integer} [bottomRight] - The tint being applied to the bottom-right of the Game Object.
  101554. *
  101555. * @return {this} This Game Object instance.
  101556. */
  101557. setTint: function (topLeft, topRight, bottomLeft, bottomRight)
  101558. {
  101559. if (topLeft === undefined) { topLeft = 0xffffff; }
  101560. if (topRight === undefined)
  101561. {
  101562. topRight = topLeft;
  101563. bottomLeft = topLeft;
  101564. bottomRight = topLeft;
  101565. }
  101566. this._tintTL = GetColor(topLeft);
  101567. this._tintTR = GetColor(topRight);
  101568. this._tintBL = GetColor(bottomLeft);
  101569. this._tintBR = GetColor(bottomRight);
  101570. this._isTinted = true;
  101571. this.tintFill = false;
  101572. return this;
  101573. },
  101574. /**
  101575. * Sets a fill-based tint on this Game Object.
  101576. *
  101577. * Unlike an additive tint, a fill-tint literally replaces the pixel colors from the texture
  101578. * with those in the tint. You can use this for effects such as making a player flash 'white'
  101579. * if hit by something. You can provide either one color value, in which case the whole
  101580. * Game Object will be rendered in that color. Or you can provide a color per corner. The colors
  101581. * are blended together across the extent of the Game Object.
  101582. *
  101583. * To modify the tint color once set, either call this method again with new values or use the
  101584. * `tint` property to set all colors at once. Or, use the properties `tintTopLeft`, `tintTopRight,
  101585. * `tintBottomLeft` and `tintBottomRight` to set the corner color values independently.
  101586. *
  101587. * To remove a tint call `clearTint`.
  101588. *
  101589. * To swap this from being a fill-tint to an additive tint set the property `tintFill` to `false`.
  101590. *
  101591. * @method Phaser.GameObjects.Components.Tint#setTintFill
  101592. * @webglOnly
  101593. * @since 3.11.0
  101594. *
  101595. * @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.
  101596. * @param {integer} [topRight] - The tint being applied to the top-right of the Game Object.
  101597. * @param {integer} [bottomLeft] - The tint being applied to the bottom-left of the Game Object.
  101598. * @param {integer} [bottomRight] - The tint being applied to the bottom-right of the Game Object.
  101599. *
  101600. * @return {this} This Game Object instance.
  101601. */
  101602. setTintFill: function (topLeft, topRight, bottomLeft, bottomRight)
  101603. {
  101604. this.setTint(topLeft, topRight, bottomLeft, bottomRight);
  101605. this.tintFill = true;
  101606. return this;
  101607. },
  101608. /**
  101609. * The tint value being applied to the top-left of the Game Object.
  101610. * This value is interpolated from the corner to the center of the Game Object.
  101611. *
  101612. * @name Phaser.GameObjects.Components.Tint#tintTopLeft
  101613. * @type {integer}
  101614. * @webglOnly
  101615. * @since 3.0.0
  101616. */
  101617. tintTopLeft: {
  101618. get: function ()
  101619. {
  101620. return this._tintTL;
  101621. },
  101622. set: function (value)
  101623. {
  101624. this._tintTL = GetColor(value);
  101625. this._isTinted = true;
  101626. }
  101627. },
  101628. /**
  101629. * The tint value being applied to the top-right of the Game Object.
  101630. * This value is interpolated from the corner to the center of the Game Object.
  101631. *
  101632. * @name Phaser.GameObjects.Components.Tint#tintTopRight
  101633. * @type {integer}
  101634. * @webglOnly
  101635. * @since 3.0.0
  101636. */
  101637. tintTopRight: {
  101638. get: function ()
  101639. {
  101640. return this._tintTR;
  101641. },
  101642. set: function (value)
  101643. {
  101644. this._tintTR = GetColor(value);
  101645. this._isTinted = true;
  101646. }
  101647. },
  101648. /**
  101649. * The tint value being applied to the bottom-left of the Game Object.
  101650. * This value is interpolated from the corner to the center of the Game Object.
  101651. *
  101652. * @name Phaser.GameObjects.Components.Tint#tintBottomLeft
  101653. * @type {integer}
  101654. * @webglOnly
  101655. * @since 3.0.0
  101656. */
  101657. tintBottomLeft: {
  101658. get: function ()
  101659. {
  101660. return this._tintBL;
  101661. },
  101662. set: function (value)
  101663. {
  101664. this._tintBL = GetColor(value);
  101665. this._isTinted = true;
  101666. }
  101667. },
  101668. /**
  101669. * The tint value being applied to the bottom-right of the Game Object.
  101670. * This value is interpolated from the corner to the center of the Game Object.
  101671. *
  101672. * @name Phaser.GameObjects.Components.Tint#tintBottomRight
  101673. * @type {integer}
  101674. * @webglOnly
  101675. * @since 3.0.0
  101676. */
  101677. tintBottomRight: {
  101678. get: function ()
  101679. {
  101680. return this._tintBR;
  101681. },
  101682. set: function (value)
  101683. {
  101684. this._tintBR = GetColor(value);
  101685. this._isTinted = true;
  101686. }
  101687. },
  101688. /**
  101689. * The tint value being applied to the whole of the Game Object.
  101690. *
  101691. * @name Phaser.GameObjects.Components.Tint#tint
  101692. * @type {integer}
  101693. * @webglOnly
  101694. * @since 3.0.0
  101695. */
  101696. tint: {
  101697. set: function (value)
  101698. {
  101699. this.setTint(value, value, value, value);
  101700. }
  101701. },
  101702. /**
  101703. * Does this Game Object have a tint applied to it or not?
  101704. *
  101705. * @name Phaser.GameObjects.Components.Tint#isTinted
  101706. * @type {boolean}
  101707. * @webglOnly
  101708. * @readOnly
  101709. * @since 3.11.0
  101710. */
  101711. isTinted: {
  101712. get: function ()
  101713. {
  101714. return this._isTinted;
  101715. }
  101716. }
  101717. };
  101718. module.exports = Tint;
  101719. /***/ }),
  101720. /* 579 */
  101721. /***/ (function(module, exports) {
  101722. /**
  101723. * @author Richard Davey <rich@photonstorm.com>
  101724. * @copyright 2018 Photon Storm Ltd.
  101725. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  101726. */
  101727. // bitmask flag for GameObject.renderMask
  101728. var _FLAG = 8; // 1000
  101729. /**
  101730. * Provides methods used for getting and setting the texture of a Game Object.
  101731. *
  101732. * @name Phaser.GameObjects.Components.TextureCrop
  101733. * @since 3.0.0
  101734. */
  101735. var TextureCrop = {
  101736. /**
  101737. * The Texture this Game Object is using to render with.
  101738. *
  101739. * @name Phaser.GameObjects.Components.TextureCrop#texture
  101740. * @type {Phaser.Textures.Texture|Phaser.Textures.CanvasTexture}
  101741. * @since 3.0.0
  101742. */
  101743. texture: null,
  101744. /**
  101745. * The Texture Frame this Game Object is using to render with.
  101746. *
  101747. * @name Phaser.GameObjects.Components.TextureCrop#frame
  101748. * @type {Phaser.Textures.Frame}
  101749. * @since 3.0.0
  101750. */
  101751. frame: null,
  101752. /**
  101753. * A boolean flag indicating if this Game Object is being cropped or not.
  101754. * You can toggle this at any time after `setCrop` has been called, to turn cropping on or off.
  101755. * Equally, calling `setCrop` with no arguments will reset the crop and disable it.
  101756. *
  101757. * @name Phaser.GameObjects.Components.TextureCrop#isCropped
  101758. * @type {boolean}
  101759. * @since 3.11.0
  101760. */
  101761. isCropped: false,
  101762. /**
  101763. * The internal crop data object, as used by `setCrop` and passed to the `Frame.setCropUVs` method.
  101764. *
  101765. * @name Phaser.GameObjects.Components.TextureCrop#isCropped
  101766. * @type {object}
  101767. * @private
  101768. * @since 3.11.0
  101769. */
  101770. _crop: { 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 },
  101771. /**
  101772. * Applies a crop to a texture based Game Object, such as a Sprite or Image.
  101773. *
  101774. * The crop is a rectangle that limits the area of the texture frame that is visible during rendering.
  101775. *
  101776. * Cropping a Game Object does not change its size, dimensions, physics body or hit area, it just
  101777. * changes what is shown when rendered.
  101778. *
  101779. * The crop coordinates are relative to the texture frame, not the Game Object, meaning 0 x 0 is the top-left.
  101780. *
  101781. * Therefore, if you had a Game Object that had an 800x600 sized texture, and you wanted to show only the left
  101782. * half of it, you could call `setCrop(0, 0, 400, 600)`.
  101783. *
  101784. * It is also scaled to match the Game Object scale automatically. Therefore a crop rect of 100x50 would crop
  101785. * an area of 200x100 when applied to a Game Object that had a scale factor of 2.
  101786. *
  101787. * You can either pass in numeric values directly, or you can provide a single Rectangle object as the first argument.
  101788. *
  101789. * Call this method with no arguments at all to reset the crop, or toggle the property `isCropped` to `false`.
  101790. *
  101791. * You should do this if the crop rectangle becomes the same size as the frame itself, as it will allow
  101792. * the renderer to skip several internal calculations.
  101793. *
  101794. * @method Phaser.GameObjects.Components.TextureCrop#setCrop
  101795. * @since 3.11.0
  101796. *
  101797. * @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.
  101798. * @param {number} [y] - The y coordinate to start the crop from.
  101799. * @param {number} [width] - The width of the crop rectangle in pixels.
  101800. * @param {number} [height] - The height of the crop rectangle in pixels.
  101801. *
  101802. * @return {this} This Game Object instance.
  101803. */
  101804. setCrop: function (x, y, width, height)
  101805. {
  101806. if (x === undefined)
  101807. {
  101808. this.isCropped = false;
  101809. }
  101810. else if (this.frame)
  101811. {
  101812. if (typeof x === 'number')
  101813. {
  101814. this.frame.setCropUVs(this._crop, x, y, width, height, this.flipX, this.flipY);
  101815. }
  101816. else
  101817. {
  101818. var rect = x;
  101819. this.frame.setCropUVs(this._crop, rect.x, rect.y, rect.width, rect.height, this.flipX, this.flipY);
  101820. }
  101821. this.isCropped = true;
  101822. }
  101823. return this;
  101824. },
  101825. /**
  101826. * Sets the texture and frame this Game Object will use to render with.
  101827. *
  101828. * Textures are referenced by their string-based keys, as stored in the Texture Manager.
  101829. *
  101830. * @method Phaser.GameObjects.Components.TextureCrop#setTexture
  101831. * @since 3.0.0
  101832. *
  101833. * @param {string} key - The key of the texture to be used, as stored in the Texture Manager.
  101834. * @param {(string|integer)} [frame] - The name or index of the frame within the Texture.
  101835. *
  101836. * @return {this} This Game Object instance.
  101837. */
  101838. setTexture: function (key, frame)
  101839. {
  101840. this.texture = this.scene.sys.textures.get(key);
  101841. return this.setFrame(frame);
  101842. },
  101843. /**
  101844. * Sets the frame this Game Object will use to render with.
  101845. *
  101846. * The Frame has to belong to the current Texture being used.
  101847. *
  101848. * It can be either a string or an index.
  101849. *
  101850. * Calling `setFrame` will modify the `width` and `height` properties of your Game Object.
  101851. * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer.
  101852. *
  101853. * @method Phaser.GameObjects.Components.TextureCrop#setFrame
  101854. * @since 3.0.0
  101855. *
  101856. * @param {(string|integer)} frame - The name or index of the frame within the Texture.
  101857. * @param {boolean} [updateSize=true] - Should this call adjust the size of the Game Object?
  101858. * @param {boolean} [updateOrigin=true] - Should this call adjust the origin of the Game Object?
  101859. *
  101860. * @return {this} This Game Object instance.
  101861. */
  101862. setFrame: function (frame, updateSize, updateOrigin)
  101863. {
  101864. if (updateSize === undefined) { updateSize = true; }
  101865. if (updateOrigin === undefined) { updateOrigin = true; }
  101866. this.frame = this.texture.get(frame);
  101867. if (!this.frame.cutWidth || !this.frame.cutHeight)
  101868. {
  101869. this.renderFlags &= ~_FLAG;
  101870. }
  101871. else
  101872. {
  101873. this.renderFlags |= _FLAG;
  101874. }
  101875. if (this._sizeComponent && updateSize)
  101876. {
  101877. this.setSizeToFrame();
  101878. }
  101879. if (this._originComponent && updateOrigin)
  101880. {
  101881. if (this.frame.customPivot)
  101882. {
  101883. this.setOrigin(this.frame.pivotX, this.frame.pivotY);
  101884. }
  101885. else
  101886. {
  101887. this.updateDisplayOrigin();
  101888. }
  101889. }
  101890. if (this.isCropped)
  101891. {
  101892. this.frame.updateCropUVs(this._crop, this.flipX, this.flipY);
  101893. }
  101894. return this;
  101895. }
  101896. };
  101897. module.exports = TextureCrop;
  101898. /***/ }),
  101899. /* 580 */
  101900. /***/ (function(module, exports) {
  101901. /**
  101902. * @author Richard Davey <rich@photonstorm.com>
  101903. * @copyright 2018 Photon Storm Ltd.
  101904. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  101905. */
  101906. // bitmask flag for GameObject.renderMask
  101907. var _FLAG = 8; // 1000
  101908. /**
  101909. * Provides methods used for getting and setting the texture of a Game Object.
  101910. *
  101911. * @name Phaser.GameObjects.Components.Texture
  101912. * @since 3.0.0
  101913. */
  101914. var Texture = {
  101915. /**
  101916. * The Texture this Game Object is using to render with.
  101917. *
  101918. * @name Phaser.GameObjects.Components.Texture#texture
  101919. * @type {Phaser.Textures.Texture|Phaser.Textures.CanvasTexture}
  101920. * @since 3.0.0
  101921. */
  101922. texture: null,
  101923. /**
  101924. * The Texture Frame this Game Object is using to render with.
  101925. *
  101926. * @name Phaser.GameObjects.Components.Texture#frame
  101927. * @type {Phaser.Textures.Frame}
  101928. * @since 3.0.0
  101929. */
  101930. frame: null,
  101931. /**
  101932. * Internal flag. Not to be set by this Game Object.
  101933. *
  101934. * @name Phaser.GameObjects.Components.Texture#isCropped
  101935. * @type {boolean}
  101936. * @private
  101937. * @since 3.11.0
  101938. */
  101939. isCropped: false,
  101940. /**
  101941. * Sets the texture and frame this Game Object will use to render with.
  101942. *
  101943. * Textures are referenced by their string-based keys, as stored in the Texture Manager.
  101944. *
  101945. * @method Phaser.GameObjects.Components.Texture#setTexture
  101946. * @since 3.0.0
  101947. *
  101948. * @param {string} key - The key of the texture to be used, as stored in the Texture Manager.
  101949. * @param {(string|integer)} [frame] - The name or index of the frame within the Texture.
  101950. *
  101951. * @return {this} This Game Object instance.
  101952. */
  101953. setTexture: function (key, frame)
  101954. {
  101955. this.texture = this.scene.sys.textures.get(key);
  101956. return this.setFrame(frame);
  101957. },
  101958. /**
  101959. * Sets the frame this Game Object will use to render with.
  101960. *
  101961. * The Frame has to belong to the current Texture being used.
  101962. *
  101963. * It can be either a string or an index.
  101964. *
  101965. * Calling `setFrame` will modify the `width` and `height` properties of your Game Object.
  101966. * It will also change the `origin` if the Frame has a custom pivot point, as exported from packages like Texture Packer.
  101967. *
  101968. * @method Phaser.GameObjects.Components.Texture#setFrame
  101969. * @since 3.0.0
  101970. *
  101971. * @param {(string|integer)} frame - The name or index of the frame within the Texture.
  101972. * @param {boolean} [updateSize=true] - Should this call adjust the size of the Game Object?
  101973. * @param {boolean} [updateOrigin=true] - Should this call adjust the origin of the Game Object?
  101974. *
  101975. * @return {this} This Game Object instance.
  101976. */
  101977. setFrame: function (frame, updateSize, updateOrigin)
  101978. {
  101979. if (updateSize === undefined) { updateSize = true; }
  101980. if (updateOrigin === undefined) { updateOrigin = true; }
  101981. this.frame = this.texture.get(frame);
  101982. if (!this.frame.cutWidth || !this.frame.cutHeight)
  101983. {
  101984. this.renderFlags &= ~_FLAG;
  101985. }
  101986. else
  101987. {
  101988. this.renderFlags |= _FLAG;
  101989. }
  101990. if (this._sizeComponent && updateSize)
  101991. {
  101992. this.setSizeToFrame();
  101993. }
  101994. if (this._originComponent && updateOrigin)
  101995. {
  101996. if (this.frame.customPivot)
  101997. {
  101998. this.setOrigin(this.frame.pivotX, this.frame.pivotY);
  101999. }
  102000. else
  102001. {
  102002. this.updateDisplayOrigin();
  102003. }
  102004. }
  102005. return this;
  102006. }
  102007. };
  102008. module.exports = Texture;
  102009. /***/ }),
  102010. /* 581 */
  102011. /***/ (function(module, exports) {
  102012. /**
  102013. * @author Richard Davey <rich@photonstorm.com>
  102014. * @copyright 2018 Photon Storm Ltd.
  102015. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  102016. */
  102017. /**
  102018. * Provides methods used for getting and setting the size of a Game Object.
  102019. *
  102020. * @name Phaser.GameObjects.Components.Size
  102021. * @since 3.0.0
  102022. */
  102023. var Size = {
  102024. /**
  102025. * A property indicating that a Game Object has this component.
  102026. *
  102027. * @name Phaser.GameObjects.Components.Size#_sizeComponent
  102028. * @type {boolean}
  102029. * @private
  102030. * @default true
  102031. * @since 3.2.0
  102032. */
  102033. _sizeComponent: true,
  102034. /**
  102035. * The native (un-scaled) width of this Game Object.
  102036. *
  102037. * @name Phaser.GameObjects.Components.Size#width
  102038. * @type {number}
  102039. * @since 3.0.0
  102040. */
  102041. width: 0,
  102042. /**
  102043. * The native (un-scaled) height of this Game Object.
  102044. *
  102045. * @name Phaser.GameObjects.Components.Size#height
  102046. * @type {number}
  102047. * @since 3.0.0
  102048. */
  102049. height: 0,
  102050. /**
  102051. * The displayed width of this Game Object.
  102052. * This value takes into account the scale factor.
  102053. *
  102054. * @name Phaser.GameObjects.Components.Size#displayWidth
  102055. * @type {number}
  102056. * @since 3.0.0
  102057. */
  102058. displayWidth: {
  102059. get: function ()
  102060. {
  102061. return this.scaleX * this.frame.realWidth;
  102062. },
  102063. set: function (value)
  102064. {
  102065. this.scaleX = value / this.frame.realWidth;
  102066. }
  102067. },
  102068. /**
  102069. * The displayed height of this Game Object.
  102070. * This value takes into account the scale factor.
  102071. *
  102072. * @name Phaser.GameObjects.Components.Size#displayHeight
  102073. * @type {number}
  102074. * @since 3.0.0
  102075. */
  102076. displayHeight: {
  102077. get: function ()
  102078. {
  102079. return this.scaleY * this.frame.realHeight;
  102080. },
  102081. set: function (value)
  102082. {
  102083. this.scaleY = value / this.frame.realHeight;
  102084. }
  102085. },
  102086. /**
  102087. * Sets the size of this Game Object to be that of the given Frame.
  102088. *
  102089. * @method Phaser.GameObjects.Components.Size#setSizeToFrame
  102090. * @since 3.0.0
  102091. *
  102092. * @param {Phaser.Textures.Frame} frame - The frame to base the size of this Game Object on.
  102093. *
  102094. * @return {this} This Game Object instance.
  102095. */
  102096. setSizeToFrame: function (frame)
  102097. {
  102098. if (frame === undefined) { frame = this.frame; }
  102099. this.width = frame.realWidth;
  102100. this.height = frame.realHeight;
  102101. return this;
  102102. },
  102103. /**
  102104. * Sets the size of this Game Object.
  102105. *
  102106. * @method Phaser.GameObjects.Components.Size#setSize
  102107. * @since 3.0.0
  102108. *
  102109. * @param {number} width - The width of this Game Object.
  102110. * @param {number} height - The height of this Game Object.
  102111. *
  102112. * @return {this} This Game Object instance.
  102113. */
  102114. setSize: function (width, height)
  102115. {
  102116. this.width = width;
  102117. this.height = height;
  102118. return this;
  102119. },
  102120. /**
  102121. * Sets the display size of this Game Object.
  102122. * Calling this will adjust the scale.
  102123. *
  102124. * @method Phaser.GameObjects.Components.Size#setDisplaySize
  102125. * @since 3.0.0
  102126. *
  102127. * @param {number} width - The width of this Game Object.
  102128. * @param {number} height - The height of this Game Object.
  102129. *
  102130. * @return {this} This Game Object instance.
  102131. */
  102132. setDisplaySize: function (width, height)
  102133. {
  102134. this.displayWidth = width;
  102135. this.displayHeight = height;
  102136. return this;
  102137. }
  102138. };
  102139. module.exports = Size;
  102140. /***/ }),
  102141. /* 582 */
  102142. /***/ (function(module, exports) {
  102143. /**
  102144. * @author Richard Davey <rich@photonstorm.com>
  102145. * @copyright 2018 Photon Storm Ltd.
  102146. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  102147. */
  102148. /**
  102149. * Provides methods used for getting and setting the Scroll Factor of a Game Object.
  102150. *
  102151. * @name Phaser.GameObjects.Components.ScrollFactor
  102152. * @since 3.0.0
  102153. */
  102154. var ScrollFactor = {
  102155. /**
  102156. * The horizontal scroll factor of this Game Object.
  102157. *
  102158. * The scroll factor controls the influence of the movement of a Camera upon this Game Object.
  102159. *
  102160. * When a camera scrolls it will change the location at which this Game Object is rendered on-screen.
  102161. * It does not change the Game Objects actual position values.
  102162. *
  102163. * A value of 1 means it will move exactly in sync with a camera.
  102164. * A value of 0 means it will not move at all, even if the camera moves.
  102165. * Other values control the degree to which the camera movement is mapped to this Game Object.
  102166. *
  102167. * @name Phaser.GameObjects.Components.ScrollFactor#scrollFactorX
  102168. * @type {number}
  102169. * @default 1
  102170. * @since 3.0.0
  102171. */
  102172. scrollFactorX: 1,
  102173. /**
  102174. * The vertical scroll factor of this Game Object.
  102175. *
  102176. * The scroll factor controls the influence of the movement of a Camera upon this Game Object.
  102177. *
  102178. * When a camera scrolls it will change the location at which this Game Object is rendered on-screen.
  102179. * It does not change the Game Objects actual position values.
  102180. *
  102181. * A value of 1 means it will move exactly in sync with a camera.
  102182. * A value of 0 means it will not move at all, even if the camera moves.
  102183. * Other values control the degree to which the camera movement is mapped to this Game Object.
  102184. *
  102185. * @name Phaser.GameObjects.Components.ScrollFactor#scrollFactorY
  102186. * @type {number}
  102187. * @default 1
  102188. * @since 3.0.0
  102189. */
  102190. scrollFactorY: 1,
  102191. /**
  102192. * Sets the scroll factor of this Game Object.
  102193. *
  102194. * The scroll factor controls the influence of the movement of a Camera upon this Game Object.
  102195. *
  102196. * When a camera scrolls it will change the location at which this Game Object is rendered on-screen.
  102197. * It does not change the Game Objects actual position values.
  102198. *
  102199. * A value of 1 means it will move exactly in sync with a camera.
  102200. * A value of 0 means it will not move at all, even if the camera moves.
  102201. * Other values control the degree to which the camera movement is mapped to this Game Object.
  102202. *
  102203. * @method Phaser.GameObjects.Components.ScrollFactor#setScrollFactor
  102204. * @since 3.0.0
  102205. *
  102206. * @param {number} x - The horizontal scroll factor of this Game Object.
  102207. * @param {number} [y=x] - The vertical scroll factor of this Game Object. If not set it will use the `x` value.
  102208. *
  102209. * @return {this} This Game Object instance.
  102210. */
  102211. setScrollFactor: function (x, y)
  102212. {
  102213. if (y === undefined) { y = x; }
  102214. this.scrollFactorX = x;
  102215. this.scrollFactorY = y;
  102216. return this;
  102217. }
  102218. };
  102219. module.exports = ScrollFactor;
  102220. /***/ }),
  102221. /* 583 */
  102222. /***/ (function(module, exports, __webpack_require__) {
  102223. /**
  102224. * @author Richard Davey <rich@photonstorm.com>
  102225. * @copyright 2018 Photon Storm Ltd.
  102226. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  102227. */
  102228. var ScaleModes = __webpack_require__(59);
  102229. /**
  102230. * Provides methods used for getting and setting the scale of a Game Object.
  102231. *
  102232. * @name Phaser.GameObjects.Components.ScaleMode
  102233. * @since 3.0.0
  102234. */
  102235. var ScaleMode = {
  102236. _scaleMode: ScaleModes.DEFAULT,
  102237. /**
  102238. * The Scale Mode being used by this Game Object.
  102239. * Can be either `ScaleModes.LINEAR` or `ScaleModes.NEAREST`.
  102240. *
  102241. * @name Phaser.GameObjects.Components.ScaleMode#scaleMode
  102242. * @type {Phaser.ScaleModes}
  102243. * @since 3.0.0
  102244. */
  102245. scaleMode: {
  102246. get: function ()
  102247. {
  102248. return this._scaleMode;
  102249. },
  102250. set: function (value)
  102251. {
  102252. if (value === ScaleModes.LINEAR || value === ScaleModes.NEAREST)
  102253. {
  102254. this._scaleMode = value;
  102255. }
  102256. }
  102257. },
  102258. /**
  102259. * Sets the Scale Mode being used by this Game Object.
  102260. * Can be either `ScaleModes.LINEAR` or `ScaleModes.NEAREST`.
  102261. *
  102262. * @method Phaser.GameObjects.Components.ScaleMode#setScaleMode
  102263. * @since 3.0.0
  102264. *
  102265. * @param {Phaser.ScaleModes} value - The Scale Mode to be used by this Game Object.
  102266. *
  102267. * @return {this} This Game Object instance.
  102268. */
  102269. setScaleMode: function (value)
  102270. {
  102271. this.scaleMode = value;
  102272. return this;
  102273. }
  102274. };
  102275. module.exports = ScaleMode;
  102276. /***/ }),
  102277. /* 584 */
  102278. /***/ (function(module, exports) {
  102279. /**
  102280. * @author Richard Davey <rich@photonstorm.com>
  102281. * @copyright 2018 Photon Storm Ltd.
  102282. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  102283. */
  102284. /**
  102285. * Provides methods used for getting and setting the origin of a Game Object.
  102286. * Values are normalized, given in the range 0 to 1.
  102287. * Display values contain the calculated pixel values.
  102288. * Should be applied as a mixin and not used directly.
  102289. *
  102290. * @name Phaser.GameObjects.Components.Origin
  102291. * @since 3.0.0
  102292. */
  102293. var Origin = {
  102294. /**
  102295. * A property indicating that a Game Object has this component.
  102296. *
  102297. * @name Phaser.GameObjects.Components.Origin#_originComponent
  102298. * @type {boolean}
  102299. * @private
  102300. * @default true
  102301. * @since 3.2.0
  102302. */
  102303. _originComponent: true,
  102304. /**
  102305. * The horizontal origin of this Game Object.
  102306. * The origin maps the relationship between the size and position of the Game Object.
  102307. * The default value is 0.5, meaning all Game Objects are positioned based on their center.
  102308. * Setting the value to 0 means the position now relates to the left of the Game Object.
  102309. *
  102310. * @name Phaser.GameObjects.Components.Origin#originX
  102311. * @type {number}
  102312. * @default 0.5
  102313. * @since 3.0.0
  102314. */
  102315. originX: 0.5,
  102316. /**
  102317. * The vertical origin of this Game Object.
  102318. * The origin maps the relationship between the size and position of the Game Object.
  102319. * The default value is 0.5, meaning all Game Objects are positioned based on their center.
  102320. * Setting the value to 0 means the position now relates to the top of the Game Object.
  102321. *
  102322. * @name Phaser.GameObjects.Components.Origin#originY
  102323. * @type {number}
  102324. * @default 0.5
  102325. * @since 3.0.0
  102326. */
  102327. originY: 0.5,
  102328. // private + read only
  102329. _displayOriginX: 0,
  102330. _displayOriginY: 0,
  102331. /**
  102332. * The horizontal display origin of this Game Object.
  102333. * The origin is a normalized value between 0 and 1.
  102334. * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin.
  102335. *
  102336. * @name Phaser.GameObjects.Components.Origin#displayOriginX
  102337. * @type {number}
  102338. * @since 3.0.0
  102339. */
  102340. displayOriginX: {
  102341. get: function ()
  102342. {
  102343. return this._displayOriginX;
  102344. },
  102345. set: function (value)
  102346. {
  102347. this._displayOriginX = value;
  102348. this.originX = value / this.width;
  102349. }
  102350. },
  102351. /**
  102352. * The vertical display origin of this Game Object.
  102353. * The origin is a normalized value between 0 and 1.
  102354. * The displayOrigin is a pixel value, based on the size of the Game Object combined with the origin.
  102355. *
  102356. * @name Phaser.GameObjects.Components.Origin#displayOriginY
  102357. * @type {number}
  102358. * @since 3.0.0
  102359. */
  102360. displayOriginY: {
  102361. get: function ()
  102362. {
  102363. return this._displayOriginY;
  102364. },
  102365. set: function (value)
  102366. {
  102367. this._displayOriginY = value;
  102368. this.originY = value / this.height;
  102369. }
  102370. },
  102371. /**
  102372. * Sets the origin of this Game Object.
  102373. *
  102374. * The values are given in the range 0 to 1.
  102375. *
  102376. * @method Phaser.GameObjects.Components.Origin#setOrigin
  102377. * @since 3.0.0
  102378. *
  102379. * @param {number} [x=0.5] - The horizontal origin value.
  102380. * @param {number} [y=x] - The vertical origin value. If not defined it will be set to the value of `x`.
  102381. *
  102382. * @return {this} This Game Object instance.
  102383. */
  102384. setOrigin: function (x, y)
  102385. {
  102386. if (x === undefined) { x = 0.5; }
  102387. if (y === undefined) { y = x; }
  102388. this.originX = x;
  102389. this.originY = y;
  102390. return this.updateDisplayOrigin();
  102391. },
  102392. /**
  102393. * Sets the origin of this Game Object based on the Pivot values in its Frame.
  102394. *
  102395. * @method Phaser.GameObjects.Components.Origin#setOriginFromFrame
  102396. * @since 3.0.0
  102397. *
  102398. * @return {this} This Game Object instance.
  102399. */
  102400. setOriginFromFrame: function ()
  102401. {
  102402. if (!this.frame || !this.frame.customPivot)
  102403. {
  102404. return this.setOrigin();
  102405. }
  102406. else
  102407. {
  102408. this.originX = this.frame.pivotX;
  102409. this.originY = this.frame.pivotY;
  102410. }
  102411. return this.updateDisplayOrigin();
  102412. },
  102413. /**
  102414. * Sets the display origin of this Game Object.
  102415. * The difference between this and setting the origin is that you can use pixel values for setting the display origin.
  102416. *
  102417. * @method Phaser.GameObjects.Components.Origin#setDisplayOrigin
  102418. * @since 3.0.0
  102419. *
  102420. * @param {number} [x=0] - The horizontal display origin value.
  102421. * @param {number} [y=x] - The vertical display origin value. If not defined it will be set to the value of `x`.
  102422. *
  102423. * @return {this} This Game Object instance.
  102424. */
  102425. setDisplayOrigin: function (x, y)
  102426. {
  102427. if (x === undefined) { x = 0; }
  102428. if (y === undefined) { y = x; }
  102429. this.displayOriginX = x;
  102430. this.displayOriginY = y;
  102431. return this;
  102432. },
  102433. /**
  102434. * Updates the Display Origin cached values internally stored on this Game Object.
  102435. * You don't usually call this directly, but it is exposed for edge-cases where you may.
  102436. *
  102437. * @method Phaser.GameObjects.Components.Origin#updateDisplayOrigin
  102438. * @since 3.0.0
  102439. *
  102440. * @return {this} This Game Object instance.
  102441. */
  102442. updateDisplayOrigin: function ()
  102443. {
  102444. this._displayOriginX = Math.round(this.originX * this.width);
  102445. this._displayOriginY = Math.round(this.originY * this.height);
  102446. return this;
  102447. }
  102448. };
  102449. module.exports = Origin;
  102450. /***/ }),
  102451. /* 585 */
  102452. /***/ (function(module, exports) {
  102453. /**
  102454. * @author Richard Davey <rich@photonstorm.com>
  102455. * @copyright 2018 Photon Storm Ltd.
  102456. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  102457. */
  102458. /**
  102459. * Provides methods used for getting and setting the transform values of a Game Object.
  102460. * Should be applied as a mixin and not used directly.
  102461. *
  102462. * @name Phaser.GameObjects.Components.MatrixStack
  102463. * @since 3.2.0
  102464. */
  102465. var MatrixStack = {
  102466. /**
  102467. * The matrix stack.
  102468. *
  102469. * @name Phaser.GameObjects.Components.MatrixStack#matrixStack
  102470. * @type {Float32Array}
  102471. * @private
  102472. * @since 3.2.0
  102473. */
  102474. matrixStack: null,
  102475. /**
  102476. * The current matrix.
  102477. *
  102478. * @name Phaser.GameObjects.Components.MatrixStack#currentMatrix
  102479. * @type {Float32Array}
  102480. * @private
  102481. * @since 3.2.0
  102482. */
  102483. currentMatrix: null,
  102484. /**
  102485. * The current index of the top of the matrix stack.
  102486. *
  102487. * @name Phaser.GameObjects.Components.MatrixStack#currentMatrixIndex
  102488. * @type {integer}
  102489. * @private
  102490. * @since 3.2.0
  102491. */
  102492. currentMatrixIndex: 0,
  102493. /**
  102494. * Initialize the matrix stack.
  102495. *
  102496. * @method Phaser.GameObjects.Components.MatrixStack#initMatrixStack
  102497. * @since 3.2.0
  102498. *
  102499. * @return {this} This Game Object instance.
  102500. */
  102501. initMatrixStack: function ()
  102502. {
  102503. this.matrixStack = new Float32Array(6000); // up to 1000 matrices
  102504. this.currentMatrix = new Float32Array([ 1, 0, 0, 1, 0, 0 ]);
  102505. this.currentMatrixIndex = 0;
  102506. return this;
  102507. },
  102508. /**
  102509. * Push the current matrix onto the matrix stack.
  102510. *
  102511. * @method Phaser.GameObjects.Components.MatrixStack#save
  102512. * @since 3.2.0
  102513. *
  102514. * @return {this} This Game Object instance.
  102515. */
  102516. save: function ()
  102517. {
  102518. if (this.currentMatrixIndex >= this.matrixStack.length) { return this; }
  102519. var matrixStack = this.matrixStack;
  102520. var currentMatrix = this.currentMatrix;
  102521. var currentMatrixIndex = this.currentMatrixIndex;
  102522. this.currentMatrixIndex += 6;
  102523. matrixStack[currentMatrixIndex + 0] = currentMatrix[0];
  102524. matrixStack[currentMatrixIndex + 1] = currentMatrix[1];
  102525. matrixStack[currentMatrixIndex + 2] = currentMatrix[2];
  102526. matrixStack[currentMatrixIndex + 3] = currentMatrix[3];
  102527. matrixStack[currentMatrixIndex + 4] = currentMatrix[4];
  102528. matrixStack[currentMatrixIndex + 5] = currentMatrix[5];
  102529. return this;
  102530. },
  102531. /**
  102532. * Pop the top of the matrix stack into the current matrix.
  102533. *
  102534. * @method Phaser.GameObjects.Components.MatrixStack#restore
  102535. * @since 3.2.0
  102536. *
  102537. * @return {this} This Game Object instance.
  102538. */
  102539. restore: function ()
  102540. {
  102541. if (this.currentMatrixIndex <= 0) { return this; }
  102542. this.currentMatrixIndex -= 6;
  102543. var matrixStack = this.matrixStack;
  102544. var currentMatrix = this.currentMatrix;
  102545. var currentMatrixIndex = this.currentMatrixIndex;
  102546. currentMatrix[0] = matrixStack[currentMatrixIndex + 0];
  102547. currentMatrix[1] = matrixStack[currentMatrixIndex + 1];
  102548. currentMatrix[2] = matrixStack[currentMatrixIndex + 2];
  102549. currentMatrix[3] = matrixStack[currentMatrixIndex + 3];
  102550. currentMatrix[4] = matrixStack[currentMatrixIndex + 4];
  102551. currentMatrix[5] = matrixStack[currentMatrixIndex + 5];
  102552. return this;
  102553. },
  102554. /**
  102555. * Reset the current matrix to the identity matrix.
  102556. *
  102557. * @method Phaser.GameObjects.Components.MatrixStack#loadIdentity
  102558. * @since 3.2.0
  102559. *
  102560. * @return {this} This Game Object instance.
  102561. */
  102562. loadIdentity: function ()
  102563. {
  102564. this.setTransform(1, 0, 0, 1, 0, 0);
  102565. return this;
  102566. },
  102567. /**
  102568. * Transform the current matrix.
  102569. *
  102570. * @method Phaser.GameObjects.Components.MatrixStack#transform
  102571. * @since 3.2.0
  102572. *
  102573. * @param {number} a - The Scale X value.
  102574. * @param {number} b - The Shear Y value.
  102575. * @param {number} c - The Shear X value.
  102576. * @param {number} d - The Scale Y value.
  102577. * @param {number} tx - The Translate X value.
  102578. * @param {number} ty - The Translate Y value.
  102579. *
  102580. * @return {this} This Game Object instance.
  102581. */
  102582. transform: function (a, b, c, d, tx, ty)
  102583. {
  102584. var currentMatrix = this.currentMatrix;
  102585. var m0 = currentMatrix[0];
  102586. var m1 = currentMatrix[1];
  102587. var m2 = currentMatrix[2];
  102588. var m3 = currentMatrix[3];
  102589. var m4 = currentMatrix[4];
  102590. var m5 = currentMatrix[5];
  102591. currentMatrix[0] = m0 * a + m2 * b;
  102592. currentMatrix[1] = m1 * a + m3 * b;
  102593. currentMatrix[2] = m0 * c + m2 * d;
  102594. currentMatrix[3] = m1 * c + m3 * d;
  102595. currentMatrix[4] = m0 * tx + m2 * ty + m4;
  102596. currentMatrix[5] = m1 * tx + m3 * ty + m5;
  102597. return this;
  102598. },
  102599. /**
  102600. * Set a transform matrix as the current matrix.
  102601. *
  102602. * @method Phaser.GameObjects.Components.MatrixStack#setTransform
  102603. * @since 3.2.0
  102604. *
  102605. * @param {number} a - The Scale X value.
  102606. * @param {number} b - The Shear Y value.
  102607. * @param {number} c - The Shear X value.
  102608. * @param {number} d - The Scale Y value.
  102609. * @param {number} tx - The Translate X value.
  102610. * @param {number} ty - The Translate Y value.
  102611. *
  102612. * @return {this} This Game Object instance.
  102613. */
  102614. setTransform: function (a, b, c, d, tx, ty)
  102615. {
  102616. var currentMatrix = this.currentMatrix;
  102617. currentMatrix[0] = a;
  102618. currentMatrix[1] = b;
  102619. currentMatrix[2] = c;
  102620. currentMatrix[3] = d;
  102621. currentMatrix[4] = tx;
  102622. currentMatrix[5] = ty;
  102623. return this;
  102624. },
  102625. /**
  102626. * Translate the current matrix.
  102627. *
  102628. * @method Phaser.GameObjects.Components.MatrixStack#translate
  102629. * @since 3.2.0
  102630. *
  102631. * @param {number} x - The horizontal translation value.
  102632. * @param {number} y - The vertical translation value.
  102633. *
  102634. * @return {this} This Game Object instance.
  102635. */
  102636. translate: function (x, y)
  102637. {
  102638. var currentMatrix = this.currentMatrix;
  102639. var m0 = currentMatrix[0];
  102640. var m1 = currentMatrix[1];
  102641. var m2 = currentMatrix[2];
  102642. var m3 = currentMatrix[3];
  102643. var m4 = currentMatrix[4];
  102644. var m5 = currentMatrix[5];
  102645. currentMatrix[4] = m0 * x + m2 * y + m4;
  102646. currentMatrix[5] = m1 * x + m3 * y + m5;
  102647. return this;
  102648. },
  102649. /**
  102650. * Scale the current matrix.
  102651. *
  102652. * @method Phaser.GameObjects.Components.MatrixStack#scale
  102653. * @since 3.2.0
  102654. *
  102655. * @param {number} x - The horizontal scale value.
  102656. * @param {number} y - The vertical scale value.
  102657. *
  102658. * @return {this} This Game Object instance.
  102659. */
  102660. scale: function (x, y)
  102661. {
  102662. var currentMatrix = this.currentMatrix;
  102663. var m0 = currentMatrix[0];
  102664. var m1 = currentMatrix[1];
  102665. var m2 = currentMatrix[2];
  102666. var m3 = currentMatrix[3];
  102667. currentMatrix[0] = m0 * x;
  102668. currentMatrix[1] = m1 * x;
  102669. currentMatrix[2] = m2 * y;
  102670. currentMatrix[3] = m3 * y;
  102671. return this;
  102672. },
  102673. /**
  102674. * Rotate the current matrix.
  102675. *
  102676. * @method Phaser.GameObjects.Components.MatrixStack#rotate
  102677. * @since 3.2.0
  102678. *
  102679. * @param {number} t - The angle of rotation in radians.
  102680. *
  102681. * @return {this} This Game Object instance.
  102682. */
  102683. rotate: function (t)
  102684. {
  102685. var currentMatrix = this.currentMatrix;
  102686. var m0 = currentMatrix[0];
  102687. var m1 = currentMatrix[1];
  102688. var m2 = currentMatrix[2];
  102689. var m3 = currentMatrix[3];
  102690. var st = Math.sin(t);
  102691. var ct = Math.cos(t);
  102692. currentMatrix[0] = m0 * ct + m2 * st;
  102693. currentMatrix[1] = m1 * ct + m3 * st;
  102694. currentMatrix[2] = m0 * -st + m2 * ct;
  102695. currentMatrix[3] = m1 * -st + m3 * ct;
  102696. return this;
  102697. }
  102698. };
  102699. module.exports = MatrixStack;
  102700. /***/ }),
  102701. /* 586 */
  102702. /***/ (function(module, exports, __webpack_require__) {
  102703. /**
  102704. * @author Richard Davey <rich@photonstorm.com>
  102705. * @copyright 2018 Photon Storm Ltd.
  102706. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  102707. */
  102708. var BitmapMask = __webpack_require__(219);
  102709. var GeometryMask = __webpack_require__(218);
  102710. /**
  102711. * Provides methods used for getting and setting the mask of a Game Object.
  102712. *
  102713. * @name Phaser.GameObjects.Components.Mask
  102714. * @since 3.0.0
  102715. */
  102716. var Mask = {
  102717. /**
  102718. * The Mask this Game Object is using during render.
  102719. *
  102720. * @name Phaser.GameObjects.Components.Mask#mask
  102721. * @type {Phaser.Display.Masks.BitmapMask|Phaser.Display.Masks.GeometryMask}
  102722. * @since 3.0.0
  102723. */
  102724. mask: null,
  102725. /**
  102726. * Sets the mask that this Game Object will use to render with.
  102727. *
  102728. * The mask must have been previously created and can be either a GeometryMask or a BitmapMask.
  102729. * Note: Bitmap Masks only work on WebGL. Geometry Masks work on both WebGL and Canvas.
  102730. *
  102731. * If a mask is already set on this Game Object it will be immediately replaced.
  102732. *
  102733. * Masks are positioned in global space and are not relative to the Game Object to which they
  102734. * are applied. The reason for this is that multiple Game Objects can all share the same mask.
  102735. *
  102736. * Masks have no impact on physics or input detection. They are purely a rendering component
  102737. * that allows you to limit what is visible during the render pass.
  102738. *
  102739. * @method Phaser.GameObjects.Components.Mask#setMask
  102740. * @since 3.6.2
  102741. *
  102742. * @param {Phaser.Display.Masks.BitmapMask|Phaser.Display.Masks.GeometryMask} mask - The mask this Game Object will use when rendering.
  102743. *
  102744. * @return {this} This Game Object instance.
  102745. */
  102746. setMask: function (mask)
  102747. {
  102748. this.mask = mask;
  102749. return this;
  102750. },
  102751. /**
  102752. * Clears the mask that this Game Object was using.
  102753. *
  102754. * @method Phaser.GameObjects.Components.Mask#clearMask
  102755. * @since 3.6.2
  102756. *
  102757. * @param {boolean} [destroyMask=false] - Destroy the mask before clearing it?
  102758. *
  102759. * @return {this} This Game Object instance.
  102760. */
  102761. clearMask: function (destroyMask)
  102762. {
  102763. if (destroyMask === undefined) { destroyMask = false; }
  102764. if (destroyMask && this.mask)
  102765. {
  102766. this.mask.destroy();
  102767. }
  102768. this.mask = null;
  102769. return this;
  102770. },
  102771. /**
  102772. * Creates and returns a Bitmap Mask. This mask can be used by any Game Object,
  102773. * including this one.
  102774. *
  102775. * To create the mask you need to pass in a reference to a renderable Game Object.
  102776. * A renderable Game Object is one that uses a texture to render with, such as an
  102777. * Image, Sprite, Render Texture or BitmapText.
  102778. *
  102779. * If you do not provide a renderable object, and this Game Object has a texture,
  102780. * it will use itself as the object. This means you can call this method to create
  102781. * a Bitmap Mask from any renderable Game Object.
  102782. *
  102783. * @method Phaser.GameObjects.Components.Mask#createBitmapMask
  102784. * @since 3.6.2
  102785. *
  102786. * @param {Phaser.GameObjects.GameObject} [renderable] - A renderable Game Object that uses a texture, such as a Sprite.
  102787. *
  102788. * @return {Phaser.Display.Masks.BitmapMask} This Bitmap Mask that was created.
  102789. */
  102790. createBitmapMask: function (renderable)
  102791. {
  102792. if (renderable === undefined && this.texture)
  102793. {
  102794. // eslint-disable-next-line consistent-this
  102795. renderable = this;
  102796. }
  102797. return new BitmapMask(this.scene, renderable);
  102798. },
  102799. /**
  102800. * Creates and returns a Geometry Mask. This mask can be used by any Game Object,
  102801. * including this one.
  102802. *
  102803. * To create the mask you need to pass in a reference to a Graphics Game Object.
  102804. *
  102805. * If you do not provide a graphics object, and this Game Object is an instance
  102806. * of a Graphics object, then it will use itself to create the mask.
  102807. *
  102808. * This means you can call this method to create a Geometry Mask from any Graphics Game Object.
  102809. *
  102810. * @method Phaser.GameObjects.Components.Mask#createGeometryMask
  102811. * @since 3.6.2
  102812. *
  102813. * @param {Phaser.GameObjects.Graphics} [graphics] - A Graphics Game Object. The geometry within it will be used as the mask.
  102814. *
  102815. * @return {Phaser.Display.Masks.GeometryMask} This Geometry Mask that was created.
  102816. */
  102817. createGeometryMask: function (graphics)
  102818. {
  102819. if (graphics === undefined && this.type === 'Graphics')
  102820. {
  102821. // eslint-disable-next-line consistent-this
  102822. graphics = this;
  102823. }
  102824. return new GeometryMask(this.scene, graphics);
  102825. }
  102826. };
  102827. module.exports = Mask;
  102828. /***/ }),
  102829. /* 587 */
  102830. /***/ (function(module, exports, __webpack_require__) {
  102831. /**
  102832. * @author Richard Davey <rich@photonstorm.com>
  102833. * @copyright 2018 Photon Storm Ltd.
  102834. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  102835. */
  102836. var Rectangle = __webpack_require__(13);
  102837. var RotateAround = __webpack_require__(297);
  102838. var Vector2 = __webpack_require__(6);
  102839. /**
  102840. * Provides methods used for obtaining the bounds of a Game Object.
  102841. * Should be applied as a mixin and not used directly.
  102842. *
  102843. * @name Phaser.GameObjects.Components.GetBounds
  102844. * @since 3.0.0
  102845. */
  102846. var GetBounds = {
  102847. /**
  102848. * Gets the center coordinate of this Game Object, regardless of origin.
  102849. * The returned point is calculated in local space and does not factor in any parent containers
  102850. *
  102851. * @method Phaser.GameObjects.Components.GetBounds#getCenter
  102852. * @since 3.0.0
  102853. *
  102854. * @generic {Phaser.Math.Vector2} O - [output,$return]
  102855. *
  102856. * @param {(Phaser.Math.Vector2|object)} [output] - An object to store the values in. If not provided a new Vector2 will be created.
  102857. *
  102858. * @return {(Phaser.Math.Vector2|object)} The values stored in the output object.
  102859. */
  102860. getCenter: function (output)
  102861. {
  102862. if (output === undefined) { output = new Vector2(); }
  102863. output.x = this.x - (this.displayWidth * this.originX) + (this.displayWidth / 2);
  102864. output.y = this.y - (this.displayHeight * this.originY) + (this.displayHeight / 2);
  102865. return output;
  102866. },
  102867. /**
  102868. * Gets the top-left corner coordinate of this Game Object, regardless of origin.
  102869. * The returned point is calculated in local space and does not factor in any parent containers
  102870. *
  102871. * @method Phaser.GameObjects.Components.GetBounds#getTopLeft
  102872. * @since 3.0.0
  102873. *
  102874. * @generic {Phaser.Math.Vector2} O - [output,$return]
  102875. *
  102876. * @param {(Phaser.Math.Vector2|object)} [output] - An object to store the values in. If not provided a new Vector2 will be created.
  102877. * @param {boolean} [includeParent=false] - If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector?
  102878. *
  102879. * @return {(Phaser.Math.Vector2|object)} The values stored in the output object.
  102880. */
  102881. getTopLeft: function (output, includeParent)
  102882. {
  102883. if (!output) { output = new Vector2(); }
  102884. if (includeParent === undefined) { includeParent = false; }
  102885. output.x = this.x - (this.displayWidth * this.originX);
  102886. output.y = this.y - (this.displayHeight * this.originY);
  102887. if (this.rotation !== 0)
  102888. {
  102889. RotateAround(output, this.x, this.y, this.rotation);
  102890. }
  102891. if (includeParent && this.parentContainer)
  102892. {
  102893. var parentMatrix = this.parentContainer.getBoundsTransformMatrix();
  102894. parentMatrix.transformPoint(output.x, output.y, output);
  102895. }
  102896. return output;
  102897. },
  102898. /**
  102899. * Gets the top-right corner coordinate of this Game Object, regardless of origin.
  102900. * The returned point is calculated in local space and does not factor in any parent containers
  102901. *
  102902. * @method Phaser.GameObjects.Components.GetBounds#getTopRight
  102903. * @since 3.0.0
  102904. *
  102905. * @generic {Phaser.Math.Vector2} O - [output,$return]
  102906. *
  102907. * @param {(Phaser.Math.Vector2|object)} [output] - An object to store the values in. If not provided a new Vector2 will be created.
  102908. * @param {boolean} [includeParent=false] - If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector?
  102909. *
  102910. * @return {(Phaser.Math.Vector2|object)} The values stored in the output object.
  102911. */
  102912. getTopRight: function (output, includeParent)
  102913. {
  102914. if (!output) { output = new Vector2(); }
  102915. if (includeParent === undefined) { includeParent = false; }
  102916. output.x = (this.x - (this.displayWidth * this.originX)) + this.displayWidth;
  102917. output.y = this.y - (this.displayHeight * this.originY);
  102918. if (this.rotation !== 0)
  102919. {
  102920. RotateAround(output, this.x, this.y, this.rotation);
  102921. }
  102922. if (includeParent && this.parentContainer)
  102923. {
  102924. var parentMatrix = this.parentContainer.getBoundsTransformMatrix();
  102925. parentMatrix.transformPoint(output.x, output.y, output);
  102926. }
  102927. return output;
  102928. },
  102929. /**
  102930. * Gets the bottom-left corner coordinate of this Game Object, regardless of origin.
  102931. * The returned point is calculated in local space and does not factor in any parent containers
  102932. *
  102933. * @method Phaser.GameObjects.Components.GetBounds#getBottomLeft
  102934. * @since 3.0.0
  102935. *
  102936. * @generic {Phaser.Math.Vector2} O - [output,$return]
  102937. *
  102938. * @param {(Phaser.Math.Vector2|object)} [output] - An object to store the values in. If not provided a new Vector2 will be created.
  102939. * @param {boolean} [includeParent=false] - If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector?
  102940. *
  102941. * @return {(Phaser.Math.Vector2|object)} The values stored in the output object.
  102942. */
  102943. getBottomLeft: function (output, includeParent)
  102944. {
  102945. if (!output) { output = new Vector2(); }
  102946. if (includeParent === undefined) { includeParent = false; }
  102947. output.x = this.x - (this.displayWidth * this.originX);
  102948. output.y = (this.y - (this.displayHeight * this.originY)) + this.displayHeight;
  102949. if (this.rotation !== 0)
  102950. {
  102951. RotateAround(output, this.x, this.y, this.rotation);
  102952. }
  102953. if (includeParent && this.parentContainer)
  102954. {
  102955. var parentMatrix = this.parentContainer.getBoundsTransformMatrix();
  102956. parentMatrix.transformPoint(output.x, output.y, output);
  102957. }
  102958. return output;
  102959. },
  102960. /**
  102961. * Gets the bottom-right corner coordinate of this Game Object, regardless of origin.
  102962. * The returned point is calculated in local space and does not factor in any parent containers
  102963. *
  102964. * @method Phaser.GameObjects.Components.GetBounds#getBottomRight
  102965. * @since 3.0.0
  102966. *
  102967. * @generic {Phaser.Math.Vector2} O - [output,$return]
  102968. *
  102969. * @param {(Phaser.Math.Vector2|object)} [output] - An object to store the values in. If not provided a new Vector2 will be created.
  102970. * @param {boolean} [includeParent=false] - If this Game Object has a parent Container, include it (and all other ancestors) in the resulting vector?
  102971. *
  102972. * @return {(Phaser.Math.Vector2|object)} The values stored in the output object.
  102973. */
  102974. getBottomRight: function (output, includeParent)
  102975. {
  102976. if (!output) { output = new Vector2(); }
  102977. if (includeParent === undefined) { includeParent = false; }
  102978. output.x = (this.x - (this.displayWidth * this.originX)) + this.displayWidth;
  102979. output.y = (this.y - (this.displayHeight * this.originY)) + this.displayHeight;
  102980. if (this.rotation !== 0)
  102981. {
  102982. RotateAround(output, this.x, this.y, this.rotation);
  102983. }
  102984. if (includeParent && this.parentContainer)
  102985. {
  102986. var parentMatrix = this.parentContainer.getBoundsTransformMatrix();
  102987. parentMatrix.transformPoint(output.x, output.y, output);
  102988. }
  102989. return output;
  102990. },
  102991. /**
  102992. * Gets the bounds of this Game Object, regardless of origin.
  102993. * The values are stored and returned in a Rectangle, or Rectangle-like, object.
  102994. *
  102995. * @method Phaser.GameObjects.Components.GetBounds#getBounds
  102996. * @since 3.0.0
  102997. *
  102998. * @generic {Phaser.Geom.Rectangle} O - [output,$return]
  102999. *
  103000. * @param {(Phaser.Geom.Rectangle|object)} [output] - An object to store the values in. If not provided a new Rectangle will be created.
  103001. *
  103002. * @return {(Phaser.Geom.Rectangle|object)} The values stored in the output object.
  103003. */
  103004. getBounds: function (output)
  103005. {
  103006. if (output === undefined) { output = new Rectangle(); }
  103007. // We can use the output object to temporarily store the x/y coords in:
  103008. var TLx, TLy, TRx, TRy, BLx, BLy, BRx, BRy;
  103009. // Instead of doing a check if parent container is
  103010. // defined per corner we only do it once.
  103011. if (this.parentContainer)
  103012. {
  103013. var parentMatrix = this.parentContainer.getBoundsTransformMatrix();
  103014. this.getTopLeft(output);
  103015. parentMatrix.transformPoint(output.x, output.y, output);
  103016. TLx = output.x;
  103017. TLy = output.y;
  103018. this.getTopRight(output);
  103019. parentMatrix.transformPoint(output.x, output.y, output);
  103020. TRx = output.x;
  103021. TRy = output.y;
  103022. this.getBottomLeft(output);
  103023. parentMatrix.transformPoint(output.x, output.y, output);
  103024. BLx = output.x;
  103025. BLy = output.y;
  103026. this.getBottomRight(output);
  103027. parentMatrix.transformPoint(output.x, output.y, output);
  103028. BRx = output.x;
  103029. BRy = output.y;
  103030. }
  103031. else
  103032. {
  103033. this.getTopLeft(output);
  103034. TLx = output.x;
  103035. TLy = output.y;
  103036. this.getTopRight(output);
  103037. TRx = output.x;
  103038. TRy = output.y;
  103039. this.getBottomLeft(output);
  103040. BLx = output.x;
  103041. BLy = output.y;
  103042. this.getBottomRight(output);
  103043. BRx = output.x;
  103044. BRy = output.y;
  103045. }
  103046. output.x = Math.min(TLx, TRx, BLx, BRx);
  103047. output.y = Math.min(TLy, TRy, BLy, BRy);
  103048. output.width = Math.max(TLx, TRx, BLx, BRx) - output.x;
  103049. output.height = Math.max(TLy, TRy, BLy, BRy) - output.y;
  103050. return output;
  103051. }
  103052. };
  103053. module.exports = GetBounds;
  103054. /***/ }),
  103055. /* 588 */
  103056. /***/ (function(module, exports) {
  103057. /**
  103058. * @author Richard Davey <rich@photonstorm.com>
  103059. * @copyright 2018 Photon Storm Ltd.
  103060. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103061. */
  103062. /**
  103063. * Provides methods used for visually flipping a Game Object.
  103064. * Should be applied as a mixin and not used directly.
  103065. *
  103066. * @name Phaser.GameObjects.Components.Flip
  103067. * @since 3.0.0
  103068. */
  103069. var Flip = {
  103070. /**
  103071. * The horizontally flipped state of the Game Object.
  103072. * A Game Object that is flipped horizontally will render inversed on the horizontal axis.
  103073. * Flipping always takes place from the middle of the texture and does not impact the scale value.
  103074. *
  103075. * @name Phaser.GameObjects.Components.Flip#flipX
  103076. * @type {boolean}
  103077. * @default false
  103078. * @since 3.0.0
  103079. */
  103080. flipX: false,
  103081. /**
  103082. * The vertically flipped state of the Game Object.
  103083. * A Game Object that is flipped vertically will render inversed on the vertical axis (i.e. upside down)
  103084. * Flipping always takes place from the middle of the texture and does not impact the scale value.
  103085. *
  103086. * @name Phaser.GameObjects.Components.Flip#flipY
  103087. * @type {boolean}
  103088. * @default false
  103089. * @since 3.0.0
  103090. */
  103091. flipY: false,
  103092. /**
  103093. * Toggles the horizontal flipped state of this Game Object.
  103094. *
  103095. * @method Phaser.GameObjects.Components.Flip#toggleFlipX
  103096. * @since 3.0.0
  103097. *
  103098. * @return {this} This Game Object instance.
  103099. */
  103100. toggleFlipX: function ()
  103101. {
  103102. this.flipX = !this.flipX;
  103103. return this;
  103104. },
  103105. /**
  103106. * Toggles the vertical flipped state of this Game Object.
  103107. *
  103108. * @method Phaser.GameObjects.Components.Flip#toggleFlipY
  103109. * @since 3.0.0
  103110. *
  103111. * @return {this} This Game Object instance.
  103112. */
  103113. toggleFlipY: function ()
  103114. {
  103115. this.flipY = !this.flipY;
  103116. return this;
  103117. },
  103118. /**
  103119. * Sets the horizontal flipped state of this Game Object.
  103120. *
  103121. * @method Phaser.GameObjects.Components.Flip#setFlipX
  103122. * @since 3.0.0
  103123. *
  103124. * @param {boolean} value - The flipped state. `false` for no flip, or `true` to be flipped.
  103125. *
  103126. * @return {this} This Game Object instance.
  103127. */
  103128. setFlipX: function (value)
  103129. {
  103130. this.flipX = value;
  103131. return this;
  103132. },
  103133. /**
  103134. * Sets the vertical flipped state of this Game Object.
  103135. *
  103136. * @method Phaser.GameObjects.Components.Flip#setFlipY
  103137. * @since 3.0.0
  103138. *
  103139. * @param {boolean} value - The flipped state. `false` for no flip, or `true` to be flipped.
  103140. *
  103141. * @return {this} This Game Object instance.
  103142. */
  103143. setFlipY: function (value)
  103144. {
  103145. this.flipY = value;
  103146. return this;
  103147. },
  103148. /**
  103149. * Sets the horizontal and vertical flipped state of this Game Object.
  103150. *
  103151. * @method Phaser.GameObjects.Components.Flip#setFlip
  103152. * @since 3.0.0
  103153. *
  103154. * @param {boolean} x - The horizontal flipped state. `false` for no flip, or `true` to be flipped.
  103155. * @param {boolean} y - The horizontal flipped state. `false` for no flip, or `true` to be flipped.
  103156. *
  103157. * @return {this} This Game Object instance.
  103158. */
  103159. setFlip: function (x, y)
  103160. {
  103161. this.flipX = x;
  103162. this.flipY = y;
  103163. return this;
  103164. },
  103165. /**
  103166. * Resets the horizontal and vertical flipped state of this Game Object back to their default un-flipped state.
  103167. *
  103168. * @method Phaser.GameObjects.Components.Flip#resetFlip
  103169. * @since 3.0.0
  103170. *
  103171. * @return {this} This Game Object instance.
  103172. */
  103173. resetFlip: function ()
  103174. {
  103175. this.flipX = false;
  103176. this.flipY = false;
  103177. return this;
  103178. }
  103179. };
  103180. module.exports = Flip;
  103181. /***/ }),
  103182. /* 589 */
  103183. /***/ (function(module, exports) {
  103184. /**
  103185. * @author Richard Davey <rich@photonstorm.com>
  103186. * @copyright 2018 Photon Storm Ltd.
  103187. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103188. */
  103189. /**
  103190. * Provides methods used for setting the depth of a Game Object.
  103191. * Should be applied as a mixin and not used directly.
  103192. *
  103193. * @name Phaser.GameObjects.Components.Depth
  103194. * @since 3.0.0
  103195. */
  103196. var Depth = {
  103197. /**
  103198. * Private internal value. Holds the depth of the Game Object.
  103199. *
  103200. * @name Phaser.GameObjects.Components.Depth#_depth
  103201. * @type {integer}
  103202. * @private
  103203. * @default 0
  103204. * @since 3.0.0
  103205. */
  103206. _depth: 0,
  103207. /**
  103208. * The depth of this Game Object within the Scene.
  103209. *
  103210. * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order
  103211. * of Game Objects, without actually moving their position in the display list.
  103212. *
  103213. * The depth starts from zero (the default value) and increases from that point. A Game Object with a higher depth
  103214. * value will always render in front of one with a lower value.
  103215. *
  103216. * Setting the depth will queue a depth sort event within the Scene.
  103217. *
  103218. * @name Phaser.GameObjects.Components.Depth#depth
  103219. * @type {number}
  103220. * @since 3.0.0
  103221. */
  103222. depth: {
  103223. get: function ()
  103224. {
  103225. return this._depth;
  103226. },
  103227. set: function (value)
  103228. {
  103229. this.scene.sys.queueDepthSort();
  103230. this._depth = value;
  103231. }
  103232. },
  103233. /**
  103234. * The depth of this Game Object within the Scene.
  103235. *
  103236. * The depth is also known as the 'z-index' in some environments, and allows you to change the rendering order
  103237. * of Game Objects, without actually moving their position in the display list.
  103238. *
  103239. * The depth starts from zero (the default value) and increases from that point. A Game Object with a higher depth
  103240. * value will always render in front of one with a lower value.
  103241. *
  103242. * Setting the depth will queue a depth sort event within the Scene.
  103243. *
  103244. * @method Phaser.GameObjects.Components.Depth#setDepth
  103245. * @since 3.0.0
  103246. *
  103247. * @param {integer} value - The depth of this Game Object.
  103248. *
  103249. * @return {this} This Game Object instance.
  103250. */
  103251. setDepth: function (value)
  103252. {
  103253. if (value === undefined) { value = 0; }
  103254. this.depth = value;
  103255. return this;
  103256. }
  103257. };
  103258. module.exports = Depth;
  103259. /***/ }),
  103260. /* 590 */
  103261. /***/ (function(module, exports) {
  103262. /**
  103263. * @author Richard Davey <rich@photonstorm.com>
  103264. * @copyright 2018 Photon Storm Ltd.
  103265. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103266. */
  103267. /**
  103268. * Provides methods used for calculating and setting the size of a non-Frame based Game Object.
  103269. * Should be applied as a mixin and not used directly.
  103270. *
  103271. * @name Phaser.GameObjects.Components.ComputedSize
  103272. * @since 3.0.0
  103273. */
  103274. var ComputedSize = {
  103275. /**
  103276. * The native (un-scaled) width of this Game Object.
  103277. *
  103278. * @name Phaser.GameObjects.Components.ComputedSize#width
  103279. * @type {number}
  103280. * @since 3.0.0
  103281. */
  103282. width: 0,
  103283. /**
  103284. * The native (un-scaled) height of this Game Object.
  103285. *
  103286. * @name Phaser.GameObjects.Components.ComputedSize#height
  103287. * @type {number}
  103288. * @since 3.0.0
  103289. */
  103290. height: 0,
  103291. /**
  103292. * The displayed width of this Game Object.
  103293. * This value takes into account the scale factor.
  103294. *
  103295. * @name Phaser.GameObjects.Components.ComputedSize#displayWidth
  103296. * @type {number}
  103297. * @since 3.0.0
  103298. */
  103299. displayWidth: {
  103300. get: function ()
  103301. {
  103302. return this.scaleX * this.width;
  103303. },
  103304. set: function (value)
  103305. {
  103306. this.scaleX = value / this.width;
  103307. }
  103308. },
  103309. /**
  103310. * The displayed height of this Game Object.
  103311. * This value takes into account the scale factor.
  103312. *
  103313. * @name Phaser.GameObjects.Components.ComputedSize#displayHeight
  103314. * @type {number}
  103315. * @since 3.0.0
  103316. */
  103317. displayHeight: {
  103318. get: function ()
  103319. {
  103320. return this.scaleY * this.height;
  103321. },
  103322. set: function (value)
  103323. {
  103324. this.scaleY = value / this.height;
  103325. }
  103326. },
  103327. /**
  103328. * Sets the size of this Game Object.
  103329. *
  103330. * @method Phaser.GameObjects.Components.ComputedSize#setSize
  103331. * @since 3.4.0
  103332. *
  103333. * @param {number} width - The width of this Game Object.
  103334. * @param {number} height - The height of this Game Object.
  103335. *
  103336. * @return {this} This Game Object instance.
  103337. */
  103338. setSize: function (width, height)
  103339. {
  103340. this.width = width;
  103341. this.height = height;
  103342. return this;
  103343. },
  103344. /**
  103345. * Sets the display size of this Game Object.
  103346. * Calling this will adjust the scale.
  103347. *
  103348. * @method Phaser.GameObjects.Components.ComputedSize#setDisplaySize
  103349. * @since 3.4.0
  103350. *
  103351. * @param {number} width - The width of this Game Object.
  103352. * @param {number} height - The height of this Game Object.
  103353. *
  103354. * @return {this} This Game Object instance.
  103355. */
  103356. setDisplaySize: function (width, height)
  103357. {
  103358. this.displayWidth = width;
  103359. this.displayHeight = height;
  103360. return this;
  103361. }
  103362. };
  103363. module.exports = ComputedSize;
  103364. /***/ }),
  103365. /* 591 */
  103366. /***/ (function(module, exports, __webpack_require__) {
  103367. /**
  103368. * @author Richard Davey <rich@photonstorm.com>
  103369. * @copyright 2018 Photon Storm Ltd.
  103370. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103371. */
  103372. var BlendModes = __webpack_require__(52);
  103373. /**
  103374. * Provides methods used for setting the blend mode of a Game Object.
  103375. * Should be applied as a mixin and not used directly.
  103376. *
  103377. * @name Phaser.GameObjects.Components.BlendMode
  103378. * @since 3.0.0
  103379. */
  103380. var BlendMode = {
  103381. /**
  103382. * Private internal value. Holds the current blend mode.
  103383. *
  103384. * @name Phaser.GameObjects.Components.BlendMode#_blendMode
  103385. * @type {integer}
  103386. * @private
  103387. * @default 0
  103388. * @since 3.0.0
  103389. */
  103390. _blendMode: BlendModes.NORMAL,
  103391. /**
  103392. * Sets the Blend Mode being used by this Game Object.
  103393. *
  103394. * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay)
  103395. *
  103396. * Under WebGL only the following Blend Modes are available:
  103397. *
  103398. * * ADD
  103399. * * MULTIPLY
  103400. * * SCREEN
  103401. *
  103402. * Canvas has more available depending on browser support.
  103403. *
  103404. * You can also create your own custom Blend Modes in WebGL.
  103405. *
  103406. * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending
  103407. * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these
  103408. * reasons try to be careful about the construction of your Scene and the frequency of which blend modes
  103409. * are used.
  103410. *
  103411. * @name Phaser.GameObjects.Components.BlendMode#blendMode
  103412. * @type {(Phaser.BlendModes|string)}
  103413. * @since 3.0.0
  103414. */
  103415. blendMode: {
  103416. get: function ()
  103417. {
  103418. return this._blendMode;
  103419. },
  103420. set: function (value)
  103421. {
  103422. if (typeof value === 'string')
  103423. {
  103424. value = BlendModes[value];
  103425. }
  103426. value |= 0;
  103427. if (value >= 0)
  103428. {
  103429. this._blendMode = value;
  103430. }
  103431. }
  103432. },
  103433. /**
  103434. * Sets the Blend Mode being used by this Game Object.
  103435. *
  103436. * This can be a const, such as `Phaser.BlendModes.SCREEN`, or an integer, such as 4 (for Overlay)
  103437. *
  103438. * Under WebGL only the following Blend Modes are available:
  103439. *
  103440. * * ADD
  103441. * * MULTIPLY
  103442. * * SCREEN
  103443. *
  103444. * Canvas has more available depending on browser support.
  103445. *
  103446. * You can also create your own custom Blend Modes in WebGL.
  103447. *
  103448. * Blend modes have different effects under Canvas and WebGL, and from browser to browser, depending
  103449. * on support. Blend Modes also cause a WebGL batch flush should it encounter a new blend mode. For these
  103450. * reasons try to be careful about the construction of your Scene and the frequency of which blend modes
  103451. * are used.
  103452. *
  103453. * @method Phaser.GameObjects.Components.BlendMode#setBlendMode
  103454. * @since 3.0.0
  103455. *
  103456. * @param {(string|Phaser.BlendModes)} value - The BlendMode value. Either a string or a CONST.
  103457. *
  103458. * @return {this} This Game Object instance.
  103459. */
  103460. setBlendMode: function (value)
  103461. {
  103462. this.blendMode = value;
  103463. return this;
  103464. }
  103465. };
  103466. module.exports = BlendMode;
  103467. /***/ }),
  103468. /* 592 */
  103469. /***/ (function(module, exports, __webpack_require__) {
  103470. /**
  103471. * @author Richard Davey <rich@photonstorm.com>
  103472. * @copyright 2018 Photon Storm Ltd.
  103473. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103474. */
  103475. var Clamp = __webpack_require__(19);
  103476. // bitmask flag for GameObject.renderMask
  103477. var _FLAG = 2; // 0010
  103478. /**
  103479. * Provides methods used for setting the alpha properties of a Game Object.
  103480. * Should be applied as a mixin and not used directly.
  103481. *
  103482. * @name Phaser.GameObjects.Components.Alpha
  103483. * @since 3.0.0
  103484. */
  103485. var Alpha = {
  103486. /**
  103487. * Private internal value. Holds the global alpha value.
  103488. *
  103489. * @name Phaser.GameObjects.Components.Alpha#_alpha
  103490. * @type {number}
  103491. * @private
  103492. * @default 1
  103493. * @since 3.0.0
  103494. */
  103495. _alpha: 1,
  103496. /**
  103497. * Private internal value. Holds the top-left alpha value.
  103498. *
  103499. * @name Phaser.GameObjects.Components.Alpha#_alphaTL
  103500. * @type {number}
  103501. * @private
  103502. * @default 1
  103503. * @since 3.0.0
  103504. */
  103505. _alphaTL: 1,
  103506. /**
  103507. * Private internal value. Holds the top-right alpha value.
  103508. *
  103509. * @name Phaser.GameObjects.Components.Alpha#_alphaTR
  103510. * @type {number}
  103511. * @private
  103512. * @default 1
  103513. * @since 3.0.0
  103514. */
  103515. _alphaTR: 1,
  103516. /**
  103517. * Private internal value. Holds the bottom-left alpha value.
  103518. *
  103519. * @name Phaser.GameObjects.Components.Alpha#_alphaBL
  103520. * @type {number}
  103521. * @private
  103522. * @default 1
  103523. * @since 3.0.0
  103524. */
  103525. _alphaBL: 1,
  103526. /**
  103527. * Private internal value. Holds the bottom-right alpha value.
  103528. *
  103529. * @name Phaser.GameObjects.Components.Alpha#_alphaBR
  103530. * @type {number}
  103531. * @private
  103532. * @default 1
  103533. * @since 3.0.0
  103534. */
  103535. _alphaBR: 1,
  103536. /**
  103537. * Clears all alpha values associated with this Game Object.
  103538. *
  103539. * Immediately sets the alpha levels back to 1 (fully opaque).
  103540. *
  103541. * @method Phaser.GameObjects.Components.Alpha#clearAlpha
  103542. * @since 3.0.0
  103543. *
  103544. * @return {this} This Game Object instance.
  103545. */
  103546. clearAlpha: function ()
  103547. {
  103548. return this.setAlpha(1);
  103549. },
  103550. /**
  103551. * Set the Alpha level of this Game Object. The alpha controls the opacity of the Game Object as it renders.
  103552. * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque.
  103553. *
  103554. * If your game is running under WebGL you can optionally specify four different alpha values, each of which
  103555. * correspond to the four corners of the Game Object. Under Canvas only the `topLeft` value given is used.
  103556. *
  103557. * @method Phaser.GameObjects.Components.Alpha#setAlpha
  103558. * @since 3.0.0
  103559. *
  103560. * @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.
  103561. * @param {number} [topRight] - The alpha value used for the top-right of the Game Object. WebGL only.
  103562. * @param {number} [bottomLeft] - The alpha value used for the bottom-left of the Game Object. WebGL only.
  103563. * @param {number} [bottomRight] - The alpha value used for the bottom-right of the Game Object. WebGL only.
  103564. *
  103565. * @return {this} This Game Object instance.
  103566. */
  103567. setAlpha: function (topLeft, topRight, bottomLeft, bottomRight)
  103568. {
  103569. if (topLeft === undefined) { topLeft = 1; }
  103570. // Treat as if there is only one alpha value for the whole Game Object
  103571. if (topRight === undefined)
  103572. {
  103573. this.alpha = topLeft;
  103574. }
  103575. else
  103576. {
  103577. this._alphaTL = Clamp(topLeft, 0, 1);
  103578. this._alphaTR = Clamp(topRight, 0, 1);
  103579. this._alphaBL = Clamp(bottomLeft, 0, 1);
  103580. this._alphaBR = Clamp(bottomRight, 0, 1);
  103581. }
  103582. return this;
  103583. },
  103584. /**
  103585. * The alpha value of the Game Object.
  103586. *
  103587. * This is a global value, impacting the entire Game Object, not just a region of it.
  103588. *
  103589. * @name Phaser.GameObjects.Components.Alpha#alpha
  103590. * @type {number}
  103591. * @since 3.0.0
  103592. */
  103593. alpha: {
  103594. get: function ()
  103595. {
  103596. return this._alpha;
  103597. },
  103598. set: function (value)
  103599. {
  103600. var v = Clamp(value, 0, 1);
  103601. this._alpha = v;
  103602. this._alphaTL = v;
  103603. this._alphaTR = v;
  103604. this._alphaBL = v;
  103605. this._alphaBR = v;
  103606. if (v === 0)
  103607. {
  103608. this.renderFlags &= ~_FLAG;
  103609. }
  103610. else
  103611. {
  103612. this.renderFlags |= _FLAG;
  103613. }
  103614. }
  103615. },
  103616. /**
  103617. * The alpha value starting from the top-left of the Game Object.
  103618. * This value is interpolated from the corner to the center of the Game Object.
  103619. *
  103620. * @name Phaser.GameObjects.Components.Alpha#alphaTopLeft
  103621. * @type {number}
  103622. * @webglOnly
  103623. * @since 3.0.0
  103624. */
  103625. alphaTopLeft: {
  103626. get: function ()
  103627. {
  103628. return this._alphaTL;
  103629. },
  103630. set: function (value)
  103631. {
  103632. var v = Clamp(value, 0, 1);
  103633. this._alphaTL = v;
  103634. if (v !== 0)
  103635. {
  103636. this.renderFlags |= _FLAG;
  103637. }
  103638. }
  103639. },
  103640. /**
  103641. * The alpha value starting from the top-right of the Game Object.
  103642. * This value is interpolated from the corner to the center of the Game Object.
  103643. *
  103644. * @name Phaser.GameObjects.Components.Alpha#alphaTopRight
  103645. * @type {number}
  103646. * @webglOnly
  103647. * @since 3.0.0
  103648. */
  103649. alphaTopRight: {
  103650. get: function ()
  103651. {
  103652. return this._alphaTR;
  103653. },
  103654. set: function (value)
  103655. {
  103656. var v = Clamp(value, 0, 1);
  103657. this._alphaTR = v;
  103658. if (v !== 0)
  103659. {
  103660. this.renderFlags |= _FLAG;
  103661. }
  103662. }
  103663. },
  103664. /**
  103665. * The alpha value starting from the bottom-left of the Game Object.
  103666. * This value is interpolated from the corner to the center of the Game Object.
  103667. *
  103668. * @name Phaser.GameObjects.Components.Alpha#alphaBottomLeft
  103669. * @type {number}
  103670. * @webglOnly
  103671. * @since 3.0.0
  103672. */
  103673. alphaBottomLeft: {
  103674. get: function ()
  103675. {
  103676. return this._alphaBL;
  103677. },
  103678. set: function (value)
  103679. {
  103680. var v = Clamp(value, 0, 1);
  103681. this._alphaBL = v;
  103682. if (v !== 0)
  103683. {
  103684. this.renderFlags |= _FLAG;
  103685. }
  103686. }
  103687. },
  103688. /**
  103689. * The alpha value starting from the bottom-right of the Game Object.
  103690. * This value is interpolated from the corner to the center of the Game Object.
  103691. *
  103692. * @name Phaser.GameObjects.Components.Alpha#alphaBottomRight
  103693. * @type {number}
  103694. * @webglOnly
  103695. * @since 3.0.0
  103696. */
  103697. alphaBottomRight: {
  103698. get: function ()
  103699. {
  103700. return this._alphaBR;
  103701. },
  103702. set: function (value)
  103703. {
  103704. var v = Clamp(value, 0, 1);
  103705. this._alphaBR = v;
  103706. if (v !== 0)
  103707. {
  103708. this.renderFlags |= _FLAG;
  103709. }
  103710. }
  103711. }
  103712. };
  103713. module.exports = Alpha;
  103714. /***/ }),
  103715. /* 593 */
  103716. /***/ (function(module, exports, __webpack_require__) {
  103717. /**
  103718. * @author Richard Davey <rich@photonstorm.com>
  103719. * @copyright 2018 Photon Storm Ltd.
  103720. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103721. */
  103722. var GetRight = __webpack_require__(47);
  103723. var GetTop = __webpack_require__(45);
  103724. var SetRight = __webpack_require__(46);
  103725. var SetTop = __webpack_require__(44);
  103726. /**
  103727. * Takes given Game Object and aligns it so that it is positioned in the top right of the other.
  103728. *
  103729. * @function Phaser.Display.Align.In.TopRight
  103730. * @since 3.0.0
  103731. *
  103732. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  103733. *
  103734. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  103735. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  103736. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  103737. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  103738. *
  103739. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  103740. */
  103741. var TopRight = function (gameObject, alignIn, offsetX, offsetY)
  103742. {
  103743. if (offsetX === undefined) { offsetX = 0; }
  103744. if (offsetY === undefined) { offsetY = 0; }
  103745. SetRight(gameObject, GetRight(alignIn) + offsetX);
  103746. SetTop(gameObject, GetTop(alignIn) - offsetY);
  103747. return gameObject;
  103748. };
  103749. module.exports = TopRight;
  103750. /***/ }),
  103751. /* 594 */
  103752. /***/ (function(module, exports, __webpack_require__) {
  103753. /**
  103754. * @author Richard Davey <rich@photonstorm.com>
  103755. * @copyright 2018 Photon Storm Ltd.
  103756. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103757. */
  103758. var GetLeft = __webpack_require__(49);
  103759. var GetTop = __webpack_require__(45);
  103760. var SetLeft = __webpack_require__(48);
  103761. var SetTop = __webpack_require__(44);
  103762. /**
  103763. * Takes given Game Object and aligns it so that it is positioned in the top left of the other.
  103764. *
  103765. * @function Phaser.Display.Align.In.TopLeft
  103766. * @since 3.0.0
  103767. *
  103768. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  103769. *
  103770. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  103771. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  103772. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  103773. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  103774. *
  103775. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  103776. */
  103777. var TopLeft = function (gameObject, alignIn, offsetX, offsetY)
  103778. {
  103779. if (offsetX === undefined) { offsetX = 0; }
  103780. if (offsetY === undefined) { offsetY = 0; }
  103781. SetLeft(gameObject, GetLeft(alignIn) - offsetX);
  103782. SetTop(gameObject, GetTop(alignIn) - offsetY);
  103783. return gameObject;
  103784. };
  103785. module.exports = TopLeft;
  103786. /***/ }),
  103787. /* 595 */
  103788. /***/ (function(module, exports, __webpack_require__) {
  103789. /**
  103790. * @author Richard Davey <rich@photonstorm.com>
  103791. * @copyright 2018 Photon Storm Ltd.
  103792. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103793. */
  103794. var GetCenterX = __webpack_require__(92);
  103795. var GetTop = __webpack_require__(45);
  103796. var SetCenterX = __webpack_require__(91);
  103797. var SetTop = __webpack_require__(44);
  103798. /**
  103799. * Takes given Game Object and aligns it so that it is positioned in the top center of the other.
  103800. *
  103801. * @function Phaser.Display.Align.In.TopCenter
  103802. * @since 3.0.0
  103803. *
  103804. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  103805. *
  103806. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  103807. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  103808. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  103809. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  103810. *
  103811. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  103812. */
  103813. var TopCenter = function (gameObject, alignIn, offsetX, offsetY)
  103814. {
  103815. if (offsetX === undefined) { offsetX = 0; }
  103816. if (offsetY === undefined) { offsetY = 0; }
  103817. SetCenterX(gameObject, GetCenterX(alignIn) + offsetX);
  103818. SetTop(gameObject, GetTop(alignIn) - offsetY);
  103819. return gameObject;
  103820. };
  103821. module.exports = TopCenter;
  103822. /***/ }),
  103823. /* 596 */
  103824. /***/ (function(module, exports, __webpack_require__) {
  103825. /**
  103826. * @author Richard Davey <rich@photonstorm.com>
  103827. * @copyright 2018 Photon Storm Ltd.
  103828. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103829. */
  103830. var GetCenterY = __webpack_require__(89);
  103831. var GetRight = __webpack_require__(47);
  103832. var SetCenterY = __webpack_require__(90);
  103833. var SetRight = __webpack_require__(46);
  103834. /**
  103835. * Takes given Game Object and aligns it so that it is positioned in the right center of the other.
  103836. *
  103837. * @function Phaser.Display.Align.In.RightCenter
  103838. * @since 3.0.0
  103839. *
  103840. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  103841. *
  103842. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  103843. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  103844. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  103845. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  103846. *
  103847. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  103848. */
  103849. var RightCenter = function (gameObject, alignIn, offsetX, offsetY)
  103850. {
  103851. if (offsetX === undefined) { offsetX = 0; }
  103852. if (offsetY === undefined) { offsetY = 0; }
  103853. SetRight(gameObject, GetRight(alignIn) + offsetX);
  103854. SetCenterY(gameObject, GetCenterY(alignIn) + offsetY);
  103855. return gameObject;
  103856. };
  103857. module.exports = RightCenter;
  103858. /***/ }),
  103859. /* 597 */
  103860. /***/ (function(module, exports, __webpack_require__) {
  103861. /**
  103862. * @author Richard Davey <rich@photonstorm.com>
  103863. * @copyright 2018 Photon Storm Ltd.
  103864. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103865. */
  103866. var GetCenterY = __webpack_require__(89);
  103867. var GetLeft = __webpack_require__(49);
  103868. var SetCenterY = __webpack_require__(90);
  103869. var SetLeft = __webpack_require__(48);
  103870. /**
  103871. * Takes given Game Object and aligns it so that it is positioned in the left center of the other.
  103872. *
  103873. * @function Phaser.Display.Align.In.LeftCenter
  103874. * @since 3.0.0
  103875. *
  103876. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  103877. *
  103878. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  103879. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  103880. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  103881. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  103882. *
  103883. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  103884. */
  103885. var LeftCenter = function (gameObject, alignIn, offsetX, offsetY)
  103886. {
  103887. if (offsetX === undefined) { offsetX = 0; }
  103888. if (offsetY === undefined) { offsetY = 0; }
  103889. SetLeft(gameObject, GetLeft(alignIn) - offsetX);
  103890. SetCenterY(gameObject, GetCenterY(alignIn) + offsetY);
  103891. return gameObject;
  103892. };
  103893. module.exports = LeftCenter;
  103894. /***/ }),
  103895. /* 598 */
  103896. /***/ (function(module, exports, __webpack_require__) {
  103897. /**
  103898. * @author Richard Davey <rich@photonstorm.com>
  103899. * @copyright 2018 Photon Storm Ltd.
  103900. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103901. */
  103902. var SetCenterX = __webpack_require__(91);
  103903. var SetCenterY = __webpack_require__(90);
  103904. /**
  103905. * Positions the Game Object so that it is centered on the given coordinates.
  103906. *
  103907. * @function Phaser.Display.Bounds.CenterOn
  103908. * @since 3.0.0
  103909. *
  103910. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  103911. *
  103912. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be re-positioned.
  103913. * @param {number} x - The horizontal coordinate to position the Game Object on.
  103914. * @param {number} y - The vertical coordinate to position the Game Object on.
  103915. *
  103916. * @return {Phaser.GameObjects.GameObject} The Game Object that was positioned.
  103917. */
  103918. var CenterOn = function (gameObject, x, y)
  103919. {
  103920. SetCenterX(gameObject, x);
  103921. return SetCenterY(gameObject, y);
  103922. };
  103923. module.exports = CenterOn;
  103924. /***/ }),
  103925. /* 599 */
  103926. /***/ (function(module, exports, __webpack_require__) {
  103927. /**
  103928. * @author Richard Davey <rich@photonstorm.com>
  103929. * @copyright 2018 Photon Storm Ltd.
  103930. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103931. */
  103932. var CenterOn = __webpack_require__(598);
  103933. var GetCenterX = __webpack_require__(92);
  103934. var GetCenterY = __webpack_require__(89);
  103935. /**
  103936. * Takes given Game Object and aligns it so that it is positioned in the center of the other.
  103937. *
  103938. * @function Phaser.Display.Align.In.Center
  103939. * @since 3.0.0
  103940. *
  103941. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  103942. *
  103943. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  103944. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  103945. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  103946. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  103947. *
  103948. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  103949. */
  103950. var Center = function (gameObject, alignIn, offsetX, offsetY)
  103951. {
  103952. if (offsetX === undefined) { offsetX = 0; }
  103953. if (offsetY === undefined) { offsetY = 0; }
  103954. CenterOn(gameObject, GetCenterX(alignIn) + offsetX, GetCenterY(alignIn) + offsetY);
  103955. return gameObject;
  103956. };
  103957. module.exports = Center;
  103958. /***/ }),
  103959. /* 600 */
  103960. /***/ (function(module, exports, __webpack_require__) {
  103961. /**
  103962. * @author Richard Davey <rich@photonstorm.com>
  103963. * @copyright 2018 Photon Storm Ltd.
  103964. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  103965. */
  103966. var GetBottom = __webpack_require__(51);
  103967. var GetRight = __webpack_require__(47);
  103968. var SetBottom = __webpack_require__(50);
  103969. var SetRight = __webpack_require__(46);
  103970. /**
  103971. * Takes given Game Object and aligns it so that it is positioned in the bottom right of the other.
  103972. *
  103973. * @function Phaser.Display.Align.In.BottomRight
  103974. * @since 3.0.0
  103975. *
  103976. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  103977. *
  103978. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  103979. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  103980. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  103981. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  103982. *
  103983. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  103984. */
  103985. var BottomRight = function (gameObject, alignIn, offsetX, offsetY)
  103986. {
  103987. if (offsetX === undefined) { offsetX = 0; }
  103988. if (offsetY === undefined) { offsetY = 0; }
  103989. SetRight(gameObject, GetRight(alignIn) + offsetX);
  103990. SetBottom(gameObject, GetBottom(alignIn) + offsetY);
  103991. return gameObject;
  103992. };
  103993. module.exports = BottomRight;
  103994. /***/ }),
  103995. /* 601 */
  103996. /***/ (function(module, exports, __webpack_require__) {
  103997. /**
  103998. * @author Richard Davey <rich@photonstorm.com>
  103999. * @copyright 2018 Photon Storm Ltd.
  104000. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104001. */
  104002. var GetBottom = __webpack_require__(51);
  104003. var GetLeft = __webpack_require__(49);
  104004. var SetBottom = __webpack_require__(50);
  104005. var SetLeft = __webpack_require__(48);
  104006. /**
  104007. * Takes given Game Object and aligns it so that it is positioned in the bottom left of the other.
  104008. *
  104009. * @function Phaser.Display.Align.In.BottomLeft
  104010. * @since 3.0.0
  104011. *
  104012. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  104013. *
  104014. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  104015. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  104016. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  104017. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  104018. *
  104019. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  104020. */
  104021. var BottomLeft = function (gameObject, alignIn, offsetX, offsetY)
  104022. {
  104023. if (offsetX === undefined) { offsetX = 0; }
  104024. if (offsetY === undefined) { offsetY = 0; }
  104025. SetLeft(gameObject, GetLeft(alignIn) - offsetX);
  104026. SetBottom(gameObject, GetBottom(alignIn) + offsetY);
  104027. return gameObject;
  104028. };
  104029. module.exports = BottomLeft;
  104030. /***/ }),
  104031. /* 602 */
  104032. /***/ (function(module, exports, __webpack_require__) {
  104033. /**
  104034. * @author Richard Davey <rich@photonstorm.com>
  104035. * @copyright 2018 Photon Storm Ltd.
  104036. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104037. */
  104038. var GetBottom = __webpack_require__(51);
  104039. var GetCenterX = __webpack_require__(92);
  104040. var SetBottom = __webpack_require__(50);
  104041. var SetCenterX = __webpack_require__(91);
  104042. /**
  104043. * Takes given Game Object and aligns it so that it is positioned in the bottom center of the other.
  104044. *
  104045. * @function Phaser.Display.Align.In.BottomCenter
  104046. * @since 3.0.0
  104047. *
  104048. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  104049. *
  104050. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  104051. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  104052. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  104053. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  104054. *
  104055. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  104056. */
  104057. var BottomCenter = function (gameObject, alignIn, offsetX, offsetY)
  104058. {
  104059. if (offsetX === undefined) { offsetX = 0; }
  104060. if (offsetY === undefined) { offsetY = 0; }
  104061. SetCenterX(gameObject, GetCenterX(alignIn) + offsetX);
  104062. SetBottom(gameObject, GetBottom(alignIn) + offsetY);
  104063. return gameObject;
  104064. };
  104065. module.exports = BottomCenter;
  104066. /***/ }),
  104067. /* 603 */
  104068. /***/ (function(module, exports, __webpack_require__) {
  104069. /**
  104070. * @author Richard Davey <rich@photonstorm.com>
  104071. * @copyright 2018 Photon Storm Ltd.
  104072. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104073. */
  104074. var ALIGN_CONST = __webpack_require__(304);
  104075. var AlignInMap = [];
  104076. AlignInMap[ALIGN_CONST.BOTTOM_CENTER] = __webpack_require__(602);
  104077. AlignInMap[ALIGN_CONST.BOTTOM_LEFT] = __webpack_require__(601);
  104078. AlignInMap[ALIGN_CONST.BOTTOM_RIGHT] = __webpack_require__(600);
  104079. AlignInMap[ALIGN_CONST.CENTER] = __webpack_require__(599);
  104080. AlignInMap[ALIGN_CONST.LEFT_CENTER] = __webpack_require__(597);
  104081. AlignInMap[ALIGN_CONST.RIGHT_CENTER] = __webpack_require__(596);
  104082. AlignInMap[ALIGN_CONST.TOP_CENTER] = __webpack_require__(595);
  104083. AlignInMap[ALIGN_CONST.TOP_LEFT] = __webpack_require__(594);
  104084. AlignInMap[ALIGN_CONST.TOP_RIGHT] = __webpack_require__(593);
  104085. /**
  104086. * Takes given Game Object and aligns it so that it is positioned relative to the other.
  104087. * The alignment used is based on the `position` argument, which is an `ALIGN_CONST` value, such as `LEFT_CENTER` or `TOP_RIGHT`.
  104088. *
  104089. * @function Phaser.Display.Align.In.QuickSet
  104090. * @since 3.0.0
  104091. *
  104092. * @generic {Phaser.GameObjects.GameObject} G - [child,$return]
  104093. *
  104094. * @param {Phaser.GameObjects.GameObject} child - The Game Object that will be positioned.
  104095. * @param {Phaser.GameObjects.GameObject} alignIn - The Game Object to base the alignment position on.
  104096. * @param {integer} position - The position to align the Game Object with. This is an align constant, such as `ALIGN_CONST.LEFT_CENTER`.
  104097. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  104098. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  104099. *
  104100. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  104101. */
  104102. var QuickSet = function (child, alignIn, position, offsetX, offsetY)
  104103. {
  104104. return AlignInMap[position](child, alignIn, offsetX, offsetY);
  104105. };
  104106. module.exports = QuickSet;
  104107. /***/ }),
  104108. /* 604 */
  104109. /***/ (function(module, exports, __webpack_require__) {
  104110. /**
  104111. * @author Richard Davey <rich@photonstorm.com>
  104112. * @copyright 2018 Photon Storm Ltd.
  104113. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104114. */
  104115. /**
  104116. * @namespace Phaser.Actions
  104117. */
  104118. module.exports = {
  104119. Angle: __webpack_require__(1011),
  104120. Call: __webpack_require__(1010),
  104121. GetFirst: __webpack_require__(1009),
  104122. GetLast: __webpack_require__(1008),
  104123. GridAlign: __webpack_require__(1007),
  104124. IncAlpha: __webpack_require__(1006),
  104125. IncX: __webpack_require__(1005),
  104126. IncXY: __webpack_require__(1004),
  104127. IncY: __webpack_require__(1003),
  104128. PlaceOnCircle: __webpack_require__(1002),
  104129. PlaceOnEllipse: __webpack_require__(1001),
  104130. PlaceOnLine: __webpack_require__(1000),
  104131. PlaceOnRectangle: __webpack_require__(999),
  104132. PlaceOnTriangle: __webpack_require__(998),
  104133. PlayAnimation: __webpack_require__(997),
  104134. PropertyValueInc: __webpack_require__(36),
  104135. PropertyValueSet: __webpack_require__(26),
  104136. RandomCircle: __webpack_require__(996),
  104137. RandomEllipse: __webpack_require__(995),
  104138. RandomLine: __webpack_require__(994),
  104139. RandomRectangle: __webpack_require__(993),
  104140. RandomTriangle: __webpack_require__(992),
  104141. Rotate: __webpack_require__(991),
  104142. RotateAround: __webpack_require__(990),
  104143. RotateAroundDistance: __webpack_require__(989),
  104144. ScaleX: __webpack_require__(988),
  104145. ScaleXY: __webpack_require__(987),
  104146. ScaleY: __webpack_require__(986),
  104147. SetAlpha: __webpack_require__(985),
  104148. SetBlendMode: __webpack_require__(984),
  104149. SetDepth: __webpack_require__(983),
  104150. SetHitArea: __webpack_require__(982),
  104151. SetOrigin: __webpack_require__(981),
  104152. SetRotation: __webpack_require__(980),
  104153. SetScale: __webpack_require__(979),
  104154. SetScaleX: __webpack_require__(978),
  104155. SetScaleY: __webpack_require__(977),
  104156. SetTint: __webpack_require__(976),
  104157. SetVisible: __webpack_require__(975),
  104158. SetX: __webpack_require__(974),
  104159. SetXY: __webpack_require__(973),
  104160. SetY: __webpack_require__(972),
  104161. ShiftPosition: __webpack_require__(971),
  104162. Shuffle: __webpack_require__(970),
  104163. SmootherStep: __webpack_require__(969),
  104164. SmoothStep: __webpack_require__(968),
  104165. Spread: __webpack_require__(967),
  104166. ToggleVisible: __webpack_require__(966),
  104167. WrapInRectangle: __webpack_require__(965)
  104168. };
  104169. /***/ }),
  104170. /* 605 */
  104171. /***/ (function(module, exports) {
  104172. /**
  104173. * Low-budget Float32Array knock-off, suitable for use with P2.js in IE9
  104174. * Source: http://www.html5gamedevs.com/topic/5988-phaser-12-ie9/
  104175. * Cameron Foale (http://www.kibibu.com)
  104176. */
  104177. if (typeof window.Uint32Array !== 'function' && typeof window.Uint32Array !== 'object')
  104178. {
  104179. var CheapArray = function (fakeType)
  104180. {
  104181. var proto = new Array(); // jshint ignore:line
  104182. window[fakeType] = function(arg) {
  104183. if (typeof(arg) === 'number')
  104184. {
  104185. Array.call(this, arg);
  104186. this.length = arg;
  104187. for (var i = 0; i < this.length; i++)
  104188. {
  104189. this[i] = 0;
  104190. }
  104191. }
  104192. else
  104193. {
  104194. Array.call(this, arg.length);
  104195. this.length = arg.length;
  104196. for (var i = 0; i < this.length; i++)
  104197. {
  104198. this[i] = arg[i];
  104199. }
  104200. }
  104201. };
  104202. window[fakeType].prototype = proto;
  104203. window[fakeType].constructor = window[fakeType];
  104204. };
  104205. CheapArray('Float32Array'); // jshint ignore:line
  104206. CheapArray('Uint32Array'); // jshint ignore:line
  104207. CheapArray('Uint16Array'); // jshint ignore:line
  104208. CheapArray('Int16Array'); // jshint ignore:line
  104209. CheapArray('ArrayBuffer'); // jshint ignore:line
  104210. }
  104211. /***/ }),
  104212. /* 606 */
  104213. /***/ (function(module, exports, __webpack_require__) {
  104214. /* WEBPACK VAR INJECTION */(function(global) {// References:
  104215. // http://paulirish.com/2011/requestanimationframe-for-smart-animating/
  104216. // https://gist.github.com/1579671
  104217. // http://updates.html5rocks.com/2012/05/requestAnimationFrame-API-now-with-sub-millisecond-precision
  104218. // https://gist.github.com/timhall/4078614
  104219. // https://github.com/Financial-Times/polyfill-service/tree/master/polyfills/requestAnimationFrame
  104220. // Expected to be used with Browserfiy
  104221. // Browserify automatically detects the use of `global` and passes the
  104222. // correct reference of `global`, `self`, and finally `window`
  104223. // Date.now
  104224. if (!(Date.now && Date.prototype.getTime)) {
  104225. Date.now = function now() {
  104226. return new Date().getTime();
  104227. };
  104228. }
  104229. // performance.now
  104230. if (!(global.performance && global.performance.now)) {
  104231. var startTime = Date.now();
  104232. if (!global.performance) {
  104233. global.performance = {};
  104234. }
  104235. global.performance.now = function () {
  104236. return Date.now() - startTime;
  104237. };
  104238. }
  104239. // requestAnimationFrame
  104240. var lastTime = Date.now();
  104241. var vendors = ['ms', 'moz', 'webkit', 'o'];
  104242. for(var x = 0; x < vendors.length && !global.requestAnimationFrame; ++x) {
  104243. global.requestAnimationFrame = global[vendors[x] + 'RequestAnimationFrame'];
  104244. global.cancelAnimationFrame = global[vendors[x] + 'CancelAnimationFrame'] ||
  104245. global[vendors[x] + 'CancelRequestAnimationFrame'];
  104246. }
  104247. if (!global.requestAnimationFrame) {
  104248. global.requestAnimationFrame = function (callback) {
  104249. if (typeof callback !== 'function') {
  104250. throw new TypeError(callback + 'is not a function');
  104251. }
  104252. var currentTime = Date.now(),
  104253. delay = 16 + lastTime - currentTime;
  104254. if (delay < 0) {
  104255. delay = 0;
  104256. }
  104257. lastTime = currentTime;
  104258. return setTimeout(function () {
  104259. lastTime = Date.now();
  104260. callback(performance.now());
  104261. }, delay);
  104262. };
  104263. }
  104264. if (!global.cancelAnimationFrame) {
  104265. global.cancelAnimationFrame = function(id) {
  104266. clearTimeout(id);
  104267. };
  104268. }
  104269. /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(220)))
  104270. /***/ }),
  104271. /* 607 */
  104272. /***/ (function(module, exports) {
  104273. /**
  104274. * performance.now
  104275. */
  104276. (function () {
  104277. if ('performance' in window === false)
  104278. {
  104279. window.performance = {};
  104280. }
  104281. // Thanks IE8
  104282. Date.now = (Date.now || function () {
  104283. return new Date().getTime();
  104284. });
  104285. if ('now' in window.performance === false)
  104286. {
  104287. var nowOffset = Date.now();
  104288. if (performance.timing && performance.timing.navigationStart)
  104289. {
  104290. nowOffset = performance.timing.navigationStart;
  104291. }
  104292. window.performance.now = function now ()
  104293. {
  104294. return Date.now() - nowOffset;
  104295. }
  104296. }
  104297. })();
  104298. /***/ }),
  104299. /* 608 */
  104300. /***/ (function(module, exports) {
  104301. // ES6 Math.trunc - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc
  104302. if (!Math.trunc) {
  104303. Math.trunc = function trunc(x) {
  104304. return x < 0 ? Math.ceil(x) : Math.floor(x);
  104305. };
  104306. }
  104307. /***/ }),
  104308. /* 609 */
  104309. /***/ (function(module, exports) {
  104310. /**
  104311. * A polyfill for Function.prototype.bind
  104312. */
  104313. if (!Function.prototype.bind) {
  104314. /* jshint freeze: false */
  104315. Function.prototype.bind = (function () {
  104316. var slice = Array.prototype.slice;
  104317. return function (thisArg) {
  104318. var target = this, boundArgs = slice.call(arguments, 1);
  104319. if (typeof target !== 'function')
  104320. {
  104321. throw new TypeError();
  104322. }
  104323. function bound() {
  104324. var args = boundArgs.concat(slice.call(arguments));
  104325. target.apply(this instanceof bound ? this : thisArg, args);
  104326. }
  104327. bound.prototype = (function F(proto) {
  104328. if (proto)
  104329. {
  104330. F.prototype = proto;
  104331. }
  104332. if (!(this instanceof F))
  104333. {
  104334. /* jshint supernew: true */
  104335. return new F;
  104336. }
  104337. })(target.prototype);
  104338. return bound;
  104339. };
  104340. })();
  104341. }
  104342. /***/ }),
  104343. /* 610 */
  104344. /***/ (function(module, exports) {
  104345. /**
  104346. * Also fix for the absent console in IE9
  104347. */
  104348. if (!window.console)
  104349. {
  104350. window.console = {};
  104351. window.console.log = window.console.assert = function(){};
  104352. window.console.warn = window.console.assert = function(){};
  104353. }
  104354. /***/ }),
  104355. /* 611 */
  104356. /***/ (function(module, exports) {
  104357. /* Copyright 2013 Chris Wilson
  104358. Licensed under the Apache License, Version 2.0 (the "License");
  104359. you may not use this file except in compliance with the License.
  104360. You may obtain a copy of the License at
  104361. http://www.apache.org/licenses/LICENSE-2.0
  104362. Unless required by applicable law or agreed to in writing, software
  104363. distributed under the License is distributed on an "AS IS" BASIS,
  104364. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  104365. See the License for the specific language governing permissions and
  104366. limitations under the License.
  104367. */
  104368. /*
  104369. This monkeypatch library is intended to be included in projects that are
  104370. written to the proper AudioContext spec (instead of webkitAudioContext),
  104371. and that use the new naming and proper bits of the Web Audio API (e.g.
  104372. using BufferSourceNode.start() instead of BufferSourceNode.noteOn()), but may
  104373. have to run on systems that only support the deprecated bits.
  104374. This library should be harmless to include if the browser supports
  104375. unprefixed "AudioContext", and/or if it supports the new names.
  104376. The patches this library handles:
  104377. if window.AudioContext is unsupported, it will be aliased to webkitAudioContext().
  104378. if AudioBufferSourceNode.start() is unimplemented, it will be routed to noteOn() or
  104379. noteGrainOn(), depending on parameters.
  104380. The following aliases only take effect if the new names are not already in place:
  104381. AudioBufferSourceNode.stop() is aliased to noteOff()
  104382. AudioContext.createGain() is aliased to createGainNode()
  104383. AudioContext.createDelay() is aliased to createDelayNode()
  104384. AudioContext.createScriptProcessor() is aliased to createJavaScriptNode()
  104385. AudioContext.createPeriodicWave() is aliased to createWaveTable()
  104386. OscillatorNode.start() is aliased to noteOn()
  104387. OscillatorNode.stop() is aliased to noteOff()
  104388. OscillatorNode.setPeriodicWave() is aliased to setWaveTable()
  104389. AudioParam.setTargetAtTime() is aliased to setTargetValueAtTime()
  104390. This library does NOT patch the enumerated type changes, as it is
  104391. recommended in the specification that implementations support both integer
  104392. and string types for AudioPannerNode.panningModel, AudioPannerNode.distanceModel
  104393. BiquadFilterNode.type and OscillatorNode.type.
  104394. */
  104395. (function () {
  104396. function fixSetTarget(param) {
  104397. if (!param) // if NYI, just return
  104398. return;
  104399. if (!param.setTargetAtTime)
  104400. param.setTargetAtTime = param.setTargetValueAtTime;
  104401. }
  104402. if (window.hasOwnProperty('webkitAudioContext') &&
  104403. !window.hasOwnProperty('AudioContext')) {
  104404. window.AudioContext = webkitAudioContext;
  104405. if (!AudioContext.prototype.hasOwnProperty('createGain'))
  104406. AudioContext.prototype.createGain = AudioContext.prototype.createGainNode;
  104407. if (!AudioContext.prototype.hasOwnProperty('createDelay'))
  104408. AudioContext.prototype.createDelay = AudioContext.prototype.createDelayNode;
  104409. if (!AudioContext.prototype.hasOwnProperty('createScriptProcessor'))
  104410. AudioContext.prototype.createScriptProcessor = AudioContext.prototype.createJavaScriptNode;
  104411. if (!AudioContext.prototype.hasOwnProperty('createPeriodicWave'))
  104412. AudioContext.prototype.createPeriodicWave = AudioContext.prototype.createWaveTable;
  104413. AudioContext.prototype.internal_createGain = AudioContext.prototype.createGain;
  104414. AudioContext.prototype.createGain = function() {
  104415. var node = this.internal_createGain();
  104416. fixSetTarget(node.gain);
  104417. return node;
  104418. };
  104419. AudioContext.prototype.internal_createDelay = AudioContext.prototype.createDelay;
  104420. AudioContext.prototype.createDelay = function(maxDelayTime) {
  104421. var node = maxDelayTime ? this.internal_createDelay(maxDelayTime) : this.internal_createDelay();
  104422. fixSetTarget(node.delayTime);
  104423. return node;
  104424. };
  104425. AudioContext.prototype.internal_createBufferSource = AudioContext.prototype.createBufferSource;
  104426. AudioContext.prototype.createBufferSource = function() {
  104427. var node = this.internal_createBufferSource();
  104428. if (!node.start) {
  104429. node.start = function ( when, offset, duration ) {
  104430. if ( offset || duration )
  104431. this.noteGrainOn( when || 0, offset, duration );
  104432. else
  104433. this.noteOn( when || 0 );
  104434. };
  104435. } else {
  104436. node.internal_start = node.start;
  104437. node.start = function( when, offset, duration ) {
  104438. if( typeof duration !== 'undefined' )
  104439. node.internal_start( when || 0, offset, duration );
  104440. else
  104441. node.internal_start( when || 0, offset || 0 );
  104442. };
  104443. }
  104444. if (!node.stop) {
  104445. node.stop = function ( when ) {
  104446. this.noteOff( when || 0 );
  104447. };
  104448. } else {
  104449. node.internal_stop = node.stop;
  104450. node.stop = function( when ) {
  104451. node.internal_stop( when || 0 );
  104452. };
  104453. }
  104454. fixSetTarget(node.playbackRate);
  104455. return node;
  104456. };
  104457. AudioContext.prototype.internal_createDynamicsCompressor = AudioContext.prototype.createDynamicsCompressor;
  104458. AudioContext.prototype.createDynamicsCompressor = function() {
  104459. var node = this.internal_createDynamicsCompressor();
  104460. fixSetTarget(node.threshold);
  104461. fixSetTarget(node.knee);
  104462. fixSetTarget(node.ratio);
  104463. fixSetTarget(node.reduction);
  104464. fixSetTarget(node.attack);
  104465. fixSetTarget(node.release);
  104466. return node;
  104467. };
  104468. AudioContext.prototype.internal_createBiquadFilter = AudioContext.prototype.createBiquadFilter;
  104469. AudioContext.prototype.createBiquadFilter = function() {
  104470. var node = this.internal_createBiquadFilter();
  104471. fixSetTarget(node.frequency);
  104472. fixSetTarget(node.detune);
  104473. fixSetTarget(node.Q);
  104474. fixSetTarget(node.gain);
  104475. return node;
  104476. };
  104477. if (AudioContext.prototype.hasOwnProperty( 'createOscillator' )) {
  104478. AudioContext.prototype.internal_createOscillator = AudioContext.prototype.createOscillator;
  104479. AudioContext.prototype.createOscillator = function() {
  104480. var node = this.internal_createOscillator();
  104481. if (!node.start) {
  104482. node.start = function ( when ) {
  104483. this.noteOn( when || 0 );
  104484. };
  104485. } else {
  104486. node.internal_start = node.start;
  104487. node.start = function ( when ) {
  104488. node.internal_start( when || 0);
  104489. };
  104490. }
  104491. if (!node.stop) {
  104492. node.stop = function ( when ) {
  104493. this.noteOff( when || 0 );
  104494. };
  104495. } else {
  104496. node.internal_stop = node.stop;
  104497. node.stop = function( when ) {
  104498. node.internal_stop( when || 0 );
  104499. };
  104500. }
  104501. if (!node.setPeriodicWave)
  104502. node.setPeriodicWave = node.setWaveTable;
  104503. fixSetTarget(node.frequency);
  104504. fixSetTarget(node.detune);
  104505. return node;
  104506. };
  104507. }
  104508. }
  104509. if (window.hasOwnProperty('webkitOfflineAudioContext') &&
  104510. !window.hasOwnProperty('OfflineAudioContext')) {
  104511. window.OfflineAudioContext = webkitOfflineAudioContext;
  104512. }
  104513. })();
  104514. /***/ }),
  104515. /* 612 */
  104516. /***/ (function(module, exports) {
  104517. /**
  104518. * A polyfill for Array.isArray
  104519. */
  104520. if (!Array.isArray)
  104521. {
  104522. Array.isArray = function (arg)
  104523. {
  104524. return Object.prototype.toString.call(arg) === '[object Array]';
  104525. };
  104526. }
  104527. /***/ }),
  104528. /* 613 */
  104529. /***/ (function(module, exports) {
  104530. /**
  104531. * A polyfill for Array.forEach
  104532. * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
  104533. */
  104534. if (!Array.prototype.forEach)
  104535. {
  104536. Array.prototype.forEach = function (fun /*, thisArg */)
  104537. {
  104538. 'use strict';
  104539. if (this === void 0 || this === null)
  104540. {
  104541. throw new TypeError();
  104542. }
  104543. var t = Object(this);
  104544. var len = t.length >>> 0;
  104545. if (typeof fun !== 'function')
  104546. {
  104547. throw new TypeError();
  104548. }
  104549. var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
  104550. for (var i = 0; i < len; i++)
  104551. {
  104552. if (i in t)
  104553. {
  104554. fun.call(thisArg, t[i], i, t);
  104555. }
  104556. }
  104557. };
  104558. }
  104559. /***/ }),
  104560. /* 614 */
  104561. /***/ (function(module, exports, __webpack_require__) {
  104562. __webpack_require__(613);
  104563. __webpack_require__(612);
  104564. __webpack_require__(611);
  104565. __webpack_require__(610);
  104566. __webpack_require__(609);
  104567. __webpack_require__(608);
  104568. __webpack_require__(607);
  104569. __webpack_require__(606);
  104570. __webpack_require__(605);
  104571. /***/ }),
  104572. /* 615 */
  104573. /***/ (function(module, exports) {
  104574. /**
  104575. * The `Matter.Pair` module contains methods for creating and manipulating collision pairs.
  104576. *
  104577. * @class Pair
  104578. */
  104579. var Pair = {};
  104580. module.exports = Pair;
  104581. (function() {
  104582. /**
  104583. * Creates a pair.
  104584. * @method create
  104585. * @param {collision} collision
  104586. * @param {number} timestamp
  104587. * @return {pair} A new pair
  104588. */
  104589. Pair.create = function(collision, timestamp) {
  104590. var bodyA = collision.bodyA,
  104591. bodyB = collision.bodyB;
  104592. var pair = {
  104593. id: Pair.id(bodyA, bodyB),
  104594. bodyA: bodyA,
  104595. bodyB: bodyB,
  104596. activeContacts: [],
  104597. separation: 0,
  104598. isActive: true,
  104599. confirmedActive: true,
  104600. isSensor: bodyA.isSensor || bodyB.isSensor,
  104601. timeCreated: timestamp,
  104602. timeUpdated: timestamp,
  104603. collision: null,
  104604. inverseMass: 0,
  104605. friction: 0,
  104606. frictionStatic: 0,
  104607. restitution: 0,
  104608. slop: 0
  104609. };
  104610. Pair.update(pair, collision, timestamp);
  104611. return pair;
  104612. };
  104613. /**
  104614. * Updates a pair given a collision.
  104615. * @method update
  104616. * @param {pair} pair
  104617. * @param {collision} collision
  104618. * @param {number} timestamp
  104619. */
  104620. Pair.update = function(pair, collision, timestamp) {
  104621. // var contacts = pair.contacts,
  104622. // supports = collision.supports,
  104623. // activeContacts = pair.activeContacts,
  104624. // parentA = collision.parentA,
  104625. // parentB = collision.parentB;
  104626. pair.collision = collision;
  104627. // pair.inverseMass = parentA.inverseMass + parentB.inverseMass;
  104628. // pair.friction = Math.min(parentA.friction, parentB.friction);
  104629. // pair.frictionStatic = Math.max(parentA.frictionStatic, parentB.frictionStatic);
  104630. // pair.restitution = Math.max(parentA.restitution, parentB.restitution);
  104631. // pair.slop = Math.max(parentA.slop, parentB.slop);
  104632. // activeContacts.length = 0;
  104633. if (collision.collided) {
  104634. var supports = collision.supports,
  104635. activeContacts = pair.activeContacts,
  104636. parentA = collision.parentA,
  104637. parentB = collision.parentB;
  104638. pair.inverseMass = parentA.inverseMass + parentB.inverseMass;
  104639. pair.friction = Math.min(parentA.friction, parentB.friction);
  104640. pair.frictionStatic = Math.max(parentA.frictionStatic, parentB.frictionStatic);
  104641. pair.restitution = Math.max(parentA.restitution, parentB.restitution);
  104642. pair.slop = Math.max(parentA.slop, parentB.slop);
  104643. for (var i = 0; i < supports.length; i++) {
  104644. activeContacts[i] = supports[i].contact;
  104645. }
  104646. var supportCount = supports.length;
  104647. if (supportCount < activeContacts.length) {
  104648. activeContacts.length = supportCount;
  104649. }
  104650. pair.separation = collision.depth;
  104651. Pair.setActive(pair, true, timestamp);
  104652. } else {
  104653. if (pair.isActive === true)
  104654. Pair.setActive(pair, false, timestamp);
  104655. }
  104656. };
  104657. /**
  104658. * Set a pair as active or inactive.
  104659. * @method setActive
  104660. * @param {pair} pair
  104661. * @param {bool} isActive
  104662. * @param {number} timestamp
  104663. */
  104664. Pair.setActive = function(pair, isActive, timestamp) {
  104665. if (isActive) {
  104666. pair.isActive = true;
  104667. pair.timeUpdated = timestamp;
  104668. } else {
  104669. pair.isActive = false;
  104670. pair.activeContacts.length = 0;
  104671. }
  104672. };
  104673. /**
  104674. * Get the id for the given pair.
  104675. * @method id
  104676. * @param {body} bodyA
  104677. * @param {body} bodyB
  104678. * @return {string} Unique pairId
  104679. */
  104680. Pair.id = function(bodyA, bodyB) {
  104681. if (bodyA.id < bodyB.id) {
  104682. return 'A' + bodyA.id + 'B' + bodyB.id;
  104683. } else {
  104684. return 'A' + bodyB.id + 'B' + bodyA.id;
  104685. }
  104686. };
  104687. })();
  104688. /***/ }),
  104689. /* 616 */
  104690. /***/ (function(module, exports, __webpack_require__) {
  104691. /**
  104692. * @author Richard Davey <rich@photonstorm.com>
  104693. * @copyright 2018 Photon Storm Ltd.
  104694. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104695. */
  104696. /**
  104697. * @namespace Phaser.Physics.Matter.Components
  104698. */
  104699. module.exports = {
  104700. Bounce: __webpack_require__(1051),
  104701. Collision: __webpack_require__(1050),
  104702. Force: __webpack_require__(1049),
  104703. Friction: __webpack_require__(1048),
  104704. Gravity: __webpack_require__(1047),
  104705. Mass: __webpack_require__(1046),
  104706. Static: __webpack_require__(1045),
  104707. Sensor: __webpack_require__(1044),
  104708. SetBody: __webpack_require__(1043),
  104709. Sleep: __webpack_require__(1041),
  104710. Transform: __webpack_require__(1040),
  104711. Velocity: __webpack_require__(1039)
  104712. };
  104713. /***/ }),
  104714. /* 617 */
  104715. /***/ (function(module, exports) {
  104716. /**
  104717. * @author Richard Davey <rich@photonstorm.com>
  104718. * @copyright 2018 Photon Storm Ltd.
  104719. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104720. */
  104721. /**
  104722. * Takes the given string and reverses it, returning the reversed string.
  104723. * For example if given the string `Atari 520ST` it would return `TS025 iratA`.
  104724. *
  104725. * @function Phaser.Utils.String.ReverseString
  104726. * @since 3.0.0
  104727. *
  104728. * @param {string} string - The string to be reversed.
  104729. *
  104730. * @return {string} The reversed string.
  104731. */
  104732. var ReverseString = function (string)
  104733. {
  104734. return string.split('').reverse().join('');
  104735. };
  104736. module.exports = ReverseString;
  104737. /***/ }),
  104738. /* 618 */
  104739. /***/ (function(module, exports) {
  104740. /**
  104741. * @author Richard Davey <rich@photonstorm.com>
  104742. * @copyright 2018 Photon Storm Ltd.
  104743. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104744. */
  104745. /**
  104746. * Takes a string and replaces instances of markers with values in the given array.
  104747. * The markers take the form of `%1`, `%2`, etc. I.e.:
  104748. *
  104749. * `Format("The %1 is worth %2 gold", [ 'Sword', 500 ])`
  104750. *
  104751. * @function Phaser.Utils.String.Format
  104752. * @since 3.0.0
  104753. *
  104754. * @param {string} string - The string containing the replacement markers.
  104755. * @param {array} values - An array containing values that will replace the markers. If no value exists an empty string is inserted instead.
  104756. *
  104757. * @return {string} The string containing replaced values.
  104758. */
  104759. var Format = function (string, values)
  104760. {
  104761. return string.replace(/%([0-9]+)/g, function (s, n)
  104762. {
  104763. return values[Number(n) - 1];
  104764. });
  104765. };
  104766. module.exports = Format;
  104767. /***/ }),
  104768. /* 619 */
  104769. /***/ (function(module, exports, __webpack_require__) {
  104770. /**
  104771. * @author Richard Davey <rich@photonstorm.com>
  104772. * @copyright 2018 Photon Storm Ltd.
  104773. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104774. */
  104775. /**
  104776. * @namespace Phaser.Utils.String
  104777. */
  104778. module.exports = {
  104779. Format: __webpack_require__(618),
  104780. Pad: __webpack_require__(134),
  104781. Reverse: __webpack_require__(617),
  104782. UppercaseFirst: __webpack_require__(249)
  104783. };
  104784. /***/ }),
  104785. /* 620 */
  104786. /***/ (function(module, exports, __webpack_require__) {
  104787. /**
  104788. * @author Richard Davey <rich@photonstorm.com>
  104789. * @copyright 2018 Photon Storm Ltd.
  104790. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104791. */
  104792. var Clone = __webpack_require__(34);
  104793. /**
  104794. * Creates a new Object using all values from obj1.
  104795. *
  104796. * 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.
  104797. *
  104798. * @function Phaser.Utils.Object.MergeRight
  104799. * @since 3.0.0
  104800. *
  104801. * @param {object} obj1 - [description]
  104802. * @param {object} obj2 - [description]
  104803. *
  104804. * @return {object} [description]
  104805. */
  104806. var MergeRight = function (obj1, obj2)
  104807. {
  104808. var clone = Clone(obj1);
  104809. for (var key in obj2)
  104810. {
  104811. if (clone.hasOwnProperty(key))
  104812. {
  104813. clone[key] = obj2[key];
  104814. }
  104815. }
  104816. return clone;
  104817. };
  104818. module.exports = MergeRight;
  104819. /***/ }),
  104820. /* 621 */
  104821. /***/ (function(module, exports) {
  104822. /**
  104823. * @author Richard Davey <rich@photonstorm.com>
  104824. * @copyright 2018 Photon Storm Ltd.
  104825. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104826. */
  104827. /**
  104828. * Verifies that an object contains all requested keys
  104829. *
  104830. * @function Phaser.Utils.Object.HasAll
  104831. * @since 3.0.0
  104832. *
  104833. * @param {object} source - an object on which to check for key existence
  104834. * @param {string[]} keys - an array of keys to ensure the source object contains
  104835. *
  104836. * @return {boolean} true if the source object contains all keys, false otherwise.
  104837. */
  104838. var HasAll = function (source, keys)
  104839. {
  104840. for (var i = 0; i < keys.length; i++)
  104841. {
  104842. if (!source.hasOwnProperty(keys[i]))
  104843. {
  104844. return false;
  104845. }
  104846. }
  104847. return true;
  104848. };
  104849. module.exports = HasAll;
  104850. /***/ }),
  104851. /* 622 */
  104852. /***/ (function(module, exports, __webpack_require__) {
  104853. /**
  104854. * @author Richard Davey <rich@photonstorm.com>
  104855. * @copyright 2018 Photon Storm Ltd.
  104856. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104857. */
  104858. var GetValue = __webpack_require__(4);
  104859. var Clamp = __webpack_require__(19);
  104860. /**
  104861. * [description]
  104862. *
  104863. * @function Phaser.Utils.Object.GetMinMaxValue
  104864. * @since 3.0.0
  104865. *
  104866. * @param {object} source - [description]
  104867. * @param {string} key - [description]
  104868. * @param {number} min - [description]
  104869. * @param {number} max - [description]
  104870. * @param {number} defaultValue - [description]
  104871. *
  104872. * @return {number} [description]
  104873. */
  104874. var GetMinMaxValue = function (source, key, min, max, defaultValue)
  104875. {
  104876. if (defaultValue === undefined) { defaultValue = min; }
  104877. var value = GetValue(source, key, defaultValue);
  104878. return Clamp(value, min, max);
  104879. };
  104880. module.exports = GetMinMaxValue;
  104881. /***/ }),
  104882. /* 623 */
  104883. /***/ (function(module, exports, __webpack_require__) {
  104884. /**
  104885. * @author Richard Davey <rich@photonstorm.com>
  104886. * @copyright 2018 Photon Storm Ltd.
  104887. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104888. */
  104889. /**
  104890. * @namespace Phaser.Utils.Object
  104891. */
  104892. module.exports = {
  104893. Clone: __webpack_require__(34),
  104894. Extend: __webpack_require__(16),
  104895. GetAdvancedValue: __webpack_require__(10),
  104896. GetFastValue: __webpack_require__(1),
  104897. GetMinMaxValue: __webpack_require__(622),
  104898. GetValue: __webpack_require__(4),
  104899. HasAll: __webpack_require__(621),
  104900. HasAny: __webpack_require__(424),
  104901. HasValue: __webpack_require__(111),
  104902. IsPlainObject: __webpack_require__(8),
  104903. Merge: __webpack_require__(94),
  104904. MergeRight: __webpack_require__(620)
  104905. };
  104906. /***/ }),
  104907. /* 624 */
  104908. /***/ (function(module, exports, __webpack_require__) {
  104909. /**
  104910. * @author Richard Davey <rich@photonstorm.com>
  104911. * @copyright 2018 Photon Storm Ltd.
  104912. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104913. */
  104914. /**
  104915. * @namespace Phaser.Utils
  104916. */
  104917. module.exports = {
  104918. Array: __webpack_require__(150),
  104919. Objects: __webpack_require__(623),
  104920. String: __webpack_require__(619)
  104921. };
  104922. /***/ }),
  104923. /* 625 */
  104924. /***/ (function(module, exports, __webpack_require__) {
  104925. /**
  104926. * @author Richard Davey <rich@photonstorm.com>
  104927. * @copyright 2018 Photon Storm Ltd.
  104928. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104929. */
  104930. var GameObjectFactory = __webpack_require__(11);
  104931. var ParseToTilemap = __webpack_require__(221);
  104932. /**
  104933. * Creates a Tilemap from the given key or data, or creates a blank Tilemap if no key/data provided.
  104934. * When loading from CSV or a 2D array, you should specify the tileWidth & tileHeight. When parsing
  104935. * from a map from Tiled, the tileWidth, tileHeight, width & height will be pulled from the map
  104936. * data. For an empty map, you should specify tileWidth, tileHeight, width & height.
  104937. *
  104938. * @method Phaser.GameObjects.GameObjectFactory#tilemap
  104939. * @since 3.0.0
  104940. *
  104941. * @param {string} [key] - The key in the Phaser cache that corresponds to the loaded tilemap data.
  104942. * @param {integer} [tileWidth=32] - The width of a tile in pixels. Pass in `null` to leave as the
  104943. * default.
  104944. * @param {integer} [tileHeight=32] - The height of a tile in pixels. Pass in `null` to leave as the
  104945. * default.
  104946. * @param {integer} [width=10] - The width of the map in tiles. Pass in `null` to leave as the
  104947. * default.
  104948. * @param {integer} [height=10] - The height of the map in tiles. Pass in `null` to leave as the
  104949. * default.
  104950. * @param {integer[][]} [data] - Instead of loading from the cache, you can also load directly from
  104951. * a 2D array of tile indexes. Pass in `null` for no data.
  104952. * @param {boolean} [insertNull=false] - Controls how empty tiles, tiles with an index of -1, in the
  104953. * map data are handled. If `true`, empty locations will get a value of `null`. If `false`, empty
  104954. * location will get a Tile object with an index of -1. If you've a large sparsely populated map and
  104955. * the tile data doesn't need to change then setting this value to `true` will help with memory
  104956. * consumption. However if your map is small or you need to update the tiles dynamically, then leave
  104957. * the default value set.
  104958. *
  104959. * @return {Phaser.Tilemaps.Tilemap}
  104960. */
  104961. GameObjectFactory.register('tilemap', function (key, tileWidth, tileHeight, width, height, data, insertNull)
  104962. {
  104963. // Allow users to specify null to indicate that they want the default value, since null is
  104964. // shorter & more legible than undefined. Convert null to undefined to allow ParseToTilemap
  104965. // defaults to take effect.
  104966. if (key === null) { key = undefined; }
  104967. if (tileWidth === null) { tileWidth = undefined; }
  104968. if (tileHeight === null) { tileHeight = undefined; }
  104969. if (width === null) { width = undefined; }
  104970. if (height === null) { height = undefined; }
  104971. return ParseToTilemap(this.scene, key, tileWidth, tileHeight, width, height, data, insertNull);
  104972. });
  104973. // When registering a factory function 'this' refers to the GameObjectFactory context.
  104974. //
  104975. // There are several properties available to use:
  104976. //
  104977. // this.scene - a reference to the Scene that owns the GameObjectFactory
  104978. // this.displayList - a reference to the Display List the Scene owns
  104979. // this.updateList - a reference to the Update List the Scene owns
  104980. /***/ }),
  104981. /* 626 */
  104982. /***/ (function(module, exports, __webpack_require__) {
  104983. /**
  104984. * @author Richard Davey <rich@photonstorm.com>
  104985. * @copyright 2018 Photon Storm Ltd.
  104986. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  104987. */
  104988. var GameObjectCreator = __webpack_require__(14);
  104989. var ParseToTilemap = __webpack_require__(221);
  104990. /**
  104991. * @typedef {object} TilemapConfig
  104992. *
  104993. * @property {string} [key] - The key in the Phaser cache that corresponds to the loaded tilemap data.
  104994. * @property {integer[][]} [data] - Instead of loading from the cache, you can also load directly from a 2D array of tile indexes.
  104995. * @property {integer} [tileWidth=32] - The width of a tile in pixels.
  104996. * @property {integer} [tileHeight=32] - The height of a tile in pixels.
  104997. * @property {integer} [width=10] - The width of the map in tiles.
  104998. * @property {integer} [height=10] - The height of the map in tiles.
  104999. * @property {boolean} [insertNull=false] - Controls how empty tiles, tiles with an index of -1,
  105000. * in the map data are handled. If `true`, empty locations will get a value of `null`. If `false`,
  105001. * empty location will get a Tile object with an index of -1. If you've a large sparsely populated
  105002. * map and the tile data doesn't need to change then setting this value to `true` will help with
  105003. * memory consumption. However if your map is small or you need to update the tiles dynamically,
  105004. * then leave the default value set.
  105005. */
  105006. /**
  105007. * Creates a Tilemap from the given key or data, or creates a blank Tilemap if no key/data provided.
  105008. * When loading from CSV or a 2D array, you should specify the tileWidth & tileHeight. When parsing
  105009. * from a map from Tiled, the tileWidth, tileHeight, width & height will be pulled from the map
  105010. * data. For an empty map, you should specify tileWidth, tileHeight, width & height.
  105011. *
  105012. * @method Phaser.GameObjects.GameObjectCreator#tilemap
  105013. * @since 3.0.0
  105014. *
  105015. * @param {TilemapConfig} [config] - The config options for the Tilemap.
  105016. *
  105017. * @return {Phaser.Tilemaps.Tilemap}
  105018. */
  105019. GameObjectCreator.register('tilemap', function (config)
  105020. {
  105021. // Defaults are applied in ParseToTilemap
  105022. var c = (config !== undefined) ? config : {};
  105023. return ParseToTilemap(
  105024. this.scene,
  105025. c.key,
  105026. c.tileWidth,
  105027. c.tileHeight,
  105028. c.width,
  105029. c.height,
  105030. c.data,
  105031. c.insertNull
  105032. );
  105033. });
  105034. /***/ }),
  105035. /* 627 */
  105036. /***/ (function(module, exports, __webpack_require__) {
  105037. /**
  105038. * @author Richard Davey <rich@photonstorm.com>
  105039. * @copyright 2018 Photon Storm Ltd.
  105040. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105041. */
  105042. var GameObject = __webpack_require__(2);
  105043. /**
  105044. * Renders this Game Object with the Canvas Renderer to the given Camera.
  105045. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  105046. * This method should not be called directly. It is a utility function of the Render module.
  105047. *
  105048. * @method Phaser.Tilemaps.StaticTilemapLayer#renderCanvas
  105049. * @since 3.0.0
  105050. * @private
  105051. *
  105052. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  105053. * @param {Phaser.Tilemaps.StaticTilemapLayer} src - The Game Object being rendered in this call.
  105054. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  105055. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  105056. */
  105057. var StaticTilemapLayerCanvasRenderer = function (renderer, src, interpolationPercentage, camera)
  105058. {
  105059. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  105060. {
  105061. return;
  105062. }
  105063. src.cull(camera);
  105064. var renderTiles = src.culledTiles;
  105065. var tileset = this.tileset;
  105066. var ctx = renderer.gameContext;
  105067. var tileCount = renderTiles.length;
  105068. var image = tileset.image.getSourceImage();
  105069. var tx = src.x - camera.scrollX * src.scrollFactorX;
  105070. var ty = src.y - camera.scrollY * src.scrollFactorY;
  105071. ctx.save();
  105072. ctx.translate(tx, ty);
  105073. ctx.rotate(src.rotation);
  105074. ctx.scale(src.scaleX, src.scaleY);
  105075. ctx.scale(src.flipX ? -1 : 1, src.flipY ? -1 : 1);
  105076. ctx.globalAlpha = camera.alpha * src.alpha;
  105077. for (var index = 0; index < tileCount; ++index)
  105078. {
  105079. var tile = renderTiles[index];
  105080. var tileTexCoords = tileset.getTileTextureCoordinates(tile.index);
  105081. if (tileTexCoords === null) { continue; }
  105082. ctx.drawImage(
  105083. image,
  105084. tileTexCoords.x, tileTexCoords.y,
  105085. tile.width, tile.height,
  105086. tile.pixelX, tile.pixelY,
  105087. tile.width, tile.height
  105088. );
  105089. }
  105090. ctx.restore();
  105091. };
  105092. module.exports = StaticTilemapLayerCanvasRenderer;
  105093. /***/ }),
  105094. /* 628 */
  105095. /***/ (function(module, exports, __webpack_require__) {
  105096. /**
  105097. * @author Richard Davey <rich@photonstorm.com>
  105098. * @copyright 2018 Photon Storm Ltd.
  105099. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105100. */
  105101. var GameObject = __webpack_require__(2);
  105102. /**
  105103. * Renders this Game Object with the WebGL Renderer to the given Camera.
  105104. *
  105105. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  105106. * This method should not be called directly. It is a utility function of the Render module.
  105107. *
  105108. * A Static Tilemap Layer renders immediately and does not use any batching.
  105109. *
  105110. * @method Phaser.Tilemaps.StaticTilemapLayer#renderWebGL
  105111. * @since 3.0.0
  105112. * @private
  105113. *
  105114. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  105115. * @param {Phaser.Tilemaps.StaticTilemapLayer} src - The Game Object being rendered in this call.
  105116. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  105117. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  105118. */
  105119. var StaticTilemapLayerWebGLRenderer = function (renderer, src, interpolationPercentage, camera)
  105120. {
  105121. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  105122. {
  105123. return;
  105124. }
  105125. src.upload(camera);
  105126. if (src.vertexCount > 0)
  105127. {
  105128. var gl = renderer.gl;
  105129. var pipeline = this.pipeline;
  105130. var pipelineVertexBuffer = pipeline.vertexBuffer;
  105131. var frame = src.tileset.image.get();
  105132. if (renderer.currentPipeline && renderer.currentPipeline.vertexCount > 0)
  105133. {
  105134. renderer.flush();
  105135. }
  105136. pipeline.vertexBuffer = src.vertexBuffer;
  105137. renderer.setPipeline(pipeline);
  105138. renderer.setTexture2D(frame.glTexture, 0);
  105139. gl.drawArrays(pipeline.topology, 0, src.vertexCount);
  105140. pipeline.vertexBuffer = pipelineVertexBuffer;
  105141. pipeline.viewIdentity();
  105142. pipeline.modelIdentity();
  105143. }
  105144. };
  105145. module.exports = StaticTilemapLayerWebGLRenderer;
  105146. /***/ }),
  105147. /* 629 */
  105148. /***/ (function(module, exports, __webpack_require__) {
  105149. /**
  105150. * @author Richard Davey <rich@photonstorm.com>
  105151. * @copyright 2018 Photon Storm Ltd.
  105152. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105153. */
  105154. var renderWebGL = __webpack_require__(3);
  105155. var renderCanvas = __webpack_require__(3);
  105156. if (true)
  105157. {
  105158. renderWebGL = __webpack_require__(628);
  105159. }
  105160. if (true)
  105161. {
  105162. renderCanvas = __webpack_require__(627);
  105163. }
  105164. module.exports = {
  105165. renderWebGL: renderWebGL,
  105166. renderCanvas: renderCanvas
  105167. };
  105168. /***/ }),
  105169. /* 630 */
  105170. /***/ (function(module, exports, __webpack_require__) {
  105171. /**
  105172. * @author Richard Davey <rich@photonstorm.com>
  105173. * @copyright 2018 Photon Storm Ltd.
  105174. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105175. */
  105176. var GameObject = __webpack_require__(2);
  105177. /**
  105178. * Renders this Game Object with the Canvas Renderer to the given Camera.
  105179. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  105180. * This method should not be called directly. It is a utility function of the Render module.
  105181. *
  105182. * @method Phaser.Tilemaps.DynamicTilemapLayer#renderCanvas
  105183. * @since 3.0.0
  105184. * @private
  105185. *
  105186. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  105187. * @param {Phaser.Tilemaps.DynamicTilemapLayer} src - The Game Object being rendered in this call.
  105188. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  105189. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  105190. */
  105191. var DynamicTilemapLayerCanvasRenderer = function (renderer, src, interpolationPercentage, camera)
  105192. {
  105193. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  105194. {
  105195. return;
  105196. }
  105197. src.cull(camera);
  105198. var renderTiles = src.culledTiles;
  105199. var length = renderTiles.length;
  105200. var image = src.tileset.image.getSourceImage();
  105201. var tileset = this.tileset;
  105202. var tx = src.x - camera.scrollX * src.scrollFactorX;
  105203. var ty = src.y - camera.scrollY * src.scrollFactorY;
  105204. var ctx = renderer.gameContext;
  105205. ctx.save();
  105206. ctx.translate(tx, ty);
  105207. ctx.rotate(src.rotation);
  105208. ctx.scale(src.scaleX, src.scaleY);
  105209. ctx.scale(src.flipX ? -1 : 1, src.flipY ? -1 : 1);
  105210. for (var index = 0; index < length; ++index)
  105211. {
  105212. var tile = renderTiles[index];
  105213. var tileTexCoords = tileset.getTileTextureCoordinates(tile.index);
  105214. if (tileTexCoords === null) { continue; }
  105215. var halfWidth = tile.width / 2;
  105216. var halfHeight = tile.height / 2;
  105217. ctx.save();
  105218. ctx.translate(tile.pixelX + halfWidth, tile.pixelY + halfHeight);
  105219. if (tile.rotation !== 0)
  105220. {
  105221. ctx.rotate(tile.rotation);
  105222. }
  105223. if (tile.flipX || tile.flipY)
  105224. {
  105225. ctx.scale(tile.flipX ? -1 : 1, tile.flipY ? -1 : 1);
  105226. }
  105227. ctx.globalAlpha = camera.alpha * src.alpha * tile.alpha;
  105228. ctx.drawImage(
  105229. image,
  105230. tileTexCoords.x, tileTexCoords.y,
  105231. tile.width, tile.height,
  105232. -halfWidth, -halfHeight,
  105233. tile.width, tile.height
  105234. );
  105235. ctx.restore();
  105236. }
  105237. ctx.restore();
  105238. };
  105239. module.exports = DynamicTilemapLayerCanvasRenderer;
  105240. /***/ }),
  105241. /* 631 */
  105242. /***/ (function(module, exports, __webpack_require__) {
  105243. /**
  105244. * @author Richard Davey <rich@photonstorm.com>
  105245. * @copyright 2018 Photon Storm Ltd.
  105246. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105247. */
  105248. var GameObject = __webpack_require__(2);
  105249. var Utils = __webpack_require__(21);
  105250. /**
  105251. * Renders this Game Object with the WebGL Renderer to the given Camera.
  105252. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  105253. * This method should not be called directly. It is a utility function of the Render module.
  105254. *
  105255. * @method Phaser.Tilemaps.DynamicTilemapLayer#renderWebGL
  105256. * @since 3.0.0
  105257. * @private
  105258. *
  105259. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  105260. * @param {Phaser.Tilemaps.DynamicTilemapLayer} src - The Game Object being rendered in this call.
  105261. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  105262. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  105263. */
  105264. var DynamicTilemapLayerWebGLRenderer = function (renderer, src, interpolationPercentage, camera)
  105265. {
  105266. var alpha = camera.alpha * src.alpha;
  105267. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)) || alpha <= 0)
  105268. {
  105269. // There's nothing to render, so abort!
  105270. return;
  105271. }
  105272. src.cull(camera);
  105273. var pipeline = this.pipeline;
  105274. var getTint = Utils.getTintAppendFloatAlpha;
  105275. var renderTiles = src.culledTiles;
  105276. var length = renderTiles.length;
  105277. var tileset = src.tileset;
  105278. var texture = tileset.glTexture;
  105279. var scrollFactorX = src.scrollFactorX;
  105280. var scrollFactorY = src.scrollFactorY;
  105281. var x = src.x;
  105282. var y = src.y;
  105283. var sx = src.scaleX;
  105284. var sy = src.scaleY;
  105285. for (var index = 0; index < length; index++)
  105286. {
  105287. var tile = renderTiles[index];
  105288. var tileTexCoords = tileset.getTileTextureCoordinates(tile.index);
  105289. if (tileTexCoords === null)
  105290. {
  105291. continue;
  105292. }
  105293. var frameWidth = tile.width;
  105294. var frameHeight = tile.height;
  105295. var frameX = tileTexCoords.x;
  105296. var frameY = tileTexCoords.y;
  105297. var tw = tile.width * 0.5;
  105298. var th = tile.height * 0.5;
  105299. var tint = getTint(tile.tint, alpha * tile.alpha);
  105300. pipeline.batchTexture(
  105301. src,
  105302. texture,
  105303. texture.width, texture.height,
  105304. tw + x + tile.pixelX * sx, th + y + tile.pixelY * sy,
  105305. tile.width * sx, tile.height * sy,
  105306. 1, 1,
  105307. tile.rotation,
  105308. tile.flipX, tile.flipY,
  105309. scrollFactorX, scrollFactorY,
  105310. tw, th,
  105311. frameX, frameY, frameWidth, frameHeight,
  105312. tint, tint, tint, tint, false,
  105313. 0, 0,
  105314. camera,
  105315. null
  105316. );
  105317. }
  105318. };
  105319. module.exports = DynamicTilemapLayerWebGLRenderer;
  105320. /***/ }),
  105321. /* 632 */
  105322. /***/ (function(module, exports, __webpack_require__) {
  105323. /**
  105324. * @author Richard Davey <rich@photonstorm.com>
  105325. * @copyright 2018 Photon Storm Ltd.
  105326. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105327. */
  105328. var renderWebGL = __webpack_require__(3);
  105329. var renderCanvas = __webpack_require__(3);
  105330. if (true)
  105331. {
  105332. renderWebGL = __webpack_require__(631);
  105333. }
  105334. if (true)
  105335. {
  105336. renderCanvas = __webpack_require__(630);
  105337. }
  105338. module.exports = {
  105339. renderWebGL: renderWebGL,
  105340. renderCanvas: renderCanvas
  105341. };
  105342. /***/ }),
  105343. /* 633 */
  105344. /***/ (function(module, exports, __webpack_require__) {
  105345. /**
  105346. * @author Richard Davey <rich@photonstorm.com>
  105347. * @copyright 2018 Photon Storm Ltd.
  105348. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105349. */
  105350. var Tileset = __webpack_require__(138);
  105351. /**
  105352. * [description]
  105353. *
  105354. * @function Phaser.Tilemaps.Parsers.Impact.ParseTilesets
  105355. * @since 3.0.0
  105356. *
  105357. * @param {object} json - [description]
  105358. *
  105359. * @return {array} [description]
  105360. */
  105361. var ParseTilesets = function (json)
  105362. {
  105363. var tilesets = [];
  105364. var tilesetsNames = [];
  105365. for (var i = 0; i < json.layer.length; i++)
  105366. {
  105367. var layer = json.layer[i];
  105368. // A relative filepath to the source image (within Weltmeister) is used for the name
  105369. var tilesetName = layer.tilesetName;
  105370. // Only add unique tilesets that have a valid name. Collision layers will have a blank name.
  105371. if (tilesetName !== '' && tilesetsNames.indexOf(tilesetName) === -1)
  105372. {
  105373. tilesetsNames.push(tilesetName);
  105374. // Tiles are stored with an ID relative to the tileset, rather than a globally unique ID
  105375. // across all tilesets. Also, tilesets in Weltmeister have no margin or padding.
  105376. tilesets.push(new Tileset(tilesetName, 0, layer.tilesize, layer.tilesize, 0, 0));
  105377. }
  105378. }
  105379. return tilesets;
  105380. };
  105381. module.exports = ParseTilesets;
  105382. /***/ }),
  105383. /* 634 */
  105384. /***/ (function(module, exports, __webpack_require__) {
  105385. /**
  105386. * @author Richard Davey <rich@photonstorm.com>
  105387. * @copyright 2018 Photon Storm Ltd.
  105388. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105389. */
  105390. var LayerData = __webpack_require__(104);
  105391. var Tile = __webpack_require__(65);
  105392. /**
  105393. * [description]
  105394. *
  105395. * @function Phaser.Tilemaps.Parsers.Impact.ParseTileLayers
  105396. * @since 3.0.0
  105397. *
  105398. * @param {object} json - [description]
  105399. * @param {boolean} insertNull - [description]
  105400. *
  105401. * @return {array} [description]
  105402. */
  105403. var ParseTileLayers = function (json, insertNull)
  105404. {
  105405. var tileLayers = [];
  105406. for (var i = 0; i < json.layer.length; i++)
  105407. {
  105408. var layer = json.layer[i];
  105409. var layerData = new LayerData({
  105410. name: layer.name,
  105411. width: layer.width,
  105412. height: layer.height,
  105413. tileWidth: layer.tilesize,
  105414. tileHeight: layer.tilesize,
  105415. visible: layer.visible === 1
  105416. });
  105417. var row = [];
  105418. var tileGrid = [];
  105419. // Loop through the data field in the JSON. This is a 2D array containing the tile indexes,
  105420. // one after the other. The indexes are relative to the tileset that contains the tile.
  105421. for (var y = 0; y < layer.data.length; y++)
  105422. {
  105423. for (var x = 0; x < layer.data[y].length; x++)
  105424. {
  105425. // In Weltmeister, 0 = no tile, but the Tilemap API expects -1 = no tile.
  105426. var index = layer.data[y][x] - 1;
  105427. var tile;
  105428. if (index > -1)
  105429. {
  105430. tile = new Tile(layerData, index, x, y, layer.tilesize, layer.tilesize);
  105431. }
  105432. else
  105433. {
  105434. tile = insertNull
  105435. ? null
  105436. : new Tile(layerData, -1, x, y, layer.tilesize, layer.tilesize);
  105437. }
  105438. row.push(tile);
  105439. }
  105440. tileGrid.push(row);
  105441. row = [];
  105442. }
  105443. layerData.data = tileGrid;
  105444. tileLayers.push(layerData);
  105445. }
  105446. return tileLayers;
  105447. };
  105448. module.exports = ParseTileLayers;
  105449. /***/ }),
  105450. /* 635 */
  105451. /***/ (function(module, exports, __webpack_require__) {
  105452. /**
  105453. * @author Richard Davey <rich@photonstorm.com>
  105454. * @copyright 2018 Photon Storm Ltd.
  105455. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105456. */
  105457. var Extend = __webpack_require__(16);
  105458. /**
  105459. * Copy properties from tileset to tiles.
  105460. *
  105461. * @function Phaser.Tilemaps.Parsers.Tiled.AssignTileProperties
  105462. * @since 3.0.0
  105463. *
  105464. * @param {Phaser.Tilemaps.MapData} mapData - [description]
  105465. */
  105466. var AssignTileProperties = function (mapData)
  105467. {
  105468. var layerData;
  105469. var tile;
  105470. var sid;
  105471. var set;
  105472. var row;
  105473. // go through each of the map data layers
  105474. for (var i = 0; i < mapData.layers.length; i++)
  105475. {
  105476. layerData = mapData.layers[i];
  105477. set = null;
  105478. // rows of tiles
  105479. for (var j = 0; j < layerData.data.length; j++)
  105480. {
  105481. row = layerData.data[j];
  105482. // individual tiles
  105483. for (var k = 0; k < row.length; k++)
  105484. {
  105485. tile = row[k];
  105486. if (tile === null || tile.index < 0)
  105487. {
  105488. continue;
  105489. }
  105490. // find the relevant tileset
  105491. sid = mapData.tiles[tile.index][2];
  105492. set = mapData.tilesets[sid];
  105493. // Ensure that a tile's size matches its tileset
  105494. tile.width = set.tileWidth;
  105495. tile.height = set.tileHeight;
  105496. // if that tile type has any properties, add them to the tile object
  105497. if (set.tileProperties && set.tileProperties[tile.index - set.firstgid])
  105498. {
  105499. tile.properties = Extend(
  105500. tile.properties, set.tileProperties[tile.index - set.firstgid]
  105501. );
  105502. }
  105503. }
  105504. }
  105505. }
  105506. };
  105507. module.exports = AssignTileProperties;
  105508. /***/ }),
  105509. /* 636 */
  105510. /***/ (function(module, exports) {
  105511. /**
  105512. * @author Richard Davey <rich@photonstorm.com>
  105513. * @copyright 2018 Photon Storm Ltd.
  105514. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105515. */
  105516. /**
  105517. * Master list of tiles -> x, y, index in tileset.
  105518. *
  105519. * @function Phaser.Tilemaps.Parsers.Tiled.BuildTilesetIndex
  105520. * @since 3.0.0
  105521. *
  105522. * @param {Phaser.Tilemaps.MapData} mapData - [description]
  105523. *
  105524. * @return {array} [description]
  105525. */
  105526. var BuildTilesetIndex = function (mapData)
  105527. {
  105528. var tiles = [];
  105529. for (var i = 0; i < mapData.tilesets.length; i++)
  105530. {
  105531. var set = mapData.tilesets[i];
  105532. var x = set.tileMargin;
  105533. var y = set.tileMargin;
  105534. var count = 0;
  105535. var countX = 0;
  105536. var countY = 0;
  105537. for (var t = set.firstgid; t < set.firstgid + set.total; t++)
  105538. {
  105539. // Can add extra properties here as needed
  105540. tiles[t] = [ x, y, i ];
  105541. x += set.tileWidth + set.tileSpacing;
  105542. count++;
  105543. if (count === set.total)
  105544. {
  105545. break;
  105546. }
  105547. countX++;
  105548. if (countX === set.columns)
  105549. {
  105550. x = set.tileMargin;
  105551. y += set.tileHeight + set.tileSpacing;
  105552. countX = 0;
  105553. countY++;
  105554. if (countY === set.rows)
  105555. {
  105556. break;
  105557. }
  105558. }
  105559. }
  105560. }
  105561. return tiles;
  105562. };
  105563. module.exports = BuildTilesetIndex;
  105564. /***/ }),
  105565. /* 637 */
  105566. /***/ (function(module, exports, __webpack_require__) {
  105567. /**
  105568. * @author Richard Davey <rich@photonstorm.com>
  105569. * @copyright 2018 Photon Storm Ltd.
  105570. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105571. */
  105572. var GetFastValue = __webpack_require__(1);
  105573. var ParseObject = __webpack_require__(319);
  105574. var ObjectLayer = __webpack_require__(318);
  105575. /**
  105576. * [description]
  105577. *
  105578. * @function Phaser.Tilemaps.Parsers.Tiled.ParseObjectLayers
  105579. * @since 3.0.0
  105580. *
  105581. * @param {object} json - [description]
  105582. *
  105583. * @return {array} [description]
  105584. */
  105585. var ParseObjectLayers = function (json)
  105586. {
  105587. var objectLayers = [];
  105588. for (var i = 0; i < json.layers.length; i++)
  105589. {
  105590. if (json.layers[i].type !== 'objectgroup')
  105591. {
  105592. continue;
  105593. }
  105594. var curo = json.layers[i];
  105595. var offsetX = GetFastValue(curo, 'offsetx', 0);
  105596. var offsetY = GetFastValue(curo, 'offsety', 0);
  105597. var objects = [];
  105598. for (var j = 0; j < curo.objects.length; j++)
  105599. {
  105600. var parsedObject = ParseObject(curo.objects[j], offsetX, offsetY);
  105601. objects.push(parsedObject);
  105602. }
  105603. var objectLayer = new ObjectLayer(curo);
  105604. objectLayer.objects = objects;
  105605. objectLayers.push(objectLayer);
  105606. }
  105607. return objectLayers;
  105608. };
  105609. module.exports = ParseObjectLayers;
  105610. /***/ }),
  105611. /* 638 */
  105612. /***/ (function(module, exports, __webpack_require__) {
  105613. /**
  105614. * @author Richard Davey <rich@photonstorm.com>
  105615. * @copyright 2018 Photon Storm Ltd.
  105616. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105617. */
  105618. var HasValue = __webpack_require__(111);
  105619. /**
  105620. * [description]
  105621. *
  105622. * @function Phaser.Tilemaps.Parsers.Tiled.Pick
  105623. * @since 3.0.0
  105624. *
  105625. * @param {object} object - [description]
  105626. * @param {array} keys - [description]
  105627. *
  105628. * @return {object} [description]
  105629. */
  105630. var Pick = function (object, keys)
  105631. {
  105632. var obj = {};
  105633. for (var i = 0; i < keys.length; i++)
  105634. {
  105635. var key = keys[i];
  105636. if (HasValue(object, key))
  105637. {
  105638. obj[key] = object[key];
  105639. }
  105640. }
  105641. return obj;
  105642. };
  105643. module.exports = Pick;
  105644. /***/ }),
  105645. /* 639 */
  105646. /***/ (function(module, exports, __webpack_require__) {
  105647. /**
  105648. * @author Richard Davey <rich@photonstorm.com>
  105649. * @copyright 2018 Photon Storm Ltd.
  105650. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105651. */
  105652. var Tileset = __webpack_require__(138);
  105653. var ImageCollection = __webpack_require__(320);
  105654. var ParseObject = __webpack_require__(319);
  105655. /**
  105656. * Tilesets & Image Collections
  105657. *
  105658. * @function Phaser.Tilemaps.Parsers.Tiled.ParseTilesets
  105659. * @since 3.0.0
  105660. *
  105661. * @param {object} json - [description]
  105662. *
  105663. * @return {object} [description]
  105664. */
  105665. var ParseTilesets = function (json)
  105666. {
  105667. var tilesets = [];
  105668. var imageCollections = [];
  105669. var lastSet = null;
  105670. var stringID;
  105671. for (var i = 0; i < json.tilesets.length; i++)
  105672. {
  105673. // name, firstgid, width, height, margin, spacing, properties
  105674. var set = json.tilesets[i];
  105675. if (set.source)
  105676. {
  105677. console.warn('Phaser can\'t load external tilesets. Use the Embed Tileset button and then export the map again.');
  105678. }
  105679. else if (set.image)
  105680. {
  105681. var newSet = new Tileset(set.name, set.firstgid, set.tilewidth, set.tileheight, set.margin, set.spacing);
  105682. // Properties stored per-tile in object with string indexes starting at "0"
  105683. if (set.tileproperties)
  105684. {
  105685. newSet.tileProperties = set.tileproperties;
  105686. }
  105687. // Object & terrain shapes stored per-tile in object with string indexes starting at "0"
  105688. if (set.tiles)
  105689. {
  105690. newSet.tileData = set.tiles;
  105691. // Parse the objects into Phaser format to match handling of other Tiled objects
  105692. for (stringID in newSet.tileData)
  105693. {
  105694. var objectGroup = newSet.tileData[stringID].objectgroup;
  105695. if (objectGroup && objectGroup.objects)
  105696. {
  105697. var parsedObjects = objectGroup.objects.map(
  105698. function (obj) { return ParseObject(obj); }
  105699. );
  105700. newSet.tileData[stringID].objectgroup.objects = parsedObjects;
  105701. }
  105702. }
  105703. }
  105704. // For a normal sliced tileset the row/count/size information is computed when updated.
  105705. // This is done (again) after the image is set.
  105706. newSet.updateTileData(set.imagewidth, set.imageheight);
  105707. tilesets.push(newSet);
  105708. }
  105709. else
  105710. {
  105711. var newCollection = new ImageCollection(set.name, set.firstgid, set.tilewidth,
  105712. set.tileheight, set.margin, set.spacing, set.properties);
  105713. for (stringID in set.tiles)
  105714. {
  105715. var image = set.tiles[stringID].image;
  105716. var gid = set.firstgid + parseInt(stringID, 10);
  105717. newCollection.addImage(gid, image);
  105718. }
  105719. imageCollections.push(newCollection);
  105720. }
  105721. // We've got a new Tileset, so set the lastgid into the previous one
  105722. if (lastSet)
  105723. {
  105724. lastSet.lastgid = set.firstgid - 1;
  105725. }
  105726. lastSet = set;
  105727. }
  105728. return { tilesets: tilesets, imageCollections: imageCollections };
  105729. };
  105730. module.exports = ParseTilesets;
  105731. /***/ }),
  105732. /* 640 */
  105733. /***/ (function(module, exports, __webpack_require__) {
  105734. /**
  105735. * @author Richard Davey <rich@photonstorm.com>
  105736. * @copyright 2018 Photon Storm Ltd.
  105737. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105738. */
  105739. var GetFastValue = __webpack_require__(1);
  105740. /**
  105741. * [description]
  105742. *
  105743. * @function Phaser.Tilemaps.Parsers.Tiled.ParseImageLayers
  105744. * @since 3.0.0
  105745. *
  105746. * @param {object} json - [description]
  105747. *
  105748. * @return {array} [description]
  105749. */
  105750. var ParseImageLayers = function (json)
  105751. {
  105752. var images = [];
  105753. for (var i = 0; i < json.layers.length; i++)
  105754. {
  105755. if (json.layers[i].type !== 'imagelayer')
  105756. {
  105757. continue;
  105758. }
  105759. var curi = json.layers[i];
  105760. images.push({
  105761. name: curi.name,
  105762. image: curi.image,
  105763. x: GetFastValue(curi, 'offsetx', 0) + curi.x,
  105764. y: GetFastValue(curi, 'offsety', 0) + curi.y,
  105765. alpha: curi.opacity,
  105766. visible: curi.visible,
  105767. properties: GetFastValue(curi, 'properties', {})
  105768. });
  105769. }
  105770. return images;
  105771. };
  105772. module.exports = ParseImageLayers;
  105773. /***/ }),
  105774. /* 641 */
  105775. /***/ (function(module, exports) {
  105776. /**
  105777. * @author Richard Davey <rich@photonstorm.com>
  105778. * @copyright 2018 Photon Storm Ltd.
  105779. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105780. */
  105781. /**
  105782. * [description]
  105783. *
  105784. * @function Phaser.Tilemaps.Parsers.Tiled.Base64Decode
  105785. * @since 3.0.0
  105786. *
  105787. * @param {object} data - [description]
  105788. *
  105789. * @return {array} [description]
  105790. */
  105791. var Base64Decode = function (data)
  105792. {
  105793. var binaryString = window.atob(data);
  105794. var len = binaryString.length;
  105795. var bytes = new Array(len / 4);
  105796. // Interpret binaryString as an array of bytes representing little-endian encoded uint32 values.
  105797. for (var i = 0; i < len; i += 4)
  105798. {
  105799. bytes[i / 4] = (
  105800. binaryString.charCodeAt(i) |
  105801. binaryString.charCodeAt(i + 1) << 8 |
  105802. binaryString.charCodeAt(i + 2) << 16 |
  105803. binaryString.charCodeAt(i + 3) << 24
  105804. ) >>> 0;
  105805. }
  105806. return bytes;
  105807. };
  105808. module.exports = Base64Decode;
  105809. /***/ }),
  105810. /* 642 */
  105811. /***/ (function(module, exports, __webpack_require__) {
  105812. /**
  105813. * @author Richard Davey <rich@photonstorm.com>
  105814. * @copyright 2018 Photon Storm Ltd.
  105815. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105816. */
  105817. var Base64Decode = __webpack_require__(641);
  105818. var GetFastValue = __webpack_require__(1);
  105819. var LayerData = __webpack_require__(104);
  105820. var ParseGID = __webpack_require__(321);
  105821. var Tile = __webpack_require__(65);
  105822. /**
  105823. * [description]
  105824. *
  105825. * @function Phaser.Tilemaps.Parsers.Tiled.ParseTileLayers
  105826. * @since 3.0.0
  105827. *
  105828. * @param {object} json - [description]
  105829. * @param {boolean} insertNull - [description]
  105830. *
  105831. * @return {array} [description]
  105832. */
  105833. var ParseTileLayers = function (json, insertNull)
  105834. {
  105835. var tileLayers = [];
  105836. for (var i = 0; i < json.layers.length; i++)
  105837. {
  105838. if (json.layers[i].type !== 'tilelayer')
  105839. {
  105840. continue;
  105841. }
  105842. var curl = json.layers[i];
  105843. // Base64 decode data if necessary. NOTE: uncompressed base64 only.
  105844. if (curl.compression)
  105845. {
  105846. console.warn(
  105847. 'TilemapParser.parseTiledJSON - Layer compression is unsupported, skipping layer \''
  105848. + curl.name + '\''
  105849. );
  105850. continue;
  105851. }
  105852. else if (curl.encoding && curl.encoding === 'base64')
  105853. {
  105854. curl.data = Base64Decode(curl.data);
  105855. delete curl.encoding; // Allow the same map to be parsed multiple times
  105856. }
  105857. var layerData = new LayerData({
  105858. name: curl.name,
  105859. x: GetFastValue(curl, 'offsetx', 0) + curl.x,
  105860. y: GetFastValue(curl, 'offsety', 0) + curl.y,
  105861. width: curl.width,
  105862. height: curl.height,
  105863. tileWidth: json.tilewidth,
  105864. tileHeight: json.tileheight,
  105865. alpha: curl.opacity,
  105866. visible: curl.visible,
  105867. properties: GetFastValue(curl, 'properties', {})
  105868. });
  105869. var x = 0;
  105870. var row = [];
  105871. var output = [];
  105872. // Loop through the data field in the JSON.
  105873. // This is an array containing the tile indexes, one after the other. -1 = no tile,
  105874. // everything else = the tile index (starting at 1 for Tiled, 0 for CSV) If the map
  105875. // contains multiple tilesets then the indexes are relative to that which the set starts
  105876. // from. Need to set which tileset in the cache = which tileset in the JSON, if you do this
  105877. // manually it means you can use the same map data but a new tileset.
  105878. for (var t = 0, len = curl.data.length; t < len; t++)
  105879. {
  105880. var gidInfo = ParseGID(curl.data[t]);
  105881. // index, x, y, width, height
  105882. if (gidInfo.gid > 0)
  105883. {
  105884. var tile = new Tile(layerData, gidInfo.gid, x, output.length, json.tilewidth,
  105885. json.tileheight);
  105886. // Turning Tiled's FlippedHorizontal, FlippedVertical and FlippedAntiDiagonal
  105887. // propeties into flipX, flipY and rotation
  105888. tile.rotation = gidInfo.rotation;
  105889. tile.flipX = gidInfo.flipped;
  105890. row.push(tile);
  105891. }
  105892. else
  105893. {
  105894. var blankTile = insertNull
  105895. ? null
  105896. : new Tile(layerData, -1, x, output.length, json.tilewidth, json.tileheight);
  105897. row.push(blankTile);
  105898. }
  105899. x++;
  105900. if (x === curl.width)
  105901. {
  105902. output.push(row);
  105903. x = 0;
  105904. row = [];
  105905. }
  105906. }
  105907. layerData.data = output;
  105908. tileLayers.push(layerData);
  105909. }
  105910. return tileLayers;
  105911. };
  105912. module.exports = ParseTileLayers;
  105913. /***/ }),
  105914. /* 643 */
  105915. /***/ (function(module, exports, __webpack_require__) {
  105916. /**
  105917. * @author Richard Davey <rich@photonstorm.com>
  105918. * @copyright 2018 Photon Storm Ltd.
  105919. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105920. */
  105921. /**
  105922. * @namespace Phaser.Tilemaps.Parsers
  105923. */
  105924. module.exports = {
  105925. Parse: __webpack_require__(324),
  105926. Parse2DArray: __webpack_require__(222),
  105927. ParseCSV: __webpack_require__(323),
  105928. Impact: __webpack_require__(317),
  105929. Tiled: __webpack_require__(322)
  105930. };
  105931. /***/ }),
  105932. /* 644 */
  105933. /***/ (function(module, exports, __webpack_require__) {
  105934. /**
  105935. * @author Richard Davey <rich@photonstorm.com>
  105936. * @copyright 2018 Photon Storm Ltd.
  105937. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105938. */
  105939. var WorldToTileX = __webpack_require__(54);
  105940. var WorldToTileY = __webpack_require__(53);
  105941. var Vector2 = __webpack_require__(6);
  105942. /**
  105943. * Converts from world XY coordinates (pixels) to tile XY coordinates (tile units), factoring in the
  105944. * layer's position, scale and scroll. This will return a new Vector2 object or update the given
  105945. * `point` object.
  105946. *
  105947. * @function Phaser.Tilemaps.Components.WorldToTileXY
  105948. * @private
  105949. * @since 3.0.0
  105950. *
  105951. * @param {number} worldX - [description]
  105952. * @param {number} worldY - [description]
  105953. * @param {boolean} [snapToFloor=true] - Whether or not to round the tile coordinate down to the
  105954. * nearest integer.
  105955. * @param {Phaser.Math.Vector2} [point] - [description]
  105956. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  105957. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  105958. *
  105959. * @return {Phaser.Math.Vector2} The XY location in tile units.
  105960. */
  105961. var WorldToTileXY = function (worldX, worldY, snapToFloor, point, camera, layer)
  105962. {
  105963. if (point === undefined) { point = new Vector2(0, 0); }
  105964. point.x = WorldToTileX(worldX, snapToFloor, camera, layer);
  105965. point.y = WorldToTileY(worldY, snapToFloor, camera, layer);
  105966. return point;
  105967. };
  105968. module.exports = WorldToTileXY;
  105969. /***/ }),
  105970. /* 645 */
  105971. /***/ (function(module, exports, __webpack_require__) {
  105972. /**
  105973. * @author Richard Davey <rich@photonstorm.com>
  105974. * @copyright 2018 Photon Storm Ltd.
  105975. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  105976. */
  105977. var GetTilesWithin = __webpack_require__(23);
  105978. /**
  105979. * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
  105980. * specified layer. Each tile will receive a new index. New indexes are drawn from the given
  105981. * weightedIndexes array. An example weighted array:
  105982. *
  105983. * [
  105984. * { index: 6, weight: 4 }, // Probability of index 6 is 4 / 8
  105985. * { index: 7, weight: 2 }, // Probability of index 7 would be 2 / 8
  105986. * { index: 8, weight: 1.5 }, // Probability of index 8 would be 1.5 / 8
  105987. * { index: 26, weight: 0.5 } // Probability of index 27 would be 0.5 / 8
  105988. * ]
  105989. *
  105990. * The probability of any index being choose is (the index's weight) / (sum of all weights). This
  105991. * method only modifies tile indexes and does not change collision information.
  105992. *
  105993. * @function Phaser.Tilemaps.Components.WeightedRandomize
  105994. * @private
  105995. * @since 3.0.0
  105996. *
  105997. * @param {integer} [tileX=0] - [description]
  105998. * @param {integer} [tileY=0] - [description]
  105999. * @param {integer} [width=max width based on tileX] - [description]
  106000. * @param {integer} [height=max height based on tileY] - [description]
  106001. * @param {object[]} [weightedIndexes] - An array of objects to randomly draw from during
  106002. * randomization. They should be in the form: { index: 0, weight: 4 } or
  106003. * { index: [0, 1], weight: 4 } if you wish to draw from multiple tile indexes.
  106004. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106005. */
  106006. var WeightedRandomize = function (tileX, tileY, width, height, weightedIndexes, layer)
  106007. {
  106008. if (weightedIndexes === undefined) { return; }
  106009. var i;
  106010. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  106011. var weightTotal = 0;
  106012. for (i = 0; i < weightedIndexes.length; i++)
  106013. {
  106014. weightTotal += weightedIndexes[i].weight;
  106015. }
  106016. if (weightTotal <= 0) { return; }
  106017. for (i = 0; i < tiles.length; i++)
  106018. {
  106019. var rand = Math.random() * weightTotal;
  106020. var sum = 0;
  106021. var randomIndex = -1;
  106022. for (var j = 0; j < weightedIndexes.length; j++)
  106023. {
  106024. sum += weightedIndexes[j].weight;
  106025. if (rand <= sum)
  106026. {
  106027. var chosen = weightedIndexes[j].index;
  106028. randomIndex = Array.isArray(chosen)
  106029. ? chosen[Math.floor(Math.random() * chosen.length)]
  106030. : chosen;
  106031. break;
  106032. }
  106033. }
  106034. tiles[i].index = randomIndex;
  106035. }
  106036. };
  106037. module.exports = WeightedRandomize;
  106038. /***/ }),
  106039. /* 646 */
  106040. /***/ (function(module, exports, __webpack_require__) {
  106041. /**
  106042. * @author Richard Davey <rich@photonstorm.com>
  106043. * @copyright 2018 Photon Storm Ltd.
  106044. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106045. */
  106046. var TileToWorldX = __webpack_require__(140);
  106047. var TileToWorldY = __webpack_require__(139);
  106048. var Vector2 = __webpack_require__(6);
  106049. /**
  106050. * Converts from tile XY coordinates (tile units) to world XY coordinates (pixels), factoring in the
  106051. * layer's position, scale and scroll. This will return a new Vector2 object or update the given
  106052. * `point` object.
  106053. *
  106054. * @function Phaser.Tilemaps.Components.TileToWorldXY
  106055. * @private
  106056. * @since 3.0.0
  106057. *
  106058. * @param {integer} tileX - [description]
  106059. * @param {integer} tileY - [description]
  106060. * @param {Phaser.Math.Vector2} [point] - [description]
  106061. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  106062. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106063. *
  106064. * @return {Phaser.Math.Vector2} The XY location in world coordinates.
  106065. */
  106066. var TileToWorldXY = function (tileX, tileY, point, camera, layer)
  106067. {
  106068. if (point === undefined) { point = new Vector2(0, 0); }
  106069. point.x = TileToWorldX(tileX, camera, layer);
  106070. point.y = TileToWorldY(tileY, camera, layer);
  106071. return point;
  106072. };
  106073. module.exports = TileToWorldXY;
  106074. /***/ }),
  106075. /* 647 */
  106076. /***/ (function(module, exports, __webpack_require__) {
  106077. /**
  106078. * @author Richard Davey <rich@photonstorm.com>
  106079. * @copyright 2018 Photon Storm Ltd.
  106080. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106081. */
  106082. var GetTilesWithin = __webpack_require__(23);
  106083. /**
  106084. * Scans the given rectangular area (given in tile coordinates) for tiles with an index matching
  106085. * `indexA` and swaps then with `indexB`. This only modifies the index and does not change collision
  106086. * information.
  106087. *
  106088. * @function Phaser.Tilemaps.Components.SwapByIndex
  106089. * @private
  106090. * @since 3.0.0
  106091. *
  106092. * @param {integer} tileA - First tile index.
  106093. * @param {integer} tileB - Second tile index.
  106094. * @param {integer} [tileX=0] - [description]
  106095. * @param {integer} [tileY=0] - [description]
  106096. * @param {integer} [width=max width based on tileX] - [description]
  106097. * @param {integer} [height=max height based on tileY] - [description]
  106098. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106099. */
  106100. var SwapByIndex = function (indexA, indexB, tileX, tileY, width, height, layer)
  106101. {
  106102. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  106103. for (var i = 0; i < tiles.length; i++)
  106104. {
  106105. if (tiles[i])
  106106. {
  106107. if (tiles[i].index === indexA)
  106108. {
  106109. tiles[i].index = indexB;
  106110. }
  106111. else if (tiles[i].index === indexB)
  106112. {
  106113. tiles[i].index = indexA;
  106114. }
  106115. }
  106116. }
  106117. };
  106118. module.exports = SwapByIndex;
  106119. /***/ }),
  106120. /* 648 */
  106121. /***/ (function(module, exports, __webpack_require__) {
  106122. /**
  106123. * @author Richard Davey <rich@photonstorm.com>
  106124. * @copyright 2018 Photon Storm Ltd.
  106125. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106126. */
  106127. var GetTilesWithin = __webpack_require__(23);
  106128. var ShuffleArray = __webpack_require__(95);
  106129. /**
  106130. * Shuffles the tiles in a rectangular region (specified in tile coordinates) within the given
  106131. * layer. It will only randomize the tiles in that area, so if they're all the same nothing will
  106132. * appear to have changed! This method only modifies tile indexes and does not change collision
  106133. * information.
  106134. *
  106135. * @function Phaser.Tilemaps.Components.Shuffle
  106136. * @private
  106137. * @since 3.0.0
  106138. *
  106139. * @param {integer} [tileX=0] - [description]
  106140. * @param {integer} [tileY=0] - [description]
  106141. * @param {integer} [width=max width based on tileX] - [description]
  106142. * @param {integer} [height=max height based on tileY] - [description]
  106143. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106144. */
  106145. var Shuffle = function (tileX, tileY, width, height, layer)
  106146. {
  106147. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  106148. var indexes = tiles.map(function (tile) { return tile.index; });
  106149. ShuffleArray(indexes);
  106150. for (var i = 0; i < tiles.length; i++)
  106151. {
  106152. tiles[i].index = indexes[i];
  106153. }
  106154. };
  106155. module.exports = Shuffle;
  106156. /***/ }),
  106157. /* 649 */
  106158. /***/ (function(module, exports, __webpack_require__) {
  106159. /**
  106160. * @author Richard Davey <rich@photonstorm.com>
  106161. * @copyright 2018 Photon Storm Ltd.
  106162. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106163. */
  106164. var GetTilesWithin = __webpack_require__(23);
  106165. /**
  106166. * Sets a collision callback for the given rectangular area (in tile coordinates) within the layer.
  106167. * If a callback is already set for the tile index it will be replaced. Set the callback to null to
  106168. * remove it.
  106169. *
  106170. * @function Phaser.Tilemaps.Components.SetTileLocationCallback
  106171. * @private
  106172. * @since 3.0.0
  106173. *
  106174. * @param {integer} [tileX=0] - [description]
  106175. * @param {integer} [tileY=0] - [description]
  106176. * @param {integer} [width=max width based on tileX] - [description]
  106177. * @param {integer} [height=max height based on tileY] - [description]
  106178. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  106179. * @param {object} callbackContext - The context under which the callback is called.
  106180. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106181. */
  106182. var SetTileLocationCallback = function (tileX, tileY, width, height, callback, callbackContext, layer)
  106183. {
  106184. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  106185. for (var i = 0; i < tiles.length; i++)
  106186. {
  106187. tiles[i].setCollisionCallback(callback, callbackContext);
  106188. }
  106189. };
  106190. module.exports = SetTileLocationCallback;
  106191. /***/ }),
  106192. /* 650 */
  106193. /***/ (function(module, exports) {
  106194. /**
  106195. * @author Richard Davey <rich@photonstorm.com>
  106196. * @copyright 2018 Photon Storm Ltd.
  106197. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106198. */
  106199. /**
  106200. * Sets a global collision callback for the given tile index within the layer. This will affect all
  106201. * tiles on this layer that have the same index. If a callback is already set for the tile index it
  106202. * will be replaced. Set the callback to null to remove it. If you want to set a callback for a tile
  106203. * at a specific location on the map then see setTileLocationCallback.
  106204. *
  106205. * @function Phaser.Tilemaps.Components.SetTileIndexCallback
  106206. * @private
  106207. * @since 3.0.0
  106208. *
  106209. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes to have a
  106210. * collision callback set for.
  106211. * @param {function} callback - The callback that will be invoked when the tile is collided with.
  106212. * @param {object} callbackContext - The context under which the callback is called.
  106213. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106214. */
  106215. var SetTileIndexCallback = function (indexes, callback, callbackContext, layer)
  106216. {
  106217. if (typeof indexes === 'number')
  106218. {
  106219. layer.callbacks[indexes] = (callback !== null)
  106220. ? { callback: callback, callbackContext: callbackContext }
  106221. : undefined;
  106222. }
  106223. else
  106224. {
  106225. for (var i = 0, len = indexes.length; i < len; i++)
  106226. {
  106227. layer.callbacks[indexes[i]] = (callback !== null)
  106228. ? { callback: callback, callbackContext: callbackContext }
  106229. : undefined;
  106230. }
  106231. }
  106232. };
  106233. module.exports = SetTileIndexCallback;
  106234. /***/ }),
  106235. /* 651 */
  106236. /***/ (function(module, exports, __webpack_require__) {
  106237. /**
  106238. * @author Richard Davey <rich@photonstorm.com>
  106239. * @copyright 2018 Photon Storm Ltd.
  106240. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106241. */
  106242. var SetTileCollision = __webpack_require__(66);
  106243. var CalculateFacesWithin = __webpack_require__(41);
  106244. /**
  106245. * Sets collision on the tiles within a layer by checking each tile's collision group data
  106246. * (typically defined in Tiled within the tileset collision editor). If any objects are found within
  106247. * a tile's collision group, the tile's colliding information will be set. The `collides` parameter
  106248. * controls if collision will be enabled (true) or disabled (false).
  106249. *
  106250. * @function Phaser.Tilemaps.Components.SetCollisionFromCollisionGroup
  106251. * @private
  106252. * @since 3.0.0
  106253. *
  106254. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  106255. * collision.
  106256. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  106257. * update.
  106258. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106259. */
  106260. var SetCollisionFromCollisionGroup = function (collides, recalculateFaces, layer)
  106261. {
  106262. if (collides === undefined) { collides = true; }
  106263. if (recalculateFaces === undefined) { recalculateFaces = true; }
  106264. for (var ty = 0; ty < layer.height; ty++)
  106265. {
  106266. for (var tx = 0; tx < layer.width; tx++)
  106267. {
  106268. var tile = layer.data[ty][tx];
  106269. if (!tile) { continue; }
  106270. var collisionGroup = tile.getCollisionGroup();
  106271. // It's possible in Tiled to have a collision group without any shapes, e.g. create a
  106272. // shape and then delete the shape.
  106273. if (collisionGroup && collisionGroup.objects && collisionGroup.objects.length > 0)
  106274. {
  106275. SetTileCollision(tile, collides);
  106276. }
  106277. }
  106278. }
  106279. if (recalculateFaces) { CalculateFacesWithin(0, 0, layer.width, layer.height, layer); }
  106280. };
  106281. module.exports = SetCollisionFromCollisionGroup;
  106282. /***/ }),
  106283. /* 652 */
  106284. /***/ (function(module, exports, __webpack_require__) {
  106285. /**
  106286. * @author Richard Davey <rich@photonstorm.com>
  106287. * @copyright 2018 Photon Storm Ltd.
  106288. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106289. */
  106290. var SetTileCollision = __webpack_require__(66);
  106291. var CalculateFacesWithin = __webpack_require__(41);
  106292. var HasValue = __webpack_require__(111);
  106293. /**
  106294. * Sets collision on the tiles within a layer by checking tile properties. If a tile has a property
  106295. * that matches the given properties object, its collision flag will be set. The `collides`
  106296. * parameter controls if collision will be enabled (true) or disabled (false). Passing in
  106297. * `{ collides: true }` would update the collision flag on any tiles with a "collides" property that
  106298. * has a value of true. Any tile that doesn't have "collides" set to true will be ignored. You can
  106299. * also use an array of values, e.g. `{ types: ["stone", "lava", "sand" ] }`. If a tile has a
  106300. * "types" property that matches any of those values, its collision flag will be updated.
  106301. *
  106302. * @function Phaser.Tilemaps.Components.SetCollisionByProperty
  106303. * @private
  106304. * @since 3.0.0
  106305. *
  106306. * @param {object} properties - An object with tile properties and corresponding values that should
  106307. * be checked.
  106308. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  106309. * collision.
  106310. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  106311. * update.
  106312. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106313. */
  106314. var SetCollisionByProperty = function (properties, collides, recalculateFaces, layer)
  106315. {
  106316. if (collides === undefined) { collides = true; }
  106317. if (recalculateFaces === undefined) { recalculateFaces = true; }
  106318. for (var ty = 0; ty < layer.height; ty++)
  106319. {
  106320. for (var tx = 0; tx < layer.width; tx++)
  106321. {
  106322. var tile = layer.data[ty][tx];
  106323. if (!tile) { continue; }
  106324. for (var property in properties)
  106325. {
  106326. if (!HasValue(tile.properties, property)) { continue; }
  106327. var values = properties[property];
  106328. if (!Array.isArray(values))
  106329. {
  106330. values = [ values ];
  106331. }
  106332. for (var i = 0; i < values.length; i++)
  106333. {
  106334. if (tile.properties[property] === values[i])
  106335. {
  106336. SetTileCollision(tile, collides);
  106337. }
  106338. }
  106339. }
  106340. }
  106341. }
  106342. if (recalculateFaces) { CalculateFacesWithin(0, 0, layer.width, layer.height, layer); }
  106343. };
  106344. module.exports = SetCollisionByProperty;
  106345. /***/ }),
  106346. /* 653 */
  106347. /***/ (function(module, exports, __webpack_require__) {
  106348. /**
  106349. * @author Richard Davey <rich@photonstorm.com>
  106350. * @copyright 2018 Photon Storm Ltd.
  106351. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106352. */
  106353. var SetTileCollision = __webpack_require__(66);
  106354. var CalculateFacesWithin = __webpack_require__(41);
  106355. var SetLayerCollisionIndex = __webpack_require__(223);
  106356. /**
  106357. * Sets collision on all tiles in the given layer, except for tiles that have an index specified in
  106358. * the given array. The `collides` parameter controls if collision will be enabled (true) or
  106359. * disabled (false).
  106360. *
  106361. * @function Phaser.Tilemaps.Components.SetCollisionByExclusion
  106362. * @private
  106363. * @since 3.0.0
  106364. *
  106365. * @param {integer[]} indexes - An array of the tile indexes to not be counted for collision.
  106366. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  106367. * collision.
  106368. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  106369. * update.
  106370. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106371. */
  106372. var SetCollisionByExclusion = function (indexes, collides, recalculateFaces, layer)
  106373. {
  106374. if (collides === undefined) { collides = true; }
  106375. if (recalculateFaces === undefined) { recalculateFaces = true; }
  106376. if (!Array.isArray(indexes)) { indexes = [ indexes ]; }
  106377. // Note: this only updates layer.collideIndexes for tile indexes found currently in the layer
  106378. for (var ty = 0; ty < layer.height; ty++)
  106379. {
  106380. for (var tx = 0; tx < layer.width; tx++)
  106381. {
  106382. var tile = layer.data[ty][tx];
  106383. if (tile && indexes.indexOf(tile.index) === -1)
  106384. {
  106385. SetTileCollision(tile, collides);
  106386. SetLayerCollisionIndex(tile.index, collides, layer);
  106387. }
  106388. }
  106389. }
  106390. if (recalculateFaces) { CalculateFacesWithin(0, 0, layer.width, layer.height, layer); }
  106391. };
  106392. module.exports = SetCollisionByExclusion;
  106393. /***/ }),
  106394. /* 654 */
  106395. /***/ (function(module, exports, __webpack_require__) {
  106396. /**
  106397. * @author Richard Davey <rich@photonstorm.com>
  106398. * @copyright 2018 Photon Storm Ltd.
  106399. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106400. */
  106401. var SetTileCollision = __webpack_require__(66);
  106402. var CalculateFacesWithin = __webpack_require__(41);
  106403. var SetLayerCollisionIndex = __webpack_require__(223);
  106404. /**
  106405. * Sets collision on a range of tiles in a layer whose index is between the specified `start` and
  106406. * `stop` (inclusive). Calling this with a start value of 10 and a stop value of 14 would set
  106407. * collision for tiles 10, 11, 12, 13 and 14. The `collides` parameter controls if collision will be
  106408. * enabled (true) or disabled (false).
  106409. *
  106410. * @function Phaser.Tilemaps.Components.SetCollisionBetween
  106411. * @private
  106412. * @since 3.0.0
  106413. *
  106414. * @param {integer} start - The first index of the tile to be set for collision.
  106415. * @param {integer} stop - The last index of the tile to be set for collision.
  106416. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  106417. * collision.
  106418. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  106419. * update.
  106420. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106421. */
  106422. var SetCollisionBetween = function (start, stop, collides, recalculateFaces, layer)
  106423. {
  106424. if (collides === undefined) { collides = true; }
  106425. if (recalculateFaces === undefined) { recalculateFaces = true; }
  106426. if (start > stop) { return; }
  106427. // Update the array of colliding indexes
  106428. for (var index = start; index <= stop; index++)
  106429. {
  106430. SetLayerCollisionIndex(index, collides, layer);
  106431. }
  106432. // Update the tiles
  106433. for (var ty = 0; ty < layer.height; ty++)
  106434. {
  106435. for (var tx = 0; tx < layer.width; tx++)
  106436. {
  106437. var tile = layer.data[ty][tx];
  106438. if (tile)
  106439. {
  106440. if (tile.index >= start && tile.index <= stop)
  106441. {
  106442. SetTileCollision(tile, collides);
  106443. }
  106444. }
  106445. }
  106446. }
  106447. if (recalculateFaces) { CalculateFacesWithin(0, 0, layer.width, layer.height, layer); }
  106448. };
  106449. module.exports = SetCollisionBetween;
  106450. /***/ }),
  106451. /* 655 */
  106452. /***/ (function(module, exports, __webpack_require__) {
  106453. /**
  106454. * @author Richard Davey <rich@photonstorm.com>
  106455. * @copyright 2018 Photon Storm Ltd.
  106456. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106457. */
  106458. var SetTileCollision = __webpack_require__(66);
  106459. var CalculateFacesWithin = __webpack_require__(41);
  106460. var SetLayerCollisionIndex = __webpack_require__(223);
  106461. /**
  106462. * Sets collision on the given tile or tiles within a layer by index. You can pass in either a
  106463. * single numeric index or an array of indexes: [2, 3, 15, 20]. The `collides` parameter controls if
  106464. * collision will be enabled (true) or disabled (false).
  106465. *
  106466. * @function Phaser.Tilemaps.Components.SetCollision
  106467. * @private
  106468. * @since 3.0.0
  106469. *
  106470. * @param {(integer|array)} indexes - Either a single tile index, or an array of tile indexes.
  106471. * @param {boolean} [collides=true] - If true it will enable collision. If false it will clear
  106472. * collision.
  106473. * @param {boolean} [recalculateFaces=true] - Whether or not to recalculate the tile faces after the
  106474. * update.
  106475. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106476. */
  106477. var SetCollision = function (indexes, collides, recalculateFaces, layer)
  106478. {
  106479. if (collides === undefined) { collides = true; }
  106480. if (recalculateFaces === undefined) { recalculateFaces = true; }
  106481. if (!Array.isArray(indexes)) { indexes = [ indexes ]; }
  106482. // Update the array of colliding indexes
  106483. for (var i = 0; i < indexes.length; i++)
  106484. {
  106485. SetLayerCollisionIndex(indexes[i], collides, layer);
  106486. }
  106487. // Update the tiles
  106488. for (var ty = 0; ty < layer.height; ty++)
  106489. {
  106490. for (var tx = 0; tx < layer.width; tx++)
  106491. {
  106492. var tile = layer.data[ty][tx];
  106493. if (tile && indexes.indexOf(tile.index) !== -1)
  106494. {
  106495. SetTileCollision(tile, collides);
  106496. }
  106497. }
  106498. }
  106499. if (recalculateFaces) { CalculateFacesWithin(0, 0, layer.width, layer.height, layer); }
  106500. };
  106501. module.exports = SetCollision;
  106502. /***/ }),
  106503. /* 656 */
  106504. /***/ (function(module, exports, __webpack_require__) {
  106505. /**
  106506. * @author Richard Davey <rich@photonstorm.com>
  106507. * @copyright 2018 Photon Storm Ltd.
  106508. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106509. */
  106510. var GetTilesWithin = __webpack_require__(23);
  106511. var Color = __webpack_require__(512);
  106512. /**
  106513. * Draws a debug representation of the layer to the given Graphics. This is helpful when you want to
  106514. * get a quick idea of which of your tiles are colliding and which have interesting faces. The tiles
  106515. * are drawn starting at (0, 0) in the Graphics, allowing you to place the debug representation
  106516. * wherever you want on the screen.
  106517. *
  106518. * @function Phaser.Tilemaps.Components.RenderDebug
  106519. * @private
  106520. * @since 3.0.0
  106521. *
  106522. * @param {Phaser.GameObjects.Graphics} graphics - The target Graphics object to draw upon.
  106523. * @param {object} styleConfig - An object specifying the colors to use for the debug drawing.
  106524. * @param {?Phaser.Display.Color} [styleConfig.tileColor=blue] - Color to use for drawing a filled rectangle at
  106525. * non-colliding tile locations. If set to null, non-colliding tiles will not be drawn.
  106526. * @param {?Phaser.Display.Color} [styleConfig.collidingTileColor=orange] - Color to use for drawing a filled
  106527. * rectangle at colliding tile locations. If set to null, colliding tiles will not be drawn.
  106528. * @param {?Phaser.Display.Color} [styleConfig.faceColor=grey] - Color to use for drawing a line at interesting
  106529. * tile faces. If set to null, interesting tile faces will not be drawn.
  106530. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106531. */
  106532. var RenderDebug = function (graphics, styleConfig, layer)
  106533. {
  106534. if (styleConfig === undefined) { styleConfig = {}; }
  106535. // Default colors without needlessly creating Color objects
  106536. var tileColor = styleConfig.tileColor !== undefined
  106537. ? styleConfig.tileColor
  106538. : new Color(105, 210, 231, 150);
  106539. var collidingTileColor = styleConfig.collidingTileColor !== undefined
  106540. ? styleConfig.collidingTileColor
  106541. : new Color(243, 134, 48, 200);
  106542. var faceColor = styleConfig.faceColor !== undefined
  106543. ? styleConfig.faceColor
  106544. : new Color(40, 39, 37, 150);
  106545. var tiles = GetTilesWithin(0, 0, layer.width, layer.height, null, layer);
  106546. for (var i = 0; i < tiles.length; i++)
  106547. {
  106548. var tile = tiles[i];
  106549. var tw = tile.width;
  106550. var th = tile.height;
  106551. var x = tile.pixelX;
  106552. var y = tile.pixelY;
  106553. var color = tile.collides ? collidingTileColor : tileColor;
  106554. if (color !== null)
  106555. {
  106556. graphics.fillStyle(color.color, color.alpha / 255);
  106557. graphics.fillRect(x, y, tw, th);
  106558. }
  106559. // Inset the face line to prevent neighboring tile's lines from overlapping
  106560. x += 1;
  106561. y += 1;
  106562. tw -= 2;
  106563. th -= 2;
  106564. if (faceColor !== null)
  106565. {
  106566. graphics.lineStyle(1, faceColor.color, faceColor.alpha / 255);
  106567. if (tile.faceTop) { graphics.lineBetween(x, y, x + tw, y); }
  106568. if (tile.faceRight) { graphics.lineBetween(x + tw, y, x + tw, y + th); }
  106569. if (tile.faceBottom) { graphics.lineBetween(x, y + th, x + tw, y + th); }
  106570. if (tile.faceLeft) { graphics.lineBetween(x, y, x, y + th); }
  106571. }
  106572. }
  106573. };
  106574. module.exports = RenderDebug;
  106575. /***/ }),
  106576. /* 657 */
  106577. /***/ (function(module, exports, __webpack_require__) {
  106578. /**
  106579. * @author Richard Davey <rich@photonstorm.com>
  106580. * @copyright 2018 Photon Storm Ltd.
  106581. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106582. */
  106583. var RemoveTileAt = __webpack_require__(325);
  106584. var WorldToTileX = __webpack_require__(54);
  106585. var WorldToTileY = __webpack_require__(53);
  106586. /**
  106587. * Removes the tile at the given world coordinates in the specified layer and updates the layer's
  106588. * collision information.
  106589. *
  106590. * @function Phaser.Tilemaps.Components.RemoveTileAtWorldXY
  106591. * @private
  106592. * @since 3.0.0
  106593. *
  106594. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  106595. * @param {number} worldX - [description]
  106596. * @param {number} worldY - [description]
  106597. * @param {boolean} [replaceWithNull=true] - If true, this will replace the tile at the specified
  106598. * location with null instead of a Tile with an index of -1.
  106599. * @param {boolean} [recalculateFaces=true] - [description]
  106600. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  106601. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106602. *
  106603. * @return {Phaser.Tilemaps.Tile} The Tile object that was removed.
  106604. */
  106605. var RemoveTileAtWorldXY = function (worldX, worldY, replaceWithNull, recalculateFaces, camera, layer)
  106606. {
  106607. var tileX = WorldToTileX(worldX, true, camera, layer);
  106608. var tileY = WorldToTileY(worldY, true, camera, layer);
  106609. return RemoveTileAt(tileX, tileY, replaceWithNull, recalculateFaces, layer);
  106610. };
  106611. module.exports = RemoveTileAtWorldXY;
  106612. /***/ }),
  106613. /* 658 */
  106614. /***/ (function(module, exports, __webpack_require__) {
  106615. /**
  106616. * @author Richard Davey <rich@photonstorm.com>
  106617. * @copyright 2018 Photon Storm Ltd.
  106618. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106619. */
  106620. var GetTilesWithin = __webpack_require__(23);
  106621. var GetRandom = __webpack_require__(149);
  106622. /**
  106623. * Randomizes the indexes of a rectangular region of tiles (in tile coordinates) within the
  106624. * specified layer. Each tile will receive a new index. If an array of indexes is passed in, then
  106625. * those will be used for randomly assigning new tile indexes. If an array is not provided, the
  106626. * indexes found within the region (excluding -1) will be used for randomly assigning new tile
  106627. * indexes. This method only modifies tile indexes and does not change collision information.
  106628. *
  106629. * @function Phaser.Tilemaps.Components.Randomize
  106630. * @private
  106631. * @since 3.0.0
  106632. *
  106633. * @param {integer} [tileX=0] - [description]
  106634. * @param {integer} [tileY=0] - [description]
  106635. * @param {integer} [width=max width based on tileX] - [description]
  106636. * @param {integer} [height=max height based on tileY] - [description]
  106637. * @param {integer[]} [indexes] - An array of indexes to randomly draw from during randomization.
  106638. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106639. */
  106640. var Randomize = function (tileX, tileY, width, height, indexes, layer)
  106641. {
  106642. var i;
  106643. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  106644. // If no indicies are given, then find all the unique indexes within the specified region
  106645. if (indexes === undefined)
  106646. {
  106647. indexes = [];
  106648. for (i = 0; i < tiles.length; i++)
  106649. {
  106650. if (indexes.indexOf(tiles[i].index) === -1)
  106651. {
  106652. indexes.push(tiles[i].index);
  106653. }
  106654. }
  106655. }
  106656. for (i = 0; i < tiles.length; i++)
  106657. {
  106658. tiles[i].index = GetRandom(indexes);
  106659. }
  106660. };
  106661. module.exports = Randomize;
  106662. /***/ }),
  106663. /* 659 */
  106664. /***/ (function(module, exports, __webpack_require__) {
  106665. /**
  106666. * @author Richard Davey <rich@photonstorm.com>
  106667. * @copyright 2018 Photon Storm Ltd.
  106668. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106669. */
  106670. var CalculateFacesWithin = __webpack_require__(41);
  106671. var PutTileAt = __webpack_require__(224);
  106672. /**
  106673. * Puts an array of tiles or a 2D array of tiles at the given tile coordinates in the specified
  106674. * layer. The array can be composed of either tile indexes or Tile objects. If you pass in a Tile,
  106675. * all attributes will be copied over to the specified location. If you pass in an index, only the
  106676. * index at the specified location will be changed. Collision information will be recalculated
  106677. * within the region tiles were changed.
  106678. *
  106679. * @function Phaser.Tilemaps.Components.PutTilesAt
  106680. * @private
  106681. * @since 3.0.0
  106682. *
  106683. * @param {(integer[]|integer[][]|Phaser.Tilemaps.Tile[]|Phaser.Tilemaps.Tile[][])} tile - A row (array) or grid (2D array) of Tiles
  106684. * or tile indexes to place.
  106685. * @param {integer} tileX - [description]
  106686. * @param {integer} tileY - [description]
  106687. * @param {boolean} [recalculateFaces=true] - [description]
  106688. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106689. */
  106690. var PutTilesAt = function (tilesArray, tileX, tileY, recalculateFaces, layer)
  106691. {
  106692. if (!Array.isArray(tilesArray)) { return null; }
  106693. if (recalculateFaces === undefined) { recalculateFaces = true; }
  106694. // Force the input array to be a 2D array
  106695. if (!Array.isArray(tilesArray[0]))
  106696. {
  106697. tilesArray = [ tilesArray ];
  106698. }
  106699. var height = tilesArray.length;
  106700. var width = tilesArray[0].length;
  106701. for (var ty = 0; ty < height; ty++)
  106702. {
  106703. for (var tx = 0; tx < width; tx++)
  106704. {
  106705. var tile = tilesArray[ty][tx];
  106706. PutTileAt(tile, tileX + tx, tileY + ty, false, layer);
  106707. }
  106708. }
  106709. if (recalculateFaces)
  106710. {
  106711. // Recalculate the faces within the destination area and neighboring tiles
  106712. CalculateFacesWithin(tileX - 1, tileY - 1, width + 2, height + 2, layer);
  106713. }
  106714. };
  106715. module.exports = PutTilesAt;
  106716. /***/ }),
  106717. /* 660 */
  106718. /***/ (function(module, exports, __webpack_require__) {
  106719. /**
  106720. * @author Richard Davey <rich@photonstorm.com>
  106721. * @copyright 2018 Photon Storm Ltd.
  106722. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106723. */
  106724. var PutTileAt = __webpack_require__(224);
  106725. var WorldToTileX = __webpack_require__(54);
  106726. var WorldToTileY = __webpack_require__(53);
  106727. /**
  106728. * Puts a tile at the given world coordinates (pixels) in the specified layer. You can pass in either
  106729. * an index or a Tile object. If you pass in a Tile, all attributes will be copied over to the
  106730. * specified location. If you pass in an index, only the index at the specified location will be
  106731. * changed. Collision information will be recalculated at the specified location.
  106732. *
  106733. * @function Phaser.Tilemaps.Components.PutTileAtWorldXY
  106734. * @private
  106735. * @since 3.0.0
  106736. *
  106737. * @param {(integer|Phaser.Tilemaps.Tile)} tile - The index of this tile to set or a Tile object.
  106738. * @param {integer} worldX - [description]
  106739. * @param {integer} worldY - [description]
  106740. * @param {boolean} [recalculateFaces=true] - [description]
  106741. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  106742. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106743. *
  106744. * @return {Phaser.Tilemaps.Tile} The Tile object that was created or added to this map.
  106745. */
  106746. var PutTileAtWorldXY = function (tile, worldX, worldY, recalculateFaces, camera, layer)
  106747. {
  106748. var tileX = WorldToTileX(worldX, true, camera, layer);
  106749. var tileY = WorldToTileY(worldY, true, camera, layer);
  106750. return PutTileAt(tile, tileX, tileY, recalculateFaces, layer);
  106751. };
  106752. module.exports = PutTileAtWorldXY;
  106753. /***/ }),
  106754. /* 661 */
  106755. /***/ (function(module, exports, __webpack_require__) {
  106756. /**
  106757. * @author Richard Davey <rich@photonstorm.com>
  106758. * @copyright 2018 Photon Storm Ltd.
  106759. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106760. */
  106761. var HasTileAt = __webpack_require__(326);
  106762. var WorldToTileX = __webpack_require__(54);
  106763. var WorldToTileY = __webpack_require__(53);
  106764. /**
  106765. * Checks if there is a tile at the given location (in world coordinates) in the given layer. Returns
  106766. * false if there is no tile or if the tile at that location has an index of -1.
  106767. *
  106768. * @function Phaser.Tilemaps.Components.HasTileAtWorldXY
  106769. * @private
  106770. * @since 3.0.0
  106771. *
  106772. * @param {number} worldX - [description]
  106773. * @param {number} worldY - [description]
  106774. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  106775. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106776. *
  106777. * @return {boolean}
  106778. */
  106779. var HasTileAtWorldXY = function (worldX, worldY, camera, layer)
  106780. {
  106781. var tileX = WorldToTileX(worldX, true, camera, layer);
  106782. var tileY = WorldToTileY(worldY, true, camera, layer);
  106783. return HasTileAt(tileX, tileY, layer);
  106784. };
  106785. module.exports = HasTileAtWorldXY;
  106786. /***/ }),
  106787. /* 662 */
  106788. /***/ (function(module, exports, __webpack_require__) {
  106789. /**
  106790. * @author Richard Davey <rich@photonstorm.com>
  106791. * @copyright 2018 Photon Storm Ltd.
  106792. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106793. */
  106794. var GetTilesWithin = __webpack_require__(23);
  106795. var WorldToTileX = __webpack_require__(54);
  106796. var WorldToTileY = __webpack_require__(53);
  106797. /**
  106798. * Gets the tiles in the given rectangular area (in world coordinates) of the layer.
  106799. *
  106800. * @function Phaser.Tilemaps.Components.GetTilesWithinWorldXY
  106801. * @private
  106802. * @since 3.0.0
  106803. *
  106804. * @param {number} worldX - [description]
  106805. * @param {number} worldY - [description]
  106806. * @param {number} width - [description]
  106807. * @param {number} height - [description]
  106808. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  106809. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  106810. * -1 for an index.
  106811. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on
  106812. * at least one side.
  106813. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  106814. * have at least one interesting face.
  106815. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  106816. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106817. *
  106818. * @return {Phaser.Tilemaps.Tile[]} Array of Tile objects.
  106819. */
  106820. var GetTilesWithinWorldXY = function (worldX, worldY, width, height, filteringOptions, camera, layer)
  106821. {
  106822. // Top left corner of the rect, rounded down to include partial tiles
  106823. var xStart = WorldToTileX(worldX, true, camera, layer);
  106824. var yStart = WorldToTileY(worldY, true, camera, layer);
  106825. // Bottom right corner of the rect, rounded up to include partial tiles
  106826. var xEnd = Math.ceil(WorldToTileX(worldX + width, false, camera, layer));
  106827. var yEnd = Math.ceil(WorldToTileY(worldY + height, false, camera, layer));
  106828. return GetTilesWithin(xStart, yStart, xEnd - xStart, yEnd - yStart, filteringOptions, layer);
  106829. };
  106830. module.exports = GetTilesWithinWorldXY;
  106831. /***/ }),
  106832. /* 663 */
  106833. /***/ (function(module, exports, __webpack_require__) {
  106834. /**
  106835. * @author Richard Davey <rich@photonstorm.com>
  106836. * @copyright 2018 Photon Storm Ltd.
  106837. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106838. */
  106839. var Geom = __webpack_require__(404);
  106840. var GetTilesWithin = __webpack_require__(23);
  106841. var Intersects = __webpack_require__(403);
  106842. var NOOP = __webpack_require__(3);
  106843. var TileToWorldX = __webpack_require__(140);
  106844. var TileToWorldY = __webpack_require__(139);
  106845. var WorldToTileX = __webpack_require__(54);
  106846. var WorldToTileY = __webpack_require__(53);
  106847. var TriangleToRectangle = function (triangle, rect)
  106848. {
  106849. return Intersects.RectangleToTriangle(rect, triangle);
  106850. };
  106851. // Note: Could possibly be optimized by copying the shape and shifting it into tilemapLayer
  106852. // coordinates instead of shifting the tiles.
  106853. /**
  106854. * Gets the tiles that overlap with the given shape in the given layer. The shape must be a Circle,
  106855. * Line, Rectangle or Triangle. The shape should be in world coordinates.
  106856. *
  106857. * @function Phaser.Tilemaps.Components.GetTilesWithinShape
  106858. * @private
  106859. * @since 3.0.0
  106860. *
  106861. * @param {(Phaser.Geom.Circle|Phaser.Geom.Line|Phaser.Geom.Rectangle|Phaser.Geom.Triangle)} shape - A shape in world (pixel) coordinates
  106862. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  106863. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  106864. * -1 for an index.
  106865. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide on
  106866. * at least one side.
  106867. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  106868. * have at least one interesting face.
  106869. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  106870. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106871. *
  106872. * @return {Phaser.Tilemaps.Tile[]} Array of Tile objects.
  106873. */
  106874. var GetTilesWithinShape = function (shape, filteringOptions, camera, layer)
  106875. {
  106876. if (shape === undefined) { return []; }
  106877. // intersectTest is a function with parameters: shape, rect
  106878. var intersectTest = NOOP;
  106879. if (shape instanceof Geom.Circle) { intersectTest = Intersects.CircleToRectangle; }
  106880. else if (shape instanceof Geom.Rectangle) { intersectTest = Intersects.RectangleToRectangle; }
  106881. else if (shape instanceof Geom.Triangle) { intersectTest = TriangleToRectangle; }
  106882. else if (shape instanceof Geom.Line) { intersectTest = Intersects.LineToRectangle; }
  106883. // Top left corner of the shapes's bounding box, rounded down to include partial tiles
  106884. var xStart = WorldToTileX(shape.left, true, camera, layer);
  106885. var yStart = WorldToTileY(shape.top, true, camera, layer);
  106886. // Bottom right corner of the shapes's bounding box, rounded up to include partial tiles
  106887. var xEnd = Math.ceil(WorldToTileX(shape.right, false, camera, layer));
  106888. var yEnd = Math.ceil(WorldToTileY(shape.bottom, false, camera, layer));
  106889. // Tiles within bounding rectangle of shape. Bounds are forced to be at least 1 x 1 tile in size
  106890. // to grab tiles for shapes that don't have a height or width (e.g. a horizontal line).
  106891. var width = Math.max(xEnd - xStart, 1);
  106892. var height = Math.max(yEnd - yStart, 1);
  106893. var tiles = GetTilesWithin(xStart, yStart, width, height, filteringOptions, layer);
  106894. var tileWidth = layer.tileWidth;
  106895. var tileHeight = layer.tileHeight;
  106896. if (layer.tilemapLayer)
  106897. {
  106898. tileWidth *= layer.tilemapLayer.scaleX;
  106899. tileHeight *= layer.tilemapLayer.scaleY;
  106900. }
  106901. var results = [];
  106902. var tileRect = new Geom.Rectangle(0, 0, tileWidth, tileHeight);
  106903. for (var i = 0; i < tiles.length; i++)
  106904. {
  106905. var tile = tiles[i];
  106906. tileRect.x = TileToWorldX(tile.x, camera, layer);
  106907. tileRect.y = TileToWorldY(tile.y, camera, layer);
  106908. if (intersectTest(shape, tileRect))
  106909. {
  106910. results.push(tile);
  106911. }
  106912. }
  106913. return results;
  106914. };
  106915. module.exports = GetTilesWithinShape;
  106916. /***/ }),
  106917. /* 664 */
  106918. /***/ (function(module, exports, __webpack_require__) {
  106919. /**
  106920. * @author Richard Davey <rich@photonstorm.com>
  106921. * @copyright 2018 Photon Storm Ltd.
  106922. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106923. */
  106924. var GetTileAt = __webpack_require__(141);
  106925. var WorldToTileX = __webpack_require__(54);
  106926. var WorldToTileY = __webpack_require__(53);
  106927. /**
  106928. * Gets a tile at the given world coordinates from the given layer.
  106929. *
  106930. * @function Phaser.Tilemaps.Components.GetTileAtWorldXY
  106931. * @private
  106932. * @since 3.0.0
  106933. *
  106934. * @param {number} worldX - X position to get the tile from (given in pixels)
  106935. * @param {number} worldY - Y position to get the tile from (given in pixels)
  106936. * @param {boolean} [nonNull=false] - If true, function won't return null for empty tiles, but a Tile
  106937. * object with an index of -1.
  106938. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - [description]
  106939. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106940. *
  106941. * @return {Phaser.Tilemaps.Tile} The tile at the given coordinates or null if no tile was found or the coordinates
  106942. * were invalid.
  106943. */
  106944. var GetTileAtWorldXY = function (worldX, worldY, nonNull, camera, layer)
  106945. {
  106946. var tileX = WorldToTileX(worldX, true, camera, layer);
  106947. var tileY = WorldToTileY(worldY, true, camera, layer);
  106948. return GetTileAt(tileX, tileY, nonNull, layer);
  106949. };
  106950. module.exports = GetTileAtWorldXY;
  106951. /***/ }),
  106952. /* 665 */
  106953. /***/ (function(module, exports, __webpack_require__) {
  106954. /**
  106955. * @author Richard Davey <rich@photonstorm.com>
  106956. * @copyright 2018 Photon Storm Ltd.
  106957. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  106958. */
  106959. var GetTilesWithin = __webpack_require__(23);
  106960. /**
  106961. * @callback EachTileCallback
  106962. *
  106963. * @param {Phaser.Tilemaps.Tile} value - [description]
  106964. * @param {number} index - [description]
  106965. * @param {Phaser.Tilemaps.Tile[]} array - [description]
  106966. */
  106967. /**
  106968. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  106969. * callback. Similar to Array.prototype.forEach in vanilla JS.
  106970. *
  106971. * @function Phaser.Tilemaps.Components.ForEachTile
  106972. * @private
  106973. * @since 3.0.0
  106974. *
  106975. * @param {EachTileCallback} callback - The callback. Each tile in the given area will be passed to this
  106976. * callback as the first and only parameter.
  106977. * @param {object} [context] - The context under which the callback should be run.
  106978. * @param {integer} [tileX=0] - [description]
  106979. * @param {integer} [tileY=0] - [description]
  106980. * @param {integer} [width=max width based on tileX] - [description]
  106981. * @param {integer} [height=max height based on tileY] - [description]
  106982. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  106983. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  106984. * -1 for an index.
  106985. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide
  106986. * on at least one side.
  106987. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  106988. * have at least one interesting face.
  106989. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  106990. */
  106991. var ForEachTile = function (callback, context, tileX, tileY, width, height, filteringOptions, layer)
  106992. {
  106993. var tiles = GetTilesWithin(tileX, tileY, width, height, filteringOptions, layer);
  106994. tiles.forEach(callback, context);
  106995. };
  106996. module.exports = ForEachTile;
  106997. /***/ }),
  106998. /* 666 */
  106999. /***/ (function(module, exports, __webpack_require__) {
  107000. /**
  107001. * @author Richard Davey <rich@photonstorm.com>
  107002. * @copyright 2018 Photon Storm Ltd.
  107003. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107004. */
  107005. var GetTilesWithin = __webpack_require__(23);
  107006. /**
  107007. * @callback FindTileCallback
  107008. *
  107009. * @param {Phaser.Tilemaps.Tile} value - [description]
  107010. * @param {number} index - [description]
  107011. * @param {Phaser.Tilemaps.Tile[]} array - [description]
  107012. *
  107013. * @return {boolean} [description]
  107014. */
  107015. /**
  107016. * Find the first tile in the given rectangular area (in tile coordinates) of the layer that
  107017. * satisfies the provided testing function. I.e. finds the first tile for which `callback` returns
  107018. * true. Similar to Array.prototype.find in vanilla JS.
  107019. *
  107020. * @function Phaser.Tilemaps.Components.FindTile
  107021. * @private
  107022. * @since 3.0.0
  107023. *
  107024. * @param {FindTileCallback} callback - The callback. Each tile in the given area will be passed to this
  107025. * callback as the first and only parameter.
  107026. * @param {object} [context] - The context under which the callback should be run.
  107027. * @param {integer} [tileX=0] - [description]
  107028. * @param {integer} [tileY=0] - [description]
  107029. * @param {integer} [width=max width based on tileX] - [description]
  107030. * @param {integer} [height=max height based on tileY] - [description]
  107031. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  107032. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  107033. * -1 for an index.
  107034. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide
  107035. * on at least one side.
  107036. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  107037. * have at least one interesting face.
  107038. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  107039. *
  107040. * @return {?Phaser.Tilemaps.Tile} A Tile that matches the search, or null if no Tile found
  107041. */
  107042. var FindTile = function (callback, context, tileX, tileY, width, height, filteringOptions, layer)
  107043. {
  107044. var tiles = GetTilesWithin(tileX, tileY, width, height, filteringOptions, layer);
  107045. return tiles.find(callback, context) || null;
  107046. };
  107047. module.exports = FindTile;
  107048. /***/ }),
  107049. /* 667 */
  107050. /***/ (function(module, exports) {
  107051. /**
  107052. * @author Richard Davey <rich@photonstorm.com>
  107053. * @copyright 2018 Photon Storm Ltd.
  107054. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107055. */
  107056. /**
  107057. * Searches the entire map layer for the first tile matching the given index, then returns that Tile
  107058. * object. If no match is found, it returns null. The search starts from the top-left tile and
  107059. * continues horizontally until it hits the end of the row, then it drops down to the next column.
  107060. * If the reverse boolean is true, it scans starting from the bottom-right corner traveling up to
  107061. * the top-left.
  107062. *
  107063. * @function Phaser.Tilemaps.Components.FindByIndex
  107064. * @private
  107065. * @since 3.0.0
  107066. *
  107067. * @param {integer} index - The tile index value to search for.
  107068. * @param {integer} [skip=0] - The number of times to skip a matching tile before returning.
  107069. * @param {boolean} [reverse=false] - If true it will scan the layer in reverse, starting at the
  107070. * bottom-right. Otherwise it scans from the top-left.
  107071. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  107072. *
  107073. * @return {?Phaser.Tilemaps.Tile} The first (or n skipped) tile with the matching index.
  107074. */
  107075. var FindByIndex = function (findIndex, skip, reverse, layer)
  107076. {
  107077. if (skip === undefined) { skip = 0; }
  107078. if (reverse === undefined) { reverse = false; }
  107079. var count = 0;
  107080. var tx;
  107081. var ty;
  107082. var tile;
  107083. if (reverse)
  107084. {
  107085. for (ty = layer.height - 1; ty >= 0; ty--)
  107086. {
  107087. for (tx = layer.width - 1; tx >= 0; tx--)
  107088. {
  107089. tile = layer.data[ty][tx];
  107090. if (tile && tile.index === findIndex)
  107091. {
  107092. if (count === skip)
  107093. {
  107094. return tile;
  107095. }
  107096. else
  107097. {
  107098. count += 1;
  107099. }
  107100. }
  107101. }
  107102. }
  107103. }
  107104. else
  107105. {
  107106. for (ty = 0; ty < layer.height; ty++)
  107107. {
  107108. for (tx = 0; tx < layer.width; tx++)
  107109. {
  107110. tile = layer.data[ty][tx];
  107111. if (tile && tile.index === findIndex)
  107112. {
  107113. if (count === skip)
  107114. {
  107115. return tile;
  107116. }
  107117. else
  107118. {
  107119. count += 1;
  107120. }
  107121. }
  107122. }
  107123. }
  107124. }
  107125. return null;
  107126. };
  107127. module.exports = FindByIndex;
  107128. /***/ }),
  107129. /* 668 */
  107130. /***/ (function(module, exports, __webpack_require__) {
  107131. /**
  107132. * @author Richard Davey <rich@photonstorm.com>
  107133. * @copyright 2018 Photon Storm Ltd.
  107134. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107135. */
  107136. var GetTilesWithin = __webpack_require__(23);
  107137. /**
  107138. * For each tile in the given rectangular area (in tile coordinates) of the layer, run the given
  107139. * filter callback function. Any tiles that pass the filter test (i.e. where the callback returns
  107140. * true) will returned as a new array. Similar to Array.prototype.Filter in vanilla JS.
  107141. *
  107142. * @function Phaser.Tilemaps.Components.FilterTiles
  107143. * @private
  107144. * @since 3.0.0
  107145. *
  107146. * @param {function} callback - The callback. Each tile in the given area will be passed to this
  107147. * callback as the first and only parameter. The callback should return true for tiles that pass the
  107148. * filter.
  107149. * @param {object} [context] - The context under which the callback should be run.
  107150. * @param {integer} [tileX=0] - [description]
  107151. * @param {integer} [tileY=0] - [description]
  107152. * @param {integer} [width=max width based on tileX] - [description]
  107153. * @param {integer} [height=max height based on tileY] - [description]
  107154. * @param {object} [filteringOptions] - Optional filters to apply when getting the tiles.
  107155. * @param {boolean} [filteringOptions.isNotEmpty=false] - If true, only return tiles that don't have
  107156. * -1 for an index.
  107157. * @param {boolean} [filteringOptions.isColliding=false] - If true, only return tiles that collide
  107158. * on at least one side.
  107159. * @param {boolean} [filteringOptions.hasInterestingFace=false] - If true, only return tiles that
  107160. * have at least one interesting face.
  107161. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  107162. *
  107163. * @return {Phaser.Tilemaps.Tile[]} The filtered array of Tiles.
  107164. */
  107165. var FilterTiles = function (callback, context, tileX, tileY, width, height, filteringOptions, layer)
  107166. {
  107167. var tiles = GetTilesWithin(tileX, tileY, width, height, filteringOptions, layer);
  107168. return tiles.filter(callback, context);
  107169. };
  107170. module.exports = FilterTiles;
  107171. /***/ }),
  107172. /* 669 */
  107173. /***/ (function(module, exports, __webpack_require__) {
  107174. /**
  107175. * @author Richard Davey <rich@photonstorm.com>
  107176. * @copyright 2018 Photon Storm Ltd.
  107177. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107178. */
  107179. var GetTilesWithin = __webpack_require__(23);
  107180. var CalculateFacesWithin = __webpack_require__(41);
  107181. var SetTileCollision = __webpack_require__(66);
  107182. /**
  107183. * Sets the tiles in the given rectangular area (in tile coordinates) of the layer with the
  107184. * specified index. Tiles will be set to collide if the given index is a colliding index.
  107185. * Collision information in the region will be recalculated.
  107186. *
  107187. * @function Phaser.Tilemaps.Components.Fill
  107188. * @private
  107189. * @since 3.0.0
  107190. *
  107191. * @param {integer} index - [description]
  107192. * @param {integer} [tileX=0] - [description]
  107193. * @param {integer} [tileY=0] - [description]
  107194. * @param {integer} [width=max width based on tileX] - [description]
  107195. * @param {integer} [height=max height based on tileY] - [description]
  107196. * @param {boolean} [recalculateFaces=true] - [description]
  107197. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  107198. */
  107199. var Fill = function (index, tileX, tileY, width, height, recalculateFaces, layer)
  107200. {
  107201. if (recalculateFaces === undefined) { recalculateFaces = true; }
  107202. var doesIndexCollide = (layer.collideIndexes.indexOf(index) !== -1);
  107203. var tiles = GetTilesWithin(tileX, tileY, width, height, null, layer);
  107204. for (var i = 0; i < tiles.length; i++)
  107205. {
  107206. tiles[i].index = index;
  107207. SetTileCollision(tiles[i], doesIndexCollide);
  107208. }
  107209. if (recalculateFaces)
  107210. {
  107211. // Recalculate the faces within the area and neighboring tiles
  107212. CalculateFacesWithin(tileX - 1, tileY - 1, width + 2, height + 2, layer);
  107213. }
  107214. };
  107215. module.exports = Fill;
  107216. /***/ }),
  107217. /* 670 */
  107218. /***/ (function(module, exports, __webpack_require__) {
  107219. /**
  107220. * @author Richard Davey <rich@photonstorm.com>
  107221. * @copyright 2018 Photon Storm Ltd.
  107222. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107223. */
  107224. var SnapFloor = __webpack_require__(145);
  107225. var SnapCeil = __webpack_require__(352);
  107226. /**
  107227. * Returns the tiles in the given layer that are within the camera's viewport. This is used
  107228. * internally.
  107229. *
  107230. * @function Phaser.Tilemaps.Components.CullTiles
  107231. * @private
  107232. * @since 3.0.0
  107233. *
  107234. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  107235. * @param {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera to run the cull check against.
  107236. * @param {array} [outputArray] - [description]
  107237. *
  107238. * @return {Phaser.Tilemaps.Tile[]} An array of Tile objects.
  107239. */
  107240. var CullTiles = function (layer, camera, outputArray)
  107241. {
  107242. if (outputArray === undefined) { outputArray = []; }
  107243. outputArray.length = 0;
  107244. var tilemapLayer = layer.tilemapLayer;
  107245. var skipCull = tilemapLayer.skipCull;
  107246. var tileW = Math.floor(layer.tileWidth * tilemapLayer.scaleX);
  107247. var tileH = Math.floor(layer.tileHeight * tilemapLayer.scaleY);
  107248. var mapData = layer.data;
  107249. var mapWidth = layer.width;
  107250. var mapHeight = layer.height;
  107251. // Camera world view bounds, snapped for tile size
  107252. var boundsLeft = SnapFloor(camera.worldView.x, tileW) - (tilemapLayer.cullPaddingX * tileW);
  107253. var boundsRight = SnapCeil(camera.worldView.right, tileW) + (tilemapLayer.cullPaddingX * tileW);
  107254. var boundsTop = SnapFloor(camera.worldView.y, tileH) - (tilemapLayer.cullPaddingY * tileH);
  107255. var boundsBottom = SnapCeil(camera.worldView.bottom, tileH) + (tilemapLayer.cullPaddingY * tileH);
  107256. for (var y = 0; y < mapHeight; y++)
  107257. {
  107258. for (var x = 0; x < mapWidth; x++)
  107259. {
  107260. var tile = mapData[y][x];
  107261. if (!tile || tile.index === -1 || !tile.visible || tile.alpha === 0)
  107262. {
  107263. continue;
  107264. }
  107265. var tilePixelX = (tile.pixelX + tilemapLayer.x) * tilemapLayer.scaleX;
  107266. var tilePixelY = (tile.pixelY + tilemapLayer.y) * tilemapLayer.scaleY;
  107267. if (skipCull || (tilePixelX >= boundsLeft && tilePixelX + tileW <= boundsRight && tilePixelY >= boundsTop && tilePixelY + tileH <= boundsBottom))
  107268. {
  107269. outputArray.push(tile);
  107270. }
  107271. }
  107272. }
  107273. tilemapLayer.tilesDrawn = outputArray.length;
  107274. tilemapLayer.tilesTotal = mapWidth * mapHeight;
  107275. return outputArray;
  107276. };
  107277. module.exports = CullTiles;
  107278. /***/ }),
  107279. /* 671 */
  107280. /***/ (function(module, exports, __webpack_require__) {
  107281. /**
  107282. * @author Richard Davey <rich@photonstorm.com>
  107283. * @copyright 2018 Photon Storm Ltd.
  107284. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107285. */
  107286. var TileToWorldX = __webpack_require__(140);
  107287. var TileToWorldY = __webpack_require__(139);
  107288. var GetTilesWithin = __webpack_require__(23);
  107289. var ReplaceByIndex = __webpack_require__(327);
  107290. /**
  107291. * Creates a Sprite for every object matching the given tile indexes in the layer. You can
  107292. * optionally specify if each tile will be replaced with a new tile after the Sprite has been
  107293. * created. This is useful if you want to lay down special tiles in a level that are converted to
  107294. * Sprites, but want to replace the tile itself with a floor tile or similar once converted.
  107295. *
  107296. * @function Phaser.Tilemaps.Components.CreateFromTiles
  107297. * @private
  107298. * @since 3.0.0
  107299. *
  107300. * @param {(integer|array)} indexes - The tile index, or array of indexes, to create Sprites from.
  107301. * @param {(integer|array)} replacements - The tile index, or array of indexes, to change a converted
  107302. * tile to. Set to `null` to leave the tiles unchanged. If an array is given, it is assumed to be a
  107303. * one-to-one mapping with the indexes array.
  107304. * @param {object} spriteConfig - The config object to pass into the Sprite creator (i.e.
  107305. * scene.make.sprite).
  107306. * @param {Phaser.Scene} [scene=scene the map is within] - The Scene to create the Sprites within.
  107307. * @param {Phaser.Cameras.Scene2D.Camera} [camera=main camera] - The Camera to use when determining the world XY
  107308. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  107309. *
  107310. * @return {Phaser.GameObjects.Sprite[]} An array of the Sprites that were created.
  107311. */
  107312. var CreateFromTiles = function (indexes, replacements, spriteConfig, scene, camera, layer)
  107313. {
  107314. if (spriteConfig === undefined) { spriteConfig = {}; }
  107315. if (!Array.isArray(indexes)) { indexes = [ indexes ]; }
  107316. var tilemapLayer = layer.tilemapLayer;
  107317. if (scene === undefined) { scene = tilemapLayer.scene; }
  107318. if (camera === undefined) { camera = scene.cameras.main; }
  107319. var tiles = GetTilesWithin(0, 0, layer.width, layer.height, null, layer);
  107320. var sprites = [];
  107321. var i;
  107322. for (i = 0; i < tiles.length; i++)
  107323. {
  107324. var tile = tiles[i];
  107325. if (indexes.indexOf(tile.index) !== -1)
  107326. {
  107327. spriteConfig.x = TileToWorldX(tile.x, camera, layer);
  107328. spriteConfig.y = TileToWorldY(tile.y, camera, layer);
  107329. var sprite = scene.make.sprite(spriteConfig);
  107330. sprites.push(sprite);
  107331. }
  107332. }
  107333. if (typeof replacements === 'number')
  107334. {
  107335. // Assume 1 replacement for all types of tile given
  107336. for (i = 0; i < indexes.length; i++)
  107337. {
  107338. ReplaceByIndex(indexes[i], replacements, 0, 0, layer.width, layer.height, layer);
  107339. }
  107340. }
  107341. else if (Array.isArray(replacements))
  107342. {
  107343. // Assume 1 to 1 mapping with indexes array
  107344. for (i = 0; i < indexes.length; i++)
  107345. {
  107346. ReplaceByIndex(indexes[i], replacements[i], 0, 0, layer.width, layer.height, layer);
  107347. }
  107348. }
  107349. return sprites;
  107350. };
  107351. module.exports = CreateFromTiles;
  107352. /***/ }),
  107353. /* 672 */
  107354. /***/ (function(module, exports, __webpack_require__) {
  107355. /**
  107356. * @author Richard Davey <rich@photonstorm.com>
  107357. * @copyright 2018 Photon Storm Ltd.
  107358. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107359. */
  107360. var GetTilesWithin = __webpack_require__(23);
  107361. var CalculateFacesWithin = __webpack_require__(41);
  107362. /**
  107363. * Copies the tiles in the source rectangular area to a new destination (all specified in tile
  107364. * coordinates) within the layer. This copies all tile properties & recalculates collision
  107365. * information in the destination region.
  107366. *
  107367. * @function Phaser.Tilemaps.Components.Copy
  107368. * @private
  107369. * @since 3.0.0
  107370. *
  107371. * @param {integer} srcTileX - [description]
  107372. * @param {integer} srcTileY - [description]
  107373. * @param {integer} width - [description]
  107374. * @param {integer} height - [description]
  107375. * @param {integer} destTileX - [description]
  107376. * @param {integer} destTileY - [description]
  107377. * @param {boolean} [recalculateFaces=true] - [description]
  107378. * @param {Phaser.Tilemaps.LayerData} layer - The Tilemap Layer to act upon.
  107379. */
  107380. var Copy = function (srcTileX, srcTileY, width, height, destTileX, destTileY, recalculateFaces, layer)
  107381. {
  107382. if (srcTileX < 0) { srcTileX = 0; }
  107383. if (srcTileY < 0) { srcTileY = 0; }
  107384. if (recalculateFaces === undefined) { recalculateFaces = true; }
  107385. var srcTiles = GetTilesWithin(srcTileX, srcTileY, width, height, null, layer);
  107386. var offsetX = destTileX - srcTileX;
  107387. var offsetY = destTileY - srcTileY;
  107388. for (var i = 0; i < srcTiles.length; i++)
  107389. {
  107390. var tileX = srcTiles[i].x + offsetX;
  107391. var tileY = srcTiles[i].y + offsetY;
  107392. if (tileX >= 0 && tileX < layer.width && tileY >= 0 && tileY < layer.height)
  107393. {
  107394. if (layer.data[tileY][tileX])
  107395. {
  107396. layer.data[tileY][tileX].copy(srcTiles[i]);
  107397. }
  107398. }
  107399. }
  107400. if (recalculateFaces)
  107401. {
  107402. // Recalculate the faces within the destination area and neighboring tiles
  107403. CalculateFacesWithin(destTileX - 1, destTileY - 1, width + 2, height + 2, layer);
  107404. }
  107405. };
  107406. module.exports = Copy;
  107407. /***/ }),
  107408. /* 673 */
  107409. /***/ (function(module, exports, __webpack_require__) {
  107410. /**
  107411. * @author Richard Davey <rich@photonstorm.com>
  107412. * @copyright 2018 Photon Storm Ltd.
  107413. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107414. */
  107415. /**
  107416. * @namespace Phaser.Tilemaps
  107417. */
  107418. module.exports = {
  107419. Components: __webpack_require__(142),
  107420. Parsers: __webpack_require__(643),
  107421. Formats: __webpack_require__(27),
  107422. ImageCollection: __webpack_require__(320),
  107423. ParseToTilemap: __webpack_require__(221),
  107424. Tile: __webpack_require__(65),
  107425. Tilemap: __webpack_require__(316),
  107426. TilemapCreator: __webpack_require__(626),
  107427. TilemapFactory: __webpack_require__(625),
  107428. Tileset: __webpack_require__(138),
  107429. LayerData: __webpack_require__(104),
  107430. MapData: __webpack_require__(103),
  107431. ObjectLayer: __webpack_require__(318),
  107432. DynamicTilemapLayer: __webpack_require__(315),
  107433. StaticTilemapLayer: __webpack_require__(314)
  107434. };
  107435. /***/ }),
  107436. /* 674 */
  107437. /***/ (function(module, exports, __webpack_require__) {
  107438. /**
  107439. * @author Richard Davey <rich@photonstorm.com>
  107440. * @copyright 2018 Photon Storm Ltd.
  107441. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107442. */
  107443. /**
  107444. * @namespace Phaser.Renderer.WebGL.Pipelines
  107445. */
  107446. module.exports = {
  107447. BitmapMaskPipeline: __webpack_require__(254),
  107448. FlatTintPipeline: __webpack_require__(253),
  107449. ForwardDiffuseLightPipeline: __webpack_require__(151),
  107450. TextureTintPipeline: __webpack_require__(130)
  107451. };
  107452. /***/ }),
  107453. /* 675 */
  107454. /***/ (function(module, exports, __webpack_require__) {
  107455. /**
  107456. * @author Richard Davey <rich@photonstorm.com>
  107457. * @copyright 2018 Photon Storm Ltd.
  107458. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107459. */
  107460. /**
  107461. * @namespace Phaser.Renderer.WebGL
  107462. */
  107463. module.exports = {
  107464. Utils: __webpack_require__(21),
  107465. WebGLPipeline: __webpack_require__(84),
  107466. WebGLRenderer: __webpack_require__(256),
  107467. Pipelines: __webpack_require__(674),
  107468. // Constants
  107469. BYTE: 0,
  107470. SHORT: 1,
  107471. UNSIGNED_BYTE: 2,
  107472. UNSIGNED_SHORT: 3,
  107473. FLOAT: 4
  107474. };
  107475. /***/ }),
  107476. /* 676 */
  107477. /***/ (function(module, exports, __webpack_require__) {
  107478. /**
  107479. * @author Richard Davey <rich@photonstorm.com>
  107480. * @copyright 2018 Photon Storm Ltd.
  107481. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107482. */
  107483. /**
  107484. * @callback SnapshotCallback
  107485. *
  107486. * @param {HTMLImageElement} snapshot - [description]
  107487. */
  107488. /**
  107489. * @namespace Phaser.Renderer.Snapshot
  107490. */
  107491. module.exports = {
  107492. Canvas: __webpack_require__(259),
  107493. WebGL: __webpack_require__(255)
  107494. };
  107495. /***/ }),
  107496. /* 677 */
  107497. /***/ (function(module, exports, __webpack_require__) {
  107498. /**
  107499. * @author Richard Davey <rich@photonstorm.com>
  107500. * @copyright 2018 Photon Storm Ltd.
  107501. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107502. */
  107503. /**
  107504. * @namespace Phaser.Renderer.Canvas
  107505. */
  107506. module.exports = {
  107507. BlitImage: __webpack_require__(260),
  107508. CanvasRenderer: __webpack_require__(261),
  107509. DrawImage: __webpack_require__(258),
  107510. GetBlendModes: __webpack_require__(257)
  107511. };
  107512. /***/ }),
  107513. /* 678 */
  107514. /***/ (function(module, exports, __webpack_require__) {
  107515. /**
  107516. * @author Richard Davey <rich@photonstorm.com>
  107517. * @copyright 2018 Photon Storm Ltd.
  107518. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107519. */
  107520. /**
  107521. * @typedef {object} RendererConfig
  107522. *
  107523. * @property {boolean} clearBeforeRender - [description]
  107524. * @property {boolean} antialias - [description]
  107525. * @property {Phaser.Display.Color} backgroundColor - [description]
  107526. * @property {number} resolution - [description]
  107527. * @property {boolean} autoResize - [description]
  107528. * @property {boolean} roundPixels - [description]
  107529. */
  107530. /**
  107531. * @namespace Phaser.Renderer
  107532. */
  107533. module.exports = {
  107534. Canvas: __webpack_require__(677),
  107535. Snapshot: __webpack_require__(676),
  107536. WebGL: __webpack_require__(675)
  107537. };
  107538. /***/ }),
  107539. /* 679 */
  107540. /***/ (function(module, exports, __webpack_require__) {
  107541. /**
  107542. * The `Matter.World` module contains methods for creating and manipulating the world composite.
  107543. * A `Matter.World` is a `Matter.Composite` body, which is a collection of `Matter.Body`, `Matter.Constraint` and other `Matter.Composite`.
  107544. * A `Matter.World` has a few additional properties including `gravity` and `bounds`.
  107545. * It is important to use the functions in the `Matter.Composite` module to modify the world composite, rather than directly modifying its properties.
  107546. * There are also a few methods here that alias those in `Matter.Composite` for easier readability.
  107547. *
  107548. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  107549. *
  107550. * @class World
  107551. * @extends Composite
  107552. */
  107553. var World = {};
  107554. module.exports = World;
  107555. var Composite = __webpack_require__(226);
  107556. var Constraint = __webpack_require__(305);
  107557. var Common = __webpack_require__(42);
  107558. (function() {
  107559. /**
  107560. * Creates a new world composite. The options parameter is an object that specifies any properties you wish to override the defaults.
  107561. * See the properties section below for detailed information on what you can pass via the `options` object.
  107562. * @method create
  107563. * @constructor
  107564. * @param {} options
  107565. * @return {world} A new world
  107566. */
  107567. World.create = function(options) {
  107568. var composite = Composite.create();
  107569. var defaults = {
  107570. label: 'World',
  107571. gravity: {
  107572. x: 0,
  107573. y: 1,
  107574. scale: 0.001
  107575. },
  107576. bounds: {
  107577. min: { x: -Infinity, y: -Infinity },
  107578. max: { x: Infinity, y: Infinity }
  107579. }
  107580. };
  107581. return Common.extend(composite, defaults, options);
  107582. };
  107583. /*
  107584. *
  107585. * Properties Documentation
  107586. *
  107587. */
  107588. /**
  107589. * The gravity to apply on the world.
  107590. *
  107591. * @property gravity
  107592. * @type object
  107593. */
  107594. /**
  107595. * The gravity x component.
  107596. *
  107597. * @property gravity.x
  107598. * @type object
  107599. * @default 0
  107600. */
  107601. /**
  107602. * The gravity y component.
  107603. *
  107604. * @property gravity.y
  107605. * @type object
  107606. * @default 1
  107607. */
  107608. /**
  107609. * The gravity scale factor.
  107610. *
  107611. * @property gravity.scale
  107612. * @type object
  107613. * @default 0.001
  107614. */
  107615. /**
  107616. * A `Bounds` object that defines the world bounds for collision detection.
  107617. *
  107618. * @property bounds
  107619. * @type bounds
  107620. * @default { min: { x: -Infinity, y: -Infinity }, max: { x: Infinity, y: Infinity } }
  107621. */
  107622. // World is a Composite body
  107623. // see src/module/Outro.js for these aliases:
  107624. /**
  107625. * An alias for Composite.clear
  107626. * @method clear
  107627. * @param {world} world
  107628. * @param {boolean} keepStatic
  107629. */
  107630. /**
  107631. * An alias for Composite.add
  107632. * @method addComposite
  107633. * @param {world} world
  107634. * @param {composite} composite
  107635. * @return {world} The original world with the objects from composite added
  107636. */
  107637. /**
  107638. * An alias for Composite.addBody
  107639. * @method addBody
  107640. * @param {world} world
  107641. * @param {body} body
  107642. * @return {world} The original world with the body added
  107643. */
  107644. /**
  107645. * An alias for Composite.addConstraint
  107646. * @method addConstraint
  107647. * @param {world} world
  107648. * @param {constraint} constraint
  107649. * @return {world} The original world with the constraint added
  107650. */
  107651. })();
  107652. /***/ }),
  107653. /* 680 */
  107654. /***/ (function(module, exports, __webpack_require__) {
  107655. /**
  107656. * The `Matter.Plugin` module contains functions for registering and installing plugins on modules.
  107657. *
  107658. * @class Plugin
  107659. */
  107660. var Plugin = {};
  107661. module.exports = Plugin;
  107662. var Common = __webpack_require__(42);
  107663. (function() {
  107664. Plugin._registry = {};
  107665. /**
  107666. * Registers a plugin object so it can be resolved later by name.
  107667. * @method register
  107668. * @param plugin {} The plugin to register.
  107669. * @return {object} The plugin.
  107670. */
  107671. Plugin.register = function(plugin) {
  107672. if (!Plugin.isPlugin(plugin)) {
  107673. Common.warn('Plugin.register:', Plugin.toString(plugin), 'does not implement all required fields.');
  107674. }
  107675. if (plugin.name in Plugin._registry) {
  107676. var registered = Plugin._registry[plugin.name],
  107677. pluginVersion = Plugin.versionParse(plugin.version).number,
  107678. registeredVersion = Plugin.versionParse(registered.version).number;
  107679. if (pluginVersion > registeredVersion) {
  107680. Common.warn('Plugin.register:', Plugin.toString(registered), 'was upgraded to', Plugin.toString(plugin));
  107681. Plugin._registry[plugin.name] = plugin;
  107682. } else if (pluginVersion < registeredVersion) {
  107683. Common.warn('Plugin.register:', Plugin.toString(registered), 'can not be downgraded to', Plugin.toString(plugin));
  107684. } else if (plugin !== registered) {
  107685. Common.warn('Plugin.register:', Plugin.toString(plugin), 'is already registered to different plugin object');
  107686. }
  107687. } else {
  107688. Plugin._registry[plugin.name] = plugin;
  107689. }
  107690. return plugin;
  107691. };
  107692. /**
  107693. * Resolves a dependency to a plugin object from the registry if it exists.
  107694. * The `dependency` may contain a version, but only the name matters when resolving.
  107695. * @method resolve
  107696. * @param dependency {string} The dependency.
  107697. * @return {object} The plugin if resolved, otherwise `undefined`.
  107698. */
  107699. Plugin.resolve = function(dependency) {
  107700. return Plugin._registry[Plugin.dependencyParse(dependency).name];
  107701. };
  107702. /**
  107703. * Returns a pretty printed plugin name and version.
  107704. * @method toString
  107705. * @param plugin {} The plugin.
  107706. * @return {string} Pretty printed plugin name and version.
  107707. */
  107708. Plugin.toString = function(plugin) {
  107709. return typeof plugin === 'string' ? plugin : (plugin.name || 'anonymous') + '@' + (plugin.version || plugin.range || '0.0.0');
  107710. };
  107711. /**
  107712. * Returns `true` if the object meets the minimum standard to be considered a plugin.
  107713. * This means it must define the following properties:
  107714. * - `name`
  107715. * - `version`
  107716. * - `install`
  107717. * @method isPlugin
  107718. * @param obj {} The obj to test.
  107719. * @return {boolean} `true` if the object can be considered a plugin otherwise `false`.
  107720. */
  107721. Plugin.isPlugin = function(obj) {
  107722. return obj && obj.name && obj.version && obj.install;
  107723. };
  107724. /**
  107725. * Returns `true` if a plugin with the given `name` been installed on `module`.
  107726. * @method isUsed
  107727. * @param module {} The module.
  107728. * @param name {string} The plugin name.
  107729. * @return {boolean} `true` if a plugin with the given `name` been installed on `module`, otherwise `false`.
  107730. */
  107731. Plugin.isUsed = function(module, name) {
  107732. return module.used.indexOf(name) > -1;
  107733. };
  107734. /**
  107735. * Returns `true` if `plugin.for` is applicable to `module` by comparing against `module.name` and `module.version`.
  107736. * If `plugin.for` is not specified then it is assumed to be applicable.
  107737. * The value of `plugin.for` is a string of the format `'module-name'` or `'module-name@version'`.
  107738. * @method isFor
  107739. * @param plugin {} The plugin.
  107740. * @param module {} The module.
  107741. * @return {boolean} `true` if `plugin.for` is applicable to `module`, otherwise `false`.
  107742. */
  107743. Plugin.isFor = function(plugin, module) {
  107744. var parsed = plugin.for && Plugin.dependencyParse(plugin.for);
  107745. return !plugin.for || (module.name === parsed.name && Plugin.versionSatisfies(module.version, parsed.range));
  107746. };
  107747. /**
  107748. * Installs the plugins by calling `plugin.install` on each plugin specified in `plugins` if passed, otherwise `module.uses`.
  107749. * For installing plugins on `Matter` see the convenience function `Matter.use`.
  107750. * Plugins may be specified either by their name or a reference to the plugin object.
  107751. * Plugins themselves may specify further dependencies, but each plugin is installed only once.
  107752. * Order is important, a topological sort is performed to find the best resulting order of installation.
  107753. * This sorting attempts to satisfy every dependency's requested ordering, but may not be exact in all cases.
  107754. * This function logs the resulting status of each dependency in the console, along with any warnings.
  107755. * - A green tick ✅ indicates a dependency was resolved and installed.
  107756. * - An orange diamond 🔶 indicates a dependency was resolved but a warning was thrown for it or one if its dependencies.
  107757. * - A red cross ❌ indicates a dependency could not be resolved.
  107758. * Avoid calling this function multiple times on the same module unless you intend to manually control installation order.
  107759. * @method use
  107760. * @param module {} The module install plugins on.
  107761. * @param [plugins=module.uses] {} The plugins to install on module (optional, defaults to `module.uses`).
  107762. */
  107763. Plugin.use = function(module, plugins) {
  107764. module.uses = (module.uses || []).concat(plugins || []);
  107765. if (module.uses.length === 0) {
  107766. Common.warn('Plugin.use:', Plugin.toString(module), 'does not specify any dependencies to install.');
  107767. return;
  107768. }
  107769. var dependencies = Plugin.dependencies(module),
  107770. sortedDependencies = Common.topologicalSort(dependencies),
  107771. status = [];
  107772. for (var i = 0; i < sortedDependencies.length; i += 1) {
  107773. if (sortedDependencies[i] === module.name) {
  107774. continue;
  107775. }
  107776. var plugin = Plugin.resolve(sortedDependencies[i]);
  107777. if (!plugin) {
  107778. status.push('❌ ' + sortedDependencies[i]);
  107779. continue;
  107780. }
  107781. if (Plugin.isUsed(module, plugin.name)) {
  107782. continue;
  107783. }
  107784. if (!Plugin.isFor(plugin, module)) {
  107785. Common.warn('Plugin.use:', Plugin.toString(plugin), 'is for', plugin.for, 'but installed on', Plugin.toString(module) + '.');
  107786. plugin._warned = true;
  107787. }
  107788. if (plugin.install) {
  107789. plugin.install(module);
  107790. } else {
  107791. Common.warn('Plugin.use:', Plugin.toString(plugin), 'does not specify an install function.');
  107792. plugin._warned = true;
  107793. }
  107794. if (plugin._warned) {
  107795. status.push('🔶 ' + Plugin.toString(plugin));
  107796. delete plugin._warned;
  107797. } else {
  107798. status.push('✅ ' + Plugin.toString(plugin));
  107799. }
  107800. module.used.push(plugin.name);
  107801. }
  107802. if (status.length > 0 && !plugin.silent) {
  107803. Common.info(status.join(' '));
  107804. }
  107805. };
  107806. /**
  107807. * Recursively finds all of a module's dependencies and returns a flat dependency graph.
  107808. * @method dependencies
  107809. * @param module {} The module.
  107810. * @return {object} A dependency graph.
  107811. */
  107812. Plugin.dependencies = function(module, tracked) {
  107813. var parsedBase = Plugin.dependencyParse(module),
  107814. name = parsedBase.name;
  107815. tracked = tracked || {};
  107816. if (name in tracked) {
  107817. return;
  107818. }
  107819. module = Plugin.resolve(module) || module;
  107820. tracked[name] = Common.map(module.uses || [], function(dependency) {
  107821. if (Plugin.isPlugin(dependency)) {
  107822. Plugin.register(dependency);
  107823. }
  107824. var parsed = Plugin.dependencyParse(dependency),
  107825. resolved = Plugin.resolve(dependency);
  107826. if (resolved && !Plugin.versionSatisfies(resolved.version, parsed.range)) {
  107827. Common.warn(
  107828. 'Plugin.dependencies:', Plugin.toString(resolved), 'does not satisfy',
  107829. Plugin.toString(parsed), 'used by', Plugin.toString(parsedBase) + '.'
  107830. );
  107831. resolved._warned = true;
  107832. module._warned = true;
  107833. } else if (!resolved) {
  107834. Common.warn(
  107835. 'Plugin.dependencies:', Plugin.toString(dependency), 'used by',
  107836. Plugin.toString(parsedBase), 'could not be resolved.'
  107837. );
  107838. module._warned = true;
  107839. }
  107840. return parsed.name;
  107841. });
  107842. for (var i = 0; i < tracked[name].length; i += 1) {
  107843. Plugin.dependencies(tracked[name][i], tracked);
  107844. }
  107845. return tracked;
  107846. };
  107847. /**
  107848. * Parses a dependency string into its components.
  107849. * The `dependency` is a string of the format `'module-name'` or `'module-name@version'`.
  107850. * See documentation for `Plugin.versionParse` for a description of the format.
  107851. * This function can also handle dependencies that are already resolved (e.g. a module object).
  107852. * @method dependencyParse
  107853. * @param dependency {string} The dependency of the format `'module-name'` or `'module-name@version'`.
  107854. * @return {object} The dependency parsed into its components.
  107855. */
  107856. Plugin.dependencyParse = function(dependency) {
  107857. if (Common.isString(dependency)) {
  107858. var pattern = /^[\w-]+(@(\*|[\^~]?\d+\.\d+\.\d+(-[0-9A-Za-z-]+)?))?$/;
  107859. if (!pattern.test(dependency)) {
  107860. Common.warn('Plugin.dependencyParse:', dependency, 'is not a valid dependency string.');
  107861. }
  107862. return {
  107863. name: dependency.split('@')[0],
  107864. range: dependency.split('@')[1] || '*'
  107865. };
  107866. }
  107867. return {
  107868. name: dependency.name,
  107869. range: dependency.range || dependency.version
  107870. };
  107871. };
  107872. /**
  107873. * Parses a version string into its components.
  107874. * Versions are strictly of the format `x.y.z` (as in [semver](http://semver.org/)).
  107875. * Versions may optionally have a prerelease tag in the format `x.y.z-alpha`.
  107876. * Ranges are a strict subset of [npm ranges](https://docs.npmjs.com/misc/semver#advanced-range-syntax).
  107877. * Only the following range types are supported:
  107878. * - Tilde ranges e.g. `~1.2.3`
  107879. * - Caret ranges e.g. `^1.2.3`
  107880. * - Exact version e.g. `1.2.3`
  107881. * - Any version `*`
  107882. * @method versionParse
  107883. * @param range {string} The version string.
  107884. * @return {object} The version range parsed into its components.
  107885. */
  107886. Plugin.versionParse = function(range) {
  107887. var pattern = /^\*|[\^~]?\d+\.\d+\.\d+(-[0-9A-Za-z-]+)?$/;
  107888. if (!pattern.test(range)) {
  107889. Common.warn('Plugin.versionParse:', range, 'is not a valid version or range.');
  107890. }
  107891. var identifiers = range.split('-');
  107892. range = identifiers[0];
  107893. var isRange = isNaN(Number(range[0])),
  107894. version = isRange ? range.substr(1) : range,
  107895. parts = Common.map(version.split('.'), function(part) {
  107896. return Number(part);
  107897. });
  107898. return {
  107899. isRange: isRange,
  107900. version: version,
  107901. range: range,
  107902. operator: isRange ? range[0] : '',
  107903. parts: parts,
  107904. prerelease: identifiers[1],
  107905. number: parts[0] * 1e8 + parts[1] * 1e4 + parts[2]
  107906. };
  107907. };
  107908. /**
  107909. * Returns `true` if `version` satisfies the given `range`.
  107910. * See documentation for `Plugin.versionParse` for a description of the format.
  107911. * If a version or range is not specified, then any version (`*`) is assumed to satisfy.
  107912. * @method versionSatisfies
  107913. * @param version {string} The version string.
  107914. * @param range {string} The range string.
  107915. * @return {boolean} `true` if `version` satisfies `range`, otherwise `false`.
  107916. */
  107917. Plugin.versionSatisfies = function(version, range) {
  107918. range = range || '*';
  107919. var rangeParsed = Plugin.versionParse(range),
  107920. rangeParts = rangeParsed.parts,
  107921. versionParsed = Plugin.versionParse(version),
  107922. versionParts = versionParsed.parts;
  107923. if (rangeParsed.isRange) {
  107924. if (rangeParsed.operator === '*' || version === '*') {
  107925. return true;
  107926. }
  107927. if (rangeParsed.operator === '~') {
  107928. return versionParts[0] === rangeParts[0] && versionParts[1] === rangeParts[1] && versionParts[2] >= rangeParts[2];
  107929. }
  107930. if (rangeParsed.operator === '^') {
  107931. if (rangeParts[0] > 0) {
  107932. return versionParts[0] === rangeParts[0] && versionParsed.number >= rangeParsed.number;
  107933. }
  107934. if (rangeParts[1] > 0) {
  107935. return versionParts[1] === rangeParts[1] && versionParts[2] >= rangeParts[2];
  107936. }
  107937. return versionParts[2] === rangeParts[2];
  107938. }
  107939. }
  107940. return version === range || version === '*';
  107941. };
  107942. })();
  107943. /***/ }),
  107944. /* 681 */
  107945. /***/ (function(module, exports, __webpack_require__) {
  107946. /**
  107947. * @author Richard Davey <rich@photonstorm.com>
  107948. * @copyright 2018 Photon Storm Ltd.
  107949. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  107950. */
  107951. var Matter = __webpack_require__(1017);
  107952. Matter.Body = __webpack_require__(73);
  107953. Matter.Composite = __webpack_require__(226);
  107954. Matter.World = __webpack_require__(679);
  107955. Matter.Detector = __webpack_require__(683);
  107956. Matter.Grid = __webpack_require__(1016);
  107957. Matter.Pairs = __webpack_require__(1015);
  107958. Matter.Pair = __webpack_require__(615);
  107959. Matter.Query = __webpack_require__(1037);
  107960. Matter.Resolver = __webpack_require__(1014);
  107961. Matter.SAT = __webpack_require__(682);
  107962. Matter.Constraint = __webpack_require__(305);
  107963. Matter.Common = __webpack_require__(42);
  107964. Matter.Engine = __webpack_require__(1013);
  107965. Matter.Events = __webpack_require__(306);
  107966. Matter.Sleeping = __webpack_require__(336);
  107967. Matter.Plugin = __webpack_require__(680);
  107968. Matter.Bodies = __webpack_require__(171);
  107969. Matter.Composites = __webpack_require__(1020);
  107970. Matter.Axes = __webpack_require__(685);
  107971. Matter.Bounds = __webpack_require__(126);
  107972. Matter.Svg = __webpack_require__(1035);
  107973. Matter.Vector = __webpack_require__(106);
  107974. Matter.Vertices = __webpack_require__(127);
  107975. // aliases
  107976. Matter.World.add = Matter.Composite.add;
  107977. Matter.World.remove = Matter.Composite.remove;
  107978. Matter.World.addComposite = Matter.Composite.addComposite;
  107979. Matter.World.addBody = Matter.Composite.addBody;
  107980. Matter.World.addConstraint = Matter.Composite.addConstraint;
  107981. Matter.World.clear = Matter.Composite.clear;
  107982. module.exports = Matter;
  107983. /***/ }),
  107984. /* 682 */
  107985. /***/ (function(module, exports, __webpack_require__) {
  107986. /**
  107987. * The `Matter.SAT` module contains methods for detecting collisions using the Separating Axis Theorem.
  107988. *
  107989. * @class SAT
  107990. */
  107991. // TODO: true circles and curves
  107992. var SAT = {};
  107993. module.exports = SAT;
  107994. var Vertices = __webpack_require__(127);
  107995. var Vector = __webpack_require__(106);
  107996. (function() {
  107997. /**
  107998. * Detect collision between two bodies using the Separating Axis Theorem.
  107999. * @method collides
  108000. * @param {body} bodyA
  108001. * @param {body} bodyB
  108002. * @param {collision} previousCollision
  108003. * @return {collision} collision
  108004. */
  108005. SAT.collides = function(bodyA, bodyB, previousCollision) {
  108006. var overlapAB,
  108007. overlapBA,
  108008. minOverlap,
  108009. collision,
  108010. canReusePrevCol = false;
  108011. if (previousCollision) {
  108012. // estimate total motion
  108013. var parentA = bodyA.parent,
  108014. parentB = bodyB.parent,
  108015. motion = parentA.speed * parentA.speed + parentA.angularSpeed * parentA.angularSpeed
  108016. + parentB.speed * parentB.speed + parentB.angularSpeed * parentB.angularSpeed;
  108017. // we may be able to (partially) reuse collision result
  108018. // but only safe if collision was resting
  108019. canReusePrevCol = previousCollision && previousCollision.collided && motion < 0.2;
  108020. // reuse collision object
  108021. collision = previousCollision;
  108022. } else {
  108023. collision = { collided: false, bodyA: bodyA, bodyB: bodyB };
  108024. }
  108025. if (previousCollision && canReusePrevCol) {
  108026. // if we can reuse the collision result
  108027. // we only need to test the previously found axis
  108028. var axisBodyA = collision.axisBody,
  108029. axisBodyB = axisBodyA === bodyA ? bodyB : bodyA,
  108030. axes = [axisBodyA.axes[previousCollision.axisNumber]];
  108031. minOverlap = _overlapAxes(axisBodyA.vertices, axisBodyB.vertices, axes);
  108032. collision.reused = true;
  108033. if (minOverlap.overlap <= 0) {
  108034. collision.collided = false;
  108035. return collision;
  108036. }
  108037. } else {
  108038. // if we can't reuse a result, perform a full SAT test
  108039. overlapAB = _overlapAxes(bodyA.vertices, bodyB.vertices, bodyA.axes);
  108040. if (overlapAB.overlap <= 0) {
  108041. collision.collided = false;
  108042. return collision;
  108043. }
  108044. overlapBA = _overlapAxes(bodyB.vertices, bodyA.vertices, bodyB.axes);
  108045. if (overlapBA.overlap <= 0) {
  108046. collision.collided = false;
  108047. return collision;
  108048. }
  108049. if (overlapAB.overlap < overlapBA.overlap) {
  108050. minOverlap = overlapAB;
  108051. collision.axisBody = bodyA;
  108052. } else {
  108053. minOverlap = overlapBA;
  108054. collision.axisBody = bodyB;
  108055. }
  108056. // important for reuse later
  108057. collision.axisNumber = minOverlap.axisNumber;
  108058. }
  108059. collision.bodyA = bodyA.id < bodyB.id ? bodyA : bodyB;
  108060. collision.bodyB = bodyA.id < bodyB.id ? bodyB : bodyA;
  108061. collision.collided = true;
  108062. collision.depth = minOverlap.overlap;
  108063. collision.parentA = collision.bodyA.parent;
  108064. collision.parentB = collision.bodyB.parent;
  108065. bodyA = collision.bodyA;
  108066. bodyB = collision.bodyB;
  108067. // ensure normal is facing away from bodyA
  108068. if (Vector.dot(minOverlap.axis, Vector.sub(bodyB.position, bodyA.position)) < 0) {
  108069. collision.normal = {
  108070. x: minOverlap.axis.x,
  108071. y: minOverlap.axis.y
  108072. };
  108073. } else {
  108074. collision.normal = {
  108075. x: -minOverlap.axis.x,
  108076. y: -minOverlap.axis.y
  108077. };
  108078. }
  108079. collision.tangent = Vector.perp(collision.normal);
  108080. collision.penetration = collision.penetration || {};
  108081. collision.penetration.x = collision.normal.x * collision.depth;
  108082. collision.penetration.y = collision.normal.y * collision.depth;
  108083. // find support points, there is always either exactly one or two
  108084. var verticesB = _findSupports(bodyA, bodyB, collision.normal),
  108085. supports = [];
  108086. // find the supports from bodyB that are inside bodyA
  108087. if (Vertices.contains(bodyA.vertices, verticesB[0]))
  108088. supports.push(verticesB[0]);
  108089. if (Vertices.contains(bodyA.vertices, verticesB[1]))
  108090. supports.push(verticesB[1]);
  108091. // find the supports from bodyA that are inside bodyB
  108092. if (supports.length < 2) {
  108093. var verticesA = _findSupports(bodyB, bodyA, Vector.neg(collision.normal));
  108094. if (Vertices.contains(bodyB.vertices, verticesA[0]))
  108095. supports.push(verticesA[0]);
  108096. if (supports.length < 2 && Vertices.contains(bodyB.vertices, verticesA[1]))
  108097. supports.push(verticesA[1]);
  108098. }
  108099. // account for the edge case of overlapping but no vertex containment
  108100. if (supports.length < 1)
  108101. supports = [verticesB[0]];
  108102. collision.supports = supports;
  108103. return collision;
  108104. };
  108105. /**
  108106. * Find the overlap between two sets of vertices.
  108107. * @method _overlapAxes
  108108. * @private
  108109. * @param {} verticesA
  108110. * @param {} verticesB
  108111. * @param {} axes
  108112. * @return result
  108113. */
  108114. var _overlapAxes = function(verticesA, verticesB, axes) {
  108115. var projectionA = Vector._temp[0],
  108116. projectionB = Vector._temp[1],
  108117. result = { overlap: Number.MAX_VALUE },
  108118. overlap,
  108119. axis;
  108120. for (var i = 0; i < axes.length; i++) {
  108121. axis = axes[i];
  108122. _projectToAxis(projectionA, verticesA, axis);
  108123. _projectToAxis(projectionB, verticesB, axis);
  108124. overlap = Math.min(projectionA.max - projectionB.min, projectionB.max - projectionA.min);
  108125. if (overlap <= 0) {
  108126. result.overlap = overlap;
  108127. return result;
  108128. }
  108129. if (overlap < result.overlap) {
  108130. result.overlap = overlap;
  108131. result.axis = axis;
  108132. result.axisNumber = i;
  108133. }
  108134. }
  108135. return result;
  108136. };
  108137. /**
  108138. * Projects vertices on an axis and returns an interval.
  108139. * @method _projectToAxis
  108140. * @private
  108141. * @param {} projection
  108142. * @param {} vertices
  108143. * @param {} axis
  108144. */
  108145. var _projectToAxis = function(projection, vertices, axis) {
  108146. var min = Vector.dot(vertices[0], axis),
  108147. max = min;
  108148. for (var i = 1; i < vertices.length; i += 1) {
  108149. var dot = Vector.dot(vertices[i], axis);
  108150. if (dot > max) {
  108151. max = dot;
  108152. } else if (dot < min) {
  108153. min = dot;
  108154. }
  108155. }
  108156. projection.min = min;
  108157. projection.max = max;
  108158. };
  108159. /**
  108160. * Finds supporting vertices given two bodies along a given direction using hill-climbing.
  108161. * @method _findSupports
  108162. * @private
  108163. * @param {} bodyA
  108164. * @param {} bodyB
  108165. * @param {} normal
  108166. * @return [vector]
  108167. */
  108168. var _findSupports = function(bodyA, bodyB, normal) {
  108169. var nearestDistance = Number.MAX_VALUE,
  108170. vertexToBody = Vector._temp[0],
  108171. vertices = bodyB.vertices,
  108172. bodyAPosition = bodyA.position,
  108173. distance,
  108174. vertex,
  108175. vertexA,
  108176. vertexB;
  108177. // find closest vertex on bodyB
  108178. for (var i = 0; i < vertices.length; i++) {
  108179. vertex = vertices[i];
  108180. vertexToBody.x = vertex.x - bodyAPosition.x;
  108181. vertexToBody.y = vertex.y - bodyAPosition.y;
  108182. distance = -Vector.dot(normal, vertexToBody);
  108183. if (distance < nearestDistance) {
  108184. nearestDistance = distance;
  108185. vertexA = vertex;
  108186. }
  108187. }
  108188. // find next closest vertex using the two connected to it
  108189. var prevIndex = vertexA.index - 1 >= 0 ? vertexA.index - 1 : vertices.length - 1;
  108190. vertex = vertices[prevIndex];
  108191. vertexToBody.x = vertex.x - bodyAPosition.x;
  108192. vertexToBody.y = vertex.y - bodyAPosition.y;
  108193. nearestDistance = -Vector.dot(normal, vertexToBody);
  108194. vertexB = vertex;
  108195. var nextIndex = (vertexA.index + 1) % vertices.length;
  108196. vertex = vertices[nextIndex];
  108197. vertexToBody.x = vertex.x - bodyAPosition.x;
  108198. vertexToBody.y = vertex.y - bodyAPosition.y;
  108199. distance = -Vector.dot(normal, vertexToBody);
  108200. if (distance < nearestDistance) {
  108201. vertexB = vertex;
  108202. }
  108203. return [vertexA, vertexB];
  108204. };
  108205. })();
  108206. /***/ }),
  108207. /* 683 */
  108208. /***/ (function(module, exports, __webpack_require__) {
  108209. /**
  108210. * The `Matter.Detector` module contains methods for detecting collisions given a set of pairs.
  108211. *
  108212. * @class Detector
  108213. */
  108214. // TODO: speculative contacts
  108215. var Detector = {};
  108216. module.exports = Detector;
  108217. var SAT = __webpack_require__(682);
  108218. var Pair = __webpack_require__(615);
  108219. var Bounds = __webpack_require__(126);
  108220. (function() {
  108221. /**
  108222. * Finds all collisions given a list of pairs.
  108223. * @method collisions
  108224. * @param {pair[]} broadphasePairs
  108225. * @param {engine} engine
  108226. * @return {array} collisions
  108227. */
  108228. Detector.collisions = function(broadphasePairs, engine) {
  108229. var collisions = [],
  108230. pairsTable = engine.pairs.table;
  108231. // @if DEBUG
  108232. var metrics = engine.metrics;
  108233. // @endif
  108234. for (var i = 0; i < broadphasePairs.length; i++) {
  108235. var bodyA = broadphasePairs[i][0],
  108236. bodyB = broadphasePairs[i][1];
  108237. if ((bodyA.isStatic || bodyA.isSleeping) && (bodyB.isStatic || bodyB.isSleeping))
  108238. continue;
  108239. if (!Detector.canCollide(bodyA.collisionFilter, bodyB.collisionFilter))
  108240. continue;
  108241. // @if DEBUG
  108242. metrics.midphaseTests += 1;
  108243. // @endif
  108244. // mid phase
  108245. if (Bounds.overlaps(bodyA.bounds, bodyB.bounds)) {
  108246. for (var j = bodyA.parts.length > 1 ? 1 : 0; j < bodyA.parts.length; j++) {
  108247. var partA = bodyA.parts[j];
  108248. for (var k = bodyB.parts.length > 1 ? 1 : 0; k < bodyB.parts.length; k++) {
  108249. var partB = bodyB.parts[k];
  108250. if ((partA === bodyA && partB === bodyB) || Bounds.overlaps(partA.bounds, partB.bounds)) {
  108251. // find a previous collision we could reuse
  108252. var pairId = Pair.id(partA, partB),
  108253. pair = pairsTable[pairId],
  108254. previousCollision;
  108255. if (pair && pair.isActive) {
  108256. previousCollision = pair.collision;
  108257. } else {
  108258. previousCollision = null;
  108259. }
  108260. // narrow phase
  108261. var collision = SAT.collides(partA, partB, previousCollision);
  108262. // @if DEBUG
  108263. metrics.narrowphaseTests += 1;
  108264. if (collision.reused)
  108265. metrics.narrowReuseCount += 1;
  108266. // @endif
  108267. if (collision.collided) {
  108268. collisions.push(collision);
  108269. // @if DEBUG
  108270. metrics.narrowDetections += 1;
  108271. // @endif
  108272. }
  108273. }
  108274. }
  108275. }
  108276. }
  108277. }
  108278. return collisions;
  108279. };
  108280. /**
  108281. * Returns `true` if both supplied collision filters will allow a collision to occur.
  108282. * See `body.collisionFilter` for more information.
  108283. * @method canCollide
  108284. * @param {} filterA
  108285. * @param {} filterB
  108286. * @return {bool} `true` if collision can occur
  108287. */
  108288. Detector.canCollide = function(filterA, filterB) {
  108289. if (filterA.group === filterB.group && filterA.group !== 0)
  108290. return filterA.group > 0;
  108291. return (filterA.mask & filterB.category) !== 0 && (filterB.mask & filterA.category) !== 0;
  108292. };
  108293. })();
  108294. /***/ }),
  108295. /* 684 */
  108296. /***/ (function(module, exports, __webpack_require__) {
  108297. /**
  108298. * @author Richard Davey <rich@photonstorm.com>
  108299. * @copyright 2018 Photon Storm Ltd.
  108300. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108301. */
  108302. var Bodies = __webpack_require__(171);
  108303. var Body = __webpack_require__(73);
  108304. var Class = __webpack_require__(0);
  108305. var Components = __webpack_require__(616);
  108306. var GetFastValue = __webpack_require__(1);
  108307. var HasValue = __webpack_require__(111);
  108308. var Vertices = __webpack_require__(127);
  108309. /**
  108310. * @classdesc
  108311. * A wrapper around a Tile that provides access to a corresponding Matter body. A tile can only
  108312. * have one Matter body associated with it. You can either pass in an existing Matter body for
  108313. * the tile or allow the constructor to create the corresponding body for you. If the Tile has a
  108314. * collision group (defined in Tiled), those shapes will be used to create the body. If not, the
  108315. * tile's rectangle bounding box will be used.
  108316. *
  108317. * The corresponding body will be accessible on the Tile itself via Tile.physics.matterBody.
  108318. *
  108319. * Note: not all Tiled collision shapes are supported. See
  108320. * Phaser.Physics.Matter.TileBody#setFromTileCollision for more information.
  108321. *
  108322. * @class TileBody
  108323. * @memberOf Phaser.Physics.Matter
  108324. * @constructor
  108325. * @since 3.0.0
  108326. *
  108327. * @extends Phaser.Physics.Matter.Components.Bounce
  108328. * @extends Phaser.Physics.Matter.Components.Collision
  108329. * @extends Phaser.Physics.Matter.Components.Friction
  108330. * @extends Phaser.Physics.Matter.Components.Gravity
  108331. * @extends Phaser.Physics.Matter.Components.Mass
  108332. * @extends Phaser.Physics.Matter.Components.Sensor
  108333. * @extends Phaser.Physics.Matter.Components.Sleep
  108334. * @extends Phaser.Physics.Matter.Components.Static
  108335. *
  108336. * @param {Phaser.Physics.Matter.World} world - [description]
  108337. * @param {Phaser.Tilemaps.Tile} tile - The target tile that should have a Matter body.
  108338. * @param {object} [options] - Options to be used when creating the Matter body. See
  108339. * Phaser.Physics.Matter.Matter.Body for a list of what Matter accepts.
  108340. * @param {Phaser.Physics.Matter.Matter.Body} [options.body=null] - An existing Matter body to
  108341. * be used instead of creating a new one.
  108342. * @param {boolean} [options.isStatic=true] - Whether or not the newly created body should be
  108343. * made static. This defaults to true since typically tiles should not be moved.
  108344. * @param {boolean} [options.addToWorld=true] - Whether or not to add the newly created body (or
  108345. * existing body if options.body is used) to the Matter world.
  108346. */
  108347. var MatterTileBody = new Class({
  108348. Mixins: [
  108349. Components.Bounce,
  108350. Components.Collision,
  108351. Components.Friction,
  108352. Components.Gravity,
  108353. Components.Mass,
  108354. Components.Sensor,
  108355. Components.Sleep,
  108356. Components.Static
  108357. ],
  108358. initialize:
  108359. function MatterTileBody (world, tile, options)
  108360. {
  108361. /**
  108362. * The tile object the body is associated with.
  108363. *
  108364. * @name Phaser.Physics.Matter.TileBody#tile
  108365. * @type {Phaser.Tilemaps.Tile}
  108366. * @since 3.0.0
  108367. */
  108368. this.tile = tile;
  108369. /**
  108370. * The Matter world the body exists within.
  108371. *
  108372. * @name Phaser.Physics.Matter.TileBody#world
  108373. * @type {Phaser.Physics.Matter.World}
  108374. * @since 3.0.0
  108375. */
  108376. this.world = world;
  108377. // Install a reference to 'this' on the tile and ensure there can only be one matter body
  108378. // associated with the tile
  108379. if (tile.physics.matterBody)
  108380. {
  108381. tile.physics.matterBody.destroy();
  108382. }
  108383. tile.physics.matterBody = this;
  108384. // Set the body either from an existing body (if provided), the shapes in the tileset
  108385. // collision layer (if it exists) or a rectangle matching the tile.
  108386. var body = GetFastValue(options, 'body', null);
  108387. var addToWorld = GetFastValue(options, 'addToWorld', true);
  108388. if (!body)
  108389. {
  108390. var collisionGroup = tile.getCollisionGroup();
  108391. var collisionObjects = GetFastValue(collisionGroup, 'objects', []);
  108392. if (collisionObjects.length > 0)
  108393. {
  108394. this.setFromTileCollision(options);
  108395. }
  108396. else
  108397. {
  108398. this.setFromTileRectangle(options);
  108399. }
  108400. }
  108401. else
  108402. {
  108403. this.setBody(body, addToWorld);
  108404. }
  108405. },
  108406. /**
  108407. * Sets the current body to a rectangle that matches the bounds of the tile.
  108408. *
  108409. * @method Phaser.Physics.Matter.TileBody#setFromTileRectangle
  108410. * @since 3.0.0
  108411. *
  108412. * @param {object} [options] - Options to be used when creating the Matter body. See MatterJS.Body for a list of what Matter accepts.
  108413. * @param {boolean} [options.isStatic=true] - Whether or not the newly created body should be
  108414. * made static. This defaults to true since typically tiles should not be moved.
  108415. * @param {boolean} [options.addToWorld=true] - Whether or not to add the newly created body (or
  108416. * existing body if options.body is used) to the Matter world.
  108417. *
  108418. * @return {Phaser.Physics.Matter.TileBody} This TileBody object.
  108419. */
  108420. setFromTileRectangle: function (options)
  108421. {
  108422. if (options === undefined) { options = {}; }
  108423. if (!HasValue(options, 'isStatic')) { options.isStatic = true; }
  108424. if (!HasValue(options, 'addToWorld')) { options.addToWorld = true; }
  108425. var bounds = this.tile.getBounds();
  108426. var cx = bounds.x + (bounds.width / 2);
  108427. var cy = bounds.y + (bounds.height / 2);
  108428. var body = Bodies.rectangle(cx, cy, bounds.width, bounds.height, options);
  108429. this.setBody(body, options.addToWorld);
  108430. return this;
  108431. },
  108432. /**
  108433. * Sets the current body from the collision group associated with the Tile. This is typically
  108434. * set up in Tiled's collision editor.
  108435. *
  108436. * Note: Matter doesn't support all shapes from Tiled. Rectangles and polygons are directly
  108437. * supported. Ellipses are converted into circle bodies. Polylines are treated as if they are
  108438. * closed polygons. If a tile has multiple shapes, a multi-part body will be created. Concave
  108439. * shapes are supported if poly-decomp library is included. Decomposition is not guaranteed to
  108440. * work for complex shapes (e.g. holes), so it's often best to manually decompose a concave
  108441. * polygon into multiple convex polygons yourself.
  108442. *
  108443. * @method Phaser.Physics.Matter.TileBody#setFromTileCollision
  108444. * @since 3.0.0
  108445. *
  108446. * @param {object} [options] - Options to be used when creating the Matter body. See MatterJS.Body for a list of what Matter accepts.
  108447. * @param {boolean} [options.isStatic=true] - Whether or not the newly created body should be
  108448. * made static. This defaults to true since typically tiles should not be moved.
  108449. * @param {boolean} [options.addToWorld=true] - Whether or not to add the newly created body (or
  108450. * existing body if options.body is used) to the Matter world.
  108451. *
  108452. * @return {Phaser.Physics.Matter.TileBody} This TileBody object.
  108453. */
  108454. setFromTileCollision: function (options)
  108455. {
  108456. if (options === undefined) { options = {}; }
  108457. if (!HasValue(options, 'isStatic')) { options.isStatic = true; }
  108458. if (!HasValue(options, 'addToWorld')) { options.addToWorld = true; }
  108459. var sx = this.tile.tilemapLayer.scaleX;
  108460. var sy = this.tile.tilemapLayer.scaleY;
  108461. var tileX = this.tile.getLeft();
  108462. var tileY = this.tile.getTop();
  108463. var collisionGroup = this.tile.getCollisionGroup();
  108464. var collisionObjects = GetFastValue(collisionGroup, 'objects', []);
  108465. var parts = [];
  108466. for (var i = 0; i < collisionObjects.length; i++)
  108467. {
  108468. var object = collisionObjects[i];
  108469. var ox = tileX + (object.x * sx);
  108470. var oy = tileY + (object.y * sy);
  108471. var ow = object.width * sx;
  108472. var oh = object.height * sy;
  108473. var body = null;
  108474. if (object.rectangle)
  108475. {
  108476. body = Bodies.rectangle(ox + ow / 2, oy + oh / 2, ow, oh, options);
  108477. }
  108478. else if (object.ellipse)
  108479. {
  108480. body = Bodies.circle(ox + ow / 2, oy + oh / 2, ow / 2, options);
  108481. }
  108482. else if (object.polygon || object.polyline)
  108483. {
  108484. // Polygons and polylines are both treated as closed polygons
  108485. var originalPoints = object.polygon ? object.polygon : object.polyline;
  108486. var points = originalPoints.map(function (p)
  108487. {
  108488. return { x: p.x * sx, y: p.y * sy };
  108489. });
  108490. var vertices = Vertices.create(points);
  108491. // Points are relative to the object's origin (first point placed in Tiled), but
  108492. // matter expects points to be relative to the center of mass. This only applies to
  108493. // convex shapes. When a concave shape is decomposed, multiple parts are created and
  108494. // the individual parts are positioned relative to (ox, oy).
  108495. if (Vertices.isConvex(points))
  108496. {
  108497. var center = Vertices.centre(vertices);
  108498. ox += center.x;
  108499. oy += center.y;
  108500. }
  108501. body = Bodies.fromVertices(ox, oy, vertices, options);
  108502. }
  108503. if (body)
  108504. {
  108505. parts.push(body);
  108506. }
  108507. }
  108508. if (parts.length === 1)
  108509. {
  108510. this.setBody(parts[0], options.addToWorld);
  108511. }
  108512. else if (parts.length > 1)
  108513. {
  108514. options.parts = parts;
  108515. this.setBody(Body.create(options), options.addToWorld);
  108516. }
  108517. return this;
  108518. },
  108519. /**
  108520. * Sets the current body to the given body. This will remove the previous body, if one already
  108521. * exists.
  108522. *
  108523. * @method Phaser.Physics.Matter.TileBody#setBody
  108524. * @since 3.0.0
  108525. *
  108526. * @param {MatterJS.Body} body - The new Matter body to use.
  108527. * @param {boolean} [addToWorld=true] - Whether or not to add the body to the Matter world.
  108528. *
  108529. * @return {Phaser.Physics.Matter.TileBody} This TileBody object.
  108530. */
  108531. setBody: function (body, addToWorld)
  108532. {
  108533. if (addToWorld === undefined) { addToWorld = true; }
  108534. if (this.body)
  108535. {
  108536. this.removeBody();
  108537. }
  108538. this.body = body;
  108539. this.body.gameObject = this;
  108540. if (addToWorld)
  108541. {
  108542. this.world.add(this.body);
  108543. }
  108544. return this;
  108545. },
  108546. /**
  108547. * Removes the current body from the TileBody and from the Matter world
  108548. *
  108549. * @method Phaser.Physics.Matter.TileBody#removeBody
  108550. * @since 3.0.0
  108551. *
  108552. * @return {Phaser.Physics.Matter.TileBody} This TileBody object.
  108553. */
  108554. removeBody: function ()
  108555. {
  108556. if (this.body)
  108557. {
  108558. this.world.remove(this.body);
  108559. this.body.gameObject = undefined;
  108560. this.body = undefined;
  108561. }
  108562. return this;
  108563. },
  108564. /**
  108565. * Removes the current body from the tile and the world.
  108566. *
  108567. * @method Phaser.Physics.Matter.TileBody#destroy
  108568. * @since 3.0.0
  108569. *
  108570. * @return {Phaser.Physics.Matter.TileBody} This TileBody object.
  108571. */
  108572. destroy: function ()
  108573. {
  108574. this.removeBody();
  108575. this.tile.physics.matterBody = undefined;
  108576. }
  108577. });
  108578. module.exports = MatterTileBody;
  108579. /***/ }),
  108580. /* 685 */
  108581. /***/ (function(module, exports, __webpack_require__) {
  108582. /**
  108583. * The `Matter.Axes` module contains methods for creating and manipulating sets of axes.
  108584. *
  108585. * @class Axes
  108586. */
  108587. var Axes = {};
  108588. module.exports = Axes;
  108589. var Vector = __webpack_require__(106);
  108590. var Common = __webpack_require__(42);
  108591. (function() {
  108592. /**
  108593. * Creates a new set of axes from the given vertices.
  108594. * @method fromVertices
  108595. * @param {vertices} vertices
  108596. * @return {axes} A new axes from the given vertices
  108597. */
  108598. Axes.fromVertices = function(vertices) {
  108599. var axes = {};
  108600. // find the unique axes, using edge normal gradients
  108601. for (var i = 0; i < vertices.length; i++) {
  108602. var j = (i + 1) % vertices.length,
  108603. normal = Vector.normalise({
  108604. x: vertices[j].y - vertices[i].y,
  108605. y: vertices[i].x - vertices[j].x
  108606. }),
  108607. gradient = (normal.y === 0) ? Infinity : (normal.x / normal.y);
  108608. // limit precision
  108609. gradient = gradient.toFixed(3).toString();
  108610. axes[gradient] = normal;
  108611. }
  108612. return Common.values(axes);
  108613. };
  108614. /**
  108615. * Rotates a set of axes by the given angle.
  108616. * @method rotate
  108617. * @param {axes} axes
  108618. * @param {number} angle
  108619. */
  108620. Axes.rotate = function(axes, angle) {
  108621. if (angle === 0)
  108622. return;
  108623. var cos = Math.cos(angle),
  108624. sin = Math.sin(angle);
  108625. for (var i = 0; i < axes.length; i++) {
  108626. var axis = axes[i],
  108627. xx;
  108628. xx = axis.x * cos - axis.y * sin;
  108629. axis.y = axis.x * sin + axis.y * cos;
  108630. axis.x = xx;
  108631. }
  108632. };
  108633. })();
  108634. /***/ }),
  108635. /* 686 */
  108636. /***/ (function(module, exports, __webpack_require__) {
  108637. /**
  108638. * @author Richard Davey <rich@photonstorm.com>
  108639. * @copyright 2018 Photon Storm Ltd.
  108640. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108641. */
  108642. /**
  108643. * @namespace Phaser.Physics.Impact.Components
  108644. */
  108645. module.exports = {
  108646. Acceleration: __webpack_require__(1069),
  108647. BodyScale: __webpack_require__(1068),
  108648. BodyType: __webpack_require__(1067),
  108649. Bounce: __webpack_require__(1066),
  108650. CheckAgainst: __webpack_require__(1065),
  108651. Collides: __webpack_require__(1064),
  108652. Debug: __webpack_require__(1063),
  108653. Friction: __webpack_require__(1062),
  108654. Gravity: __webpack_require__(1061),
  108655. Offset: __webpack_require__(1060),
  108656. SetGameObject: __webpack_require__(1059),
  108657. Velocity: __webpack_require__(1058)
  108658. };
  108659. /***/ }),
  108660. /* 687 */
  108661. /***/ (function(module, exports, __webpack_require__) {
  108662. /**
  108663. * @author Richard Davey <rich@photonstorm.com>
  108664. * @copyright 2018 Photon Storm Ltd.
  108665. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108666. */
  108667. var GetOverlapY = __webpack_require__(341);
  108668. /**
  108669. * [description]
  108670. *
  108671. * @function Phaser.Physics.Arcade.SeparateY
  108672. * @since 3.0.0
  108673. *
  108674. * @param {Phaser.Physics.Arcade.Body} body1 - [description]
  108675. * @param {Phaser.Physics.Arcade.Body} body2 - [description]
  108676. * @param {boolean} overlapOnly - [description]
  108677. * @param {number} bias - [description]
  108678. *
  108679. * @return {boolean} [description]
  108680. */
  108681. var SeparateY = function (body1, body2, overlapOnly, bias)
  108682. {
  108683. var overlap = GetOverlapY(body1, body2, overlapOnly, bias);
  108684. // Can't separate two immovable bodies, or a body with its own custom separation logic
  108685. if (overlapOnly || overlap === 0 || (body1.immovable && body2.immovable) || body1.customSeparateY || body2.customSeparateY)
  108686. {
  108687. // return true if there was some overlap, otherwise false
  108688. return (overlap !== 0) || (body1.embedded && body2.embedded);
  108689. }
  108690. // Adjust their positions and velocities accordingly (if there was any overlap)
  108691. var v1 = body1.velocity.y;
  108692. var v2 = body2.velocity.y;
  108693. if (!body1.immovable && !body2.immovable)
  108694. {
  108695. overlap *= 0.5;
  108696. body1.y -= overlap;
  108697. body2.y += overlap;
  108698. var nv1 = Math.sqrt((v2 * v2 * body2.mass) / body1.mass) * ((v2 > 0) ? 1 : -1);
  108699. var nv2 = Math.sqrt((v1 * v1 * body1.mass) / body2.mass) * ((v1 > 0) ? 1 : -1);
  108700. var avg = (nv1 + nv2) * 0.5;
  108701. nv1 -= avg;
  108702. nv2 -= avg;
  108703. body1.velocity.y = avg + nv1 * body1.bounce.y;
  108704. body2.velocity.y = avg + nv2 * body2.bounce.y;
  108705. }
  108706. else if (!body1.immovable)
  108707. {
  108708. body1.y -= overlap;
  108709. body1.velocity.y = v2 - v1 * body1.bounce.y;
  108710. // This is special case code that handles things like horizontal moving platforms you can ride
  108711. if (body2.moves)
  108712. {
  108713. body1.x += (body2.x - body2.prev.x) * body2.friction.x;
  108714. }
  108715. }
  108716. else
  108717. {
  108718. body2.y += overlap;
  108719. body2.velocity.y = v1 - v2 * body2.bounce.y;
  108720. // This is special case code that handles things like horizontal moving platforms you can ride
  108721. if (body1.moves)
  108722. {
  108723. body2.x += (body1.x - body1.prev.x) * body1.friction.x;
  108724. }
  108725. }
  108726. // If we got this far then there WAS overlap, and separation is complete, so return true
  108727. return true;
  108728. };
  108729. module.exports = SeparateY;
  108730. /***/ }),
  108731. /* 688 */
  108732. /***/ (function(module, exports, __webpack_require__) {
  108733. /**
  108734. * @author Richard Davey <rich@photonstorm.com>
  108735. * @copyright 2018 Photon Storm Ltd.
  108736. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108737. */
  108738. var GetOverlapX = __webpack_require__(342);
  108739. /**
  108740. * [description]
  108741. *
  108742. * @function Phaser.Physics.Arcade.SeparateX
  108743. * @since 3.0.0
  108744. *
  108745. * @param {Phaser.Physics.Arcade.Body} body1 - [description]
  108746. * @param {Phaser.Physics.Arcade.Body} body2 - [description]
  108747. * @param {boolean} overlapOnly - [description]
  108748. * @param {number} bias - [description]
  108749. *
  108750. * @return {boolean} [description]
  108751. */
  108752. var SeparateX = function (body1, body2, overlapOnly, bias)
  108753. {
  108754. var overlap = GetOverlapX(body1, body2, overlapOnly, bias);
  108755. // Can't separate two immovable bodies, or a body with its own custom separation logic
  108756. if (overlapOnly || overlap === 0 || (body1.immovable && body2.immovable) || body1.customSeparateX || body2.customSeparateX)
  108757. {
  108758. // return true if there was some overlap, otherwise false
  108759. return (overlap !== 0) || (body1.embedded && body2.embedded);
  108760. }
  108761. // Adjust their positions and velocities accordingly (if there was any overlap)
  108762. var v1 = body1.velocity.x;
  108763. var v2 = body2.velocity.x;
  108764. if (!body1.immovable && !body2.immovable)
  108765. {
  108766. overlap *= 0.5;
  108767. body1.x -= overlap;
  108768. body2.x += overlap;
  108769. var nv1 = Math.sqrt((v2 * v2 * body2.mass) / body1.mass) * ((v2 > 0) ? 1 : -1);
  108770. var nv2 = Math.sqrt((v1 * v1 * body1.mass) / body2.mass) * ((v1 > 0) ? 1 : -1);
  108771. var avg = (nv1 + nv2) * 0.5;
  108772. nv1 -= avg;
  108773. nv2 -= avg;
  108774. body1.velocity.x = avg + nv1 * body1.bounce.x;
  108775. body2.velocity.x = avg + nv2 * body2.bounce.x;
  108776. }
  108777. else if (!body1.immovable)
  108778. {
  108779. body1.x -= overlap;
  108780. body1.velocity.x = v2 - v1 * body1.bounce.x;
  108781. // This is special case code that handles things like vertically moving platforms you can ride
  108782. if (body2.moves)
  108783. {
  108784. body1.y += (body2.y - body2.prev.y) * body2.friction.y;
  108785. }
  108786. }
  108787. else
  108788. {
  108789. body2.x += overlap;
  108790. body2.velocity.x = v1 - v2 * body2.bounce.x;
  108791. // This is special case code that handles things like vertically moving platforms you can ride
  108792. if (body1.moves)
  108793. {
  108794. body2.y += (body1.y - body1.prev.y) * body1.friction.y;
  108795. }
  108796. }
  108797. // If we got this far then there WAS overlap, and separation is complete, so return true
  108798. return true;
  108799. };
  108800. module.exports = SeparateX;
  108801. /***/ }),
  108802. /* 689 */
  108803. /***/ (function(module, exports) {
  108804. /**
  108805. * @author Richard Davey <rich@photonstorm.com>
  108806. * @copyright 2018 Photon Storm Ltd.
  108807. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108808. */
  108809. /**
  108810. * Internal function to process the separation of a physics body from a tile.
  108811. *
  108812. * @function Phaser.Physics.Arcade.Tilemap.ProcessTileSeparationY
  108813. * @since 3.0.0
  108814. *
  108815. * @param {Phaser.Physics.Arcade.Body} body - The Body object to separate.
  108816. * @param {number} y - The y separation amount.
  108817. */
  108818. var ProcessTileSeparationY = function (body, y)
  108819. {
  108820. if (y < 0)
  108821. {
  108822. body.blocked.none = false;
  108823. body.blocked.up = true;
  108824. }
  108825. else if (y > 0)
  108826. {
  108827. body.blocked.none = false;
  108828. body.blocked.down = true;
  108829. }
  108830. body.position.y -= y;
  108831. if (body.bounce.y === 0)
  108832. {
  108833. body.velocity.y = 0;
  108834. }
  108835. else
  108836. {
  108837. body.velocity.y = -body.velocity.y * body.bounce.y;
  108838. }
  108839. };
  108840. module.exports = ProcessTileSeparationY;
  108841. /***/ }),
  108842. /* 690 */
  108843. /***/ (function(module, exports, __webpack_require__) {
  108844. /**
  108845. * @author Richard Davey <rich@photonstorm.com>
  108846. * @copyright 2018 Photon Storm Ltd.
  108847. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108848. */
  108849. var ProcessTileSeparationY = __webpack_require__(689);
  108850. /**
  108851. * Check the body against the given tile on the Y axis.
  108852. *
  108853. * @function Phaser.Physics.Arcade.Tilemap.TileCheckY
  108854. * @since 3.0.0
  108855. *
  108856. * @param {Phaser.Physics.Arcade.Body} body - The Body object to separate.
  108857. * @param {Phaser.Tilemaps.Tile} tile - The tile to check.
  108858. * @param {number} tileTop - [description]
  108859. * @param {number} tileBottom - [description]
  108860. * @param {number} tileBias - [description]
  108861. *
  108862. * @return {number} The amount of separation that occurred.
  108863. */
  108864. var TileCheckY = function (body, tile, tileTop, tileBottom, tileBias)
  108865. {
  108866. var oy = 0;
  108867. if (body.deltaY() < 0 && !body.blocked.up && tile.collideDown && body.checkCollision.up)
  108868. {
  108869. // Body is moving UP
  108870. if (tile.faceBottom && body.y < tileBottom)
  108871. {
  108872. oy = body.y - tileBottom;
  108873. if (oy < -tileBias)
  108874. {
  108875. oy = 0;
  108876. }
  108877. }
  108878. }
  108879. else if (body.deltaY() > 0 && !body.blocked.down && tile.collideUp && body.checkCollision.down)
  108880. {
  108881. // Body is moving DOWN
  108882. if (tile.faceTop && body.bottom > tileTop)
  108883. {
  108884. oy = body.bottom - tileTop;
  108885. if (oy > tileBias)
  108886. {
  108887. oy = 0;
  108888. }
  108889. }
  108890. }
  108891. if (oy !== 0)
  108892. {
  108893. if (body.customSeparateY)
  108894. {
  108895. body.overlapY = oy;
  108896. }
  108897. else
  108898. {
  108899. ProcessTileSeparationY(body, oy);
  108900. }
  108901. }
  108902. return oy;
  108903. };
  108904. module.exports = TileCheckY;
  108905. /***/ }),
  108906. /* 691 */
  108907. /***/ (function(module, exports) {
  108908. /**
  108909. * @author Richard Davey <rich@photonstorm.com>
  108910. * @copyright 2018 Photon Storm Ltd.
  108911. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108912. */
  108913. /**
  108914. * Internal function to process the separation of a physics body from a tile.
  108915. *
  108916. * @function Phaser.Physics.Arcade.Tilemap.ProcessTileSeparationX
  108917. * @since 3.0.0
  108918. *
  108919. * @param {Phaser.Physics.Arcade.Body} body - The Body object to separate.
  108920. * @param {number} x - The x separation amount.
  108921. */
  108922. var ProcessTileSeparationX = function (body, x)
  108923. {
  108924. if (x < 0)
  108925. {
  108926. body.blocked.none = false;
  108927. body.blocked.left = true;
  108928. }
  108929. else if (x > 0)
  108930. {
  108931. body.blocked.none = false;
  108932. body.blocked.right = true;
  108933. }
  108934. body.position.x -= x;
  108935. if (body.bounce.x === 0)
  108936. {
  108937. body.velocity.x = 0;
  108938. }
  108939. else
  108940. {
  108941. body.velocity.x = -body.velocity.x * body.bounce.x;
  108942. }
  108943. };
  108944. module.exports = ProcessTileSeparationX;
  108945. /***/ }),
  108946. /* 692 */
  108947. /***/ (function(module, exports, __webpack_require__) {
  108948. /**
  108949. * @author Richard Davey <rich@photonstorm.com>
  108950. * @copyright 2018 Photon Storm Ltd.
  108951. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  108952. */
  108953. var ProcessTileSeparationX = __webpack_require__(691);
  108954. /**
  108955. * Check the body against the given tile on the X axis.
  108956. *
  108957. * @function Phaser.Physics.Arcade.Tilemap.TileCheckX
  108958. * @since 3.0.0
  108959. *
  108960. * @param {Phaser.Physics.Arcade.Body} body - The Body object to separate.
  108961. * @param {Phaser.Tilemaps.Tile} tile - The tile to check.
  108962. * @param {number} tileLeft - [description]
  108963. * @param {number} tileRight - [description]
  108964. * @param {number} tileBias - [description]
  108965. *
  108966. * @return {number} The amount of separation that occurred.
  108967. */
  108968. var TileCheckX = function (body, tile, tileLeft, tileRight, tileBias)
  108969. {
  108970. var ox = 0;
  108971. if (body.deltaX() < 0 && !body.blocked.left && tile.collideRight && body.checkCollision.left)
  108972. {
  108973. // Body is moving LEFT
  108974. if (tile.faceRight && body.x < tileRight)
  108975. {
  108976. ox = body.x - tileRight;
  108977. if (ox < -tileBias)
  108978. {
  108979. ox = 0;
  108980. }
  108981. }
  108982. }
  108983. else if (body.deltaX() > 0 && !body.blocked.right && tile.collideLeft && body.checkCollision.right)
  108984. {
  108985. // Body is moving RIGHT
  108986. if (tile.faceLeft && body.right > tileLeft)
  108987. {
  108988. ox = body.right - tileLeft;
  108989. if (ox > tileBias)
  108990. {
  108991. ox = 0;
  108992. }
  108993. }
  108994. }
  108995. if (ox !== 0)
  108996. {
  108997. if (body.customSeparateX)
  108998. {
  108999. body.overlapX = ox;
  109000. }
  109001. else
  109002. {
  109003. ProcessTileSeparationX(body, ox);
  109004. }
  109005. }
  109006. return ox;
  109007. };
  109008. module.exports = TileCheckX;
  109009. /***/ }),
  109010. /* 693 */
  109011. /***/ (function(module, exports, __webpack_require__) {
  109012. /**
  109013. * @author Richard Davey <rich@photonstorm.com>
  109014. * @copyright 2018 Photon Storm Ltd.
  109015. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109016. */
  109017. var TileCheckX = __webpack_require__(692);
  109018. var TileCheckY = __webpack_require__(690);
  109019. var TileIntersectsBody = __webpack_require__(340);
  109020. /**
  109021. * The core separation function to separate a physics body and a tile.
  109022. *
  109023. * @function Phaser.Physics.Arcade.Tilemap.SeparateTile
  109024. * @since 3.0.0
  109025. *
  109026. * @param {number} i - [description]
  109027. * @param {Phaser.Physics.Arcade.Body} body - The Body object to separate.
  109028. * @param {Phaser.Tilemaps.Tile} tile - The tile to collide against.
  109029. * @param {Phaser.Geom.Rectangle} tileWorldRect - [description]
  109030. * @param {(Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} tilemapLayer - The tilemapLayer to collide against.
  109031. * @param {number} tileBias - [description]
  109032. *
  109033. * @return {boolean} Returns true if the body was separated, otherwise false.
  109034. */
  109035. var SeparateTile = function (i, body, tile, tileWorldRect, tilemapLayer, tileBias)
  109036. {
  109037. var tileLeft = tileWorldRect.left;
  109038. var tileTop = tileWorldRect.top;
  109039. var tileRight = tileWorldRect.right;
  109040. var tileBottom = tileWorldRect.bottom;
  109041. var faceHorizontal = tile.faceLeft || tile.faceRight;
  109042. var faceVertical = tile.faceTop || tile.faceBottom;
  109043. // We don't need to go any further if this tile doesn't actually have any colliding faces. This
  109044. // could happen if the tile was meant to be collided with re: a callback, but otherwise isn't
  109045. // needed for separation.
  109046. if (!faceHorizontal && !faceVertical)
  109047. {
  109048. return false;
  109049. }
  109050. var ox = 0;
  109051. var oy = 0;
  109052. var minX = 0;
  109053. var minY = 1;
  109054. if (body.deltaAbsX() > body.deltaAbsY())
  109055. {
  109056. // Moving faster horizontally, check X axis first
  109057. minX = -1;
  109058. }
  109059. else if (body.deltaAbsX() < body.deltaAbsY())
  109060. {
  109061. // Moving faster vertically, check Y axis first
  109062. minY = -1;
  109063. }
  109064. if (body.deltaX() !== 0 && body.deltaY() !== 0 && faceHorizontal && faceVertical)
  109065. {
  109066. // We only need do this if both axes have colliding faces AND we're moving in both
  109067. // directions
  109068. minX = Math.min(Math.abs(body.position.x - tileRight), Math.abs(body.right - tileLeft));
  109069. minY = Math.min(Math.abs(body.position.y - tileBottom), Math.abs(body.bottom - tileTop));
  109070. }
  109071. if (minX < minY)
  109072. {
  109073. if (faceHorizontal)
  109074. {
  109075. ox = TileCheckX(body, tile, tileLeft, tileRight, tileBias);
  109076. // That's horizontal done, check if we still intersects? If not then we can return now
  109077. if (ox !== 0 && !TileIntersectsBody(tileWorldRect, body))
  109078. {
  109079. return true;
  109080. }
  109081. }
  109082. if (faceVertical)
  109083. {
  109084. oy = TileCheckY(body, tile, tileTop, tileBottom, tileBias);
  109085. }
  109086. }
  109087. else
  109088. {
  109089. if (faceVertical)
  109090. {
  109091. oy = TileCheckY(body, tile, tileTop, tileBottom, tileBias);
  109092. // That's vertical done, check if we still intersects? If not then we can return now
  109093. if (oy !== 0 && !TileIntersectsBody(tileWorldRect, body))
  109094. {
  109095. return true;
  109096. }
  109097. }
  109098. if (faceHorizontal)
  109099. {
  109100. ox = TileCheckX(body, tile, tileLeft, tileRight, tileBias);
  109101. }
  109102. }
  109103. return (ox !== 0 || oy !== 0);
  109104. };
  109105. module.exports = SeparateTile;
  109106. /***/ }),
  109107. /* 694 */
  109108. /***/ (function(module, exports) {
  109109. /**
  109110. * @author Richard Davey <rich@photonstorm.com>
  109111. * @copyright 2018 Photon Storm Ltd.
  109112. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109113. */
  109114. /**
  109115. * [description]
  109116. *
  109117. * @function Phaser.Physics.Arcade.Tilemap.ProcessTileCallbacks
  109118. * @since 3.0.0
  109119. *
  109120. * @param {Phaser.Tilemaps.Tilemap} tile - [description]
  109121. * @param {Phaser.GameObjects.Sprite} sprite - [description]
  109122. *
  109123. * @return {boolean} [description]
  109124. */
  109125. var ProcessTileCallbacks = function (tile, sprite)
  109126. {
  109127. // Tile callbacks take priority over layer level callbacks
  109128. if (tile.collisionCallback)
  109129. {
  109130. return !tile.collisionCallback.call(tile.collisionCallbackContext, sprite, tile);
  109131. }
  109132. else if (tile.layer.callbacks[tile.index])
  109133. {
  109134. return !tile.layer.callbacks[tile.index].callback.call(
  109135. tile.layer.callbacks[tile.index].callbackContext, sprite, tile
  109136. );
  109137. }
  109138. return true;
  109139. };
  109140. module.exports = ProcessTileCallbacks;
  109141. /***/ }),
  109142. /* 695 */
  109143. /***/ (function(module, exports) {
  109144. /**
  109145. * @author Richard Davey <rich@photonstorm.com>
  109146. * @copyright 2018 Photon Storm Ltd.
  109147. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109148. */
  109149. /**
  109150. * [description]
  109151. *
  109152. * @name Phaser.Physics.Arcade.Components.Velocity
  109153. * @since 3.0.0
  109154. */
  109155. var Velocity = {
  109156. /**
  109157. * [description]
  109158. *
  109159. * @method Phaser.Physics.Arcade.Components.Velocity#setVelocity
  109160. * @since 3.0.0
  109161. *
  109162. * @param {number} x - [description]
  109163. * @param {number} [y=x] - [description]
  109164. *
  109165. * @return {this} This Game Object.
  109166. */
  109167. setVelocity: function (x, y)
  109168. {
  109169. this.body.velocity.set(x, y);
  109170. return this;
  109171. },
  109172. /**
  109173. * [description]
  109174. *
  109175. * @method Phaser.Physics.Arcade.Components.Velocity#setVelocityX
  109176. * @since 3.0.0
  109177. *
  109178. * @param {number} x - [description]
  109179. *
  109180. * @return {this} This Game Object.
  109181. */
  109182. setVelocityX: function (x)
  109183. {
  109184. this.body.velocity.x = x;
  109185. return this;
  109186. },
  109187. /**
  109188. * [description]
  109189. *
  109190. * @method Phaser.Physics.Arcade.Components.Velocity#setVelocityY
  109191. * @since 3.0.0
  109192. *
  109193. * @param {number} y - [description]
  109194. *
  109195. * @return {this} This Game Object.
  109196. */
  109197. setVelocityY: function (y)
  109198. {
  109199. this.body.velocity.y = y;
  109200. return this;
  109201. },
  109202. /**
  109203. * [description]
  109204. *
  109205. * @method Phaser.Physics.Arcade.Components.Velocity#setMaxVelocity
  109206. * @since 3.0.0
  109207. *
  109208. * @param {number} x - [description]
  109209. * @param {number} [y=x] - [description]
  109210. *
  109211. * @return {this} This Game Object.
  109212. */
  109213. setMaxVelocity: function (x, y)
  109214. {
  109215. this.body.maxVelocity.set(x, y);
  109216. return this;
  109217. }
  109218. };
  109219. module.exports = Velocity;
  109220. /***/ }),
  109221. /* 696 */
  109222. /***/ (function(module, exports) {
  109223. /**
  109224. * @author Richard Davey <rich@photonstorm.com>
  109225. * @copyright 2018 Photon Storm Ltd.
  109226. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109227. */
  109228. /**
  109229. * [description]
  109230. *
  109231. * @name Phaser.Physics.Arcade.Components.Size
  109232. * @since 3.0.0
  109233. */
  109234. var Size = {
  109235. /**
  109236. * [description]
  109237. *
  109238. * @method Phaser.Physics.Arcade.Components.Size#setOffset
  109239. * @since 3.0.0
  109240. *
  109241. * @param {number} x - [description]
  109242. * @param {number} [y=x] - [description]
  109243. *
  109244. * @return {this} This Game Object.
  109245. */
  109246. setOffset: function (x, y)
  109247. {
  109248. this.body.setOffset(x, y);
  109249. return this;
  109250. },
  109251. /**
  109252. * [description]
  109253. *
  109254. * @method Phaser.Physics.Arcade.Components.Size#setSize
  109255. * @since 3.0.0
  109256. *
  109257. * @param {number} width - [description]
  109258. * @param {number} height - [description]
  109259. * @param {boolean} [center=true] - [description]
  109260. *
  109261. * @return {this} This Game Object.
  109262. */
  109263. setSize: function (width, height, center)
  109264. {
  109265. this.body.setSize(width, height, center);
  109266. return this;
  109267. },
  109268. /**
  109269. * [description]
  109270. *
  109271. * @method Phaser.Physics.Arcade.Components.Size#setCircle
  109272. * @since 3.0.0
  109273. *
  109274. * @param {number} radius - [description]
  109275. * @param {number} [offsetX] - [description]
  109276. * @param {number} [offsetY] - [description]
  109277. *
  109278. * @return {this} This Game Object.
  109279. */
  109280. setCircle: function (radius, offsetX, offsetY)
  109281. {
  109282. this.body.setCircle(radius, offsetX, offsetY);
  109283. return this;
  109284. }
  109285. };
  109286. module.exports = Size;
  109287. /***/ }),
  109288. /* 697 */
  109289. /***/ (function(module, exports) {
  109290. /**
  109291. * @author Richard Davey <rich@photonstorm.com>
  109292. * @copyright 2018 Photon Storm Ltd.
  109293. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109294. */
  109295. /**
  109296. * [description]
  109297. *
  109298. * @name Phaser.Physics.Arcade.Components.Mass
  109299. * @since 3.0.0
  109300. */
  109301. var Mass = {
  109302. /**
  109303. * [description]
  109304. *
  109305. * @method Phaser.Physics.Arcade.Components.Mass#setMass
  109306. * @since 3.0.0
  109307. *
  109308. * @param {number} value - [description]
  109309. *
  109310. * @return {this} This Game Object.
  109311. */
  109312. setMass: function (value)
  109313. {
  109314. this.body.mass = value;
  109315. return this;
  109316. }
  109317. };
  109318. module.exports = Mass;
  109319. /***/ }),
  109320. /* 698 */
  109321. /***/ (function(module, exports) {
  109322. /**
  109323. * @author Richard Davey <rich@photonstorm.com>
  109324. * @copyright 2018 Photon Storm Ltd.
  109325. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109326. */
  109327. /**
  109328. * [description]
  109329. *
  109330. * @name Phaser.Physics.Arcade.Components.Immovable
  109331. * @since 3.0.0
  109332. */
  109333. var Immovable = {
  109334. /**
  109335. * [description]
  109336. *
  109337. * @method Phaser.Physics.Arcade.Components.Immovable#setImmovable
  109338. * @since 3.0.0
  109339. *
  109340. * @param {boolean} [value=true] - [description]
  109341. *
  109342. * @return {this} This Game Object.
  109343. */
  109344. setImmovable: function (value)
  109345. {
  109346. if (value === undefined) { value = true; }
  109347. this.body.immovable = value;
  109348. return this;
  109349. }
  109350. };
  109351. module.exports = Immovable;
  109352. /***/ }),
  109353. /* 699 */
  109354. /***/ (function(module, exports) {
  109355. /**
  109356. * @author Richard Davey <rich@photonstorm.com>
  109357. * @copyright 2018 Photon Storm Ltd.
  109358. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109359. */
  109360. /**
  109361. * [description]
  109362. *
  109363. * @name Phaser.Physics.Arcade.Components.Gravity
  109364. * @since 3.0.0
  109365. */
  109366. var Gravity = {
  109367. /**
  109368. * [description]
  109369. *
  109370. * @method Phaser.Physics.Arcade.Components.Gravity#setGravity
  109371. * @since 3.0.0
  109372. *
  109373. * @param {number} x - [description]
  109374. * @param {number} [y=x] - [description]
  109375. *
  109376. * @return {this} This Game Object.
  109377. */
  109378. setGravity: function (x, y)
  109379. {
  109380. this.body.gravity.set(x, y);
  109381. return this;
  109382. },
  109383. /**
  109384. * [description]
  109385. *
  109386. * @method Phaser.Physics.Arcade.Components.Gravity#setGravityX
  109387. * @since 3.0.0
  109388. *
  109389. * @param {number} x - [description]
  109390. *
  109391. * @return {this} This Game Object.
  109392. */
  109393. setGravityX: function (x)
  109394. {
  109395. this.body.gravity.x = x;
  109396. return this;
  109397. },
  109398. /**
  109399. * [description]
  109400. *
  109401. * @method Phaser.Physics.Arcade.Components.Gravity#setGravityY
  109402. * @since 3.0.0
  109403. *
  109404. * @param {number} y - [description]
  109405. *
  109406. * @return {this} This Game Object.
  109407. */
  109408. setGravityY: function (y)
  109409. {
  109410. this.body.gravity.y = y;
  109411. return this;
  109412. }
  109413. };
  109414. module.exports = Gravity;
  109415. /***/ }),
  109416. /* 700 */
  109417. /***/ (function(module, exports) {
  109418. /**
  109419. * @author Richard Davey <rich@photonstorm.com>
  109420. * @copyright 2018 Photon Storm Ltd.
  109421. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109422. */
  109423. /**
  109424. * [description]
  109425. *
  109426. * @name Phaser.Physics.Arcade.Components.Friction
  109427. * @since 3.0.0
  109428. */
  109429. var Friction = {
  109430. /**
  109431. * [description]
  109432. *
  109433. * @method Phaser.Physics.Arcade.Components.Friction#setFriction
  109434. * @since 3.0.0
  109435. *
  109436. * @param {number} x - [description]
  109437. * @param {number} [y=x] - [description]
  109438. *
  109439. * @return {this} This Game Object.
  109440. */
  109441. setFriction: function (x, y)
  109442. {
  109443. this.body.friction.set(x, y);
  109444. return this;
  109445. },
  109446. /**
  109447. * [description]
  109448. *
  109449. * @method Phaser.Physics.Arcade.Components.Friction#setFrictionX
  109450. * @since 3.0.0
  109451. *
  109452. * @param {number} x - [description]
  109453. *
  109454. * @return {this} This Game Object.
  109455. */
  109456. setFrictionX: function (x)
  109457. {
  109458. this.body.friction.x = x;
  109459. return this;
  109460. },
  109461. /**
  109462. * [description]
  109463. *
  109464. * @method Phaser.Physics.Arcade.Components.Friction#setFrictionY
  109465. * @since 3.0.0
  109466. *
  109467. * @param {number} y - [description]
  109468. *
  109469. * @return {this} This Game Object.
  109470. */
  109471. setFrictionY: function (y)
  109472. {
  109473. this.body.friction.y = y;
  109474. return this;
  109475. }
  109476. };
  109477. module.exports = Friction;
  109478. /***/ }),
  109479. /* 701 */
  109480. /***/ (function(module, exports) {
  109481. /**
  109482. * @author Richard Davey <rich@photonstorm.com>
  109483. * @copyright 2018 Photon Storm Ltd.
  109484. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109485. */
  109486. /**
  109487. * [description]
  109488. *
  109489. * @name Phaser.Physics.Arcade.Components.Enable
  109490. * @since 3.0.0
  109491. */
  109492. var Enable = {
  109493. /**
  109494. * [description]
  109495. *
  109496. * @method Phaser.Physics.Arcade.Components.Enable#enableBody
  109497. * @since 3.0.0
  109498. *
  109499. * @param {boolean} reset - [description]
  109500. * @param {number} x - [description]
  109501. * @param {number} y - [description]
  109502. * @param {boolean} enableGameObject - [description]
  109503. * @param {boolean} showGameObject - [description]
  109504. *
  109505. * @return {this} This Game Object.
  109506. */
  109507. enableBody: function (reset, x, y, enableGameObject, showGameObject)
  109508. {
  109509. if (reset)
  109510. {
  109511. this.body.reset(x, y);
  109512. }
  109513. if (enableGameObject)
  109514. {
  109515. this.body.gameObject.active = true;
  109516. }
  109517. if (showGameObject)
  109518. {
  109519. this.body.gameObject.visible = true;
  109520. }
  109521. this.body.enable = true;
  109522. return this;
  109523. },
  109524. /**
  109525. * [description]
  109526. *
  109527. * @method Phaser.Physics.Arcade.Components.Enable#disableBody
  109528. * @since 3.0.0
  109529. *
  109530. * @param {boolean} [disableGameObject=false] - [description]
  109531. * @param {boolean} [hideGameObject=false] - [description]
  109532. *
  109533. * @return {this} This Game Object.
  109534. */
  109535. disableBody: function (disableGameObject, hideGameObject)
  109536. {
  109537. if (disableGameObject === undefined) { disableGameObject = false; }
  109538. if (hideGameObject === undefined) { hideGameObject = false; }
  109539. this.body.stop();
  109540. this.body.enable = false;
  109541. if (disableGameObject)
  109542. {
  109543. this.body.gameObject.active = false;
  109544. }
  109545. if (hideGameObject)
  109546. {
  109547. this.body.gameObject.visible = false;
  109548. }
  109549. return this;
  109550. },
  109551. /**
  109552. * Syncs the Bodies position and size with its parent Game Object.
  109553. * You don't need to call this for Dynamic Bodies, as it happens automatically.
  109554. * But for Static bodies it's a useful way of modifying the position of a Static Body
  109555. * in the Physics World, based on its Game Object.
  109556. *
  109557. * @method Phaser.Physics.Arcade.Components.Enable#refreshBody
  109558. * @since 3.1.0
  109559. *
  109560. * @return {this} This Game Object.
  109561. */
  109562. refreshBody: function ()
  109563. {
  109564. this.body.updateFromGameObject();
  109565. return this;
  109566. }
  109567. };
  109568. module.exports = Enable;
  109569. /***/ }),
  109570. /* 702 */
  109571. /***/ (function(module, exports) {
  109572. /**
  109573. * @author Richard Davey <rich@photonstorm.com>
  109574. * @copyright 2018 Photon Storm Ltd.
  109575. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109576. */
  109577. /**
  109578. * [description]
  109579. *
  109580. * @name Phaser.Physics.Arcade.Components.Drag
  109581. * @since 3.0.0
  109582. */
  109583. var Drag = {
  109584. /**
  109585. * [description]
  109586. *
  109587. * @method Phaser.Physics.Arcade.Components.Drag#setDrag
  109588. * @since 3.0.0
  109589. *
  109590. * @param {number} x - [description]
  109591. * @param {number} [y=x] - [description]
  109592. *
  109593. * @return {this} This Game Object.
  109594. */
  109595. setDrag: function (x, y)
  109596. {
  109597. this.body.drag.set(x, y);
  109598. return this;
  109599. },
  109600. /**
  109601. * [description]
  109602. *
  109603. * @method Phaser.Physics.Arcade.Components.Drag#setDragX
  109604. * @since 3.0.0
  109605. *
  109606. * @param {number} value - [description]
  109607. *
  109608. * @return {this} This Game Object.
  109609. */
  109610. setDragX: function (value)
  109611. {
  109612. this.body.drag.x = value;
  109613. return this;
  109614. },
  109615. /**
  109616. * [description]
  109617. *
  109618. * @method Phaser.Physics.Arcade.Components.Drag#setDragY
  109619. * @since 3.0.0
  109620. *
  109621. * @param {number} value - [description]
  109622. *
  109623. * @return {this} This Game Object.
  109624. */
  109625. setDragY: function (value)
  109626. {
  109627. this.body.drag.y = value;
  109628. return this;
  109629. },
  109630. /**
  109631. * [description]
  109632. *
  109633. * @method Phaser.Physics.Arcade.Components.Drag#setDamping
  109634. * @since 3.10.0
  109635. *
  109636. * @param {boolean} value - `true` to use damping for deceleration, or `false` to use linear deceleration.
  109637. *
  109638. * @return {this} This Game Object.
  109639. */
  109640. setDamping: function (value)
  109641. {
  109642. this.body.useDamping = value;
  109643. return this;
  109644. }
  109645. };
  109646. module.exports = Drag;
  109647. /***/ }),
  109648. /* 703 */
  109649. /***/ (function(module, exports) {
  109650. /**
  109651. * @author Richard Davey <rich@photonstorm.com>
  109652. * @copyright 2018 Photon Storm Ltd.
  109653. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109654. */
  109655. /**
  109656. * [description]
  109657. *
  109658. * @name Phaser.Physics.Arcade.Components.Debug
  109659. * @since 3.0.0
  109660. */
  109661. var Debug = {
  109662. /**
  109663. * [description]
  109664. *
  109665. * @method Phaser.Physics.Arcade.Components.Debug#setDebug
  109666. * @since 3.0.0
  109667. *
  109668. * @param {boolean} showBody - [description]
  109669. * @param {boolean} showVelocity - [description]
  109670. * @param {number} bodyColor - [description]
  109671. *
  109672. * @return {this} This Game Object.
  109673. */
  109674. setDebug: function (showBody, showVelocity, bodyColor)
  109675. {
  109676. this.debugShowBody = showBody;
  109677. this.debugShowVelocity = showVelocity;
  109678. this.debugBodyColor = bodyColor;
  109679. return this;
  109680. },
  109681. /**
  109682. * [description]
  109683. *
  109684. * @method Phaser.Physics.Arcade.Components.Debug#setDebugBodyColor
  109685. * @since 3.0.0
  109686. *
  109687. * @param {number} value - [description]
  109688. *
  109689. * @return {this} This Game Object.
  109690. */
  109691. setDebugBodyColor: function (value)
  109692. {
  109693. this.body.debugBodyColor = value;
  109694. return this;
  109695. },
  109696. /**
  109697. * [description]
  109698. *
  109699. * @name Phaser.Physics.Arcade.Components.Debug#debugShowBody
  109700. * @type {boolean}
  109701. * @since 3.0.0
  109702. */
  109703. debugShowBody: {
  109704. get: function ()
  109705. {
  109706. return this.body.debugShowBody;
  109707. },
  109708. set: function (value)
  109709. {
  109710. this.body.debugShowBody = value;
  109711. }
  109712. },
  109713. /**
  109714. * [description]
  109715. *
  109716. * @name Phaser.Physics.Arcade.Components.Debug#debugShowVelocity
  109717. * @type {boolean}
  109718. * @since 3.0.0
  109719. */
  109720. debugShowVelocity: {
  109721. get: function ()
  109722. {
  109723. return this.body.debugShowVelocity;
  109724. },
  109725. set: function (value)
  109726. {
  109727. this.body.debugShowVelocity = value;
  109728. }
  109729. },
  109730. /**
  109731. * [description]
  109732. *
  109733. * @name Phaser.Physics.Arcade.Components.Debug#debugBodyColor
  109734. * @type {number}
  109735. * @since 3.0.0
  109736. */
  109737. debugBodyColor: {
  109738. get: function ()
  109739. {
  109740. return this.body.debugBodyColor;
  109741. },
  109742. set: function (value)
  109743. {
  109744. this.body.debugBodyColor = value;
  109745. }
  109746. }
  109747. };
  109748. module.exports = Debug;
  109749. /***/ }),
  109750. /* 704 */
  109751. /***/ (function(module, exports) {
  109752. /**
  109753. * @author Richard Davey <rich@photonstorm.com>
  109754. * @copyright 2018 Photon Storm Ltd.
  109755. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109756. */
  109757. /**
  109758. * [description]
  109759. *
  109760. * @name Phaser.Physics.Arcade.Components.Bounce
  109761. * @since 3.0.0
  109762. */
  109763. var Bounce = {
  109764. /**
  109765. * [description]
  109766. *
  109767. * @method Phaser.Physics.Arcade.Components.Bounce#setBounce
  109768. * @since 3.0.0
  109769. *
  109770. * @param {number} x - [description]
  109771. * @param {number} [y=x] - [description]
  109772. *
  109773. * @return {this} This Game Object.
  109774. */
  109775. setBounce: function (x, y)
  109776. {
  109777. this.body.bounce.set(x, y);
  109778. return this;
  109779. },
  109780. /**
  109781. * [description]
  109782. *
  109783. * @method Phaser.Physics.Arcade.Components.Bounce#setBounceX
  109784. * @since 3.0.0
  109785. *
  109786. * @param {number} value - [description]
  109787. *
  109788. * @return {this} This Game Object.
  109789. */
  109790. setBounceX: function (value)
  109791. {
  109792. this.body.bounce.x = value;
  109793. return this;
  109794. },
  109795. /**
  109796. * [description]
  109797. *
  109798. * @method Phaser.Physics.Arcade.Components.Bounce#setBounceY
  109799. * @since 3.0.0
  109800. *
  109801. * @param {number} value - [description]
  109802. *
  109803. * @return {this} This Game Object.
  109804. */
  109805. setBounceY: function (value)
  109806. {
  109807. this.body.bounce.y = value;
  109808. return this;
  109809. },
  109810. /**
  109811. * [description]
  109812. *
  109813. * @method Phaser.Physics.Arcade.Components.Bounce#setCollideWorldBounds
  109814. * @since 3.0.0
  109815. *
  109816. * @param {boolean} value - [description]
  109817. *
  109818. * @return {this} This Game Object.
  109819. */
  109820. setCollideWorldBounds: function (value)
  109821. {
  109822. this.body.collideWorldBounds = value;
  109823. return this;
  109824. }
  109825. };
  109826. module.exports = Bounce;
  109827. /***/ }),
  109828. /* 705 */
  109829. /***/ (function(module, exports) {
  109830. /**
  109831. * @author Richard Davey <rich@photonstorm.com>
  109832. * @copyright 2018 Photon Storm Ltd.
  109833. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109834. */
  109835. /**
  109836. * [description]
  109837. *
  109838. * @name Phaser.Physics.Arcade.Components.Angular
  109839. * @since 3.0.0
  109840. */
  109841. var Angular = {
  109842. /**
  109843. * [description]
  109844. *
  109845. * @method Phaser.Physics.Arcade.Components.Angular#setAngularVelocity
  109846. * @since 3.0.0
  109847. *
  109848. * @param {number} value - [description]
  109849. *
  109850. * @return {this} This Game Object.
  109851. */
  109852. setAngularVelocity: function (value)
  109853. {
  109854. this.body.angularVelocity = value;
  109855. return this;
  109856. },
  109857. /**
  109858. * [description]
  109859. *
  109860. * @method Phaser.Physics.Arcade.Components.Angular#setAngularAcceleration
  109861. * @since 3.0.0
  109862. *
  109863. * @param {number} value - [description]
  109864. *
  109865. * @return {this} This Game Object.
  109866. */
  109867. setAngularAcceleration: function (value)
  109868. {
  109869. this.body.angularAcceleration = value;
  109870. return this;
  109871. },
  109872. /**
  109873. * [description]
  109874. *
  109875. * @method Phaser.Physics.Arcade.Components.Angular#setAngularDrag
  109876. * @since 3.0.0
  109877. *
  109878. * @param {number} value - [description]
  109879. *
  109880. * @return {this} This Game Object.
  109881. */
  109882. setAngularDrag: function (value)
  109883. {
  109884. this.body.angularDrag = value;
  109885. return this;
  109886. }
  109887. };
  109888. module.exports = Angular;
  109889. /***/ }),
  109890. /* 706 */
  109891. /***/ (function(module, exports) {
  109892. /**
  109893. * @author Richard Davey <rich@photonstorm.com>
  109894. * @copyright 2018 Photon Storm Ltd.
  109895. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109896. */
  109897. /**
  109898. * [description]
  109899. *
  109900. * @name Phaser.Physics.Arcade.Components.Acceleration
  109901. * @since 3.0.0
  109902. */
  109903. var Acceleration = {
  109904. /**
  109905. * [description]
  109906. *
  109907. * @method Phaser.Physics.Arcade.Components.Acceleration#setAcceleration
  109908. * @since 3.0.0
  109909. *
  109910. * @param {number} x - The horizontal acceleration
  109911. * @param {number} [y=x] - The vertical acceleration
  109912. *
  109913. * @return {this} This Game Object.
  109914. */
  109915. setAcceleration: function (x, y)
  109916. {
  109917. this.body.acceleration.set(x, y);
  109918. return this;
  109919. },
  109920. /**
  109921. * [description]
  109922. *
  109923. * @method Phaser.Physics.Arcade.Components.Acceleration#setAccelerationX
  109924. * @since 3.0.0
  109925. *
  109926. * @param {number} value - The horizontal acceleration
  109927. *
  109928. * @return {this} This Game Object.
  109929. */
  109930. setAccelerationX: function (value)
  109931. {
  109932. this.body.acceleration.x = value;
  109933. return this;
  109934. },
  109935. /**
  109936. * [description]
  109937. *
  109938. * @method Phaser.Physics.Arcade.Components.Acceleration#setAccelerationY
  109939. * @since 3.0.0
  109940. *
  109941. * @param {number} value - The vertical acceleration
  109942. *
  109943. * @return {this} This Game Object.
  109944. */
  109945. setAccelerationY: function (value)
  109946. {
  109947. this.body.acceleration.y = value;
  109948. return this;
  109949. }
  109950. };
  109951. module.exports = Acceleration;
  109952. /***/ }),
  109953. /* 707 */
  109954. /***/ (function(module, exports, __webpack_require__) {
  109955. /**
  109956. * @author Richard Davey <rich@photonstorm.com>
  109957. * @copyright 2018 Photon Storm Ltd.
  109958. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  109959. */
  109960. var Class = __webpack_require__(0);
  109961. var DegToRad = __webpack_require__(39);
  109962. var DistanceBetween = __webpack_require__(58);
  109963. var Factory = __webpack_require__(350);
  109964. var GetFastValue = __webpack_require__(1);
  109965. var Merge = __webpack_require__(94);
  109966. var PluginCache = __webpack_require__(12);
  109967. var Vector2 = __webpack_require__(6);
  109968. var World = __webpack_require__(345);
  109969. // All methods in this class are available under `this.physics` in a Scene.
  109970. /**
  109971. * @classdesc
  109972. * [description]
  109973. *
  109974. * @class ArcadePhysics
  109975. * @memberOf Phaser.Physics.Arcade
  109976. * @constructor
  109977. * @since 3.0.0
  109978. *
  109979. * @param {Phaser.Scene} scene - [description]
  109980. */
  109981. var ArcadePhysics = new Class({
  109982. initialize:
  109983. function ArcadePhysics (scene)
  109984. {
  109985. /**
  109986. * [description]
  109987. *
  109988. * @name Phaser.Physics.Arcade.ArcadePhysics#scene
  109989. * @type {Phaser.Scene}
  109990. * @since 3.0.0
  109991. */
  109992. this.scene = scene;
  109993. /**
  109994. * [description]
  109995. *
  109996. * @name Phaser.Physics.Arcade.ArcadePhysics#systems
  109997. * @type {Phaser.Scenes.Systems}
  109998. * @since 3.0.0
  109999. */
  110000. this.systems = scene.sys;
  110001. /**
  110002. * [description]
  110003. *
  110004. * @name Phaser.Physics.Arcade.ArcadePhysics#config
  110005. * @type {object}
  110006. * @since 3.0.0
  110007. */
  110008. this.config = this.getConfig();
  110009. /**
  110010. * [description]
  110011. *
  110012. * @name Phaser.Physics.Arcade.ArcadePhysics#world
  110013. * @type {Phaser.Physics.Arcade.World}
  110014. * @since 3.0.0
  110015. */
  110016. this.world;
  110017. /**
  110018. * [description]
  110019. *
  110020. * @name Phaser.Physics.Arcade.ArcadePhysics#add
  110021. * @type {Phaser.Physics.Arcade.Factory}
  110022. * @since 3.0.0
  110023. */
  110024. this.add;
  110025. scene.sys.events.once('boot', this.boot, this);
  110026. scene.sys.events.on('start', this.start, this);
  110027. },
  110028. /**
  110029. * This method is called automatically, only once, when the Scene is first created.
  110030. * Do not invoke it directly.
  110031. *
  110032. * @method Phaser.Physics.Arcade.ArcadePhysics#boot
  110033. * @private
  110034. * @since 3.5.1
  110035. */
  110036. boot: function ()
  110037. {
  110038. this.world = new World(this.scene, this.config);
  110039. this.add = new Factory(this.world);
  110040. this.systems.events.once('destroy', this.destroy, this);
  110041. },
  110042. /**
  110043. * This method is called automatically by the Scene when it is starting up.
  110044. * It is responsible for creating local systems, properties and listening for Scene events.
  110045. * Do not invoke it directly.
  110046. *
  110047. * @method Phaser.Physics.Arcade.ArcadePhysics#start
  110048. * @private
  110049. * @since 3.5.0
  110050. */
  110051. start: function ()
  110052. {
  110053. if (!this.world)
  110054. {
  110055. this.world = new World(this.scene, this.config);
  110056. this.add = new Factory(this.world);
  110057. }
  110058. var eventEmitter = this.systems.events;
  110059. eventEmitter.on('update', this.world.update, this.world);
  110060. eventEmitter.on('postupdate', this.world.postUpdate, this.world);
  110061. eventEmitter.once('shutdown', this.shutdown, this);
  110062. },
  110063. /**
  110064. * [description]
  110065. *
  110066. * @method Phaser.Physics.Arcade.ArcadePhysics#getConfig
  110067. * @since 3.0.0
  110068. *
  110069. * @return {object} [description]
  110070. */
  110071. getConfig: function ()
  110072. {
  110073. var gameConfig = this.systems.game.config.physics;
  110074. var sceneConfig = this.systems.settings.physics;
  110075. var config = Merge(
  110076. GetFastValue(sceneConfig, 'arcade', {}),
  110077. GetFastValue(gameConfig, 'arcade', {})
  110078. );
  110079. return config;
  110080. },
  110081. /**
  110082. * Checks for overlaps between two Game Objects. The objects can be any Game Object that have an Arcade Physics Body.
  110083. *
  110084. * Unlike {@link #collide} the objects are NOT automatically separated or have any physics applied, they merely test for overlap results.
  110085. *
  110086. * Both the first and second parameter can be arrays of objects, of differing types.
  110087. * If two arrays are passed, the contents of the first parameter will be tested against all contents of the 2nd parameter.
  110088. *
  110089. * ##### Tilemaps
  110090. *
  110091. * Any overlapping tiles, including blank/null tiles, will give a positive result. Tiles marked via {@link Phaser.Tilemap#setCollision} (and similar methods) have no special status, and callbacks added via {@link Phaser.Tilemap#setTileIndexCallback} or {@link Phaser.Tilemap#setTileLocationCallback} are not invoked. So calling this method without any callbacks isn't very useful.
  110092. *
  110093. * If you're interested only in whether an object overlaps a certain tile or class of tiles, filter the tiles with `processCallback` and then use the result returned by this method. Blank/null tiles can be excluded by their {@link Phaser.Tile#index index} (-1).
  110094. *
  110095. * If you want to take action on certain overlaps, examine the tiles in `collideCallback` and then handle as you like.
  110096. *
  110097. * @method Phaser.Physics.Arcade.ArcadePhysics#overlap
  110098. * @since 3.0.0
  110099. *
  110100. * @param {(Phaser.GameObjects.GameObject|array)} object1 - The first object or array of objects to check. Can be any Game Object that has an Arcade Physics Body.
  110101. * @param {(Phaser.GameObjects.GameObject|array)} object2 - The second object or array of objects to check. Can be any Game Object that has an Arcade Physics Body.
  110102. * @param {ArcadePhysicsCallback} [overlapCallback=null] - An optional callback function that is called if the objects overlap. The two objects will be passed to this function in the same order in which you specified them, unless you are checking Group vs. Sprite, in which case Sprite will always be the first parameter.
  110103. * @param {ArcadePhysicsCallback} [processCallback=null] - A 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`.
  110104. * @param {*} [callbackContext] - The context in which to run the callbacks.
  110105. *
  110106. * @return {boolean} True if an overlap occurred otherwise false.
  110107. */
  110108. overlap: function (object1, object2, overlapCallback, processCallback, callbackContext)
  110109. {
  110110. if (overlapCallback === undefined) { overlapCallback = null; }
  110111. if (processCallback === undefined) { processCallback = null; }
  110112. if (callbackContext === undefined) { callbackContext = overlapCallback; }
  110113. return this.world.collideObjects(object1, object2, overlapCallback, processCallback, callbackContext, true);
  110114. },
  110115. /**
  110116. * [description]
  110117. *
  110118. * @method Phaser.Physics.Arcade.ArcadePhysics#collide
  110119. * @since 3.0.0
  110120. *
  110121. * @param {(Phaser.GameObjects.GameObject|array)} object1 - The first object or array of objects to check. Can be any Game Object that has an Arcade Physics Body.
  110122. * @param {(Phaser.GameObjects.GameObject|array)} object2 - The second object or array of objects to check. Can be any Game Object that has an Arcade Physics Body.
  110123. * @param {ArcadePhysicsCallback} [collideCallback=null] - An optional callback function that is called if the objects collide. The two objects will be passed to this function in the same order in which you specified them, unless you are checking Group vs. Sprite, in which case Sprite will always be the first parameter.
  110124. * @param {ArcadePhysicsCallback} [processCallback=null] - A 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`.
  110125. * @param {*} [callbackContext] - The context in which to run the callbacks.
  110126. *
  110127. * @return {boolean} True if a collision occurred otherwise false.
  110128. */
  110129. collide: function (object1, object2, collideCallback, processCallback, callbackContext)
  110130. {
  110131. if (collideCallback === undefined) { collideCallback = null; }
  110132. if (processCallback === undefined) { processCallback = null; }
  110133. if (callbackContext === undefined) { callbackContext = collideCallback; }
  110134. return this.world.collideObjects(object1, object2, collideCallback, processCallback, callbackContext, false);
  110135. },
  110136. /**
  110137. * [description]
  110138. *
  110139. * @method Phaser.Physics.Arcade.ArcadePhysics#pause
  110140. * @since 3.0.0
  110141. *
  110142. * @return {Phaser.Physics.Arcade.World} [description]
  110143. */
  110144. pause: function ()
  110145. {
  110146. return this.world.pause();
  110147. },
  110148. /**
  110149. * [description]
  110150. *
  110151. * @method Phaser.Physics.Arcade.ArcadePhysics#resume
  110152. * @since 3.0.0
  110153. *
  110154. * @return {Phaser.Physics.Arcade.World} [description]
  110155. */
  110156. resume: function ()
  110157. {
  110158. return this.world.resume();
  110159. },
  110160. /**
  110161. * 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)
  110162. *
  110163. * You must give a maximum speed value, beyond which the game object won't go any faster.
  110164. *
  110165. * 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.
  110166. * Note: The game object doesn't stop moving once it reaches the destination coordinates.
  110167. *
  110168. * @method Phaser.Physics.Arcade.ArcadePhysics#accelerateTo
  110169. * @since 3.0.0
  110170. *
  110171. * @param {Phaser.GameObjects.GameObject} gameObject - Any Game Object with an Arcade Physics body.
  110172. * @param {number} x - The x coordinate to accelerate towards.
  110173. * @param {number} y - The y coordinate to accelerate towards.
  110174. * @param {number} [speed=60] - The acceleration (change in speed) in pixels per second squared.
  110175. * @param {number} [xSpeedMax=500] - The maximum x velocity the game object can reach.
  110176. * @param {number} [ySpeedMax=500] - The maximum y velocity the game object can reach.
  110177. *
  110178. * @return {number} The angle (in radians) that the object should be visually set to in order to match its new velocity.
  110179. */
  110180. accelerateTo: function (gameObject, x, y, speed, xSpeedMax, ySpeedMax)
  110181. {
  110182. if (speed === undefined) { speed = 60; }
  110183. var angle = Math.atan2(y - gameObject.y, x - gameObject.x);
  110184. gameObject.body.acceleration.setToPolar(angle, speed);
  110185. if (xSpeedMax !== undefined && ySpeedMax !== undefined)
  110186. {
  110187. gameObject.body.maxVelocity.set(xSpeedMax, ySpeedMax);
  110188. }
  110189. return angle;
  110190. },
  110191. /**
  110192. * 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)
  110193. *
  110194. * You must give a maximum speed value, beyond which the game object won't go any faster.
  110195. *
  110196. * 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.
  110197. * Note: The game object doesn't stop moving once it reaches the destination coordinates.
  110198. *
  110199. * @method Phaser.Physics.Arcade.ArcadePhysics#accelerateToObject
  110200. * @since 3.0.0
  110201. *
  110202. * @param {Phaser.GameObjects.GameObject} gameObject - Any Game Object with an Arcade Physics body.
  110203. * @param {Phaser.GameObjects.GameObject} destination - The Game Object to move towards. Can be any object but must have visible x/y properties.
  110204. * @param {number} [speed=60] - The acceleration (change in speed) in pixels per second squared.
  110205. * @param {number} [xSpeedMax=500] - The maximum x velocity the game object can reach.
  110206. * @param {number} [ySpeedMax=500] - The maximum y velocity the game object can reach.
  110207. *
  110208. * @return {number} The angle (in radians) that the object should be visually set to in order to match its new velocity.
  110209. */
  110210. accelerateToObject: function (gameObject, destination, speed, xSpeedMax, ySpeedMax)
  110211. {
  110212. return this.accelerateTo(gameObject, destination.x, destination.y, speed, xSpeedMax, ySpeedMax);
  110213. },
  110214. /**
  110215. * Finds the Body closest to a source point or object.
  110216. *
  110217. * @method Phaser.Physics.Arcade.ArcadePhysics#closest
  110218. * @since 3.0.0
  110219. *
  110220. * @param {object} source - Any object with public `x` and `y` properties, such as a Game Object or Geometry object.
  110221. *
  110222. * @return {Phaser.Physics.Arcade.Body} The closest Body to the given source point.
  110223. */
  110224. closest: function (source)
  110225. {
  110226. var bodies = this.tree.all();
  110227. var min = Number.MAX_VALUE;
  110228. var closest = null;
  110229. var x = source.x;
  110230. var y = source.y;
  110231. for (var i = bodies.length - 1; i >= 0; i--)
  110232. {
  110233. var target = bodies[i];
  110234. var distance = DistanceBetween(x, y, target.x, target.y);
  110235. if (distance < min)
  110236. {
  110237. closest = target;
  110238. min = distance;
  110239. }
  110240. }
  110241. return closest;
  110242. },
  110243. /**
  110244. * Finds the Body farthest from a source point or object.
  110245. *
  110246. * @method Phaser.Physics.Arcade.ArcadePhysics#furthest
  110247. * @since 3.0.0
  110248. *
  110249. * @param {object} source - Any object with public `x` and `y` properties, such as a Game Object or Geometry object.
  110250. *
  110251. * @return {Phaser.Physics.Arcade.Body} The Body furthest from the given source point.
  110252. */
  110253. furthest: function (source)
  110254. {
  110255. var bodies = this.tree.all();
  110256. var max = -1;
  110257. var farthest = null;
  110258. var x = source.x;
  110259. var y = source.y;
  110260. for (var i = bodies.length - 1; i >= 0; i--)
  110261. {
  110262. var target = bodies[i];
  110263. var distance = DistanceBetween(x, y, target.x, target.y);
  110264. if (distance > max)
  110265. {
  110266. farthest = target;
  110267. max = distance;
  110268. }
  110269. }
  110270. return farthest;
  110271. },
  110272. /**
  110273. * Move the given display object towards the x/y coordinates at a steady velocity.
  110274. * 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.
  110275. * Timings are approximate due to the way browser timers work. Allow for a variance of +- 50ms.
  110276. * 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.
  110277. * Note: The display object doesn't stop moving once it reaches the destination coordinates.
  110278. * 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)
  110279. *
  110280. * @method Phaser.Physics.Arcade.ArcadePhysics#moveTo
  110281. * @since 3.0.0
  110282. *
  110283. * @param {Phaser.GameObjects.GameObject} gameObject - Any Game Object with an Arcade Physics body.
  110284. * @param {number} x - The x coordinate to move towards.
  110285. * @param {number} y - The y coordinate to move towards.
  110286. * @param {number} [speed=60] - The speed it will move, in pixels per second (default is 60 pixels/sec)
  110287. * @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.
  110288. *
  110289. * @return {number} The angle (in radians) that the object should be visually set to in order to match its new velocity.
  110290. */
  110291. moveTo: function (gameObject, x, y, speed, maxTime)
  110292. {
  110293. if (speed === undefined) { speed = 60; }
  110294. if (maxTime === undefined) { maxTime = 0; }
  110295. var angle = Math.atan2(y - gameObject.y, x - gameObject.x);
  110296. if (maxTime > 0)
  110297. {
  110298. // We know how many pixels we need to move, but how fast?
  110299. speed = DistanceBetween(gameObject.x, gameObject.y, x, y) / (maxTime / 1000);
  110300. }
  110301. gameObject.body.velocity.setToPolar(angle, speed);
  110302. return angle;
  110303. },
  110304. /**
  110305. * Move the given display object towards the destination object at a steady velocity.
  110306. * 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.
  110307. * Timings are approximate due to the way browser timers work. Allow for a variance of +- 50ms.
  110308. * 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.
  110309. * Note: The display object doesn't stop moving once it reaches the destination coordinates.
  110310. * 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)
  110311. *
  110312. * @method Phaser.Physics.Arcade.ArcadePhysics#moveToObject
  110313. * @since 3.0.0
  110314. *
  110315. * @param {Phaser.GameObjects.GameObject} gameObject - Any Game Object with an Arcade Physics body.
  110316. * @param {object} destination - Any object with public `x` and `y` properties, such as a Game Object or Geometry object.
  110317. * @param {number} [speed=60] - The speed it will move, in pixels per second (default is 60 pixels/sec)
  110318. * @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.
  110319. *
  110320. * @return {number} The angle (in radians) that the object should be visually set to in order to match its new velocity.
  110321. */
  110322. moveToObject: function (gameObject, destination, speed, maxTime)
  110323. {
  110324. return this.moveTo(gameObject, destination.x, destination.y, speed, maxTime);
  110325. },
  110326. /**
  110327. * Given the angle (in degrees) and speed calculate the velocity and return it as a vector, or set it to the given vector object.
  110328. * 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.
  110329. *
  110330. * @method Phaser.Physics.Arcade.ArcadePhysics#velocityFromAngle
  110331. * @since 3.0.0
  110332. *
  110333. * @param {number} angle - The angle in degrees calculated in clockwise positive direction (down = 90 degrees positive, right = 0 degrees positive, up = 90 degrees negative)
  110334. * @param {number} [speed=60] - The speed it will move, in pixels per second squared.
  110335. * @param {Phaser.Math.Vector2} [vec2] - The Vector2 in which the x and y properties will be set to the calculated velocity.
  110336. *
  110337. * @return {Phaser.Math.Vector2} The Vector2 that stores the velocity.
  110338. */
  110339. velocityFromAngle: function (angle, speed, vec2)
  110340. {
  110341. if (speed === undefined) { speed = 60; }
  110342. if (vec2 === undefined) { vec2 = new Vector2(); }
  110343. return vec2.setToPolar(DegToRad(angle), speed);
  110344. },
  110345. /**
  110346. * Given the rotation (in radians) and speed calculate the velocity and return it as a vector, or set it to the given vector object.
  110347. * 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.
  110348. *
  110349. * @method Phaser.Physics.Arcade.ArcadePhysics#velocityFromRotation
  110350. * @since 3.0.0
  110351. *
  110352. * @param {number} rotation - The angle in radians.
  110353. * @param {number} [speed=60] - The speed it will move, in pixels per second squared
  110354. * @param {Phaser.Math.Vector2} [vec2] - The Vector2 in which the x and y properties will be set to the calculated velocity.
  110355. *
  110356. * @return {Phaser.Math.Vector2} The Vector2 that stores the velocity.
  110357. */
  110358. velocityFromRotation: function (rotation, speed, vec2)
  110359. {
  110360. if (speed === undefined) { speed = 60; }
  110361. if (vec2 === undefined) { vec2 = new Vector2(); }
  110362. return vec2.setToPolar(rotation, speed);
  110363. },
  110364. /**
  110365. * The Scene that owns this plugin is shutting down.
  110366. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  110367. *
  110368. * @method Phaser.Physics.Arcade.ArcadePhysics#shutdown
  110369. * @since 3.0.0
  110370. */
  110371. shutdown: function ()
  110372. {
  110373. var eventEmitter = this.systems.events;
  110374. eventEmitter.off('update', this.world.update, this.world);
  110375. eventEmitter.off('postupdate', this.world.postUpdate, this.world);
  110376. eventEmitter.off('shutdown', this.shutdown, this);
  110377. this.add.destroy();
  110378. this.world.destroy();
  110379. this.add = null;
  110380. this.world = null;
  110381. },
  110382. /**
  110383. * The Scene that owns this plugin is being destroyed.
  110384. * We need to shutdown and then kill off all external references.
  110385. *
  110386. * @method Phaser.Physics.Arcade.ArcadePhysics#destroy
  110387. * @since 3.0.0
  110388. */
  110389. destroy: function ()
  110390. {
  110391. this.shutdown();
  110392. this.scene.sys.events.off('start', this.start, this);
  110393. this.scene = null;
  110394. this.systems = null;
  110395. }
  110396. });
  110397. PluginCache.register('ArcadePhysics', ArcadePhysics, 'arcadePhysics');
  110398. module.exports = ArcadePhysics;
  110399. /***/ }),
  110400. /* 708 */
  110401. /***/ (function(module, exports, __webpack_require__) {
  110402. /**
  110403. * @author Richard Davey <rich@photonstorm.com>
  110404. * @copyright 2018 Photon Storm Ltd.
  110405. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110406. */
  110407. var CONST = __webpack_require__(43);
  110408. var Extend = __webpack_require__(16);
  110409. /**
  110410. * @callback ArcadePhysicsCallback
  110411. *
  110412. * @param {Phaser.GameObjects.GameObject} object1 - [description]
  110413. * @param {Phaser.GameObjects.GameObject} object2 - [description]
  110414. */
  110415. /**
  110416. * @namespace Phaser.Physics.Arcade
  110417. */
  110418. var Arcade = {
  110419. ArcadePhysics: __webpack_require__(707),
  110420. Body: __webpack_require__(344),
  110421. Collider: __webpack_require__(343),
  110422. Factory: __webpack_require__(350),
  110423. Group: __webpack_require__(347),
  110424. Image: __webpack_require__(349),
  110425. Sprite: __webpack_require__(143),
  110426. StaticBody: __webpack_require__(339),
  110427. StaticGroup: __webpack_require__(346),
  110428. World: __webpack_require__(345)
  110429. };
  110430. // Merge in the consts
  110431. Arcade = Extend(false, Arcade, CONST);
  110432. module.exports = Arcade;
  110433. /***/ }),
  110434. /* 709 */
  110435. /***/ (function(module, exports) {
  110436. /**
  110437. * @author Richard Davey <rich@photonstorm.com>
  110438. * @copyright 2018 Photon Storm Ltd.
  110439. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110440. */
  110441. /**
  110442. * Checks if the two values are within the given `tolerance` of each other.
  110443. *
  110444. * @function Phaser.Math.Within
  110445. * @since 3.0.0
  110446. *
  110447. * @param {number} a - The first value to use in the calculation.
  110448. * @param {number} b - The second value to use in the calculation.
  110449. * @param {number} tolerance - The tolerance. Anything equal to or less than this value is considered as being within range.
  110450. *
  110451. * @return {boolean} Returns `true` if `a` is less than or equal to the tolerance of `b`.
  110452. */
  110453. var Within = function (a, b, tolerance)
  110454. {
  110455. return (Math.abs(a - b) <= tolerance);
  110456. };
  110457. module.exports = Within;
  110458. /***/ }),
  110459. /* 710 */
  110460. /***/ (function(module, exports) {
  110461. /**
  110462. * @author Richard Davey <rich@photonstorm.com>
  110463. * @copyright 2018 Photon Storm Ltd.
  110464. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110465. */
  110466. /**
  110467. * @typedef {object} SinCosTable
  110468. *
  110469. * @property {number} sin - The sine value.
  110470. * @property {number} cos - The cosine value.
  110471. * @property {number} length - The length.
  110472. */
  110473. /**
  110474. * Generate a series of sine and cosine values.
  110475. *
  110476. * @function Phaser.Math.SinCosTableGenerator
  110477. * @since 3.0.0
  110478. *
  110479. * @param {number} length - The number of values to generate.
  110480. * @param {number} [sinAmp=1] - The sine value amplitude.
  110481. * @param {number} [cosAmp=1] - The cosine value amplitude.
  110482. * @param {number} [frequency=1] - The frequency of the values.
  110483. *
  110484. * @return {SinCosTable} The generated values.
  110485. */
  110486. var SinCosTableGenerator = function (length, sinAmp, cosAmp, frequency)
  110487. {
  110488. if (sinAmp === undefined) { sinAmp = 1; }
  110489. if (cosAmp === undefined) { cosAmp = 1; }
  110490. if (frequency === undefined) { frequency = 1; }
  110491. frequency *= Math.PI / length;
  110492. var cos = [];
  110493. var sin = [];
  110494. for (var c = 0; c < length; c++)
  110495. {
  110496. cosAmp -= sinAmp * frequency;
  110497. sinAmp += cosAmp * frequency;
  110498. cos[c] = cosAmp;
  110499. sin[c] = sinAmp;
  110500. }
  110501. return {
  110502. sin: sin,
  110503. cos: cos,
  110504. length: length
  110505. };
  110506. };
  110507. module.exports = SinCosTableGenerator;
  110508. /***/ }),
  110509. /* 711 */
  110510. /***/ (function(module, exports) {
  110511. /**
  110512. * @author Richard Davey <rich@photonstorm.com>
  110513. * @copyright 2018 Photon Storm Ltd.
  110514. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110515. */
  110516. /**
  110517. * Round a value to a given decimal place.
  110518. *
  110519. * @function Phaser.Math.RoundTo
  110520. * @since 3.0.0
  110521. *
  110522. * @param {number} value - The value to round.
  110523. * @param {integer} [place=0] - The place to round to.
  110524. * @param {integer} [base=10] - The base to round in. Default is 10 for decimal.
  110525. *
  110526. * @return {number} The rounded value.
  110527. */
  110528. var RoundTo = function (value, place, base)
  110529. {
  110530. if (place === undefined) { place = 0; }
  110531. if (base === undefined) { base = 10; }
  110532. var p = Math.pow(base, -place);
  110533. return Math.round(value * p) / p;
  110534. };
  110535. module.exports = RoundTo;
  110536. /***/ }),
  110537. /* 712 */
  110538. /***/ (function(module, exports) {
  110539. /**
  110540. * @author Richard Davey <rich@photonstorm.com>
  110541. * @copyright 2018 Photon Storm Ltd.
  110542. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110543. */
  110544. /**
  110545. * Compute a random unit vector.
  110546. *
  110547. * Computes random values for the given vector between -1 and 1 that can be used to represent a direction.
  110548. *
  110549. * Optionally accepts a scale value to scale the resulting vector by.
  110550. *
  110551. * @function Phaser.Math.RandomXY
  110552. * @since 3.0.0
  110553. *
  110554. * @param {Phaser.Math.Vector2} vector - The Vector to compute random values for.
  110555. * @param {number} [scale=1] - The scale of the random values.
  110556. *
  110557. * @return {Phaser.Math.Vector2} The given Vector.
  110558. */
  110559. var RandomXY = function (vector, scale)
  110560. {
  110561. if (scale === undefined) { scale = 1; }
  110562. var r = Math.random() * 2 * Math.PI;
  110563. vector.x = Math.cos(r) * scale;
  110564. vector.y = Math.sin(r) * scale;
  110565. return vector;
  110566. };
  110567. module.exports = RandomXY;
  110568. /***/ }),
  110569. /* 713 */
  110570. /***/ (function(module, exports) {
  110571. /**
  110572. * @author Richard Davey <rich@photonstorm.com>
  110573. * @copyright 2018 Photon Storm Ltd.
  110574. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110575. */
  110576. /**
  110577. * Work out what percentage `value` is of the range between `min` and `max`.
  110578. * If `max` isn't given then it will return the percentage of `value` to `min`.
  110579. *
  110580. * 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.
  110581. *
  110582. * @function Phaser.Math.Percent
  110583. * @since 3.0.0
  110584. *
  110585. * @param {number} value - The value to determine the percentage of.
  110586. * @param {number} min - The minimum value.
  110587. * @param {number} [max] - The maximum value.
  110588. * @param {number} [upperMax] - The mid-way point in the range that represents 100%.
  110589. *
  110590. * @return {number} A value between 0 and 1 representing the percentage.
  110591. */
  110592. var Percent = function (value, min, max, upperMax)
  110593. {
  110594. if (max === undefined) { max = min + 1; }
  110595. var percentage = (value - min) / (max - min);
  110596. if (percentage > 1)
  110597. {
  110598. if (upperMax !== undefined)
  110599. {
  110600. percentage = ((upperMax - value)) / (upperMax - max);
  110601. if (percentage < 0)
  110602. {
  110603. percentage = 0;
  110604. }
  110605. }
  110606. else
  110607. {
  110608. percentage = 1;
  110609. }
  110610. }
  110611. else if (percentage < 0)
  110612. {
  110613. percentage = 0;
  110614. }
  110615. return percentage;
  110616. };
  110617. module.exports = Percent;
  110618. /***/ }),
  110619. /* 714 */
  110620. /***/ (function(module, exports) {
  110621. /**
  110622. * @author Richard Davey <rich@photonstorm.com>
  110623. * @copyright 2018 Photon Storm Ltd.
  110624. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110625. */
  110626. /**
  110627. * Subtract an `amount` from `value`, limiting the minimum result to `min`.
  110628. *
  110629. * @function Phaser.Math.MinSub
  110630. * @since 3.0.0
  110631. *
  110632. * @param {number} value - The value to subtract from.
  110633. * @param {number} amount - The amount to subtract.
  110634. * @param {number} min - The minimum value to return.
  110635. *
  110636. * @return {number} The resulting value.
  110637. */
  110638. var MinSub = function (value, amount, min)
  110639. {
  110640. return Math.max(value - amount, min);
  110641. };
  110642. module.exports = MinSub;
  110643. /***/ }),
  110644. /* 715 */
  110645. /***/ (function(module, exports) {
  110646. /**
  110647. * @author Richard Davey <rich@photonstorm.com>
  110648. * @copyright 2018 Photon Storm Ltd.
  110649. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110650. */
  110651. /**
  110652. * Add an `amount` to a `value`, limiting the maximum result to `max`.
  110653. *
  110654. * @function Phaser.Math.MaxAdd
  110655. * @since 3.0.0
  110656. *
  110657. * @param {number} value - The value to add to.
  110658. * @param {number} amount - The amount to add.
  110659. * @param {number} max - The maximum value to return.
  110660. *
  110661. * @return {number} The resulting value.
  110662. */
  110663. var MaxAdd = function (value, amount, max)
  110664. {
  110665. return Math.min(value + amount, max);
  110666. };
  110667. module.exports = MaxAdd;
  110668. /***/ }),
  110669. /* 716 */
  110670. /***/ (function(module, exports) {
  110671. /**
  110672. * @author Richard Davey <rich@photonstorm.com>
  110673. * @copyright 2018 Photon Storm Ltd.
  110674. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110675. */
  110676. /**
  110677. * Check if a given value is an even number using a strict type check.
  110678. *
  110679. * @function Phaser.Math.IsEvenStrict
  110680. * @since 3.0.0
  110681. *
  110682. * @param {number} value - The number to perform the check with.
  110683. *
  110684. * @return {boolean} Whether the number is even or not.
  110685. */
  110686. var IsEvenStrict = function (value)
  110687. {
  110688. // Use strict equality === for "is number" test
  110689. return (value === parseFloat(value)) ? !(value % 2) : void 0;
  110690. };
  110691. module.exports = IsEvenStrict;
  110692. /***/ }),
  110693. /* 717 */
  110694. /***/ (function(module, exports) {
  110695. /**
  110696. * @author Richard Davey <rich@photonstorm.com>
  110697. * @copyright 2018 Photon Storm Ltd.
  110698. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110699. */
  110700. /**
  110701. * Check if a given value is an even number.
  110702. *
  110703. * @function Phaser.Math.IsEven
  110704. * @since 3.0.0
  110705. *
  110706. * @param {number} value - The number to perform the check with.
  110707. *
  110708. * @return {boolean} Whether the number is even or not.
  110709. */
  110710. var IsEven = function (value)
  110711. {
  110712. // Use abstract equality == for "is number" test
  110713. // eslint-disable-next-line eqeqeq
  110714. return (value == parseFloat(value)) ? !(value % 2) : void 0;
  110715. };
  110716. module.exports = IsEven;
  110717. /***/ }),
  110718. /* 718 */
  110719. /***/ (function(module, exports) {
  110720. /**
  110721. * @author Richard Davey <rich@photonstorm.com>
  110722. * @copyright 2018 Photon Storm Ltd.
  110723. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110724. */
  110725. /**
  110726. * Calculate the speed required to cover a distance in the time given.
  110727. *
  110728. * @function Phaser.Math.GetSpeed
  110729. * @since 3.0.0
  110730. *
  110731. * @param {number} distance - The distance to travel in pixels.
  110732. * @param {integer} time - The time, in ms, to cover the distance in.
  110733. *
  110734. * @return {number} The amount you will need to increment the position by each step in order to cover the distance in the time given.
  110735. */
  110736. var GetSpeed = function (distance, time)
  110737. {
  110738. return (distance / time) / 1000;
  110739. };
  110740. module.exports = GetSpeed;
  110741. /***/ }),
  110742. /* 719 */
  110743. /***/ (function(module, exports) {
  110744. /**
  110745. * @author Richard Davey <rich@photonstorm.com>
  110746. * @copyright 2018 Photon Storm Ltd.
  110747. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110748. */
  110749. /**
  110750. * Floors to some place comparative to a `base`, default is 10 for decimal place.
  110751. *
  110752. * The `place` is represented by the power applied to `base` to get that place.
  110753. *
  110754. * @function Phaser.Math.FloorTo
  110755. * @since 3.0.0
  110756. *
  110757. * @param {number} value - The value to round.
  110758. * @param {integer} [place=0] - The place to round to.
  110759. * @param {integer} [base=10] - The base to round in. Default is 10 for decimal.
  110760. *
  110761. * @return {number} The rounded value.
  110762. */
  110763. var FloorTo = function (value, place, base)
  110764. {
  110765. if (place === undefined) { place = 0; }
  110766. if (base === undefined) { base = 10; }
  110767. var p = Math.pow(base, -place);
  110768. return Math.floor(value * p) / p;
  110769. };
  110770. module.exports = FloorTo;
  110771. /***/ }),
  110772. /* 720 */
  110773. /***/ (function(module, exports) {
  110774. /**
  110775. * @author Richard Davey <rich@photonstorm.com>
  110776. * @copyright 2018 Photon Storm Ltd.
  110777. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110778. */
  110779. /**
  110780. * Calculates the positive difference of two given numbers.
  110781. *
  110782. * @function Phaser.Math.Difference
  110783. * @since 3.0.0
  110784. *
  110785. * @param {number} a - The first number in the calculation.
  110786. * @param {number} b - The second number in the calculation.
  110787. *
  110788. * @return {number} The positive difference of the two given numbers.
  110789. */
  110790. var Difference = function (a, b)
  110791. {
  110792. return Math.abs(a - b);
  110793. };
  110794. module.exports = Difference;
  110795. /***/ }),
  110796. /* 721 */
  110797. /***/ (function(module, exports) {
  110798. /**
  110799. * @author Richard Davey <rich@photonstorm.com>
  110800. * @copyright 2018 Photon Storm Ltd.
  110801. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110802. */
  110803. /**
  110804. * Ceils to some place comparative to a `base`, default is 10 for decimal place.
  110805. *
  110806. * The `place` is represented by the power applied to `base` to get that place.
  110807. *
  110808. * @function Phaser.Math.CeilTo
  110809. * @since 3.0.0
  110810. *
  110811. * @param {number} value - The value to round.
  110812. * @param {number} [place=0] - The place to round to.
  110813. * @param {integer} [base=10] - The base to round in. Default is 10 for decimal.
  110814. *
  110815. * @return {number} The rounded value.
  110816. */
  110817. var CeilTo = function (value, place, base)
  110818. {
  110819. if (place === undefined) { place = 0; }
  110820. if (base === undefined) { base = 10; }
  110821. var p = Math.pow(base, -place);
  110822. return Math.ceil(value * p) / p;
  110823. };
  110824. module.exports = CeilTo;
  110825. /***/ }),
  110826. /* 722 */
  110827. /***/ (function(module, exports) {
  110828. /**
  110829. * @author Richard Davey <rich@photonstorm.com>
  110830. * @copyright 2018 Photon Storm Ltd.
  110831. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110832. */
  110833. /**
  110834. * Calculate the mean average of the given values.
  110835. *
  110836. * @function Phaser.Math.Average
  110837. * @since 3.0.0
  110838. *
  110839. * @param {number[]} values - The values to average.
  110840. *
  110841. * @return {number} The average value.
  110842. */
  110843. var Average = function (values)
  110844. {
  110845. var sum = 0;
  110846. for (var i = 0; i < values.length; i++)
  110847. {
  110848. sum += (+values[i]);
  110849. }
  110850. return sum / values.length;
  110851. };
  110852. module.exports = Average;
  110853. /***/ }),
  110854. /* 723 */
  110855. /***/ (function(module, exports) {
  110856. /**
  110857. * @author Richard Davey <rich@photonstorm.com>
  110858. * @copyright 2018 Photon Storm Ltd.
  110859. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110860. */
  110861. /**
  110862. * Snap a value to nearest grid slice, using rounding.
  110863. *
  110864. * 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`.
  110865. *
  110866. * @function Phaser.Math.Snap.To
  110867. * @since 3.0.0
  110868. *
  110869. * @param {number} value - The value to snap.
  110870. * @param {number} gap - The interval gap of the grid.
  110871. * @param {number} [start=0] - Optional starting offset for gap.
  110872. *
  110873. * @return {number} The snapped value.
  110874. */
  110875. var SnapTo = function (value, gap, start)
  110876. {
  110877. if (start === undefined) { start = 0; }
  110878. if (gap === 0)
  110879. {
  110880. return value;
  110881. }
  110882. value -= start;
  110883. value = gap * Math.round(value / gap);
  110884. return start + value;
  110885. };
  110886. module.exports = SnapTo;
  110887. /***/ }),
  110888. /* 724 */
  110889. /***/ (function(module, exports, __webpack_require__) {
  110890. /**
  110891. * @author Richard Davey <rich@photonstorm.com>
  110892. * @copyright 2018 Photon Storm Ltd.
  110893. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110894. */
  110895. /**
  110896. * @namespace Phaser.Math.Snap
  110897. */
  110898. module.exports = {
  110899. Ceil: __webpack_require__(352),
  110900. Floor: __webpack_require__(145),
  110901. To: __webpack_require__(723)
  110902. };
  110903. /***/ }),
  110904. /* 725 */
  110905. /***/ (function(module, exports) {
  110906. /**
  110907. * @author Richard Davey <rich@photonstorm.com>
  110908. * @copyright 2018 Photon Storm Ltd.
  110909. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110910. */
  110911. /**
  110912. * Tests the value and returns `true` if it is a power of two.
  110913. *
  110914. * @function Phaser.Math.Pow2.IsValuePowerOfTwo
  110915. * @since 3.0.0
  110916. *
  110917. * @param {number} value - The value to check if it's a power of two.
  110918. *
  110919. * @return {boolean} Returns `true` if `value` is a power of two, otherwise `false`.
  110920. */
  110921. var IsValuePowerOfTwo = function (value)
  110922. {
  110923. return (value > 0 && (value & (value - 1)) === 0);
  110924. };
  110925. module.exports = IsValuePowerOfTwo;
  110926. /***/ }),
  110927. /* 726 */
  110928. /***/ (function(module, exports, __webpack_require__) {
  110929. /**
  110930. * @author Richard Davey <rich@photonstorm.com>
  110931. * @copyright 2018 Photon Storm Ltd.
  110932. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110933. */
  110934. /**
  110935. * @namespace Phaser.Math.Pow2
  110936. */
  110937. module.exports = {
  110938. GetNext: __webpack_require__(415),
  110939. IsSize: __webpack_require__(85),
  110940. IsValue: __webpack_require__(725)
  110941. };
  110942. /***/ }),
  110943. /* 727 */
  110944. /***/ (function(module, exports, __webpack_require__) {
  110945. /**
  110946. * @author Richard Davey <rich@photonstorm.com>
  110947. * @copyright 2018 Photon Storm Ltd.
  110948. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110949. */
  110950. var SmootherStep = __webpack_require__(292);
  110951. /**
  110952. * A Smoother Step interpolation method.
  110953. *
  110954. * @function Phaser.Math.Interpolation.SmootherStep
  110955. * @since 3.9.0
  110956. * @see {@link https://en.wikipedia.org/wiki/Smoothstep#Variations}
  110957. *
  110958. * @param {number} t - The percentage of interpolation, between 0 and 1.
  110959. * @param {number} min - The minimum value, also known as the 'left edge', assumed smaller than the 'right edge'.
  110960. * @param {number} max - The maximum value, also known as the 'right edge', assumed greater than the 'left edge'.
  110961. *
  110962. * @return {number} The interpolated value.
  110963. */
  110964. var SmootherStepInterpolation = function (t, min, max)
  110965. {
  110966. return min + (max - min) * SmootherStep(t, 0, 1);
  110967. };
  110968. module.exports = SmootherStepInterpolation;
  110969. /***/ }),
  110970. /* 728 */
  110971. /***/ (function(module, exports, __webpack_require__) {
  110972. /**
  110973. * @author Richard Davey <rich@photonstorm.com>
  110974. * @copyright 2018 Photon Storm Ltd.
  110975. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  110976. */
  110977. var Linear = __webpack_require__(122);
  110978. /**
  110979. * A linear interpolation method.
  110980. *
  110981. * @function Phaser.Math.Interpolation.Linear
  110982. * @since 3.0.0
  110983. * @see {@link https://en.wikipedia.org/wiki/Linear_interpolation}
  110984. *
  110985. * @param {number[]} v - The input array of values to interpolate between.
  110986. * @param {!number} k - The percentage of interpolation, between 0 and 1.
  110987. *
  110988. * @return {!number} The interpolated value.
  110989. */
  110990. var LinearInterpolation = function (v, k)
  110991. {
  110992. var m = v.length - 1;
  110993. var f = m * k;
  110994. var i = Math.floor(f);
  110995. if (k < 0)
  110996. {
  110997. return Linear(v[0], v[1], f);
  110998. }
  110999. if (k > 1)
  111000. {
  111001. return Linear(v[m], v[m - 1], m - f);
  111002. }
  111003. return Linear(v[i], v[(i + 1 > m) ? m : i + 1], f - i);
  111004. };
  111005. module.exports = LinearInterpolation;
  111006. /***/ }),
  111007. /* 729 */
  111008. /***/ (function(module, exports, __webpack_require__) {
  111009. /**
  111010. * @author Richard Davey <rich@photonstorm.com>
  111011. * @copyright 2018 Photon Storm Ltd.
  111012. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111013. */
  111014. var CatmullRom = __webpack_require__(267);
  111015. /**
  111016. * A Catmull-Rom interpolation method.
  111017. *
  111018. * @function Phaser.Math.Interpolation.CatmullRom
  111019. * @since 3.0.0
  111020. *
  111021. * @param {number[]} v - The input array of values to interpolate between.
  111022. * @param {number} k - The percentage of interpolation, between 0 and 1.
  111023. *
  111024. * @return {number} The interpolated value.
  111025. */
  111026. var CatmullRomInterpolation = function (v, k)
  111027. {
  111028. var m = v.length - 1;
  111029. var f = m * k;
  111030. var i = Math.floor(f);
  111031. if (v[0] === v[m])
  111032. {
  111033. if (k < 0)
  111034. {
  111035. i = Math.floor(f = m * (1 + k));
  111036. }
  111037. return CatmullRom(f - i, v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m]);
  111038. }
  111039. else
  111040. {
  111041. if (k < 0)
  111042. {
  111043. return v[0] - (CatmullRom(-f, v[0], v[0], v[1], v[1]) - v[0]);
  111044. }
  111045. if (k > 1)
  111046. {
  111047. return v[m] - (CatmullRom(f - m, v[m], v[m], v[m - 1], v[m - 1]) - v[m]);
  111048. }
  111049. 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]);
  111050. }
  111051. };
  111052. module.exports = CatmullRomInterpolation;
  111053. /***/ }),
  111054. /* 730 */
  111055. /***/ (function(module, exports, __webpack_require__) {
  111056. /**
  111057. * @author Richard Davey <rich@photonstorm.com>
  111058. * @copyright 2018 Photon Storm Ltd.
  111059. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111060. */
  111061. var Bernstein = __webpack_require__(354);
  111062. /**
  111063. * A bezier interpolation method.
  111064. *
  111065. * @function Phaser.Math.Interpolation.Bezier
  111066. * @since 3.0.0
  111067. *
  111068. * @param {number[]} v - The input array of values to interpolate between.
  111069. * @param {number} k - The percentage of interpolation, between 0 and 1.
  111070. *
  111071. * @return {number} The interpolated value.
  111072. */
  111073. var BezierInterpolation = function (v, k)
  111074. {
  111075. var b = 0;
  111076. var n = v.length - 1;
  111077. for (var i = 0; i <= n; i++)
  111078. {
  111079. b += Math.pow(1 - k, n - i) * Math.pow(k, i) * v[i] * Bernstein(n, i);
  111080. }
  111081. return b;
  111082. };
  111083. module.exports = BezierInterpolation;
  111084. /***/ }),
  111085. /* 731 */
  111086. /***/ (function(module, exports, __webpack_require__) {
  111087. /**
  111088. * @author Richard Davey <rich@photonstorm.com>
  111089. * @copyright 2018 Photon Storm Ltd.
  111090. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111091. */
  111092. /**
  111093. * @namespace Phaser.Math.Interpolation
  111094. */
  111095. module.exports = {
  111096. Bezier: __webpack_require__(730),
  111097. CatmullRom: __webpack_require__(729),
  111098. CubicBezier: __webpack_require__(520),
  111099. Linear: __webpack_require__(728),
  111100. QuadraticBezier: __webpack_require__(516),
  111101. SmoothStep: __webpack_require__(251),
  111102. SmootherStep: __webpack_require__(727)
  111103. };
  111104. /***/ }),
  111105. /* 732 */
  111106. /***/ (function(module, exports) {
  111107. /**
  111108. * @author Richard Davey <rich@photonstorm.com>
  111109. * @copyright 2018 Photon Storm Ltd.
  111110. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111111. */
  111112. /**
  111113. * Calculate the fuzzy floor of the given value.
  111114. *
  111115. * @function Phaser.Math.Fuzzy.Floor
  111116. * @since 3.0.0
  111117. *
  111118. * @param {number} value - The value.
  111119. * @param {number} [epsilon=0.0001] - The epsilon.
  111120. *
  111121. * @return {number} The floor of the value.
  111122. */
  111123. var Floor = function (value, epsilon)
  111124. {
  111125. if (epsilon === undefined) { epsilon = 0.0001; }
  111126. return Math.floor(value + epsilon);
  111127. };
  111128. module.exports = Floor;
  111129. /***/ }),
  111130. /* 733 */
  111131. /***/ (function(module, exports) {
  111132. /**
  111133. * @author Richard Davey <rich@photonstorm.com>
  111134. * @copyright 2018 Photon Storm Ltd.
  111135. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111136. */
  111137. /**
  111138. * Calculate the fuzzy ceiling of the given value.
  111139. *
  111140. * @function Phaser.Math.Fuzzy.Ceil
  111141. * @since 3.0.0
  111142. *
  111143. * @param {number} value - The value.
  111144. * @param {number} [epsilon=0.0001] - The epsilon.
  111145. *
  111146. * @return {number} The fuzzy ceiling of the value.
  111147. */
  111148. var Ceil = function (value, epsilon)
  111149. {
  111150. if (epsilon === undefined) { epsilon = 0.0001; }
  111151. return Math.ceil(value - epsilon);
  111152. };
  111153. module.exports = Ceil;
  111154. /***/ }),
  111155. /* 734 */
  111156. /***/ (function(module, exports, __webpack_require__) {
  111157. /**
  111158. * @author Richard Davey <rich@photonstorm.com>
  111159. * @copyright 2018 Photon Storm Ltd.
  111160. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111161. */
  111162. /**
  111163. * @namespace Phaser.Math.Fuzzy
  111164. */
  111165. module.exports = {
  111166. Ceil: __webpack_require__(733),
  111167. Equal: __webpack_require__(357),
  111168. Floor: __webpack_require__(732),
  111169. GreaterThan: __webpack_require__(356),
  111170. LessThan: __webpack_require__(355)
  111171. };
  111172. /***/ }),
  111173. /* 735 */
  111174. /***/ (function(module, exports, __webpack_require__) {
  111175. /**
  111176. * @author Richard Davey <rich@photonstorm.com>
  111177. * @copyright 2018 Photon Storm Ltd.
  111178. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111179. */
  111180. /**
  111181. * @namespace Phaser.Math.Easing
  111182. */
  111183. module.exports = {
  111184. Back: __webpack_require__(291),
  111185. Bounce: __webpack_require__(290),
  111186. Circular: __webpack_require__(289),
  111187. Cubic: __webpack_require__(288),
  111188. Elastic: __webpack_require__(287),
  111189. Expo: __webpack_require__(286),
  111190. Linear: __webpack_require__(285),
  111191. Quadratic: __webpack_require__(284),
  111192. Quartic: __webpack_require__(283),
  111193. Quintic: __webpack_require__(282),
  111194. Sine: __webpack_require__(281),
  111195. Stepped: __webpack_require__(280)
  111196. };
  111197. /***/ }),
  111198. /* 736 */
  111199. /***/ (function(module, exports) {
  111200. /**
  111201. * @author Richard Davey <rich@photonstorm.com>
  111202. * @copyright 2018 Photon Storm Ltd.
  111203. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111204. */
  111205. /**
  111206. * Calculate the distance between two sets of coordinates (points), squared.
  111207. *
  111208. * @function Phaser.Math.Distance.Squared
  111209. * @since 3.0.0
  111210. *
  111211. * @param {number} x1 - The x coordinate of the first point.
  111212. * @param {number} y1 - The y coordinate of the first point.
  111213. * @param {number} x2 - The x coordinate of the second point.
  111214. * @param {number} y2 - The y coordinate of the second point.
  111215. *
  111216. * @return {number} The distance between each point, squared.
  111217. */
  111218. var DistanceSquared = function (x1, y1, x2, y2)
  111219. {
  111220. var dx = x1 - x2;
  111221. var dy = y1 - y2;
  111222. return dx * dx + dy * dy;
  111223. };
  111224. module.exports = DistanceSquared;
  111225. /***/ }),
  111226. /* 737 */
  111227. /***/ (function(module, exports) {
  111228. /**
  111229. * @author Richard Davey <rich@photonstorm.com>
  111230. * @copyright 2018 Photon Storm Ltd.
  111231. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111232. */
  111233. /**
  111234. * Calculate the distance between two sets of coordinates (points) to the power of `pow`.
  111235. *
  111236. * @function Phaser.Math.Distance.Power
  111237. * @since 3.0.0
  111238. *
  111239. * @param {number} x1 - The x coordinate of the first point.
  111240. * @param {number} y1 - The y coordinate of the first point.
  111241. * @param {number} x2 - The x coordinate of the second point.
  111242. * @param {number} y2 - The y coordinate of the second point.
  111243. * @param {number} pow - The exponent.
  111244. *
  111245. * @return {number} The distance between each point.
  111246. */
  111247. var DistancePower = function (x1, y1, x2, y2, pow)
  111248. {
  111249. if (pow === undefined) { pow = 2; }
  111250. return Math.sqrt(Math.pow(x2 - x1, pow) + Math.pow(y2 - y1, pow));
  111251. };
  111252. module.exports = DistancePower;
  111253. /***/ }),
  111254. /* 738 */
  111255. /***/ (function(module, exports, __webpack_require__) {
  111256. /**
  111257. * @author Richard Davey <rich@photonstorm.com>
  111258. * @copyright 2018 Photon Storm Ltd.
  111259. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111260. */
  111261. /**
  111262. * @namespace Phaser.Math.Distance
  111263. */
  111264. module.exports = {
  111265. Between: __webpack_require__(58),
  111266. Power: __webpack_require__(737),
  111267. Squared: __webpack_require__(736)
  111268. };
  111269. /***/ }),
  111270. /* 739 */
  111271. /***/ (function(module, exports) {
  111272. /**
  111273. * @author Richard Davey <rich@photonstorm.com>
  111274. * @copyright 2018 Photon Storm Ltd.
  111275. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111276. */
  111277. /**
  111278. * Gets the shortest angle between `angle1` and `angle2`.
  111279. *
  111280. * Both angles must be in the range -180 to 180, which is the same clamped
  111281. * range that `sprite.angle` uses, so you can pass in two sprite angles to
  111282. * this method and get the shortest angle back between the two of them.
  111283. *
  111284. * The angle returned will be in the same range. If the returned angle is
  111285. * greater than 0 then it's a counter-clockwise rotation, if < 0 then it's
  111286. * a clockwise rotation.
  111287. *
  111288. * TODO: Wrap the angles in this function?
  111289. *
  111290. * @function Phaser.Math.Angle.ShortestBetween
  111291. * @since 3.0.0
  111292. *
  111293. * @param {number} angle1 - The first angle in the range -180 to 180.
  111294. * @param {number} angle2 - The second angle in the range -180 to 180.
  111295. *
  111296. * @return {number} The shortest angle, in degrees. If greater than zero it's a counter-clockwise rotation.
  111297. */
  111298. var ShortestBetween = function (angle1, angle2)
  111299. {
  111300. var difference = angle2 - angle1;
  111301. if (difference === 0)
  111302. {
  111303. return 0;
  111304. }
  111305. var times = Math.floor((difference - (-180)) / 360);
  111306. return difference - (times * 360);
  111307. };
  111308. module.exports = ShortestBetween;
  111309. /***/ }),
  111310. /* 740 */
  111311. /***/ (function(module, exports, __webpack_require__) {
  111312. /**
  111313. * @author Richard Davey <rich@photonstorm.com>
  111314. * @copyright 2018 Photon Storm Ltd.
  111315. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111316. */
  111317. var MATH_CONST = __webpack_require__(15);
  111318. /**
  111319. * Rotates `currentAngle` towards `targetAngle`, taking the shortest rotation distance. The `lerp` argument is the amount to rotate by in this call.
  111320. *
  111321. * @function Phaser.Math.Angle.RotateTo
  111322. * @since 3.0.0
  111323. *
  111324. * @param {number} currentAngle - The current angle, in radians.
  111325. * @param {number} targetAngle - The target angle to rotate to, in radians.
  111326. * @param {number} [lerp=0.05] - The lerp value to add to the current angle.
  111327. *
  111328. * @return {number} The adjusted angle.
  111329. */
  111330. var RotateTo = function (currentAngle, targetAngle, lerp)
  111331. {
  111332. if (lerp === undefined) { lerp = 0.05; }
  111333. if (currentAngle === targetAngle)
  111334. {
  111335. return currentAngle;
  111336. }
  111337. if (Math.abs(targetAngle - currentAngle) <= lerp || Math.abs(targetAngle - currentAngle) >= (MATH_CONST.PI2 - lerp))
  111338. {
  111339. currentAngle = targetAngle;
  111340. }
  111341. else
  111342. {
  111343. if (Math.abs(targetAngle - currentAngle) > Math.PI)
  111344. {
  111345. if (targetAngle < currentAngle)
  111346. {
  111347. targetAngle += MATH_CONST.PI2;
  111348. }
  111349. else
  111350. {
  111351. targetAngle -= MATH_CONST.PI2;
  111352. }
  111353. }
  111354. if (targetAngle > currentAngle)
  111355. {
  111356. currentAngle += lerp;
  111357. }
  111358. else if (targetAngle < currentAngle)
  111359. {
  111360. currentAngle -= lerp;
  111361. }
  111362. }
  111363. return currentAngle;
  111364. };
  111365. module.exports = RotateTo;
  111366. /***/ }),
  111367. /* 741 */
  111368. /***/ (function(module, exports, __webpack_require__) {
  111369. /**
  111370. * @author Richard Davey <rich@photonstorm.com>
  111371. * @copyright 2018 Photon Storm Ltd.
  111372. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111373. */
  111374. var Normalize = __webpack_require__(358);
  111375. /**
  111376. * Reverse the given angle.
  111377. *
  111378. * @function Phaser.Math.Angle.Reverse
  111379. * @since 3.0.0
  111380. *
  111381. * @param {number} angle - The angle to reverse, in radians.
  111382. *
  111383. * @return {number} The reversed angle, in radians.
  111384. */
  111385. var Reverse = function (angle)
  111386. {
  111387. return Normalize(angle + Math.PI);
  111388. };
  111389. module.exports = Reverse;
  111390. /***/ }),
  111391. /* 742 */
  111392. /***/ (function(module, exports) {
  111393. /**
  111394. * @author Richard Davey <rich@photonstorm.com>
  111395. * @copyright 2018 Photon Storm Ltd.
  111396. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111397. */
  111398. /**
  111399. * Find the angle of a segment from (point1.x, point1.y) -> (point2.x, point2.y).
  111400. *
  111401. * The difference between this method and {@link Phaser.Math.Angle.BetweenPoints} is that this assumes the y coordinate
  111402. * travels down the screen.
  111403. *
  111404. * @function Phaser.Math.Angle.BetweenPointsY
  111405. * @since 3.0.0
  111406. *
  111407. * @param {(Phaser.Geom.Point|object)} point1 - The first point.
  111408. * @param {(Phaser.Geom.Point|object)} point2 - The second point.
  111409. *
  111410. * @return {number} The angle in radians.
  111411. */
  111412. var BetweenPointsY = function (point1, point2)
  111413. {
  111414. return Math.atan2(point2.x - point1.x, point2.y - point1.y);
  111415. };
  111416. module.exports = BetweenPointsY;
  111417. /***/ }),
  111418. /* 743 */
  111419. /***/ (function(module, exports) {
  111420. /**
  111421. * @author Richard Davey <rich@photonstorm.com>
  111422. * @copyright 2018 Photon Storm Ltd.
  111423. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111424. */
  111425. /**
  111426. * Find the angle of a segment from (point1.x, point1.y) -> (point2.x, point2.y).
  111427. *
  111428. * Calculates the angle of the vector from the first point to the second point.
  111429. *
  111430. * @function Phaser.Math.Angle.BetweenPoints
  111431. * @since 3.0.0
  111432. *
  111433. * @param {(Phaser.Geom.Point|object)} point1 - The first point.
  111434. * @param {(Phaser.Geom.Point|object)} point2 - The second point.
  111435. *
  111436. * @return {number} The angle in radians.
  111437. */
  111438. var BetweenPoints = function (point1, point2)
  111439. {
  111440. return Math.atan2(point2.y - point1.y, point2.x - point1.x);
  111441. };
  111442. module.exports = BetweenPoints;
  111443. /***/ }),
  111444. /* 744 */
  111445. /***/ (function(module, exports) {
  111446. /**
  111447. * @author Richard Davey <rich@photonstorm.com>
  111448. * @copyright 2018 Photon Storm Ltd.
  111449. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111450. */
  111451. /**
  111452. * Find the angle of a segment from (x1, y1) -> (x2, y2).
  111453. *
  111454. * The difference between this method and {@link Phaser.Math.Angle.Between} is that this assumes the y coordinate
  111455. * travels down the screen.
  111456. *
  111457. * @function Phaser.Math.Angle.BetweenY
  111458. * @since 3.0.0
  111459. *
  111460. * @param {number} x1 - The x coordinate of the first point.
  111461. * @param {number} y1 - The y coordinate of the first point.
  111462. * @param {number} x2 - The x coordinate of the second point.
  111463. * @param {number} y2 - The y coordinate of the second point.
  111464. *
  111465. * @return {number} The angle in radians.
  111466. */
  111467. var BetweenY = function (x1, y1, x2, y2)
  111468. {
  111469. return Math.atan2(x2 - x1, y2 - y1);
  111470. };
  111471. module.exports = BetweenY;
  111472. /***/ }),
  111473. /* 745 */
  111474. /***/ (function(module, exports) {
  111475. /**
  111476. * @author Richard Davey <rich@photonstorm.com>
  111477. * @copyright 2018 Photon Storm Ltd.
  111478. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111479. */
  111480. /**
  111481. * Find the angle of a segment from (x1, y1) -> (x2, y2).
  111482. *
  111483. * @function Phaser.Math.Angle.Between
  111484. * @since 3.0.0
  111485. *
  111486. * @param {number} x1 - The x coordinate of the first point.
  111487. * @param {number} y1 - The y coordinate of the first point.
  111488. * @param {number} x2 - The x coordinate of the second point.
  111489. * @param {number} y2 - The y coordinate of the second point.
  111490. *
  111491. * @return {number} The angle in radians.
  111492. */
  111493. var Between = function (x1, y1, x2, y2)
  111494. {
  111495. return Math.atan2(y2 - y1, x2 - x1);
  111496. };
  111497. module.exports = Between;
  111498. /***/ }),
  111499. /* 746 */
  111500. /***/ (function(module, exports, __webpack_require__) {
  111501. /**
  111502. * @author Richard Davey <rich@photonstorm.com>
  111503. * @copyright 2018 Photon Storm Ltd.
  111504. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111505. */
  111506. /**
  111507. * @namespace Phaser.Math.Angle
  111508. */
  111509. module.exports = {
  111510. Between: __webpack_require__(745),
  111511. BetweenY: __webpack_require__(744),
  111512. BetweenPoints: __webpack_require__(743),
  111513. BetweenPointsY: __webpack_require__(742),
  111514. Reverse: __webpack_require__(741),
  111515. RotateTo: __webpack_require__(740),
  111516. ShortestBetween: __webpack_require__(739),
  111517. Normalize: __webpack_require__(358),
  111518. Wrap: __webpack_require__(217),
  111519. WrapDegrees: __webpack_require__(216)
  111520. };
  111521. /***/ }),
  111522. /* 747 */
  111523. /***/ (function(module, exports, __webpack_require__) {
  111524. /**
  111525. * @author Richard Davey <rich@photonstorm.com>
  111526. * @copyright 2018 Photon Storm Ltd.
  111527. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111528. */
  111529. var CONST = __webpack_require__(15);
  111530. var Extend = __webpack_require__(16);
  111531. /**
  111532. * @namespace Phaser.Math
  111533. */
  111534. var PhaserMath = {
  111535. // Collections of functions
  111536. Angle: __webpack_require__(746),
  111537. Distance: __webpack_require__(738),
  111538. Easing: __webpack_require__(735),
  111539. Fuzzy: __webpack_require__(734),
  111540. Interpolation: __webpack_require__(731),
  111541. Pow2: __webpack_require__(726),
  111542. Snap: __webpack_require__(724),
  111543. // Expose the RNG Class
  111544. RandomDataGenerator: __webpack_require__(302),
  111545. // Single functions
  111546. Average: __webpack_require__(722),
  111547. Bernstein: __webpack_require__(354),
  111548. Between: __webpack_require__(152),
  111549. CatmullRom: __webpack_require__(267),
  111550. CeilTo: __webpack_require__(721),
  111551. Clamp: __webpack_require__(19),
  111552. DegToRad: __webpack_require__(39),
  111553. Difference: __webpack_require__(720),
  111554. Factorial: __webpack_require__(353),
  111555. FloatBetween: __webpack_require__(242),
  111556. FloorTo: __webpack_require__(719),
  111557. FromPercent: __webpack_require__(64),
  111558. GetSpeed: __webpack_require__(718),
  111559. IsEven: __webpack_require__(717),
  111560. IsEvenStrict: __webpack_require__(716),
  111561. Linear: __webpack_require__(122),
  111562. MaxAdd: __webpack_require__(715),
  111563. MinSub: __webpack_require__(714),
  111564. Percent: __webpack_require__(713),
  111565. RadToDeg: __webpack_require__(153),
  111566. RandomXY: __webpack_require__(712),
  111567. RandomXYZ: __webpack_require__(531),
  111568. RandomXYZW: __webpack_require__(530),
  111569. Rotate: __webpack_require__(351),
  111570. RotateAround: __webpack_require__(297),
  111571. RotateAroundDistance: __webpack_require__(293),
  111572. RoundAwayFromZero: __webpack_require__(248),
  111573. RoundTo: __webpack_require__(711),
  111574. SinCosTableGenerator: __webpack_require__(710),
  111575. SmootherStep: __webpack_require__(292),
  111576. SmoothStep: __webpack_require__(157),
  111577. TransformXY: __webpack_require__(250),
  111578. Within: __webpack_require__(709),
  111579. Wrap: __webpack_require__(40),
  111580. // Vector classes
  111581. Vector2: __webpack_require__(6),
  111582. Vector3: __webpack_require__(87),
  111583. Vector4: __webpack_require__(271),
  111584. Matrix3: __webpack_require__(527),
  111585. Matrix4: __webpack_require__(272),
  111586. Quaternion: __webpack_require__(528),
  111587. RotateVec3: __webpack_require__(529)
  111588. };
  111589. // Merge in the consts
  111590. PhaserMath = Extend(false, PhaserMath, CONST);
  111591. // Export it
  111592. module.exports = PhaserMath;
  111593. /***/ }),
  111594. /* 748 */
  111595. /***/ (function(module, exports, __webpack_require__) {
  111596. /**
  111597. * @author Richard Davey <rich@photonstorm.com>
  111598. * @copyright 2018 Photon Storm Ltd.
  111599. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111600. */
  111601. var Class = __webpack_require__(0);
  111602. var FileTypesManager = __webpack_require__(7);
  111603. var GetFastValue = __webpack_require__(1);
  111604. var ImageFile = __webpack_require__(38);
  111605. var IsPlainObject = __webpack_require__(8);
  111606. var MultiFile = __webpack_require__(37);
  111607. var TextFile = __webpack_require__(229);
  111608. /**
  111609. * @typedef {object} Phaser.Loader.FileTypes.UnityAtlasFileConfig
  111610. *
  111611. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  111612. * @property {string} [textureURL] - The absolute or relative URL to load the texture image file from.
  111613. * @property {string} [textureExtension='png'] - The default file extension to use for the image texture if no url is provided.
  111614. * @property {XHRSettingsObject} [textureXhrSettings] - Extra XHR Settings specifically for the texture image file.
  111615. * @property {string} [normalMap] - The filename of an associated normal map. It uses the same path and url to load as the texture image.
  111616. * @property {string} [atlasURL] - The absolute or relative URL to load the atlas data file from.
  111617. * @property {string} [atlasExtension='txt'] - The default file extension to use for the atlas data if no url is provided.
  111618. * @property {XHRSettingsObject} [atlasXhrSettings] - Extra XHR Settings specifically for the atlas data file.
  111619. */
  111620. /**
  111621. * @classdesc
  111622. * A single text file based Unity Texture Atlas File suitable for loading by the Loader.
  111623. *
  111624. * These are created when you use the Phaser.Loader.LoaderPlugin#unityAtlas method and are not typically created directly.
  111625. *
  111626. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#unityAtlas.
  111627. *
  111628. * @class UnityAtlasFile
  111629. * @extends Phaser.Loader.MultiFile
  111630. * @memberOf Phaser.Loader.FileTypes
  111631. * @constructor
  111632. *
  111633. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  111634. * @param {(string|Phaser.Loader.FileTypes.UnityAtlasFileConfig)} key - The key to use for this file, or a file configuration object.
  111635. * @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".
  111636. * @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".
  111637. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings.
  111638. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas data file. Used in replacement of the Loaders default XHR Settings.
  111639. */
  111640. var UnityAtlasFile = new Class({
  111641. Extends: MultiFile,
  111642. initialize:
  111643. function UnityAtlasFile (loader, key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
  111644. {
  111645. var image;
  111646. var data;
  111647. if (IsPlainObject(key))
  111648. {
  111649. var config = key;
  111650. image = new ImageFile(loader, {
  111651. key: key,
  111652. url: GetFastValue(config, 'textureURL'),
  111653. extension: GetFastValue(config, 'textureExtension', 'png'),
  111654. normalMap: GetFastValue(config, 'normalMap'),
  111655. xhrSettings: GetFastValue(config, 'textureXhrSettings')
  111656. });
  111657. data = new TextFile(loader, {
  111658. key: key,
  111659. url: GetFastValue(config, 'atlasURL'),
  111660. extension: GetFastValue(config, 'atlasExtension', 'txt'),
  111661. xhrSettings: GetFastValue(config, 'atlasXhrSettings')
  111662. });
  111663. }
  111664. else
  111665. {
  111666. image = new ImageFile(loader, key, textureURL, textureXhrSettings);
  111667. data = new TextFile(loader, key, atlasURL, atlasXhrSettings);
  111668. }
  111669. if (image.linkFile)
  111670. {
  111671. // Image has a normal map
  111672. MultiFile.call(this, loader, 'unityatlas', key, [ image, data, image.linkFile ]);
  111673. }
  111674. else
  111675. {
  111676. MultiFile.call(this, loader, 'unityatlas', key, [ image, data ]);
  111677. }
  111678. },
  111679. /**
  111680. * Adds this file to its target cache upon successful loading and processing.
  111681. *
  111682. * @method Phaser.Loader.FileTypes.UnityAtlasFile#addToCache
  111683. * @since 3.7.0
  111684. */
  111685. addToCache: function ()
  111686. {
  111687. if (this.failed === 0 && !this.complete)
  111688. {
  111689. var image = this.files[0];
  111690. var text = this.files[1];
  111691. var normalMap = (this.files[2]) ? this.files[2].data : null;
  111692. this.loader.textureManager.addUnityAtlas(image.key, image.data, text.data, normalMap);
  111693. text.addToCache();
  111694. this.complete = true;
  111695. }
  111696. }
  111697. });
  111698. /**
  111699. * Adds a Unity YAML based Texture Atlas, or array of atlases, to the current load queue.
  111700. *
  111701. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  111702. *
  111703. * ```javascript
  111704. * function preload ()
  111705. * {
  111706. * this.load.unityAtlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.txt');
  111707. * }
  111708. * ```
  111709. *
  111710. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  111711. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  111712. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  111713. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  111714. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  111715. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  111716. * loaded.
  111717. *
  111718. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  111719. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  111720. *
  111721. * Phaser expects the atlas data to be provided in a YAML formatted text file as exported from Unity.
  111722. *
  111723. * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle.
  111724. *
  111725. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  111726. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  111727. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  111728. * then remove it from the Texture Manager first, before loading a new one.
  111729. *
  111730. * Instead of passing arguments you can pass a configuration object, such as:
  111731. *
  111732. * ```javascript
  111733. * this.load.unityAtlas({
  111734. * key: 'mainmenu',
  111735. * textureURL: 'images/MainMenu.png',
  111736. * atlasURL: 'images/MainMenu.txt'
  111737. * });
  111738. * ```
  111739. *
  111740. * See the documentation for `Phaser.Loader.FileTypes.UnityAtlasFileConfig` for more details.
  111741. *
  111742. * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key:
  111743. *
  111744. * ```javascript
  111745. * this.load.unityAtlas('mainmenu', 'images/MainMenu.png', 'images/MainMenu.json');
  111746. * // and later in your game ...
  111747. * this.add.image(x, y, 'mainmenu', 'background');
  111748. * ```
  111749. *
  111750. * To get a list of all available frames within an atlas please consult your Texture Atlas software.
  111751. *
  111752. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  111753. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  111754. * this is what you would use to retrieve the image from the Texture Manager.
  111755. *
  111756. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  111757. *
  111758. * 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"
  111759. * 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
  111760. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  111761. *
  111762. * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image,
  111763. * then you can specify it by providing an array as the `url` where the second element is the normal map:
  111764. *
  111765. * ```javascript
  111766. * this.load.unityAtlas('mainmenu', [ 'images/MainMenu.png', 'images/MainMenu-n.png' ], 'images/MainMenu.txt');
  111767. * ```
  111768. *
  111769. * Or, if you are using a config object use the `normalMap` property:
  111770. *
  111771. * ```javascript
  111772. * this.load.unityAtlas({
  111773. * key: 'mainmenu',
  111774. * textureURL: 'images/MainMenu.png',
  111775. * normalMap: 'images/MainMenu-n.png',
  111776. * atlasURL: 'images/MainMenu.txt'
  111777. * });
  111778. * ```
  111779. *
  111780. * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings.
  111781. * Normal maps are a WebGL only feature.
  111782. *
  111783. * Note: The ability to load this type of file will only be available if the Unity Atlas File type has been built into Phaser.
  111784. * It is available in the default build but can be excluded from custom builds.
  111785. *
  111786. * @method Phaser.Loader.LoaderPlugin#unityAtlas
  111787. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  111788. * @since 3.0.0
  111789. *
  111790. * @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.
  111791. * @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".
  111792. * @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".
  111793. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings.
  111794. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas data file. Used in replacement of the Loaders default XHR Settings.
  111795. *
  111796. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  111797. */
  111798. FileTypesManager.register('unityAtlas', function (key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
  111799. {
  111800. var multifile;
  111801. // Supports an Object file definition in the key argument
  111802. // Or an array of objects in the key argument
  111803. // Or a single entry where all arguments have been defined
  111804. if (Array.isArray(key))
  111805. {
  111806. for (var i = 0; i < key.length; i++)
  111807. {
  111808. multifile = new UnityAtlasFile(this, key[i]);
  111809. this.addFile(multifile.files);
  111810. }
  111811. }
  111812. else
  111813. {
  111814. multifile = new UnityAtlasFile(this, key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings);
  111815. this.addFile(multifile.files);
  111816. }
  111817. return this;
  111818. });
  111819. module.exports = UnityAtlasFile;
  111820. /***/ }),
  111821. /* 749 */
  111822. /***/ (function(module, exports, __webpack_require__) {
  111823. /**
  111824. * @author Richard Davey <rich@photonstorm.com>
  111825. * @copyright 2018 Photon Storm Ltd.
  111826. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111827. */
  111828. var Class = __webpack_require__(0);
  111829. var FileTypesManager = __webpack_require__(7);
  111830. var JSONFile = __webpack_require__(28);
  111831. var TILEMAP_FORMATS = __webpack_require__(27);
  111832. /**
  111833. * @typedef {object} Phaser.Loader.FileTypes.TilemapJSONFileConfig
  111834. *
  111835. * @property {string} key - The key of the file. Must be unique within both the Loader and the Tilemap Cache.
  111836. * @property {string} [url] - The absolute or relative URL to load the file from.
  111837. * @property {string} [extension='json'] - The default file extension to use if no url is provided.
  111838. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  111839. */
  111840. /**
  111841. * @classdesc
  111842. * A single Tiled Tilemap JSON File suitable for loading by the Loader.
  111843. *
  111844. * These are created when you use the Phaser.Loader.LoaderPlugin#tilemapTiledJSON method and are not typically created directly.
  111845. *
  111846. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#tilemapTiledJSON.
  111847. *
  111848. * @class TilemapJSONFile
  111849. * @extends Phaser.Loader.File
  111850. * @memberOf Phaser.Loader.FileTypes
  111851. * @constructor
  111852. * @since 3.0.0
  111853. *
  111854. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  111855. * @param {(string|Phaser.Loader.FileTypes.TilemapJSONFileConfig)} key - The key to use for this file, or a file configuration object.
  111856. * @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".
  111857. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  111858. */
  111859. var TilemapJSONFile = new Class({
  111860. Extends: JSONFile,
  111861. initialize:
  111862. function TilemapJSONFile (loader, key, url, xhrSettings)
  111863. {
  111864. JSONFile.call(this, loader, key, url, xhrSettings);
  111865. this.type = 'tilemapJSON';
  111866. this.cache = loader.cacheManager.tilemap;
  111867. },
  111868. /**
  111869. * Adds this file to its target cache upon successful loading and processing.
  111870. *
  111871. * @method Phaser.Loader.FileTypes.TilemapJSONFile#addToCache
  111872. * @since 3.7.0
  111873. */
  111874. addToCache: function ()
  111875. {
  111876. var tiledata = { format: TILEMAP_FORMATS.TILED_JSON, data: this.data };
  111877. this.cache.add(this.key, tiledata);
  111878. this.pendingDestroy(tiledata);
  111879. }
  111880. });
  111881. /**
  111882. * Adds a Tiled JSON Tilemap file, or array of map files, to the current load queue.
  111883. *
  111884. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  111885. *
  111886. * ```javascript
  111887. * function preload ()
  111888. * {
  111889. * this.load.tilemapTiledJSON('level1', maps/Level1.json');
  111890. * }
  111891. * ```
  111892. *
  111893. * The Tilemap data is created using the Tiled Map Editor and selecting JSON as the export format.
  111894. *
  111895. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  111896. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  111897. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  111898. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  111899. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  111900. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  111901. * loaded.
  111902. *
  111903. * The key must be a unique String. It is used to add the file to the global Tilemap Cache upon a successful load.
  111904. * The key should be unique both in terms of files being loaded and files already present in the Tilemap Cache.
  111905. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  111906. * then remove it from the Text Cache first, before loading a new one.
  111907. *
  111908. * Instead of passing arguments you can pass a configuration object, such as:
  111909. *
  111910. * ```javascript
  111911. * this.load.tilemapTiledJSON({
  111912. * key: 'level1',
  111913. * url: 'maps/Level1.json'
  111914. * });
  111915. * ```
  111916. *
  111917. * See the documentation for `Phaser.Loader.FileTypes.TilemapJSONFileConfig` for more details.
  111918. *
  111919. * Once the file has finished loading you can access it from its Cache using its key:
  111920. *
  111921. * ```javascript
  111922. * this.load.tilemapTiledJSON('level1', 'maps/Level1.json');
  111923. * // and later in your game ...
  111924. * var map = this.make.tilemap({ key: 'level1' });
  111925. * ```
  111926. *
  111927. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  111928. * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and
  111929. * this is what you would use to retrieve the text from the Tilemap Cache.
  111930. *
  111931. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  111932. *
  111933. * 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"
  111934. * 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
  111935. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  111936. *
  111937. * Note: The ability to load this type of file will only be available if the Tilemap JSON File type has been built into Phaser.
  111938. * It is available in the default build but can be excluded from custom builds.
  111939. *
  111940. * @method Phaser.Loader.LoaderPlugin#tilemapTiledJSON
  111941. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  111942. * @since 3.0.0
  111943. *
  111944. * @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.
  111945. * @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".
  111946. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  111947. *
  111948. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  111949. */
  111950. FileTypesManager.register('tilemapTiledJSON', function (key, url, xhrSettings)
  111951. {
  111952. if (Array.isArray(key))
  111953. {
  111954. for (var i = 0; i < key.length; i++)
  111955. {
  111956. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  111957. this.addFile(new TilemapJSONFile(this, key[i]));
  111958. }
  111959. }
  111960. else
  111961. {
  111962. this.addFile(new TilemapJSONFile(this, key, url, xhrSettings));
  111963. }
  111964. return this;
  111965. });
  111966. module.exports = TilemapJSONFile;
  111967. /***/ }),
  111968. /* 750 */
  111969. /***/ (function(module, exports, __webpack_require__) {
  111970. /**
  111971. * @author Richard Davey <rich@photonstorm.com>
  111972. * @copyright 2018 Photon Storm Ltd.
  111973. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  111974. */
  111975. var Class = __webpack_require__(0);
  111976. var FileTypesManager = __webpack_require__(7);
  111977. var JSONFile = __webpack_require__(28);
  111978. var TILEMAP_FORMATS = __webpack_require__(27);
  111979. /**
  111980. * @typedef {object} Phaser.Loader.FileTypes.TilemapImpactFileConfig
  111981. *
  111982. * @property {string} key - The key of the file. Must be unique within both the Loader and the Tilemap Cache.
  111983. * @property {string} [url] - The absolute or relative URL to load the file from.
  111984. * @property {string} [extension='json'] - The default file extension to use if no url is provided.
  111985. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  111986. */
  111987. /**
  111988. * @classdesc
  111989. * A single Impact.js Tilemap JSON File suitable for loading by the Loader.
  111990. *
  111991. * These are created when you use the Phaser.Loader.LoaderPlugin#tilemapImpact method and are not typically created directly.
  111992. *
  111993. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#tilemapImpact.
  111994. *
  111995. * @class TilemapImpactFile
  111996. * @extends Phaser.Loader.File
  111997. * @memberOf Phaser.Loader.FileTypes
  111998. * @constructor
  111999. * @since 3.7.0
  112000. *
  112001. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  112002. * @param {(string|Phaser.Loader.FileTypes.TilemapImpactFileConfig)} key - The key to use for this file, or a file configuration object.
  112003. * @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".
  112004. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  112005. */
  112006. var TilemapImpactFile = new Class({
  112007. Extends: JSONFile,
  112008. initialize:
  112009. function TilemapImpactFile (loader, key, url, xhrSettings)
  112010. {
  112011. JSONFile.call(this, loader, key, url, xhrSettings);
  112012. this.type = 'tilemapJSON';
  112013. this.cache = loader.cacheManager.tilemap;
  112014. },
  112015. /**
  112016. * Adds this file to its target cache upon successful loading and processing.
  112017. *
  112018. * @method Phaser.Loader.FileTypes.TilemapImpactFile#addToCache
  112019. * @since 3.7.0
  112020. */
  112021. addToCache: function ()
  112022. {
  112023. var tiledata = { format: TILEMAP_FORMATS.WELTMEISTER, data: this.data };
  112024. this.cache.add(this.key, tiledata);
  112025. this.pendingDestroy(tiledata);
  112026. }
  112027. });
  112028. /**
  112029. * Adds an Impact.js Tilemap file, or array of map files, to the current load queue.
  112030. *
  112031. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  112032. *
  112033. * ```javascript
  112034. * function preload ()
  112035. * {
  112036. * this.load.tilemapImpact('level1', maps/Level1.json');
  112037. * }
  112038. * ```
  112039. *
  112040. * Impact Tilemap data is created the Impact.js Map Editor called Weltmeister.
  112041. *
  112042. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  112043. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  112044. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  112045. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  112046. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  112047. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  112048. * loaded.
  112049. *
  112050. * The key must be a unique String. It is used to add the file to the global Tilemap Cache upon a successful load.
  112051. * The key should be unique both in terms of files being loaded and files already present in the Tilemap Cache.
  112052. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  112053. * then remove it from the Text Cache first, before loading a new one.
  112054. *
  112055. * Instead of passing arguments you can pass a configuration object, such as:
  112056. *
  112057. * ```javascript
  112058. * this.load.tilemapImpact({
  112059. * key: 'level1',
  112060. * url: 'maps/Level1.json'
  112061. * });
  112062. * ```
  112063. *
  112064. * See the documentation for `Phaser.Loader.FileTypes.TilemapImpactFileConfig` for more details.
  112065. *
  112066. * Once the file has finished loading you can access it from its Cache using its key:
  112067. *
  112068. * ```javascript
  112069. * this.load.tilemapImpact('level1', 'maps/Level1.json');
  112070. * // and later in your game ...
  112071. * var map = this.make.tilemap({ key: 'level1' });
  112072. * ```
  112073. *
  112074. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  112075. * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and
  112076. * this is what you would use to retrieve the text from the Tilemap Cache.
  112077. *
  112078. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  112079. *
  112080. * 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"
  112081. * 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
  112082. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  112083. *
  112084. * Note: The ability to load this type of file will only be available if the Tilemap Impact File type has been built into Phaser.
  112085. * It is available in the default build but can be excluded from custom builds.
  112086. *
  112087. * @method Phaser.Loader.LoaderPlugin#tilemapImpact
  112088. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  112089. * @since 3.7.0
  112090. *
  112091. * @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.
  112092. * @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".
  112093. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  112094. *
  112095. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  112096. */
  112097. FileTypesManager.register('tilemapImpact', function (key, url, xhrSettings)
  112098. {
  112099. if (Array.isArray(key))
  112100. {
  112101. for (var i = 0; i < key.length; i++)
  112102. {
  112103. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  112104. this.addFile(new TilemapImpactFile(this, key[i]));
  112105. }
  112106. }
  112107. else
  112108. {
  112109. this.addFile(new TilemapImpactFile(this, key, url, xhrSettings));
  112110. }
  112111. return this;
  112112. });
  112113. module.exports = TilemapImpactFile;
  112114. /***/ }),
  112115. /* 751 */
  112116. /***/ (function(module, exports, __webpack_require__) {
  112117. /**
  112118. * @author Richard Davey <rich@photonstorm.com>
  112119. * @copyright 2018 Photon Storm Ltd.
  112120. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112121. */
  112122. var Class = __webpack_require__(0);
  112123. var CONST = __webpack_require__(18);
  112124. var File = __webpack_require__(20);
  112125. var FileTypesManager = __webpack_require__(7);
  112126. var GetFastValue = __webpack_require__(1);
  112127. var IsPlainObject = __webpack_require__(8);
  112128. var TILEMAP_FORMATS = __webpack_require__(27);
  112129. /**
  112130. * @typedef {object} Phaser.Loader.FileTypes.TilemapCSVFileConfig
  112131. *
  112132. * @property {string} key - The key of the file. Must be unique within both the Loader and the Tilemap Cache.
  112133. * @property {string} [url] - The absolute or relative URL to load the file from.
  112134. * @property {string} [extension='csv'] - The default file extension to use if no url is provided.
  112135. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  112136. */
  112137. /**
  112138. * @classdesc
  112139. * A single Tilemap CSV File suitable for loading by the Loader.
  112140. *
  112141. * These are created when you use the Phaser.Loader.LoaderPlugin#tilemapCSV method and are not typically created directly.
  112142. *
  112143. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#tilemapCSV.
  112144. *
  112145. * @class TilemapCSVFile
  112146. * @extends Phaser.Loader.File
  112147. * @memberOf Phaser.Loader.FileTypes
  112148. * @constructor
  112149. * @since 3.0.0
  112150. *
  112151. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  112152. * @param {(string|Phaser.Loader.FileTypes.TilemapCSVFileConfig)} key - The key to use for this file, or a file configuration object.
  112153. * @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".
  112154. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  112155. */
  112156. var TilemapCSVFile = new Class({
  112157. Extends: File,
  112158. initialize:
  112159. function TilemapCSVFile (loader, key, url, xhrSettings)
  112160. {
  112161. var extension = 'csv';
  112162. if (IsPlainObject(key))
  112163. {
  112164. var config = key;
  112165. key = GetFastValue(config, 'key');
  112166. url = GetFastValue(config, 'url');
  112167. xhrSettings = GetFastValue(config, 'xhrSettings');
  112168. extension = GetFastValue(config, 'extension', extension);
  112169. }
  112170. var fileConfig = {
  112171. type: 'tilemapCSV',
  112172. cache: loader.cacheManager.tilemap,
  112173. extension: extension,
  112174. responseType: 'text',
  112175. key: key,
  112176. url: url,
  112177. xhrSettings: xhrSettings
  112178. };
  112179. File.call(this, loader, fileConfig);
  112180. this.tilemapFormat = TILEMAP_FORMATS.CSV;
  112181. },
  112182. /**
  112183. * Called automatically by Loader.nextFile.
  112184. * This method controls what extra work this File does with its loaded data.
  112185. *
  112186. * @method Phaser.Loader.FileTypes.TilemapCSVFile#onProcess
  112187. * @since 3.7.0
  112188. */
  112189. onProcess: function ()
  112190. {
  112191. this.state = CONST.FILE_PROCESSING;
  112192. this.data = this.xhrLoader.responseText;
  112193. this.onProcessComplete();
  112194. },
  112195. /**
  112196. * Adds this file to its target cache upon successful loading and processing.
  112197. *
  112198. * @method Phaser.Loader.FileTypes.TilemapCSVFile#addToCache
  112199. * @since 3.7.0
  112200. */
  112201. addToCache: function ()
  112202. {
  112203. var tiledata = { format: this.tilemapFormat, data: this.data };
  112204. this.cache.add(this.key, tiledata);
  112205. this.pendingDestroy(tiledata);
  112206. }
  112207. });
  112208. /**
  112209. * Adds a CSV Tilemap file, or array of CSV files, to the current load queue.
  112210. *
  112211. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  112212. *
  112213. * ```javascript
  112214. * function preload ()
  112215. * {
  112216. * this.load.tilemapCSV('level1', maps/Level1.csv');
  112217. * }
  112218. * ```
  112219. *
  112220. * Tilemap CSV data can be created in a text editor, or a 3rd party app that exports as CSV.
  112221. *
  112222. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  112223. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  112224. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  112225. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  112226. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  112227. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  112228. * loaded.
  112229. *
  112230. * The key must be a unique String. It is used to add the file to the global Tilemap Cache upon a successful load.
  112231. * The key should be unique both in terms of files being loaded and files already present in the Tilemap Cache.
  112232. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  112233. * then remove it from the Text Cache first, before loading a new one.
  112234. *
  112235. * Instead of passing arguments you can pass a configuration object, such as:
  112236. *
  112237. * ```javascript
  112238. * this.load.tilemapCSV({
  112239. * key: 'level1',
  112240. * url: 'maps/Level1.csv'
  112241. * });
  112242. * ```
  112243. *
  112244. * See the documentation for `Phaser.Loader.FileTypes.TilemapCSVFileConfig` for more details.
  112245. *
  112246. * Once the file has finished loading you can access it from its Cache using its key:
  112247. *
  112248. * ```javascript
  112249. * this.load.tilemapCSV('level1', 'maps/Level1.csv');
  112250. * // and later in your game ...
  112251. * var map = this.make.tilemap({ key: 'level1' });
  112252. * ```
  112253. *
  112254. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  112255. * key. For example, if the prefix was `LEVEL1.` and the key was `Story` the final key will be `LEVEL1.Story` and
  112256. * this is what you would use to retrieve the text from the Tilemap Cache.
  112257. *
  112258. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  112259. *
  112260. * 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"
  112261. * 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
  112262. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  112263. *
  112264. * Note: The ability to load this type of file will only be available if the Tilemap CSV File type has been built into Phaser.
  112265. * It is available in the default build but can be excluded from custom builds.
  112266. *
  112267. * @method Phaser.Loader.LoaderPlugin#tilemapCSV
  112268. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  112269. * @since 3.0.0
  112270. *
  112271. * @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.
  112272. * @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".
  112273. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  112274. *
  112275. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  112276. */
  112277. FileTypesManager.register('tilemapCSV', function (key, url, xhrSettings)
  112278. {
  112279. if (Array.isArray(key))
  112280. {
  112281. for (var i = 0; i < key.length; i++)
  112282. {
  112283. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  112284. this.addFile(new TilemapCSVFile(this, key[i]));
  112285. }
  112286. }
  112287. else
  112288. {
  112289. this.addFile(new TilemapCSVFile(this, key, url, xhrSettings));
  112290. }
  112291. return this;
  112292. });
  112293. module.exports = TilemapCSVFile;
  112294. /***/ }),
  112295. /* 752 */
  112296. /***/ (function(module, exports, __webpack_require__) {
  112297. /**
  112298. * @author Richard Davey <rich@photonstorm.com>
  112299. * @copyright 2018 Photon Storm Ltd.
  112300. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112301. */
  112302. var Class = __webpack_require__(0);
  112303. var CONST = __webpack_require__(18);
  112304. var File = __webpack_require__(20);
  112305. var FileTypesManager = __webpack_require__(7);
  112306. var GetFastValue = __webpack_require__(1);
  112307. var IsPlainObject = __webpack_require__(8);
  112308. /**
  112309. * @typedef {object} Phaser.Loader.FileTypes.SVGFileConfig
  112310. *
  112311. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  112312. * @property {string} [url] - The absolute or relative URL to load the file from.
  112313. * @property {string} [extension='svg'] - The default file extension to use if no url is provided.
  112314. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  112315. */
  112316. /**
  112317. * @classdesc
  112318. * A single SVG File suitable for loading by the Loader.
  112319. *
  112320. * These are created when you use the Phaser.Loader.LoaderPlugin#svg method and are not typically created directly.
  112321. *
  112322. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#svg.
  112323. *
  112324. * @class SVGFile
  112325. * @extends Phaser.Loader.File
  112326. * @memberOf Phaser.Loader.FileTypes
  112327. * @constructor
  112328. * @since 3.0.0
  112329. *
  112330. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  112331. * @param {(string|Phaser.Loader.FileTypes.SVGFileConfig)} key - The key to use for this file, or a file configuration object.
  112332. * @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".
  112333. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  112334. */
  112335. var SVGFile = new Class({
  112336. Extends: File,
  112337. initialize:
  112338. function SVGFile (loader, key, url, xhrSettings)
  112339. {
  112340. var extension = 'svg';
  112341. if (IsPlainObject(key))
  112342. {
  112343. var config = key;
  112344. key = GetFastValue(config, 'key');
  112345. url = GetFastValue(config, 'url');
  112346. xhrSettings = GetFastValue(config, 'xhrSettings');
  112347. extension = GetFastValue(config, 'extension', extension);
  112348. }
  112349. var fileConfig = {
  112350. type: 'svg',
  112351. cache: loader.textureManager,
  112352. extension: extension,
  112353. responseType: 'text',
  112354. key: key,
  112355. url: url,
  112356. xhrSettings: xhrSettings
  112357. };
  112358. File.call(this, loader, fileConfig);
  112359. },
  112360. /**
  112361. * Called automatically by Loader.nextFile.
  112362. * This method controls what extra work this File does with its loaded data.
  112363. *
  112364. * @method Phaser.Loader.FileTypes.SVGFile#onProcess
  112365. * @since 3.7.0
  112366. */
  112367. onProcess: function ()
  112368. {
  112369. this.state = CONST.FILE_PROCESSING;
  112370. var svg = [ this.xhrLoader.responseText ];
  112371. try
  112372. {
  112373. var blob = new window.Blob(svg, { type: 'image/svg+xml;charset=utf-8' });
  112374. }
  112375. catch (e)
  112376. {
  112377. this.onProcessError();
  112378. return;
  112379. }
  112380. this.data = new Image();
  112381. this.data.crossOrigin = this.crossOrigin;
  112382. var _this = this;
  112383. var retry = false;
  112384. this.data.onload = function ()
  112385. {
  112386. if (!retry)
  112387. {
  112388. File.revokeObjectURL(_this.data);
  112389. }
  112390. _this.onProcessComplete();
  112391. };
  112392. this.data.onerror = function ()
  112393. {
  112394. // Safari 8 re-try
  112395. if (!retry)
  112396. {
  112397. retry = true;
  112398. File.revokeObjectURL(_this.data);
  112399. _this.data.src = 'data:image/svg+xml,' + encodeURIComponent(svg.join(''));
  112400. }
  112401. else
  112402. {
  112403. _this.onProcessError();
  112404. }
  112405. };
  112406. File.createObjectURL(this.data, blob, 'image/svg+xml');
  112407. },
  112408. /**
  112409. * Adds this file to its target cache upon successful loading and processing.
  112410. *
  112411. * @method Phaser.Loader.FileTypes.SVGFile#addToCache
  112412. * @since 3.7.0
  112413. */
  112414. addToCache: function ()
  112415. {
  112416. var texture = this.cache.addImage(this.key, this.data);
  112417. this.pendingDestroy(texture);
  112418. }
  112419. });
  112420. /**
  112421. * Adds an SVG File, or array of SVG Files, to the current load queue.
  112422. *
  112423. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  112424. *
  112425. * ```javascript
  112426. * function preload ()
  112427. * {
  112428. * this.load.svg('morty', 'images/Morty.svg');
  112429. * }
  112430. * ```
  112431. *
  112432. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  112433. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  112434. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  112435. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  112436. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  112437. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  112438. * loaded.
  112439. *
  112440. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  112441. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  112442. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  112443. * then remove it from the Texture Manager first, before loading a new one.
  112444. *
  112445. * Instead of passing arguments you can pass a configuration object, such as:
  112446. *
  112447. * ```javascript
  112448. * this.load.svg({
  112449. * key: 'morty',
  112450. * url: 'images/Morty.svg'
  112451. * });
  112452. * ```
  112453. *
  112454. * See the documentation for `Phaser.Loader.FileTypes.SVGFileConfig` for more details.
  112455. *
  112456. * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key:
  112457. *
  112458. * ```javascript
  112459. * this.load.svg('morty', 'images/Morty.svg');
  112460. * // and later in your game ...
  112461. * this.add.image(x, y, 'morty');
  112462. * ```
  112463. *
  112464. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  112465. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  112466. * this is what you would use to retrieve the image from the Texture Manager.
  112467. *
  112468. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  112469. *
  112470. * 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"
  112471. * 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
  112472. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  112473. *
  112474. * Note: The ability to load this type of file will only be available if the SVG File type has been built into Phaser.
  112475. * It is available in the default build but can be excluded from custom builds.
  112476. *
  112477. * @method Phaser.Loader.LoaderPlugin#svg
  112478. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  112479. * @since 3.0.0
  112480. *
  112481. * @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.
  112482. * @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".
  112483. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  112484. *
  112485. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  112486. */
  112487. FileTypesManager.register('svg', function (key, url, xhrSettings)
  112488. {
  112489. if (Array.isArray(key))
  112490. {
  112491. for (var i = 0; i < key.length; i++)
  112492. {
  112493. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  112494. this.addFile(new SVGFile(this, key[i]));
  112495. }
  112496. }
  112497. else
  112498. {
  112499. this.addFile(new SVGFile(this, key, url, xhrSettings));
  112500. }
  112501. return this;
  112502. });
  112503. module.exports = SVGFile;
  112504. /***/ }),
  112505. /* 753 */
  112506. /***/ (function(module, exports, __webpack_require__) {
  112507. /**
  112508. * @author Richard Davey <rich@photonstorm.com>
  112509. * @copyright 2018 Photon Storm Ltd.
  112510. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112511. */
  112512. var Class = __webpack_require__(0);
  112513. var CONST = __webpack_require__(18);
  112514. var File = __webpack_require__(20);
  112515. var FileTypesManager = __webpack_require__(7);
  112516. var GetFastValue = __webpack_require__(1);
  112517. var IsPlainObject = __webpack_require__(8);
  112518. /**
  112519. * @typedef {object} Phaser.Loader.FileTypes.ScenePluginFileConfig
  112520. *
  112521. * @property {string} key - The key of the file. Must be unique within the Loader.
  112522. * @property {(string|function)} [url] - The absolute or relative URL to load the file from. Or, a Scene Plugin.
  112523. * @property {string} [extension='js'] - The default file extension to use if no url is provided.
  112524. * @property {string} [systemKey] - If this plugin is to be added to Scene.Systems, this is the property key for it.
  112525. * @property {string} [sceneKey] - If this plugin is to be added to the Scene, this is the property key for it.
  112526. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  112527. */
  112528. /**
  112529. * @classdesc
  112530. * A single Scene Plugin Script File suitable for loading by the Loader.
  112531. *
  112532. * These are created when you use the Phaser.Loader.LoaderPlugin#scenePlugin method and are not typically created directly.
  112533. *
  112534. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#scenePlugin.
  112535. *
  112536. * @class ScenePluginFile
  112537. * @extends Phaser.Loader.File
  112538. * @memberOf Phaser.Loader.FileTypes
  112539. * @constructor
  112540. * @since 3.8.0
  112541. *
  112542. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  112543. * @param {(string|Phaser.Loader.FileTypes.ScenePluginFileConfig)} key - The key to use for this file, or a file configuration object.
  112544. * @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".
  112545. * @param {string} [systemKey] - If this plugin is to be added to Scene.Systems, this is the property key for it.
  112546. * @param {string} [sceneKey] - If this plugin is to be added to the Scene, this is the property key for it.
  112547. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  112548. */
  112549. var ScenePluginFile = new Class({
  112550. Extends: File,
  112551. initialize:
  112552. function ScenePluginFile (loader, key, url, systemKey, sceneKey, xhrSettings)
  112553. {
  112554. var extension = 'js';
  112555. if (IsPlainObject(key))
  112556. {
  112557. var config = key;
  112558. key = GetFastValue(config, 'key');
  112559. url = GetFastValue(config, 'url');
  112560. xhrSettings = GetFastValue(config, 'xhrSettings');
  112561. extension = GetFastValue(config, 'extension', extension);
  112562. systemKey = GetFastValue(config, 'systemKey');
  112563. sceneKey = GetFastValue(config, 'sceneKey');
  112564. }
  112565. var fileConfig = {
  112566. type: 'scenePlugin',
  112567. cache: false,
  112568. extension: extension,
  112569. responseType: 'text',
  112570. key: key,
  112571. url: url,
  112572. xhrSettings: xhrSettings,
  112573. config: {
  112574. systemKey: systemKey,
  112575. sceneKey: sceneKey
  112576. }
  112577. };
  112578. File.call(this, loader, fileConfig);
  112579. // If the url variable refers to a class, add the plugin directly
  112580. if (typeof url === 'function')
  112581. {
  112582. this.data = url;
  112583. this.state = CONST.FILE_POPULATED;
  112584. }
  112585. },
  112586. /**
  112587. * Called automatically by Loader.nextFile.
  112588. * This method controls what extra work this File does with its loaded data.
  112589. *
  112590. * @method Phaser.Loader.FileTypes.ScenePluginFile#onProcess
  112591. * @since 3.8.0
  112592. */
  112593. onProcess: function ()
  112594. {
  112595. var pluginManager = this.loader.systems.plugins;
  112596. var config = this.config;
  112597. var key = this.key;
  112598. var systemKey = GetFastValue(config, 'systemKey', key);
  112599. var sceneKey = GetFastValue(config, 'sceneKey', key);
  112600. if (this.state === CONST.FILE_POPULATED)
  112601. {
  112602. pluginManager.installScenePlugin(systemKey, this.data, sceneKey, this.loader.scene);
  112603. }
  112604. else
  112605. {
  112606. // Plugin added via a js file
  112607. this.state = CONST.FILE_PROCESSING;
  112608. this.data = document.createElement('script');
  112609. this.data.language = 'javascript';
  112610. this.data.type = 'text/javascript';
  112611. this.data.defer = false;
  112612. this.data.text = this.xhrLoader.responseText;
  112613. document.head.appendChild(this.data);
  112614. pluginManager.installScenePlugin(systemKey, window[this.key], sceneKey, this.loader.scene);
  112615. }
  112616. this.onProcessComplete();
  112617. }
  112618. });
  112619. /**
  112620. * Adds a Scene Plugin Script file, or array of plugin files, to the current load queue.
  112621. *
  112622. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  112623. *
  112624. * ```javascript
  112625. * function preload ()
  112626. * {
  112627. * this.load.scenePlugin('ModPlayer', 'plugins/ModPlayer.js', 'modPlayer', 'mods');
  112628. * }
  112629. * ```
  112630. *
  112631. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  112632. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  112633. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  112634. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  112635. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  112636. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  112637. * loaded.
  112638. *
  112639. * The key must be a unique String and not already in-use by another file in the Loader.
  112640. *
  112641. * Instead of passing arguments you can pass a configuration object, such as:
  112642. *
  112643. * ```javascript
  112644. * this.load.scenePlugin({
  112645. * key: 'modplayer',
  112646. * url: 'plugins/ModPlayer.js'
  112647. * });
  112648. * ```
  112649. *
  112650. * See the documentation for `Phaser.Loader.FileTypes.ScenePluginFileConfig` for more details.
  112651. *
  112652. * Once the file has finished loading it will automatically be converted into a script element
  112653. * via `document.createElement('script')`. It will have its language set to JavaScript, `defer` set to
  112654. * false and then the resulting element will be appended to `document.head`. Any code then in the
  112655. * script will be executed. It will then be passed to the Phaser PluginCache.register method.
  112656. *
  112657. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  112658. *
  112659. * 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"
  112660. * 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
  112661. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  112662. *
  112663. * Note: The ability to load this type of file will only be available if the Script File type has been built into Phaser.
  112664. * It is available in the default build but can be excluded from custom builds.
  112665. *
  112666. * @method Phaser.Loader.LoaderPlugin#scenePlugin
  112667. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  112668. * @since 3.8.0
  112669. *
  112670. * @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.
  112671. * @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.
  112672. * @param {string} [systemKey] - If this plugin is to be added to Scene.Systems, this is the property key for it.
  112673. * @param {string} [sceneKey] - If this plugin is to be added to the Scene, this is the property key for it.
  112674. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  112675. *
  112676. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  112677. */
  112678. FileTypesManager.register('scenePlugin', function (key, url, systemKey, sceneKey, xhrSettings)
  112679. {
  112680. if (Array.isArray(key))
  112681. {
  112682. for (var i = 0; i < key.length; i++)
  112683. {
  112684. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  112685. this.addFile(new ScenePluginFile(this, key[i]));
  112686. }
  112687. }
  112688. else
  112689. {
  112690. this.addFile(new ScenePluginFile(this, key, url, systemKey, sceneKey, xhrSettings));
  112691. }
  112692. return this;
  112693. });
  112694. module.exports = ScenePluginFile;
  112695. /***/ }),
  112696. /* 754 */
  112697. /***/ (function(module, exports, __webpack_require__) {
  112698. /**
  112699. * @author Richard Davey <rich@photonstorm.com>
  112700. * @copyright 2018 Photon Storm Ltd.
  112701. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112702. */
  112703. var Class = __webpack_require__(0);
  112704. var CONST = __webpack_require__(18);
  112705. var FileTypesManager = __webpack_require__(7);
  112706. var JSONFile = __webpack_require__(28);
  112707. /**
  112708. * @typedef {object} Phaser.Loader.FileTypes.PackFileConfig
  112709. *
  112710. * @property {string} key - The key of the file. Must be unique within both the Loader and the JSON Cache.
  112711. * @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.
  112712. * @property {string} [extension='json'] - The default file extension to use if no url is provided.
  112713. * @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.
  112714. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  112715. */
  112716. /**
  112717. * @classdesc
  112718. * A single JSON Pack File suitable for loading by the Loader.
  112719. *
  112720. * These are created when you use the Phaser.Loader.LoaderPlugin#pack method and are not typically created directly.
  112721. *
  112722. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#pack.
  112723. *
  112724. * @class PackFile
  112725. * @extends Phaser.Loader.File
  112726. * @memberOf Phaser.Loader.FileTypes
  112727. * @constructor
  112728. * @since 3.7.0
  112729. *
  112730. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  112731. * @param {(string|Phaser.Loader.FileTypes.JSONFileConfig)} key - The key to use for this file, or a file configuration object.
  112732. * @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".
  112733. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  112734. * @param {string} [dataKey] - When the JSON file loads only this property will be stored in the Cache.
  112735. */
  112736. var PackFile = new Class({
  112737. Extends: JSONFile,
  112738. initialize:
  112739. // 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
  112740. // dataKey allows you to pluck a specific object out of the JSON and put just that into the cache, rather than the whole thing
  112741. function PackFile (loader, key, url, xhrSettings, dataKey)
  112742. {
  112743. JSONFile.call(this, loader, key, url, xhrSettings, dataKey);
  112744. this.type = 'packfile';
  112745. },
  112746. /**
  112747. * Called automatically by Loader.nextFile.
  112748. * This method controls what extra work this File does with its loaded data.
  112749. *
  112750. * @method Phaser.Loader.FileTypes.PackFile#onProcess
  112751. * @since 3.7.0
  112752. */
  112753. onProcess: function ()
  112754. {
  112755. if (this.state !== CONST.FILE_POPULATED)
  112756. {
  112757. this.state = CONST.FILE_PROCESSING;
  112758. this.data = JSON.parse(this.xhrLoader.responseText);
  112759. }
  112760. // Let's pass the pack file data over to the Loader ...
  112761. this.loader.addPack(this.data, this.config);
  112762. this.onProcessComplete();
  112763. }
  112764. });
  112765. /**
  112766. * Adds a JSON File Pack, or array of packs, to the current load queue.
  112767. *
  112768. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  112769. *
  112770. * ```javascript
  112771. * function preload ()
  112772. * {
  112773. * this.load.pack('level1', 'data/Level1Files.json');
  112774. * }
  112775. * ```
  112776. *
  112777. * A File Pack is a JSON file (or object) that contains details about other files that should be added into the Loader.
  112778. * Here is a small example:
  112779. *
  112780. * ```json
  112781. * {
  112782. * "test1": {
  112783. * "files": [
  112784. * {
  112785. * "type": "image",
  112786. * "key": "taikodrummaster",
  112787. * "url": "assets/pics/taikodrummaster.jpg"
  112788. * },
  112789. * {
  112790. * "type": "image",
  112791. * "key": "sukasuka-chtholly",
  112792. * "url": "assets/pics/sukasuka-chtholly.png"
  112793. * }
  112794. * ]
  112795. * },
  112796. * "meta": {
  112797. * "generated": "1401380327373",
  112798. * "app": "Phaser 3 Asset Packer",
  112799. * "url": "https://phaser.io",
  112800. * "version": "1.0",
  112801. * "copyright": "Photon Storm Ltd. 2018"
  112802. * }
  112803. * }
  112804. * ```
  112805. *
  112806. * The pack can be split into sections. In the example above you'll see a section called `test1. You can tell
  112807. * the `load.pack` method to parse only a particular section of a pack. The pack is stored in the JSON Cache,
  112808. * so you can pass it to the Loader to process additional sections as needed in your game, or you can just load
  112809. * them all at once without specifying anything.
  112810. *
  112811. * The pack file can contain an entry for any type of file that Phaser can load. The object structures exactly
  112812. * match that of the file type configs, and all properties available within the file type configs can be used
  112813. * in the pack file too.
  112814. *
  112815. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  112816. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  112817. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  112818. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  112819. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  112820. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  112821. * loaded.
  112822. *
  112823. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  112824. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  112825. *
  112826. * The key must be a unique String. It is used to add the file to the global JSON Cache upon a successful load.
  112827. * The key should be unique both in terms of files being loaded and files already present in the JSON Cache.
  112828. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  112829. * then remove it from the JSON Cache first, before loading a new one.
  112830. *
  112831. * Instead of passing arguments you can pass a configuration object, such as:
  112832. *
  112833. * ```javascript
  112834. * this.load.pack({
  112835. * key: 'level1',
  112836. * url: 'data/Level1Files.json'
  112837. * });
  112838. * ```
  112839. *
  112840. * See the documentation for `Phaser.Loader.FileTypes.PackFileConfig` for more details.
  112841. *
  112842. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  112843. * key. For example, if the prefix was `LEVEL1.` and the key was `Waves` the final key will be `LEVEL1.Waves` and
  112844. * this is what you would use to retrieve the text from the JSON Cache.
  112845. *
  112846. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  112847. *
  112848. * 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"
  112849. * 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
  112850. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  112851. *
  112852. * 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,
  112853. * rather than the whole file. For example, if your JSON data had a structure like this:
  112854. *
  112855. * ```json
  112856. * {
  112857. * "level1": {
  112858. * "baddies": {
  112859. * "aliens": {},
  112860. * "boss": {}
  112861. * }
  112862. * },
  112863. * "level2": {},
  112864. * "level3": {}
  112865. * }
  112866. * ```
  112867. *
  112868. * And you only wanted to store the `boss` data in the Cache, then you could pass `level1.baddies.boss`as the `dataKey`.
  112869. *
  112870. * Note: The ability to load this type of file will only be available if the Pack File type has been built into Phaser.
  112871. * It is available in the default build but can be excluded from custom builds.
  112872. *
  112873. * @method Phaser.Loader.LoaderPlugin#pack
  112874. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  112875. * @since 3.7.0
  112876. *
  112877. * @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.
  112878. * @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".
  112879. * @param {string} [dataKey] - When the JSON file loads only this property will be stored in the Cache.
  112880. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  112881. *
  112882. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  112883. */
  112884. FileTypesManager.register('pack', function (key, url, packKey, xhrSettings)
  112885. {
  112886. // Supports an Object file definition in the key argument
  112887. // Or an array of objects in the key argument
  112888. // Or a single entry where all arguments have been defined
  112889. if (Array.isArray(key))
  112890. {
  112891. for (var i = 0; i < key.length; i++)
  112892. {
  112893. this.addFile(new PackFile(this, key[i]));
  112894. }
  112895. }
  112896. else
  112897. {
  112898. this.addFile(new PackFile(this, key, url, xhrSettings, packKey));
  112899. }
  112900. return this;
  112901. });
  112902. module.exports = PackFile;
  112903. /***/ }),
  112904. /* 755 */
  112905. /***/ (function(module, exports, __webpack_require__) {
  112906. /**
  112907. * @author Richard Davey <rich@photonstorm.com>
  112908. * @copyright 2018 Photon Storm Ltd.
  112909. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  112910. */
  112911. var Class = __webpack_require__(0);
  112912. var CONST = __webpack_require__(18);
  112913. var File = __webpack_require__(20);
  112914. var FileTypesManager = __webpack_require__(7);
  112915. var GetFastValue = __webpack_require__(1);
  112916. var IsPlainObject = __webpack_require__(8);
  112917. /**
  112918. * @typedef {object} Phaser.Loader.FileTypes.HTMLFileConfig
  112919. *
  112920. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  112921. * @property {string} [url] - The absolute or relative URL to load the file from.
  112922. * @property {string} [extension='html'] - The default file extension to use if no url is provided.
  112923. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  112924. * @property {integer} [width=512] - The width of the texture the HTML will be rendered to.
  112925. * @property {integer} [height=512] - The height of the texture the HTML will be rendered to.
  112926. */
  112927. /**
  112928. * @classdesc
  112929. * A single HTML File suitable for loading by the Loader.
  112930. *
  112931. * These are created when you use the Phaser.Loader.LoaderPlugin#html method and are not typically created directly.
  112932. *
  112933. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#html.
  112934. *
  112935. * @class HTMLFile
  112936. * @extends Phaser.Loader.File
  112937. * @memberOf Phaser.Loader.FileTypes
  112938. * @constructor
  112939. * @since 3.0.0
  112940. *
  112941. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  112942. * @param {(string|Phaser.Loader.FileTypes.HTMLFileConfig)} key - The key to use for this file, or a file configuration object.
  112943. * @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".
  112944. * @param {integer} [width] - The width of the texture the HTML will be rendered to.
  112945. * @param {integer} [height] - The height of the texture the HTML will be rendered to.
  112946. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  112947. */
  112948. var HTMLFile = new Class({
  112949. Extends: File,
  112950. initialize:
  112951. function HTMLFile (loader, key, url, width, height, xhrSettings)
  112952. {
  112953. if (width === undefined) { width = 512; }
  112954. if (height === undefined) { height = 512; }
  112955. var extension = 'html';
  112956. if (IsPlainObject(key))
  112957. {
  112958. var config = key;
  112959. key = GetFastValue(config, 'key');
  112960. url = GetFastValue(config, 'url');
  112961. xhrSettings = GetFastValue(config, 'xhrSettings');
  112962. extension = GetFastValue(config, 'extension', extension);
  112963. width = GetFastValue(config, 'width', width);
  112964. height = GetFastValue(config, 'height', height);
  112965. }
  112966. var fileConfig = {
  112967. type: 'html',
  112968. cache: loader.textureManager,
  112969. extension: extension,
  112970. responseType: 'text',
  112971. key: key,
  112972. url: url,
  112973. xhrSettings: xhrSettings,
  112974. config: {
  112975. width: width,
  112976. height: height
  112977. }
  112978. };
  112979. File.call(this, loader, fileConfig);
  112980. },
  112981. /**
  112982. * Called automatically by Loader.nextFile.
  112983. * This method controls what extra work this File does with its loaded data.
  112984. *
  112985. * @method Phaser.Loader.FileTypes.HTMLFile#onProcess
  112986. * @since 3.7.0
  112987. */
  112988. onProcess: function ()
  112989. {
  112990. this.state = CONST.FILE_PROCESSING;
  112991. var w = this.config.width;
  112992. var h = this.config.height;
  112993. var data = [];
  112994. data.push('<svg width="' + w + 'px" height="' + h + 'px" viewBox="0 0 ' + w + ' ' + h + '" xmlns="http://www.w3.org/2000/svg">');
  112995. data.push('<foreignObject width="100%" height="100%">');
  112996. data.push('<body xmlns="http://www.w3.org/1999/xhtml">');
  112997. data.push(this.xhrLoader.responseText);
  112998. data.push('</body>');
  112999. data.push('</foreignObject>');
  113000. data.push('</svg>');
  113001. var svg = [ data.join('\n') ];
  113002. var _this = this;
  113003. try
  113004. {
  113005. var blob = new window.Blob(svg, { type: 'image/svg+xml;charset=utf-8' });
  113006. }
  113007. catch (e)
  113008. {
  113009. _this.state = CONST.FILE_ERRORED;
  113010. _this.onProcessComplete();
  113011. return;
  113012. }
  113013. this.data = new Image();
  113014. this.data.crossOrigin = this.crossOrigin;
  113015. this.data.onload = function ()
  113016. {
  113017. File.revokeObjectURL(_this.data);
  113018. _this.onProcessComplete();
  113019. };
  113020. this.data.onerror = function ()
  113021. {
  113022. File.revokeObjectURL(_this.data);
  113023. _this.onProcessError();
  113024. };
  113025. File.createObjectURL(this.data, blob, 'image/svg+xml');
  113026. },
  113027. /**
  113028. * Adds this file to its target cache upon successful loading and processing.
  113029. *
  113030. * @method Phaser.Loader.FileTypes.HTMLFile#addToCache
  113031. * @since 3.7.0
  113032. */
  113033. addToCache: function ()
  113034. {
  113035. var texture = this.cache.addImage(this.key, this.data);
  113036. this.pendingDestroy(texture);
  113037. }
  113038. });
  113039. /**
  113040. * Adds an HTML File, or array of HTML Files, to the current load queue.
  113041. *
  113042. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  113043. *
  113044. * ```javascript
  113045. * function preload ()
  113046. * {
  113047. * this.load.html('instructions', 'content/intro.html', 256, 512);
  113048. * }
  113049. * ```
  113050. *
  113051. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  113052. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  113053. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  113054. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  113055. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  113056. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  113057. * loaded.
  113058. *
  113059. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  113060. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  113061. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  113062. * then remove it from the Texture Manager first, before loading a new one.
  113063. *
  113064. * Instead of passing arguments you can pass a configuration object, such as:
  113065. *
  113066. * ```javascript
  113067. * this.load.html({
  113068. * key: 'instructions',
  113069. * url: 'content/intro.html',
  113070. * width: 256,
  113071. * height: 512
  113072. * });
  113073. * ```
  113074. *
  113075. * See the documentation for `Phaser.Loader.FileTypes.HTMLFileConfig` for more details.
  113076. *
  113077. * Once the file has finished loading you can use it as a texture for a Game Object by referencing its key:
  113078. *
  113079. * ```javascript
  113080. * this.load.html('instructions', 'content/intro.html', 256, 512);
  113081. * // and later in your game ...
  113082. * this.add.image(x, y, 'instructions');
  113083. * ```
  113084. *
  113085. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  113086. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  113087. * this is what you would use to retrieve the image from the Texture Manager.
  113088. *
  113089. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  113090. *
  113091. * 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"
  113092. * 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
  113093. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  113094. *
  113095. * The width and height are the size of the texture to which the HTML will be rendered. It's not possible to determine these
  113096. * automatically, so you will need to provide them, either as arguments or in the file config object.
  113097. * When the HTML file has loaded a new SVG element is created with a size and viewbox set to the width and height given.
  113098. * The SVG file has a body tag added to it, with the HTML file contents included. It then calls `window.Blob` on the SVG,
  113099. * and if successful is added to the Texture Manager, otherwise it fails processing. The overall quality of the rendered
  113100. * HTML depends on your browser, and some of them may not even support the svg / blob process used. Be aware that there are
  113101. * limitations on what HTML can be inside an SVG. You can find out more details in this
  113102. * [Mozilla MDN entry](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Drawing_DOM_objects_into_a_canvas).
  113103. *
  113104. * Note: The ability to load this type of file will only be available if the Image File type has been built into Phaser.
  113105. * It is available in the default build but can be excluded from custom builds.
  113106. *
  113107. * @method Phaser.Loader.LoaderPlugin#html
  113108. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  113109. * @since 3.0.0
  113110. *
  113111. * @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.
  113112. * @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".
  113113. * @param {integer} [width=512] - The width of the texture the HTML will be rendered to.
  113114. * @param {integer} [height=512] - The height of the texture the HTML will be rendered to.
  113115. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  113116. *
  113117. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  113118. */
  113119. FileTypesManager.register('html', function (key, url, width, height, xhrSettings)
  113120. {
  113121. if (Array.isArray(key))
  113122. {
  113123. for (var i = 0; i < key.length; i++)
  113124. {
  113125. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  113126. this.addFile(new HTMLFile(this, key[i]));
  113127. }
  113128. }
  113129. else
  113130. {
  113131. this.addFile(new HTMLFile(this, key, url, width, height, xhrSettings));
  113132. }
  113133. return this;
  113134. });
  113135. module.exports = HTMLFile;
  113136. /***/ }),
  113137. /* 756 */
  113138. /***/ (function(module, exports, __webpack_require__) {
  113139. /**
  113140. * @author Richard Davey <rich@photonstorm.com>
  113141. * @copyright 2018 Photon Storm Ltd.
  113142. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113143. */
  113144. var Class = __webpack_require__(0);
  113145. var CONST = __webpack_require__(18);
  113146. var File = __webpack_require__(20);
  113147. var FileTypesManager = __webpack_require__(7);
  113148. var GetFastValue = __webpack_require__(1);
  113149. var IsPlainObject = __webpack_require__(8);
  113150. /**
  113151. * @typedef {object} Phaser.Loader.FileTypes.GLSLFileConfig
  113152. *
  113153. * @property {string} key - The key of the file. Must be unique within both the Loader and the Text Cache.
  113154. * @property {string} [url] - The absolute or relative URL to load the file from.
  113155. * @property {string} [extension='glsl'] - The default file extension to use if no url is provided.
  113156. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  113157. */
  113158. /**
  113159. * @classdesc
  113160. * A single GLSL File suitable for loading by the Loader.
  113161. *
  113162. * These are created when you use the Phaser.Loader.LoaderPlugin#glsl method and are not typically created directly.
  113163. *
  113164. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#glsl.
  113165. *
  113166. * @class GLSLFile
  113167. * @extends Phaser.Loader.File
  113168. * @memberOf Phaser.Loader.FileTypes
  113169. * @constructor
  113170. * @since 3.0.0
  113171. *
  113172. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  113173. * @param {(string|Phaser.Loader.FileTypes.TextFileConfig)} key - The key to use for this file, or a file configuration object.
  113174. * @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".
  113175. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  113176. */
  113177. var GLSLFile = new Class({
  113178. Extends: File,
  113179. initialize:
  113180. function GLSLFile (loader, key, url, xhrSettings)
  113181. {
  113182. var extension = 'glsl';
  113183. if (IsPlainObject(key))
  113184. {
  113185. var config = key;
  113186. key = GetFastValue(config, 'key');
  113187. url = GetFastValue(config, 'url');
  113188. xhrSettings = GetFastValue(config, 'xhrSettings');
  113189. extension = GetFastValue(config, 'extension', extension);
  113190. }
  113191. var fileConfig = {
  113192. type: 'glsl',
  113193. cache: loader.cacheManager.shader,
  113194. extension: extension,
  113195. responseType: 'text',
  113196. key: key,
  113197. url: url,
  113198. xhrSettings: xhrSettings
  113199. };
  113200. File.call(this, loader, fileConfig);
  113201. },
  113202. /**
  113203. * Called automatically by Loader.nextFile.
  113204. * This method controls what extra work this File does with its loaded data.
  113205. *
  113206. * @method Phaser.Loader.FileTypes.GLSLFile#onProcess
  113207. * @since 3.7.0
  113208. */
  113209. onProcess: function ()
  113210. {
  113211. this.state = CONST.FILE_PROCESSING;
  113212. this.data = this.xhrLoader.responseText;
  113213. this.onProcessComplete();
  113214. }
  113215. });
  113216. /**
  113217. * Adds a GLSL file, or array of GLSL files, to the current load queue.
  113218. * In Phaser 3 GLSL files are just plain Text files at the current moment in time.
  113219. *
  113220. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  113221. *
  113222. * ```javascript
  113223. * function preload ()
  113224. * {
  113225. * this.load.glsl('plasma', 'shaders/Plasma.glsl');
  113226. * }
  113227. * ```
  113228. *
  113229. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  113230. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  113231. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  113232. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  113233. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  113234. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  113235. * loaded.
  113236. *
  113237. * The key must be a unique String. It is used to add the file to the global Shader Cache upon a successful load.
  113238. * The key should be unique both in terms of files being loaded and files already present in the Shader Cache.
  113239. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  113240. * then remove it from the Shader Cache first, before loading a new one.
  113241. *
  113242. * Instead of passing arguments you can pass a configuration object, such as:
  113243. *
  113244. * ```javascript
  113245. * this.load.glsl({
  113246. * key: 'plasma',
  113247. * url: 'shaders/Plasma.glsl'
  113248. * });
  113249. * ```
  113250. *
  113251. * See the documentation for `Phaser.Loader.FileTypes.GLSLFileConfig` for more details.
  113252. *
  113253. * Once the file has finished loading you can access it from its Cache using its key:
  113254. *
  113255. * ```javascript
  113256. * this.load.glsl('plasma', 'shaders/Plasma.glsl');
  113257. * // and later in your game ...
  113258. * var data = this.cache.shader.get('plasma');
  113259. * ```
  113260. *
  113261. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  113262. * key. For example, if the prefix was `FX.` and the key was `Plasma` the final key will be `FX.Plasma` and
  113263. * this is what you would use to retrieve the text from the Shader Cache.
  113264. *
  113265. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  113266. *
  113267. * 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"
  113268. * 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
  113269. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  113270. *
  113271. * Note: The ability to load this type of file will only be available if the GLSL File type has been built into Phaser.
  113272. * It is available in the default build but can be excluded from custom builds.
  113273. *
  113274. * @method Phaser.Loader.LoaderPlugin#glsl
  113275. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  113276. * @since 3.0.0
  113277. *
  113278. * @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.
  113279. * @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".
  113280. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  113281. *
  113282. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  113283. */
  113284. FileTypesManager.register('glsl', function (key, url, xhrSettings)
  113285. {
  113286. if (Array.isArray(key))
  113287. {
  113288. for (var i = 0; i < key.length; i++)
  113289. {
  113290. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  113291. this.addFile(new GLSLFile(this, key[i]));
  113292. }
  113293. }
  113294. else
  113295. {
  113296. this.addFile(new GLSLFile(this, key, url, xhrSettings));
  113297. }
  113298. return this;
  113299. });
  113300. module.exports = GLSLFile;
  113301. /***/ }),
  113302. /* 757 */
  113303. /***/ (function(module, exports, __webpack_require__) {
  113304. /**
  113305. * @author Richard Davey <rich@photonstorm.com>
  113306. * @copyright 2018 Photon Storm Ltd.
  113307. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113308. */
  113309. var Class = __webpack_require__(0);
  113310. var FileTypesManager = __webpack_require__(7);
  113311. var GetFastValue = __webpack_require__(1);
  113312. var ImageFile = __webpack_require__(38);
  113313. var IsPlainObject = __webpack_require__(8);
  113314. var MultiFile = __webpack_require__(37);
  113315. var ParseXMLBitmapFont = __webpack_require__(445);
  113316. var XMLFile = __webpack_require__(144);
  113317. /**
  113318. * @typedef {object} Phaser.Loader.FileTypes.BitmapFontFileConfig
  113319. *
  113320. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  113321. * @property {string} [textureURL] - The absolute or relative URL to load the texture image file from.
  113322. * @property {string} [textureExtension='png'] - The default file extension to use for the image texture if no url is provided.
  113323. * @property {XHRSettingsObject} [textureXhrSettings] - Extra XHR Settings specifically for the texture image file.
  113324. * @property {string} [normalMap] - The filename of an associated normal map. It uses the same path and url to load as the texture image.
  113325. * @property {string} [fontDataURL] - The absolute or relative URL to load the font data xml file from.
  113326. * @property {string} [fontDataExtension='xml'] - The default file extension to use for the font data xml if no url is provided.
  113327. * @property {XHRSettingsObject} [fontDataXhrSettings] - Extra XHR Settings specifically for the font data xml file.
  113328. */
  113329. /**
  113330. * @classdesc
  113331. * A single Bitmap Font based File suitable for loading by the Loader.
  113332. *
  113333. * These are created when you use the Phaser.Loader.LoaderPlugin#bitmapFont method and are not typically created directly.
  113334. *
  113335. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#bitmapFont.
  113336. *
  113337. * @class BitmapFontFile
  113338. * @extends Phaser.Loader.MultiFile
  113339. * @memberOf Phaser.Loader.FileTypes
  113340. * @constructor
  113341. * @since 3.0.0
  113342. *
  113343. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  113344. * @param {(string|Phaser.Loader.FileTypes.BitmapFontFileConfig)} key - The key to use for this file, or a file configuration object.
  113345. * @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".
  113346. * @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".
  113347. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the font image file. Used in replacement of the Loaders default XHR Settings.
  113348. * @param {XHRSettingsObject} [fontDataXhrSettings] - An XHR Settings configuration object for the font data xml file. Used in replacement of the Loaders default XHR Settings.
  113349. */
  113350. var BitmapFontFile = new Class({
  113351. Extends: MultiFile,
  113352. initialize:
  113353. function BitmapFontFile (loader, key, textureURL, fontDataURL, textureXhrSettings, fontDataXhrSettings)
  113354. {
  113355. var image;
  113356. var data;
  113357. if (IsPlainObject(key))
  113358. {
  113359. var config = key;
  113360. key = GetFastValue(config, 'key');
  113361. image = new ImageFile(loader, {
  113362. key: key,
  113363. url: GetFastValue(config, 'textureURL'),
  113364. extension: GetFastValue(config, 'textureExtension', 'png'),
  113365. normalMap: GetFastValue(config, 'normalMap'),
  113366. xhrSettings: GetFastValue(config, 'textureXhrSettings')
  113367. });
  113368. data = new XMLFile(loader, {
  113369. key: key,
  113370. url: GetFastValue(config, 'fontDataURL'),
  113371. extension: GetFastValue(config, 'fontDataExtension', 'xml'),
  113372. xhrSettings: GetFastValue(config, 'fontDataXhrSettings')
  113373. });
  113374. }
  113375. else
  113376. {
  113377. image = new ImageFile(loader, key, textureURL, textureXhrSettings);
  113378. data = new XMLFile(loader, key, fontDataURL, fontDataXhrSettings);
  113379. }
  113380. if (image.linkFile)
  113381. {
  113382. // Image has a normal map
  113383. MultiFile.call(this, loader, 'bitmapfont', key, [ image, data, image.linkFile ]);
  113384. }
  113385. else
  113386. {
  113387. MultiFile.call(this, loader, 'bitmapfont', key, [ image, data ]);
  113388. }
  113389. },
  113390. /**
  113391. * Adds this file to its target cache upon successful loading and processing.
  113392. *
  113393. * @method Phaser.Loader.FileTypes.BitmapFontFile#addToCache
  113394. * @since 3.7.0
  113395. */
  113396. addToCache: function ()
  113397. {
  113398. if (this.isReadyToProcess())
  113399. {
  113400. var image = this.files[0];
  113401. var xml = this.files[1];
  113402. image.addToCache();
  113403. xml.addToCache();
  113404. this.loader.cacheManager.bitmapFont.add(image.key, { data: ParseXMLBitmapFont(xml.data), texture: image.key, frame: null });
  113405. this.complete = true;
  113406. }
  113407. }
  113408. });
  113409. /**
  113410. * Adds an XML based Bitmap Font, or array of fonts, to the current load queue.
  113411. *
  113412. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  113413. * ```javascript
  113414. * function preload ()
  113415. * {
  113416. * this.load.bitmapFont('goldenFont', 'images/GoldFont.png', 'images/GoldFont.xml');
  113417. * }
  113418. * ```
  113419. *
  113420. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  113421. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  113422. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  113423. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  113424. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  113425. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  113426. * loaded.
  113427. *
  113428. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  113429. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  113430. *
  113431. * Phaser expects the font data to be provided in an XML file format.
  113432. * These files are created by software such as the [Angelcode Bitmap Font Generator](http://www.angelcode.com/products/bmfont/),
  113433. * [Littera](http://kvazars.com/littera/) or [Glyph Designer](https://71squared.com/glyphdesigner)
  113434. *
  113435. * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle.
  113436. *
  113437. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  113438. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  113439. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  113440. * then remove it from the Texture Manager first, before loading a new one.
  113441. *
  113442. * Instead of passing arguments you can pass a configuration object, such as:
  113443. *
  113444. * ```javascript
  113445. * this.load.bitmapFont({
  113446. * key: 'goldenFont',
  113447. * textureURL: 'images/GoldFont.png',
  113448. * fontDataURL: 'images/GoldFont.xml'
  113449. * });
  113450. * ```
  113451. *
  113452. * See the documentation for `Phaser.Loader.FileTypes.BitmapFontFileConfig` for more details.
  113453. *
  113454. * Once the atlas has finished loading you can use key of it when creating a Bitmap Text Game Object:
  113455. *
  113456. * ```javascript
  113457. * this.load.bitmapFont('goldenFont', 'images/GoldFont.png', 'images/GoldFont.xml');
  113458. * // and later in your game ...
  113459. * this.add.bitmapText(x, y, 'goldenFont', 'Hello World');
  113460. * ```
  113461. *
  113462. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  113463. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  113464. * this is what you would use when creating a Bitmap Text object.
  113465. *
  113466. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  113467. *
  113468. * 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"
  113469. * 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
  113470. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  113471. *
  113472. * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image,
  113473. * then you can specify it by providing an array as the `url` where the second element is the normal map:
  113474. *
  113475. * ```javascript
  113476. * this.load.bitmapFont('goldenFont', [ 'images/GoldFont.png', 'images/GoldFont-n.png' ], 'images/GoldFont.xml');
  113477. * ```
  113478. *
  113479. * Or, if you are using a config object use the `normalMap` property:
  113480. *
  113481. * ```javascript
  113482. * this.load.bitmapFont({
  113483. * key: 'goldenFont',
  113484. * textureURL: 'images/GoldFont.png',
  113485. * normalMap: 'images/GoldFont-n.png',
  113486. * fontDataURL: 'images/GoldFont.xml'
  113487. * });
  113488. * ```
  113489. *
  113490. * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings.
  113491. * Normal maps are a WebGL only feature.
  113492. *
  113493. * Note: The ability to load this type of file will only be available if the Bitmap Font File type has been built into Phaser.
  113494. * It is available in the default build but can be excluded from custom builds.
  113495. *
  113496. * @method Phaser.Loader.LoaderPlugin#bitmapFont
  113497. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  113498. * @since 3.0.0
  113499. *
  113500. * @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.
  113501. * @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".
  113502. * @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".
  113503. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the font image file. Used in replacement of the Loaders default XHR Settings.
  113504. * @param {XHRSettingsObject} [fontDataXhrSettings] - An XHR Settings configuration object for the font data xml file. Used in replacement of the Loaders default XHR Settings.
  113505. *
  113506. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  113507. */
  113508. FileTypesManager.register('bitmapFont', function (key, textureURL, fontDataURL, textureXhrSettings, fontDataXhrSettings)
  113509. {
  113510. var multifile;
  113511. // Supports an Object file definition in the key argument
  113512. // Or an array of objects in the key argument
  113513. // Or a single entry where all arguments have been defined
  113514. if (Array.isArray(key))
  113515. {
  113516. for (var i = 0; i < key.length; i++)
  113517. {
  113518. multifile = new BitmapFontFile(this, key[i]);
  113519. this.addFile(multifile.files);
  113520. }
  113521. }
  113522. else
  113523. {
  113524. multifile = new BitmapFontFile(this, key, textureURL, fontDataURL, textureXhrSettings, fontDataXhrSettings);
  113525. this.addFile(multifile.files);
  113526. }
  113527. return this;
  113528. });
  113529. module.exports = BitmapFontFile;
  113530. /***/ }),
  113531. /* 758 */
  113532. /***/ (function(module, exports, __webpack_require__) {
  113533. /**
  113534. * @author Richard Davey <rich@photonstorm.com>
  113535. * @copyright 2018 Photon Storm Ltd.
  113536. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113537. */
  113538. var Class = __webpack_require__(0);
  113539. var CONST = __webpack_require__(18);
  113540. var File = __webpack_require__(20);
  113541. var FileTypesManager = __webpack_require__(7);
  113542. var GetFastValue = __webpack_require__(1);
  113543. var IsPlainObject = __webpack_require__(8);
  113544. /**
  113545. * @typedef {object} Phaser.Loader.FileTypes.BinaryFileConfig
  113546. *
  113547. * @property {string} key - The key of the file. Must be unique within both the Loader and the Binary Cache.
  113548. * @property {string} [url] - The absolute or relative URL to load the file from.
  113549. * @property {string} [extension='bin'] - The default file extension to use if no url is provided.
  113550. * @property {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  113551. * @property {any} [dataType] - Optional type to cast the binary file to once loaded. For example, `Uint8Array`.
  113552. */
  113553. /**
  113554. * @classdesc
  113555. * A single Binary File suitable for loading by the Loader.
  113556. *
  113557. * These are created when you use the Phaser.Loader.LoaderPlugin#binary method and are not typically created directly.
  113558. *
  113559. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#binary.
  113560. *
  113561. * @class BinaryFile
  113562. * @extends Phaser.Loader.File
  113563. * @memberOf Phaser.Loader.FileTypes
  113564. * @constructor
  113565. * @since 3.0.0
  113566. *
  113567. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  113568. * @param {(string|Phaser.Loader.FileTypes.BinaryFileConfig)} key - The key to use for this file, or a file configuration object.
  113569. * @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".
  113570. * @param {XHRSettingsObject} [xhrSettings] - Extra XHR Settings specifically for this file.
  113571. * @param {any} [dataType] - Optional type to cast the binary file to once loaded. For example, `Uint8Array`.
  113572. */
  113573. var BinaryFile = new Class({
  113574. Extends: File,
  113575. initialize:
  113576. function BinaryFile (loader, key, url, xhrSettings, dataType)
  113577. {
  113578. var extension = 'bin';
  113579. if (IsPlainObject(key))
  113580. {
  113581. var config = key;
  113582. key = GetFastValue(config, 'key');
  113583. url = GetFastValue(config, 'url');
  113584. xhrSettings = GetFastValue(config, 'xhrSettings');
  113585. extension = GetFastValue(config, 'extension', extension);
  113586. dataType = GetFastValue(config, 'dataType', dataType);
  113587. }
  113588. var fileConfig = {
  113589. type: 'binary',
  113590. cache: loader.cacheManager.binary,
  113591. extension: extension,
  113592. responseType: 'arraybuffer',
  113593. key: key,
  113594. url: url,
  113595. xhrSettings: xhrSettings,
  113596. config: { dataType: dataType }
  113597. };
  113598. File.call(this, loader, fileConfig);
  113599. },
  113600. /**
  113601. * Called automatically by Loader.nextFile.
  113602. * This method controls what extra work this File does with its loaded data.
  113603. *
  113604. * @method Phaser.Loader.FileTypes.BinaryFile#onProcess
  113605. * @since 3.7.0
  113606. */
  113607. onProcess: function ()
  113608. {
  113609. this.state = CONST.FILE_PROCESSING;
  113610. var ctor = this.config.dataType;
  113611. this.data = (ctor) ? new ctor(this.xhrLoader.response) : this.xhrLoader.response;
  113612. this.onProcessComplete();
  113613. }
  113614. });
  113615. /**
  113616. * Adds a Binary file, or array of Binary files, to the current load queue.
  113617. *
  113618. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  113619. *
  113620. * ```javascript
  113621. * function preload ()
  113622. * {
  113623. * this.load.binary('doom', 'files/Doom.wad');
  113624. * }
  113625. * ```
  113626. *
  113627. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  113628. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  113629. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  113630. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  113631. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  113632. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  113633. * loaded.
  113634. *
  113635. * The key must be a unique String. It is used to add the file to the global Binary Cache upon a successful load.
  113636. * The key should be unique both in terms of files being loaded and files already present in the Binary Cache.
  113637. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  113638. * then remove it from the Binary Cache first, before loading a new one.
  113639. *
  113640. * Instead of passing arguments you can pass a configuration object, such as:
  113641. *
  113642. * ```javascript
  113643. * this.load.binary({
  113644. * key: 'doom',
  113645. * url: 'files/Doom.wad',
  113646. * dataType: Uint8Array
  113647. * });
  113648. * ```
  113649. *
  113650. * See the documentation for `Phaser.Loader.FileTypes.BinaryFileConfig` for more details.
  113651. *
  113652. * Once the file has finished loading you can access it from its Cache using its key:
  113653. *
  113654. * ```javascript
  113655. * this.load.binary('doom', 'files/Doom.wad');
  113656. * // and later in your game ...
  113657. * var data = this.cache.binary.get('doom');
  113658. * ```
  113659. *
  113660. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  113661. * key. For example, if the prefix was `LEVEL1.` and the key was `Data` the final key will be `LEVEL1.Data` and
  113662. * this is what you would use to retrieve the text from the Binary Cache.
  113663. *
  113664. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  113665. *
  113666. * 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"
  113667. * 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
  113668. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  113669. *
  113670. * Note: The ability to load this type of file will only be available if the Binary File type has been built into Phaser.
  113671. * It is available in the default build but can be excluded from custom builds.
  113672. *
  113673. * @method Phaser.Loader.LoaderPlugin#binary
  113674. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  113675. * @since 3.0.0
  113676. *
  113677. * @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.
  113678. * @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".
  113679. * @param {any} [dataType] - Optional type to cast the binary file to once loaded. For example, `Uint8Array`.
  113680. * @param {XHRSettingsObject} [xhrSettings] - An XHR Settings configuration object. Used in replacement of the Loaders default XHR Settings.
  113681. *
  113682. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  113683. */
  113684. FileTypesManager.register('binary', function (key, url, dataType, xhrSettings)
  113685. {
  113686. if (Array.isArray(key))
  113687. {
  113688. for (var i = 0; i < key.length; i++)
  113689. {
  113690. // If it's an array it has to be an array of Objects, so we get everything out of the 'key' object
  113691. this.addFile(new BinaryFile(this, key[i]));
  113692. }
  113693. }
  113694. else
  113695. {
  113696. this.addFile(new BinaryFile(this, key, url, xhrSettings, dataType));
  113697. }
  113698. return this;
  113699. });
  113700. module.exports = BinaryFile;
  113701. /***/ }),
  113702. /* 759 */
  113703. /***/ (function(module, exports, __webpack_require__) {
  113704. /**
  113705. * @author Richard Davey <rich@photonstorm.com>
  113706. * @copyright 2018 Photon Storm Ltd.
  113707. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113708. */
  113709. var Class = __webpack_require__(0);
  113710. var FileTypesManager = __webpack_require__(7);
  113711. var GetFastValue = __webpack_require__(1);
  113712. var ImageFile = __webpack_require__(38);
  113713. var IsPlainObject = __webpack_require__(8);
  113714. var MultiFile = __webpack_require__(37);
  113715. var XMLFile = __webpack_require__(144);
  113716. /**
  113717. * @typedef {object} Phaser.Loader.FileTypes.AtlasXMLFileConfig
  113718. *
  113719. * @property {string} key - The key of the file. Must be unique within both the Loader and the Texture Manager.
  113720. * @property {string} [textureURL] - The absolute or relative URL to load the texture image file from.
  113721. * @property {string} [textureExtension='png'] - The default file extension to use for the image texture if no url is provided.
  113722. * @property {XHRSettingsObject} [textureXhrSettings] - Extra XHR Settings specifically for the texture image file.
  113723. * @property {string} [normalMap] - The filename of an associated normal map. It uses the same path and url to load as the texture image.
  113724. * @property {string} [atlasURL] - The absolute or relative URL to load the atlas xml file from.
  113725. * @property {string} [atlasExtension='xml'] - The default file extension to use for the atlas xml if no url is provided.
  113726. * @property {XHRSettingsObject} [atlasXhrSettings] - Extra XHR Settings specifically for the atlas xml file.
  113727. */
  113728. /**
  113729. * @classdesc
  113730. * A single XML based Texture Atlas File suitable for loading by the Loader.
  113731. *
  113732. * These are created when you use the Phaser.Loader.LoaderPlugin#atlasXML method and are not typically created directly.
  113733. *
  113734. * For documentation about what all the arguments and configuration options mean please see Phaser.Loader.LoaderPlugin#atlasXML.
  113735. *
  113736. * @class AtlasXMLFile
  113737. * @extends Phaser.Loader.MultiFile
  113738. * @memberOf Phaser.Loader.FileTypes
  113739. * @constructor
  113740. *
  113741. * @param {Phaser.Loader.LoaderPlugin} loader - A reference to the Loader that is responsible for this file.
  113742. * @param {(string|Phaser.Loader.FileTypes.AtlasXMLFileConfig)} key - The key to use for this file, or a file configuration object.
  113743. * @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".
  113744. * @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".
  113745. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings.
  113746. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas xml file. Used in replacement of the Loaders default XHR Settings.
  113747. */
  113748. var AtlasXMLFile = new Class({
  113749. Extends: MultiFile,
  113750. initialize:
  113751. function AtlasXMLFile (loader, key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
  113752. {
  113753. var image;
  113754. var data;
  113755. if (IsPlainObject(key))
  113756. {
  113757. var config = key;
  113758. key = GetFastValue(config, 'key');
  113759. image = new ImageFile(loader, {
  113760. key: key,
  113761. url: GetFastValue(config, 'textureURL'),
  113762. extension: GetFastValue(config, 'textureExtension', 'png'),
  113763. normalMap: GetFastValue(config, 'normalMap'),
  113764. xhrSettings: GetFastValue(config, 'textureXhrSettings')
  113765. });
  113766. data = new XMLFile(loader, {
  113767. key: key,
  113768. url: GetFastValue(config, 'atlasURL'),
  113769. extension: GetFastValue(config, 'atlasExtension', 'xml'),
  113770. xhrSettings: GetFastValue(config, 'atlasXhrSettings')
  113771. });
  113772. }
  113773. else
  113774. {
  113775. image = new ImageFile(loader, key, textureURL, textureXhrSettings);
  113776. data = new XMLFile(loader, key, atlasURL, atlasXhrSettings);
  113777. }
  113778. if (image.linkFile)
  113779. {
  113780. // Image has a normal map
  113781. MultiFile.call(this, loader, 'atlasxml', key, [ image, data, image.linkFile ]);
  113782. }
  113783. else
  113784. {
  113785. MultiFile.call(this, loader, 'atlasxml', key, [ image, data ]);
  113786. }
  113787. },
  113788. /**
  113789. * Adds this file to its target cache upon successful loading and processing.
  113790. *
  113791. * @method Phaser.Loader.FileTypes.AtlasXMLFile#addToCache
  113792. * @since 3.7.0
  113793. */
  113794. addToCache: function ()
  113795. {
  113796. if (this.isReadyToProcess())
  113797. {
  113798. var image = this.files[0];
  113799. var xml = this.files[1];
  113800. var normalMap = (this.files[2]) ? this.files[2].data : null;
  113801. this.loader.textureManager.addAtlasXML(image.key, image.data, xml.data, normalMap);
  113802. xml.addToCache();
  113803. this.complete = true;
  113804. }
  113805. }
  113806. });
  113807. /**
  113808. * Adds an XML based Texture Atlas, or array of atlases, to the current load queue.
  113809. *
  113810. * You can call this method from within your Scene's `preload`, along with any other files you wish to load:
  113811. *
  113812. * ```javascript
  113813. * function preload ()
  113814. * {
  113815. * this.load.atlasXML('mainmenu', 'images/MainMenu.png', 'images/MainMenu.xml');
  113816. * }
  113817. * ```
  113818. *
  113819. * The file is **not** loaded right away. It is added to a queue ready to be loaded either when the loader starts,
  113820. * or if it's already running, when the next free load slot becomes available. This happens automatically if you
  113821. * are calling this from within the Scene's `preload` method, or a related callback. Because the file is queued
  113822. * it means you cannot use the file immediately after calling this method, but must wait for the file to complete.
  113823. * The typical flow for a Phaser Scene is that you load assets in the Scene's `preload` method and then when the
  113824. * Scene's `create` method is called you are guaranteed that all of those assets are ready for use and have been
  113825. * loaded.
  113826. *
  113827. * If you call this from outside of `preload` then you are responsible for starting the Loader afterwards and monitoring
  113828. * its events to know when it's safe to use the asset. Please see the Phaser.Loader.LoaderPlugin class for more details.
  113829. *
  113830. * Phaser expects the atlas data to be provided in an XML file format.
  113831. * These files are created by software such as Shoebox and Adobe Flash / Animate.
  113832. *
  113833. * Phaser can load all common image types: png, jpg, gif and any other format the browser can natively handle.
  113834. *
  113835. * The key must be a unique String. It is used to add the file to the global Texture Manager upon a successful load.
  113836. * The key should be unique both in terms of files being loaded and files already present in the Texture Manager.
  113837. * Loading a file using a key that is already taken will result in a warning. If you wish to replace an existing file
  113838. * then remove it from the Texture Manager first, before loading a new one.
  113839. *
  113840. * Instead of passing arguments you can pass a configuration object, such as:
  113841. *
  113842. * ```javascript
  113843. * this.load.atlasXML({
  113844. * key: 'mainmenu',
  113845. * textureURL: 'images/MainMenu.png',
  113846. * atlasURL: 'images/MainMenu.xml'
  113847. * });
  113848. * ```
  113849. *
  113850. * See the documentation for `Phaser.Loader.FileTypes.AtlasXMLFileConfig` for more details.
  113851. *
  113852. * Once the atlas has finished loading you can use frames from it as textures for a Game Object by referencing its key:
  113853. *
  113854. * ```javascript
  113855. * this.load.atlasXML('mainmenu', 'images/MainMenu.png', 'images/MainMenu.xml');
  113856. * // and later in your game ...
  113857. * this.add.image(x, y, 'mainmenu', 'background');
  113858. * ```
  113859. *
  113860. * To get a list of all available frames within an atlas please consult your Texture Atlas software.
  113861. *
  113862. * If you have specified a prefix in the loader, via `Loader.setPrefix` then this value will be prepended to this files
  113863. * key. For example, if the prefix was `MENU.` and the key was `Background` the final key will be `MENU.Background` and
  113864. * this is what you would use to retrieve the image from the Texture Manager.
  113865. *
  113866. * The URL can be relative or absolute. If the URL is relative the `Loader.baseURL` and `Loader.path` values will be prepended to it.
  113867. *
  113868. * 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"
  113869. * 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
  113870. * this can be overridden if using an object instead of method arguments. If you do not desire this action then provide a URL.
  113871. *
  113872. * Phaser also supports the automatic loading of associated normal maps. If you have a normal map to go with this image,
  113873. * then you can specify it by providing an array as the `url` where the second element is the normal map:
  113874. *
  113875. * ```javascript
  113876. * this.load.atlasXML('mainmenu', [ 'images/MainMenu.png', 'images/MainMenu-n.png' ], 'images/MainMenu.xml');
  113877. * ```
  113878. *
  113879. * Or, if you are using a config object use the `normalMap` property:
  113880. *
  113881. * ```javascript
  113882. * this.load.atlasXML({
  113883. * key: 'mainmenu',
  113884. * textureURL: 'images/MainMenu.png',
  113885. * normalMap: 'images/MainMenu-n.png',
  113886. * atlasURL: 'images/MainMenu.xml'
  113887. * });
  113888. * ```
  113889. *
  113890. * The normal map file is subject to the same conditions as the image file with regard to the path, baseURL, CORs and XHR Settings.
  113891. * Normal maps are a WebGL only feature.
  113892. *
  113893. * Note: The ability to load this type of file will only be available if the Atlas XML File type has been built into Phaser.
  113894. * It is available in the default build but can be excluded from custom builds.
  113895. *
  113896. * @method Phaser.Loader.LoaderPlugin#atlasXML
  113897. * @fires Phaser.Loader.LoaderPlugin#addFileEvent
  113898. * @since 3.7.0
  113899. *
  113900. * @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.
  113901. * @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".
  113902. * @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".
  113903. * @param {XHRSettingsObject} [textureXhrSettings] - An XHR Settings configuration object for the atlas image file. Used in replacement of the Loaders default XHR Settings.
  113904. * @param {XHRSettingsObject} [atlasXhrSettings] - An XHR Settings configuration object for the atlas xml file. Used in replacement of the Loaders default XHR Settings.
  113905. *
  113906. * @return {Phaser.Loader.LoaderPlugin} The Loader instance.
  113907. */
  113908. FileTypesManager.register('atlasXML', function (key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings)
  113909. {
  113910. var multifile;
  113911. // Supports an Object file definition in the key argument
  113912. // Or an array of objects in the key argument
  113913. // Or a single entry where all arguments have been defined
  113914. if (Array.isArray(key))
  113915. {
  113916. for (var i = 0; i < key.length; i++)
  113917. {
  113918. multifile = new AtlasXMLFile(this, key[i]);
  113919. this.addFile(multifile.files);
  113920. }
  113921. }
  113922. else
  113923. {
  113924. multifile = new AtlasXMLFile(this, key, textureURL, atlasURL, textureXhrSettings, atlasXhrSettings);
  113925. this.addFile(multifile.files);
  113926. }
  113927. return this;
  113928. });
  113929. module.exports = AtlasXMLFile;
  113930. /***/ }),
  113931. /* 760 */
  113932. /***/ (function(module, exports, __webpack_require__) {
  113933. /**
  113934. * @author Richard Davey <rich@photonstorm.com>
  113935. * @copyright 2018 Photon Storm Ltd.
  113936. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113937. */
  113938. /**
  113939. * @namespace Phaser.Loader.FileTypes
  113940. */
  113941. module.exports = {
  113942. AnimationJSONFile: __webpack_require__(366),
  113943. AtlasJSONFile: __webpack_require__(365),
  113944. AtlasXMLFile: __webpack_require__(759),
  113945. AudioFile: __webpack_require__(173),
  113946. AudioSpriteFile: __webpack_require__(364),
  113947. BinaryFile: __webpack_require__(758),
  113948. BitmapFontFile: __webpack_require__(757),
  113949. GLSLFile: __webpack_require__(756),
  113950. HTML5AudioFile: __webpack_require__(172),
  113951. HTMLFile: __webpack_require__(755),
  113952. ImageFile: __webpack_require__(38),
  113953. JSONFile: __webpack_require__(28),
  113954. MultiAtlasFile: __webpack_require__(363),
  113955. PackFile: __webpack_require__(754),
  113956. PluginFile: __webpack_require__(362),
  113957. ScenePluginFile: __webpack_require__(753),
  113958. ScriptFile: __webpack_require__(361),
  113959. SpriteSheetFile: __webpack_require__(360),
  113960. SVGFile: __webpack_require__(752),
  113961. TextFile: __webpack_require__(229),
  113962. TilemapCSVFile: __webpack_require__(751),
  113963. TilemapImpactFile: __webpack_require__(750),
  113964. TilemapJSONFile: __webpack_require__(749),
  113965. UnityAtlasFile: __webpack_require__(748),
  113966. XMLFile: __webpack_require__(144)
  113967. };
  113968. /***/ }),
  113969. /* 761 */
  113970. /***/ (function(module, exports, __webpack_require__) {
  113971. /**
  113972. * @author Richard Davey <rich@photonstorm.com>
  113973. * @copyright 2018 Photon Storm Ltd.
  113974. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  113975. */
  113976. var CONST = __webpack_require__(18);
  113977. var Extend = __webpack_require__(16);
  113978. /**
  113979. * @namespace Phaser.Loader
  113980. */
  113981. var Loader = {
  113982. FileTypes: __webpack_require__(760),
  113983. File: __webpack_require__(20),
  113984. FileTypesManager: __webpack_require__(7),
  113985. GetURL: __webpack_require__(108),
  113986. LoaderPlugin: __webpack_require__(359),
  113987. MergeXHRSettings: __webpack_require__(107),
  113988. MultiFile: __webpack_require__(37),
  113989. XHRLoader: __webpack_require__(174),
  113990. XHRSettings: __webpack_require__(74)
  113991. };
  113992. // Merge in the consts
  113993. Loader = Extend(false, Loader, CONST);
  113994. module.exports = Loader;
  113995. /***/ }),
  113996. /* 762 */
  113997. /***/ (function(module, exports, __webpack_require__) {
  113998. /**
  113999. * @author Richard Davey <rich@photonstorm.com>
  114000. * @copyright 2018 Photon Storm Ltd.
  114001. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114002. */
  114003. var RotateAroundXY = __webpack_require__(230);
  114004. /**
  114005. * [description]
  114006. *
  114007. * @function Phaser.Geom.Triangle.RotateAroundPoint
  114008. * @since 3.0.0
  114009. *
  114010. * @generic {Phaser.Geom.Triangle} O - [triangle,$return]
  114011. *
  114012. * @param {Phaser.Geom.Triangle} triangle - [description]
  114013. * @param {Phaser.Geom.Point} point - [description]
  114014. * @param {number} angle - [description]
  114015. *
  114016. * @return {Phaser.Geom.Triangle} [description]
  114017. */
  114018. var RotateAroundPoint = function (triangle, point, angle)
  114019. {
  114020. return RotateAroundXY(triangle, point.x, point.y, angle);
  114021. };
  114022. module.exports = RotateAroundPoint;
  114023. /***/ }),
  114024. /* 763 */
  114025. /***/ (function(module, exports, __webpack_require__) {
  114026. /**
  114027. * @author Richard Davey <rich@photonstorm.com>
  114028. * @copyright 2018 Photon Storm Ltd.
  114029. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114030. */
  114031. var RotateAroundXY = __webpack_require__(230);
  114032. var InCenter = __webpack_require__(390);
  114033. /**
  114034. * [description]
  114035. *
  114036. * @function Phaser.Geom.Triangle.Rotate
  114037. * @since 3.0.0
  114038. *
  114039. * @generic {Phaser.Geom.Triangle} O - [triangle,$return]
  114040. *
  114041. * @param {Phaser.Geom.Triangle} triangle - [description]
  114042. * @param {number} angle - [description]
  114043. *
  114044. * @return {Phaser.Geom.Triangle} [description]
  114045. */
  114046. var Rotate = function (triangle, angle)
  114047. {
  114048. var point = InCenter(triangle);
  114049. return RotateAroundXY(triangle, point.x, point.y, angle);
  114050. };
  114051. module.exports = Rotate;
  114052. /***/ }),
  114053. /* 764 */
  114054. /***/ (function(module, exports, __webpack_require__) {
  114055. /**
  114056. * @author Richard Davey <rich@photonstorm.com>
  114057. * @copyright 2018 Photon Storm Ltd.
  114058. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114059. */
  114060. var Length = __webpack_require__(70);
  114061. // The 2D area of a triangle. The area value is always non-negative.
  114062. /**
  114063. * [description]
  114064. *
  114065. * @function Phaser.Geom.Triangle.Perimeter
  114066. * @since 3.0.0
  114067. *
  114068. * @param {Phaser.Geom.Triangle} triangle - [description]
  114069. *
  114070. * @return {number} [description]
  114071. */
  114072. var Perimeter = function (triangle)
  114073. {
  114074. var line1 = triangle.getLineA();
  114075. var line2 = triangle.getLineB();
  114076. var line3 = triangle.getLineC();
  114077. return (Length(line1) + Length(line2) + Length(line3));
  114078. };
  114079. module.exports = Perimeter;
  114080. /***/ }),
  114081. /* 765 */
  114082. /***/ (function(module, exports) {
  114083. /**
  114084. * @author Richard Davey <rich@photonstorm.com>
  114085. * @copyright 2018 Photon Storm Ltd.
  114086. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114087. */
  114088. /**
  114089. * [description]
  114090. *
  114091. * @function Phaser.Geom.Triangle.Equals
  114092. * @since 3.0.0
  114093. *
  114094. * @param {Phaser.Geom.Triangle} triangle - [description]
  114095. * @param {Phaser.Geom.Triangle} toCompare - [description]
  114096. *
  114097. * @return {boolean} [description]
  114098. */
  114099. var Equals = function (triangle, toCompare)
  114100. {
  114101. return (
  114102. triangle.x1 === toCompare.x1 &&
  114103. triangle.y1 === toCompare.y1 &&
  114104. triangle.x2 === toCompare.x2 &&
  114105. triangle.y2 === toCompare.y2 &&
  114106. triangle.x3 === toCompare.x3 &&
  114107. triangle.y3 === toCompare.y3
  114108. );
  114109. };
  114110. module.exports = Equals;
  114111. /***/ }),
  114112. /* 766 */
  114113. /***/ (function(module, exports) {
  114114. /**
  114115. * @author Richard Davey <rich@photonstorm.com>
  114116. * @copyright 2018 Photon Storm Ltd.
  114117. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114118. */
  114119. /**
  114120. * Copy the values of one Triangle to a destination Triangle.
  114121. *
  114122. * @function Phaser.Geom.Triangle.CopyFrom
  114123. * @since 3.0.0
  114124. *
  114125. * @generic {Phaser.Geom.Triangle} O - [dest,$return]
  114126. *
  114127. * @param {Phaser.Geom.Triangle} source - The source Triangle to copy the values from.
  114128. * @param {Phaser.Geom.Triangle} dest - The destination Triangle to copy the values to.
  114129. *
  114130. * @return {Phaser.Geom.Triangle} The destination Triangle.
  114131. */
  114132. var CopyFrom = function (source, dest)
  114133. {
  114134. return dest.setTo(source.x1, source.y1, source.x2, source.y2, source.x3, source.y3);
  114135. };
  114136. module.exports = CopyFrom;
  114137. /***/ }),
  114138. /* 767 */
  114139. /***/ (function(module, exports, __webpack_require__) {
  114140. /**
  114141. * @author Richard Davey <rich@photonstorm.com>
  114142. * @copyright 2018 Photon Storm Ltd.
  114143. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114144. */
  114145. var Contains = __webpack_require__(60);
  114146. /**
  114147. * [description]
  114148. *
  114149. * @function Phaser.Geom.Triangle.ContainsPoint
  114150. * @since 3.0.0
  114151. *
  114152. * @param {Phaser.Geom.Triangle} triangle - [description]
  114153. * @param {Phaser.Geom.Point} point - [description]
  114154. *
  114155. * @return {boolean} [description]
  114156. */
  114157. var ContainsPoint = function (triangle, point)
  114158. {
  114159. return Contains(triangle, point.x, point.y);
  114160. };
  114161. module.exports = ContainsPoint;
  114162. /***/ }),
  114163. /* 768 */
  114164. /***/ (function(module, exports, __webpack_require__) {
  114165. /**
  114166. * @author Richard Davey <rich@photonstorm.com>
  114167. * @copyright 2018 Photon Storm Ltd.
  114168. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114169. */
  114170. var Triangle = __webpack_require__(67);
  114171. /**
  114172. * [description]
  114173. *
  114174. * @function Phaser.Geom.Triangle.Clone
  114175. * @since 3.0.0
  114176. *
  114177. * @param {Phaser.Geom.Triangle} source - [description]
  114178. *
  114179. * @return {Phaser.Geom.Triangle} [description]
  114180. */
  114181. var Clone = function (source)
  114182. {
  114183. return new Triangle(source.x1, source.y1, source.x2, source.y2, source.x3, source.y3);
  114184. };
  114185. module.exports = Clone;
  114186. /***/ }),
  114187. /* 769 */
  114188. /***/ (function(module, exports, __webpack_require__) {
  114189. /**
  114190. * @author Richard Davey <rich@photonstorm.com>
  114191. * @copyright 2018 Photon Storm Ltd.
  114192. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114193. */
  114194. var Circle = __webpack_require__(88);
  114195. // Adapted from https://gist.github.com/mutoo/5617691
  114196. /**
  114197. * [description]
  114198. *
  114199. * @function Phaser.Geom.Triangle.CircumCircle
  114200. * @since 3.0.0
  114201. *
  114202. * @generic {Phaser.Geom.Circle} O - [out,$return]
  114203. *
  114204. * @param {Phaser.Geom.Triangle} triangle - [description]
  114205. * @param {Phaser.Geom.Circle} [out] - [description]
  114206. *
  114207. * @return {Phaser.Geom.Circle} [description]
  114208. */
  114209. var CircumCircle = function (triangle, out)
  114210. {
  114211. if (out === undefined) { out = new Circle(); }
  114212. // A
  114213. var x1 = triangle.x1;
  114214. var y1 = triangle.y1;
  114215. // B
  114216. var x2 = triangle.x2;
  114217. var y2 = triangle.y2;
  114218. // C
  114219. var x3 = triangle.x3;
  114220. var y3 = triangle.y3;
  114221. var A = x2 - x1;
  114222. var B = y2 - y1;
  114223. var C = x3 - x1;
  114224. var D = y3 - y1;
  114225. var E = A * (x1 + x2) + B * (y1 + y2);
  114226. var F = C * (x1 + x3) + D * (y1 + y3);
  114227. var G = 2 * (A * (y3 - y2) - B * (x3 - x2));
  114228. var dx;
  114229. var dy;
  114230. // If the points of the triangle are collinear, then just find the
  114231. // extremes and use the midpoint as the center of the circumcircle.
  114232. if (Math.abs(G) < 0.000001)
  114233. {
  114234. var minX = Math.min(x1, x2, x3);
  114235. var minY = Math.min(y1, y2, y3);
  114236. dx = (Math.max(x1, x2, x3) - minX) * 0.5;
  114237. dy = (Math.max(y1, y2, y3) - minY) * 0.5;
  114238. out.x = minX + dx;
  114239. out.y = minY + dy;
  114240. out.radius = Math.sqrt(dx * dx + dy * dy);
  114241. }
  114242. else
  114243. {
  114244. out.x = (D * E - B * F) / G;
  114245. out.y = (A * F - C * E) / G;
  114246. dx = out.x - x1;
  114247. dy = out.y - y1;
  114248. out.radius = Math.sqrt(dx * dx + dy * dy);
  114249. }
  114250. return out;
  114251. };
  114252. module.exports = CircumCircle;
  114253. /***/ }),
  114254. /* 770 */
  114255. /***/ (function(module, exports, __webpack_require__) {
  114256. /**
  114257. * @author Richard Davey <rich@photonstorm.com>
  114258. * @copyright 2018 Photon Storm Ltd.
  114259. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114260. */
  114261. var Vector2 = __webpack_require__(6);
  114262. // Adapted from http://bjornharrtell.github.io/jsts/doc/api/jsts_geom_Triangle.js.html
  114263. /**
  114264. * Computes the determinant of a 2x2 matrix. Uses standard double-precision arithmetic, so is susceptible to round-off error.
  114265. *
  114266. * @function det
  114267. * @private
  114268. * @since 3.0.0
  114269. *
  114270. * @param {number} m00 - The [0,0] entry of the matrix.
  114271. * @param {number} m01 - The [0,1] entry of the matrix.
  114272. * @param {number} m10 - The [1,0] entry of the matrix.
  114273. * @param {number} m11 - The [1,1] entry of the matrix.
  114274. *
  114275. * @return {number} the determinant.
  114276. */
  114277. function det (m00, m01, m10, m11)
  114278. {
  114279. return (m00 * m11) - (m01 * m10);
  114280. }
  114281. /**
  114282. * Computes the circumcentre of a triangle. The circumcentre is the centre of
  114283. * the circumcircle, the smallest circle which encloses the triangle. It is also
  114284. * the common intersection point of the perpendicular bisectors of the sides of
  114285. * the triangle, and is the only point which has equal distance to all three
  114286. * vertices of the triangle.
  114287. *
  114288. * @function Phaser.Geom.Triangle.CircumCenter
  114289. * @since 3.0.0
  114290. *
  114291. * @generic {Phaser.Math.Vector2} O - [out,$return]
  114292. *
  114293. * @param {Phaser.Geom.Triangle} triangle - [description]
  114294. * @param {Phaser.Math.Vector2} [out] - [description]
  114295. *
  114296. * @return {Phaser.Math.Vector2} [description]
  114297. */
  114298. var CircumCenter = function (triangle, out)
  114299. {
  114300. if (out === undefined) { out = new Vector2(); }
  114301. var cx = triangle.x3;
  114302. var cy = triangle.y3;
  114303. var ax = triangle.x1 - cx;
  114304. var ay = triangle.y1 - cy;
  114305. var bx = triangle.x2 - cx;
  114306. var by = triangle.y2 - cy;
  114307. var denom = 2 * det(ax, ay, bx, by);
  114308. var numx = det(ay, ax * ax + ay * ay, by, bx * bx + by * by);
  114309. var numy = det(ax, ax * ax + ay * ay, bx, bx * bx + by * by);
  114310. out.x = cx - numx / denom;
  114311. out.y = cy + numy / denom;
  114312. return out;
  114313. };
  114314. module.exports = CircumCenter;
  114315. /***/ }),
  114316. /* 771 */
  114317. /***/ (function(module, exports, __webpack_require__) {
  114318. /**
  114319. * @author Richard Davey <rich@photonstorm.com>
  114320. * @copyright 2018 Photon Storm Ltd.
  114321. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114322. */
  114323. var Centroid = __webpack_require__(392);
  114324. var Offset = __webpack_require__(391);
  114325. /**
  114326. * @callback CenterFunction
  114327. *
  114328. * @param {Phaser.Geom.Triangle} triangle - [description]
  114329. *
  114330. * @return {Phaser.Math.Vector2} [description]
  114331. */
  114332. /**
  114333. * [description]
  114334. *
  114335. * @function Phaser.Geom.Triangle.CenterOn
  114336. * @since 3.0.0
  114337. *
  114338. * @generic {Phaser.Geom.Triangle} O - [triangle,$return]
  114339. *
  114340. * @param {Phaser.Geom.Triangle} triangle - [description]
  114341. * @param {number} x - [description]
  114342. * @param {number} y - [description]
  114343. * @param {CenterFunction} [centerFunc] - [description]
  114344. *
  114345. * @return {Phaser.Geom.Triangle} [description]
  114346. */
  114347. var CenterOn = function (triangle, x, y, centerFunc)
  114348. {
  114349. if (centerFunc === undefined) { centerFunc = Centroid; }
  114350. // Get the center of the triangle
  114351. var center = centerFunc(triangle);
  114352. // Difference
  114353. var diffX = x - center.x;
  114354. var diffY = y - center.y;
  114355. return Offset(triangle, diffX, diffY);
  114356. };
  114357. module.exports = CenterOn;
  114358. /***/ }),
  114359. /* 772 */
  114360. /***/ (function(module, exports, __webpack_require__) {
  114361. /**
  114362. * @author Richard Davey <rich@photonstorm.com>
  114363. * @copyright 2018 Photon Storm Ltd.
  114364. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114365. */
  114366. var Triangle = __webpack_require__(67);
  114367. // Builds a right triangle, with one 90 degree angle and two acute angles
  114368. // The x/y is the coordinate of the 90 degree angle (and will map to x1/y1 in the resulting Triangle)
  114369. // w/h can be positive or negative and represent the length of each side
  114370. /**
  114371. * [description]
  114372. *
  114373. * @function Phaser.Geom.Triangle.BuildRight
  114374. * @since 3.0.0
  114375. *
  114376. * @param {number} x - [description]
  114377. * @param {number} y - [description]
  114378. * @param {number} width - [description]
  114379. * @param {number} height - [description]
  114380. *
  114381. * @return {Phaser.Geom.Triangle} [description]
  114382. */
  114383. var BuildRight = function (x, y, width, height)
  114384. {
  114385. if (height === undefined) { height = width; }
  114386. // 90 degree angle
  114387. var x1 = x;
  114388. var y1 = y;
  114389. var x2 = x;
  114390. var y2 = y - height;
  114391. var x3 = x + width;
  114392. var y3 = y;
  114393. return new Triangle(x1, y1, x2, y2, x3, y3);
  114394. };
  114395. module.exports = BuildRight;
  114396. /***/ }),
  114397. /* 773 */
  114398. /***/ (function(module, exports, __webpack_require__) {
  114399. /**
  114400. * @author Richard Davey <rich@photonstorm.com>
  114401. * @copyright 2018 Photon Storm Ltd.
  114402. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114403. */
  114404. var EarCut = __webpack_require__(252);
  114405. var Triangle = __webpack_require__(67);
  114406. /**
  114407. * [description]
  114408. *
  114409. * @function Phaser.Geom.Triangle.BuildFromPolygon
  114410. * @since 3.0.0
  114411. *
  114412. * @generic {Phaser.Geom.Triangle[]} O - [out,$return]
  114413. *
  114414. * @param {array} data - A flat array of vertice coordinates like [x0,y0, x1,y1, x2,y2, ...]
  114415. * @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).
  114416. * @param {number} [scaleX=1] - [description]
  114417. * @param {number} [scaleY=1] - [description]
  114418. * @param {(array|Phaser.Geom.Triangle[])} [out] - [description]
  114419. *
  114420. * @return {(array|Phaser.Geom.Triangle[])} [description]
  114421. */
  114422. var BuildFromPolygon = function (data, holes, scaleX, scaleY, out)
  114423. {
  114424. if (holes === undefined) { holes = null; }
  114425. if (scaleX === undefined) { scaleX = 1; }
  114426. if (scaleY === undefined) { scaleY = 1; }
  114427. if (out === undefined) { out = []; }
  114428. var tris = EarCut(data, holes);
  114429. var a;
  114430. var b;
  114431. var c;
  114432. var x1;
  114433. var y1;
  114434. var x2;
  114435. var y2;
  114436. var x3;
  114437. var y3;
  114438. for (var i = 0; i < tris.length; i += 3)
  114439. {
  114440. a = tris[i];
  114441. b = tris[i + 1];
  114442. c = tris[i + 2];
  114443. x1 = data[a * 2] * scaleX;
  114444. y1 = data[(a * 2) + 1] * scaleY;
  114445. x2 = data[b * 2] * scaleX;
  114446. y2 = data[(b * 2) + 1] * scaleY;
  114447. x3 = data[c * 2] * scaleX;
  114448. y3 = data[(c * 2) + 1] * scaleY;
  114449. out.push(new Triangle(x1, y1, x2, y2, x3, y3));
  114450. }
  114451. return out;
  114452. };
  114453. module.exports = BuildFromPolygon;
  114454. /***/ }),
  114455. /* 774 */
  114456. /***/ (function(module, exports, __webpack_require__) {
  114457. /**
  114458. * @author Richard Davey <rich@photonstorm.com>
  114459. * @copyright 2018 Photon Storm Ltd.
  114460. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114461. */
  114462. var Triangle = __webpack_require__(67);
  114463. // Builds an equilateral triangle.
  114464. // In the equilateral triangle, all the sides are the same length (congruent)
  114465. // and all the angles are the same size (congruent).
  114466. // The x/y specifies the top-middle of the triangle (x1/y1) and length
  114467. // is the length of each side
  114468. /**
  114469. * [description]
  114470. *
  114471. * @function Phaser.Geom.Triangle.BuildEquilateral
  114472. * @since 3.0.0
  114473. *
  114474. * @param {number} x - [description]
  114475. * @param {number} y - [description]
  114476. * @param {number} length - [description]
  114477. *
  114478. * @return {Phaser.Geom.Triangle} [description]
  114479. */
  114480. var BuildEquilateral = function (x, y, length)
  114481. {
  114482. var height = length * (Math.sqrt(3) / 2);
  114483. var x1 = x;
  114484. var y1 = y;
  114485. var x2 = x + (length / 2);
  114486. var y2 = y + height;
  114487. var x3 = x - (length / 2);
  114488. var y3 = y + height;
  114489. return new Triangle(x1, y1, x2, y2, x3, y3);
  114490. };
  114491. module.exports = BuildEquilateral;
  114492. /***/ }),
  114493. /* 775 */
  114494. /***/ (function(module, exports) {
  114495. /**
  114496. * @author Richard Davey <rich@photonstorm.com>
  114497. * @copyright 2018 Photon Storm Ltd.
  114498. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114499. */
  114500. // The 2D area of a triangle. The area value is always non-negative.
  114501. /**
  114502. * [description]
  114503. *
  114504. * @function Phaser.Geom.Triangle.Area
  114505. * @since 3.0.0
  114506. *
  114507. * @param {Phaser.Geom.Triangle} triangle - [description]
  114508. *
  114509. * @return {number} [description]
  114510. */
  114511. var Area = function (triangle)
  114512. {
  114513. var x1 = triangle.x1;
  114514. var y1 = triangle.y1;
  114515. var x2 = triangle.x2;
  114516. var y2 = triangle.y2;
  114517. var x3 = triangle.x3;
  114518. var y3 = triangle.y3;
  114519. return Math.abs(((x3 - x1) * (y2 - y1) - (x2 - x1) * (y3 - y1)) / 2);
  114520. };
  114521. module.exports = Area;
  114522. /***/ }),
  114523. /* 776 */
  114524. /***/ (function(module, exports, __webpack_require__) {
  114525. /**
  114526. * @author Richard Davey <rich@photonstorm.com>
  114527. * @copyright 2018 Photon Storm Ltd.
  114528. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114529. */
  114530. var Triangle = __webpack_require__(67);
  114531. Triangle.Area = __webpack_require__(775);
  114532. Triangle.BuildEquilateral = __webpack_require__(774);
  114533. Triangle.BuildFromPolygon = __webpack_require__(773);
  114534. Triangle.BuildRight = __webpack_require__(772);
  114535. Triangle.CenterOn = __webpack_require__(771);
  114536. Triangle.Centroid = __webpack_require__(392);
  114537. Triangle.CircumCenter = __webpack_require__(770);
  114538. Triangle.CircumCircle = __webpack_require__(769);
  114539. Triangle.Clone = __webpack_require__(768);
  114540. Triangle.Contains = __webpack_require__(60);
  114541. Triangle.ContainsArray = __webpack_require__(236);
  114542. Triangle.ContainsPoint = __webpack_require__(767);
  114543. Triangle.CopyFrom = __webpack_require__(766);
  114544. Triangle.Decompose = __webpack_require__(399);
  114545. Triangle.Equals = __webpack_require__(765);
  114546. Triangle.GetPoint = __webpack_require__(232);
  114547. Triangle.GetPoints = __webpack_require__(231);
  114548. Triangle.InCenter = __webpack_require__(390);
  114549. Triangle.Perimeter = __webpack_require__(764);
  114550. Triangle.Offset = __webpack_require__(391);
  114551. Triangle.Random = __webpack_require__(158);
  114552. Triangle.Rotate = __webpack_require__(763);
  114553. Triangle.RotateAroundPoint = __webpack_require__(762);
  114554. Triangle.RotateAroundXY = __webpack_require__(230);
  114555. module.exports = Triangle;
  114556. /***/ }),
  114557. /* 777 */
  114558. /***/ (function(module, exports) {
  114559. /**
  114560. * @author Richard Davey <rich@photonstorm.com>
  114561. * @copyright 2018 Photon Storm Ltd.
  114562. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114563. */
  114564. // Scales the width and height of this Rectangle by the given amounts.
  114565. /**
  114566. * [description]
  114567. *
  114568. * @function Phaser.Geom.Rectangle.Scale
  114569. * @since 3.0.0
  114570. *
  114571. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  114572. *
  114573. * @param {Phaser.Geom.Rectangle} rect - [description]
  114574. * @param {number} x - [description]
  114575. * @param {number} y - [description]
  114576. *
  114577. * @return {Phaser.Geom.Rectangle} [description]
  114578. */
  114579. var Scale = function (rect, x, y)
  114580. {
  114581. if (y === undefined) { y = x; }
  114582. rect.width *= x;
  114583. rect.height *= y;
  114584. return rect;
  114585. };
  114586. module.exports = Scale;
  114587. /***/ }),
  114588. /* 778 */
  114589. /***/ (function(module, exports, __webpack_require__) {
  114590. /**
  114591. * @author Richard Davey <rich@photonstorm.com>
  114592. * @copyright 2018 Photon Storm Ltd.
  114593. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114594. */
  114595. var Between = __webpack_require__(152);
  114596. var ContainsRect = __webpack_require__(393);
  114597. var Point = __webpack_require__(5);
  114598. /**
  114599. * Calculates a random point that lies within the `outer` Rectangle, but outside of the `inner` Rectangle.
  114600. * The inner Rectangle must be fully contained within the outer rectangle.
  114601. *
  114602. * @function Phaser.Geom.Rectangle.RandomOutside
  114603. * @since 3.10.0
  114604. *
  114605. * @generic {Phaser.Geom.Point} O - [out,$return]
  114606. *
  114607. * @param {Phaser.Geom.Rectangle} outer - The outer Rectangle to get the random point within.
  114608. * @param {Phaser.Geom.Rectangle} inner - The inner Rectangle to exclude from the returned point.
  114609. * @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.
  114610. *
  114611. * @return {Phaser.Geom.Point} A Point object containing the random values in its `x` and `y` properties.
  114612. */
  114613. var RandomOutside = function (outer, inner, out)
  114614. {
  114615. if (out === undefined) { out = new Point(); }
  114616. if (ContainsRect(outer, inner))
  114617. {
  114618. // Pick a random quadrant
  114619. //
  114620. // The quadrants don't extend the full widths / heights of the outer rect to give
  114621. // us a better uniformed distribution, otherwise you get clumping in the corners where
  114622. // the 4 quads would overlap
  114623. switch (Between(0, 3))
  114624. {
  114625. case 0: // Top
  114626. out.x = outer.x + (Math.random() * (inner.right - outer.x));
  114627. out.y = outer.y + (Math.random() * (inner.top - outer.y));
  114628. break;
  114629. case 1: // Bottom
  114630. out.x = inner.x + (Math.random() * (outer.right - inner.x));
  114631. out.y = inner.bottom + (Math.random() * (outer.bottom - inner.bottom));
  114632. break;
  114633. case 2: // Left
  114634. out.x = outer.x + (Math.random() * (inner.x - outer.x));
  114635. out.y = inner.y + (Math.random() * (outer.bottom - inner.y));
  114636. break;
  114637. case 3: // Right
  114638. out.x = inner.right + (Math.random() * (outer.right - inner.right));
  114639. out.y = outer.y + (Math.random() * (inner.bottom - outer.y));
  114640. break;
  114641. }
  114642. }
  114643. return out;
  114644. };
  114645. module.exports = RandomOutside;
  114646. /***/ }),
  114647. /* 779 */
  114648. /***/ (function(module, exports, __webpack_require__) {
  114649. /**
  114650. * @author Richard Davey <rich@photonstorm.com>
  114651. * @copyright 2018 Photon Storm Ltd.
  114652. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114653. */
  114654. var Point = __webpack_require__(5);
  114655. var DegToRad = __webpack_require__(39);
  114656. /**
  114657. * [description]
  114658. *
  114659. * @function Phaser.Geom.Rectangle.PerimeterPoint
  114660. * @since 3.0.0
  114661. *
  114662. * @generic {Phaser.Geom.Point} O - [out,$return]
  114663. *
  114664. * @param {Phaser.Geom.Rectangle} rectangle - [description]
  114665. * @param {integer} angle - [description]
  114666. * @param {Phaser.Geom.Point} [out] - [description]
  114667. *
  114668. * @return {Phaser.Geom.Point} [description]
  114669. */
  114670. var PerimeterPoint = function (rectangle, angle, out)
  114671. {
  114672. if (out === undefined) { out = new Point(); }
  114673. angle = DegToRad(angle);
  114674. var s = Math.sin(angle);
  114675. var c = Math.cos(angle);
  114676. var dx = (c > 0) ? rectangle.width / 2 : rectangle.width / -2;
  114677. var dy = (s > 0) ? rectangle.height / 2 : rectangle.height / -2;
  114678. if (Math.abs(dx * s) < Math.abs(dy * c))
  114679. {
  114680. dy = (dx * s) / c;
  114681. }
  114682. else
  114683. {
  114684. dx = (dy * c) / s;
  114685. }
  114686. out.x = dx + rectangle.centerX;
  114687. out.y = dy + rectangle.centerY;
  114688. return out;
  114689. };
  114690. module.exports = PerimeterPoint;
  114691. /***/ }),
  114692. /* 780 */
  114693. /***/ (function(module, exports) {
  114694. /**
  114695. * @author Richard Davey <rich@photonstorm.com>
  114696. * @copyright 2018 Photon Storm Ltd.
  114697. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114698. */
  114699. /**
  114700. * [description]
  114701. *
  114702. * @function Phaser.Geom.Rectangle.Overlaps
  114703. * @since 3.0.0
  114704. *
  114705. * @param {Phaser.Geom.Rectangle} rectA - [description]
  114706. * @param {Phaser.Geom.Rectangle} rectB - [description]
  114707. *
  114708. * @return {boolean} [description]
  114709. */
  114710. var Overlaps = function (rectA, rectB)
  114711. {
  114712. return (
  114713. rectA.x < rectB.right &&
  114714. rectA.right > rectB.x &&
  114715. rectA.y < rectB.bottom &&
  114716. rectA.bottom > rectB.y
  114717. );
  114718. };
  114719. module.exports = Overlaps;
  114720. /***/ }),
  114721. /* 781 */
  114722. /***/ (function(module, exports) {
  114723. /**
  114724. * @author Richard Davey <rich@photonstorm.com>
  114725. * @copyright 2018 Photon Storm Ltd.
  114726. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114727. */
  114728. /**
  114729. * [description]
  114730. *
  114731. * @function Phaser.Geom.Rectangle.OffsetPoint
  114732. * @since 3.0.0
  114733. *
  114734. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  114735. *
  114736. * @param {Phaser.Geom.Rectangle} rect - [description]
  114737. * @param {Phaser.Geom.Point} point - [description]
  114738. *
  114739. * @return {Phaser.Geom.Rectangle} [description]
  114740. */
  114741. var OffsetPoint = function (rect, point)
  114742. {
  114743. rect.x += point.x;
  114744. rect.y += point.y;
  114745. return rect;
  114746. };
  114747. module.exports = OffsetPoint;
  114748. /***/ }),
  114749. /* 782 */
  114750. /***/ (function(module, exports) {
  114751. /**
  114752. * @author Richard Davey <rich@photonstorm.com>
  114753. * @copyright 2018 Photon Storm Ltd.
  114754. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114755. */
  114756. /**
  114757. * [description]
  114758. *
  114759. * @function Phaser.Geom.Rectangle.Offset
  114760. * @since 3.0.0
  114761. *
  114762. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  114763. *
  114764. * @param {Phaser.Geom.Rectangle} rect - [description]
  114765. * @param {number} x - [description]
  114766. * @param {number} y - [description]
  114767. *
  114768. * @return {Phaser.Geom.Rectangle} [description]
  114769. */
  114770. var Offset = function (rect, x, y)
  114771. {
  114772. rect.x += x;
  114773. rect.y += y;
  114774. return rect;
  114775. };
  114776. module.exports = Offset;
  114777. /***/ }),
  114778. /* 783 */
  114779. /***/ (function(module, exports) {
  114780. /**
  114781. * @author Richard Davey <rich@photonstorm.com>
  114782. * @copyright 2018 Photon Storm Ltd.
  114783. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114784. */
  114785. /**
  114786. * [description]
  114787. *
  114788. * @function Phaser.Geom.Rectangle.MergeXY
  114789. * @since 3.0.0
  114790. *
  114791. * @generic {Phaser.Geom.Rectangle} O - [target,$return]
  114792. *
  114793. * @param {Phaser.Geom.Rectangle} target - [description]
  114794. * @param {number} x - [description]
  114795. * @param {number} y - [description]
  114796. *
  114797. * @return {Phaser.Geom.Rectangle} [description]
  114798. */
  114799. var MergeXY = function (target, x, y)
  114800. {
  114801. var minX = Math.min(target.x, x);
  114802. var maxX = Math.max(target.right, x);
  114803. target.x = minX;
  114804. target.width = maxX - minX;
  114805. var minY = Math.min(target.y, y);
  114806. var maxY = Math.max(target.bottom, y);
  114807. target.y = minY;
  114808. target.height = maxY - minY;
  114809. return target;
  114810. };
  114811. module.exports = MergeXY;
  114812. /***/ }),
  114813. /* 784 */
  114814. /***/ (function(module, exports) {
  114815. /**
  114816. * @author Richard Davey <rich@photonstorm.com>
  114817. * @copyright 2018 Photon Storm Ltd.
  114818. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114819. */
  114820. // Merges source rectangle into target rectangle and returns target
  114821. // Neither rect should have negative widths or heights
  114822. /**
  114823. * [description]
  114824. *
  114825. * @function Phaser.Geom.Rectangle.MergeRect
  114826. * @since 3.0.0
  114827. *
  114828. * @generic {Phaser.Geom.Rectangle} O - [target,$return]
  114829. *
  114830. * @param {Phaser.Geom.Rectangle} target - [description]
  114831. * @param {Phaser.Geom.Rectangle} source - [description]
  114832. *
  114833. * @return {Phaser.Geom.Rectangle} [description]
  114834. */
  114835. var MergeRect = function (target, source)
  114836. {
  114837. var minX = Math.min(target.x, source.x);
  114838. var maxX = Math.max(target.right, source.right);
  114839. target.x = minX;
  114840. target.width = maxX - minX;
  114841. var minY = Math.min(target.y, source.y);
  114842. var maxY = Math.max(target.bottom, source.bottom);
  114843. target.y = minY;
  114844. target.height = maxY - minY;
  114845. return target;
  114846. };
  114847. module.exports = MergeRect;
  114848. /***/ }),
  114849. /* 785 */
  114850. /***/ (function(module, exports) {
  114851. /**
  114852. * @author Richard Davey <rich@photonstorm.com>
  114853. * @copyright 2018 Photon Storm Ltd.
  114854. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114855. */
  114856. // Merges the target Rectangle with a list of points.
  114857. // The points is an array of objects with public x/y properties.
  114858. /**
  114859. * [description]
  114860. *
  114861. * @function Phaser.Geom.Rectangle.MergePoints
  114862. * @since 3.0.0
  114863. *
  114864. * @generic {Phaser.Geom.Rectangle} O - [target,$return]
  114865. *
  114866. * @param {Phaser.Geom.Rectangle} target - [description]
  114867. * @param {Phaser.Geom.Point[]} points - [description]
  114868. *
  114869. * @return {Phaser.Geom.Rectangle} [description]
  114870. */
  114871. var MergePoints = function (target, points)
  114872. {
  114873. var minX = target.x;
  114874. var maxX = target.right;
  114875. var minY = target.y;
  114876. var maxY = target.bottom;
  114877. for (var i = 0; i < points.length; i++)
  114878. {
  114879. minX = Math.min(minX, points[i].x);
  114880. maxX = Math.max(maxX, points[i].x);
  114881. minY = Math.min(minY, points[i].y);
  114882. maxY = Math.max(maxY, points[i].y);
  114883. }
  114884. target.x = minX;
  114885. target.y = minY;
  114886. target.width = maxX - minX;
  114887. target.height = maxY - minY;
  114888. return target;
  114889. };
  114890. module.exports = MergePoints;
  114891. /***/ }),
  114892. /* 786 */
  114893. /***/ (function(module, exports, __webpack_require__) {
  114894. /**
  114895. * @author Richard Davey <rich@photonstorm.com>
  114896. * @copyright 2018 Photon Storm Ltd.
  114897. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114898. */
  114899. var Rectangle = __webpack_require__(13);
  114900. var Intersects = __webpack_require__(237);
  114901. /**
  114902. * Takes two Rectangles and first checks to see if they intersect.
  114903. * If they intersect it will return the area of intersection in the `out` Rectangle.
  114904. * If they do not intersect, the `out` Rectangle will have a width and height of zero.
  114905. *
  114906. * @function Phaser.Geom.Rectangle.Intersection
  114907. * @since 3.11.0
  114908. *
  114909. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  114910. *
  114911. * @param {Phaser.Geom.Rectangle} rectA - The first Rectangle to get the intersection from.
  114912. * @param {Phaser.Geom.Rectangle} rectB - The second Rectangle to get the intersection from.
  114913. * @param {Phaser.Geom.Rectangle} [out] - A Rectangle to store the intersection results in.
  114914. *
  114915. * @return {Phaser.Geom.Rectangle} The intersection result. If the width and height are zero, no intersection occurred.
  114916. */
  114917. var Intersection = function (rectA, rectB, out)
  114918. {
  114919. if (out === undefined) { out = new Rectangle(); }
  114920. if (Intersects(rectA, rectB))
  114921. {
  114922. out.x = Math.max(rectA.x, rectB.x);
  114923. out.y = Math.max(rectA.y, rectB.y);
  114924. out.width = Math.min(rectA.right, rectB.right) - out.x;
  114925. out.height = Math.min(rectA.bottom, rectB.bottom) - out.y;
  114926. }
  114927. else
  114928. {
  114929. out.setEmpty();
  114930. }
  114931. return out;
  114932. };
  114933. module.exports = Intersection;
  114934. /***/ }),
  114935. /* 787 */
  114936. /***/ (function(module, exports, __webpack_require__) {
  114937. /**
  114938. * @author Richard Davey <rich@photonstorm.com>
  114939. * @copyright 2018 Photon Storm Ltd.
  114940. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114941. */
  114942. var CenterOn = __webpack_require__(156);
  114943. // Increases the size of the Rectangle object by the specified amounts.
  114944. // The center point of the Rectangle object stays the same, and its size increases
  114945. // to the left and right by the x value, and to the top and the bottom by the y value.
  114946. /**
  114947. * [description]
  114948. *
  114949. * @function Phaser.Geom.Rectangle.Inflate
  114950. * @since 3.0.0
  114951. *
  114952. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  114953. *
  114954. * @param {Phaser.Geom.Rectangle} rect - [description]
  114955. * @param {number} x - [description]
  114956. * @param {number} y - [description]
  114957. *
  114958. * @return {Phaser.Geom.Rectangle} [description]
  114959. */
  114960. var Inflate = function (rect, x, y)
  114961. {
  114962. var cx = rect.centerX;
  114963. var cy = rect.centerY;
  114964. rect.setSize(rect.width + (x * 2), rect.height + (y * 2));
  114965. return CenterOn(rect, cx, cy);
  114966. };
  114967. module.exports = Inflate;
  114968. /***/ }),
  114969. /* 788 */
  114970. /***/ (function(module, exports, __webpack_require__) {
  114971. /**
  114972. * @author Richard Davey <rich@photonstorm.com>
  114973. * @copyright 2018 Photon Storm Ltd.
  114974. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  114975. */
  114976. var Point = __webpack_require__(5);
  114977. // The size of the Rectangle object, expressed as a Point object
  114978. // with the values of the width and height properties.
  114979. /**
  114980. * [description]
  114981. *
  114982. * @function Phaser.Geom.Rectangle.GetSize
  114983. * @since 3.0.0
  114984. *
  114985. * @generic {Phaser.Geom.Point} O - [out,$return]
  114986. *
  114987. * @param {Phaser.Geom.Rectangle} rect - [description]
  114988. * @param {(Phaser.Geom.Point|object)} [out] - [description]
  114989. *
  114990. * @return {(Phaser.Geom.Point|object)} [description]
  114991. */
  114992. var GetSize = function (rect, out)
  114993. {
  114994. if (out === undefined) { out = new Point(); }
  114995. out.x = rect.width;
  114996. out.y = rect.height;
  114997. return out;
  114998. };
  114999. module.exports = GetSize;
  115000. /***/ }),
  115001. /* 789 */
  115002. /***/ (function(module, exports, __webpack_require__) {
  115003. /**
  115004. * @author Richard Davey <rich@photonstorm.com>
  115005. * @copyright 2018 Photon Storm Ltd.
  115006. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115007. */
  115008. var Point = __webpack_require__(5);
  115009. // The center of the Rectangle object, expressed as a Point object
  115010. /**
  115011. * [description]
  115012. *
  115013. * @function Phaser.Geom.Rectangle.GetCenter
  115014. * @since 3.0.0
  115015. *
  115016. * @generic {Phaser.Geom.Point} O - [out,$return]
  115017. *
  115018. * @param {Phaser.Geom.Rectangle} rect - [description]
  115019. * @param {(Phaser.Geom.Point|object)} [out] - [description]
  115020. *
  115021. * @return {(Phaser.Geom.Point|object)} [description]
  115022. */
  115023. var GetCenter = function (rect, out)
  115024. {
  115025. if (out === undefined) { out = new Point(); }
  115026. out.x = rect.centerX;
  115027. out.y = rect.centerY;
  115028. return out;
  115029. };
  115030. module.exports = GetCenter;
  115031. /***/ }),
  115032. /* 790 */
  115033. /***/ (function(module, exports) {
  115034. /**
  115035. * @author Richard Davey <rich@photonstorm.com>
  115036. * @copyright 2018 Photon Storm Ltd.
  115037. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115038. */
  115039. /**
  115040. * [description]
  115041. *
  115042. * @function Phaser.Geom.Rectangle.FloorAll
  115043. * @since 3.0.0
  115044. *
  115045. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  115046. *
  115047. * @param {Phaser.Geom.Rectangle} rect - [description]
  115048. *
  115049. * @return {Phaser.Geom.Rectangle} [description]
  115050. */
  115051. var FloorAll = function (rect)
  115052. {
  115053. rect.x = Math.floor(rect.x);
  115054. rect.y = Math.floor(rect.y);
  115055. rect.width = Math.floor(rect.width);
  115056. rect.height = Math.floor(rect.height);
  115057. return rect;
  115058. };
  115059. module.exports = FloorAll;
  115060. /***/ }),
  115061. /* 791 */
  115062. /***/ (function(module, exports) {
  115063. /**
  115064. * @author Richard Davey <rich@photonstorm.com>
  115065. * @copyright 2018 Photon Storm Ltd.
  115066. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115067. */
  115068. /**
  115069. * [description]
  115070. *
  115071. * @function Phaser.Geom.Rectangle.Floor
  115072. * @since 3.0.0
  115073. *
  115074. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  115075. *
  115076. * @param {Phaser.Geom.Rectangle} rect - [description]
  115077. *
  115078. * @return {Phaser.Geom.Rectangle} [description]
  115079. */
  115080. var Floor = function (rect)
  115081. {
  115082. rect.x = Math.floor(rect.x);
  115083. rect.y = Math.floor(rect.y);
  115084. return rect;
  115085. };
  115086. module.exports = Floor;
  115087. /***/ }),
  115088. /* 792 */
  115089. /***/ (function(module, exports, __webpack_require__) {
  115090. /**
  115091. * @author Richard Davey <rich@photonstorm.com>
  115092. * @copyright 2018 Photon Storm Ltd.
  115093. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115094. */
  115095. var GetAspectRatio = __webpack_require__(233);
  115096. // Fits the target rectangle around the source rectangle.
  115097. // Preserves aspect ration.
  115098. // Scales and centers the target rectangle to the source rectangle
  115099. /**
  115100. * [description]
  115101. *
  115102. * @function Phaser.Geom.Rectangle.FitOutside
  115103. * @since 3.0.0
  115104. *
  115105. * @generic {Phaser.Geom.Rectangle} O - [target,$return]
  115106. *
  115107. * @param {Phaser.Geom.Rectangle} target - [description]
  115108. * @param {Phaser.Geom.Rectangle} source - [description]
  115109. *
  115110. * @return {Phaser.Geom.Rectangle} [description]
  115111. */
  115112. var FitOutside = function (target, source)
  115113. {
  115114. var ratio = GetAspectRatio(target);
  115115. if (ratio > GetAspectRatio(source))
  115116. {
  115117. // Wider than Tall
  115118. target.setSize(source.height * ratio, source.height);
  115119. }
  115120. else
  115121. {
  115122. // Taller than Wide
  115123. target.setSize(source.width, source.width / ratio);
  115124. }
  115125. return target.setPosition(
  115126. source.centerX - target.width / 2,
  115127. source.centerY - target.height / 2
  115128. );
  115129. };
  115130. module.exports = FitOutside;
  115131. /***/ }),
  115132. /* 793 */
  115133. /***/ (function(module, exports, __webpack_require__) {
  115134. /**
  115135. * @author Richard Davey <rich@photonstorm.com>
  115136. * @copyright 2018 Photon Storm Ltd.
  115137. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115138. */
  115139. var GetAspectRatio = __webpack_require__(233);
  115140. // Fits the target rectangle into the source rectangle.
  115141. // Preserves aspect ratio.
  115142. // Scales and centers the target rectangle to the source rectangle
  115143. /**
  115144. * [description]
  115145. *
  115146. * @function Phaser.Geom.Rectangle.FitInside
  115147. * @since 3.0.0
  115148. *
  115149. * @generic {Phaser.Geom.Rectangle} O - [target,$return]
  115150. *
  115151. * @param {Phaser.Geom.Rectangle} target - [description]
  115152. * @param {Phaser.Geom.Rectangle} source - [description]
  115153. *
  115154. * @return {Phaser.Geom.Rectangle} [description]
  115155. */
  115156. var FitInside = function (target, source)
  115157. {
  115158. var ratio = GetAspectRatio(target);
  115159. if (ratio < GetAspectRatio(source))
  115160. {
  115161. // Taller than Wide
  115162. target.setSize(source.height * ratio, source.height);
  115163. }
  115164. else
  115165. {
  115166. // Wider than Tall
  115167. target.setSize(source.width, source.width / ratio);
  115168. }
  115169. return target.setPosition(
  115170. source.centerX - (target.width / 2),
  115171. source.centerY - (target.height / 2)
  115172. );
  115173. };
  115174. module.exports = FitInside;
  115175. /***/ }),
  115176. /* 794 */
  115177. /***/ (function(module, exports) {
  115178. /**
  115179. * @author Richard Davey <rich@photonstorm.com>
  115180. * @copyright 2018 Photon Storm Ltd.
  115181. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115182. */
  115183. /**
  115184. * [description]
  115185. *
  115186. * @function Phaser.Geom.Rectangle.Equals
  115187. * @since 3.0.0
  115188. *
  115189. * @param {Phaser.Geom.Rectangle} rect - [description]
  115190. * @param {Phaser.Geom.Rectangle} toCompare - [description]
  115191. *
  115192. * @return {boolean} [description]
  115193. */
  115194. var Equals = function (rect, toCompare)
  115195. {
  115196. return (
  115197. rect.x === toCompare.x &&
  115198. rect.y === toCompare.y &&
  115199. rect.width === toCompare.width &&
  115200. rect.height === toCompare.height
  115201. );
  115202. };
  115203. module.exports = Equals;
  115204. /***/ }),
  115205. /* 795 */
  115206. /***/ (function(module, exports) {
  115207. /**
  115208. * @author Richard Davey <rich@photonstorm.com>
  115209. * @copyright 2018 Photon Storm Ltd.
  115210. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115211. */
  115212. /**
  115213. * Copy the values of one Rectangle to a destination Rectangle.
  115214. *
  115215. * @function Phaser.Geom.Rectangle.CopyFrom
  115216. * @since 3.0.0
  115217. *
  115218. * @generic {Phaser.Geom.Rectangle} O - [dest,$return]
  115219. *
  115220. * @param {Phaser.Geom.Rectangle} source - The source Rectangle to copy the values from.
  115221. * @param {Phaser.Geom.Rectangle} dest - The destination Rectangle to copy the values to.
  115222. *
  115223. * @return {Phaser.Geom.Rectangle} The destination Rectangle.
  115224. */
  115225. var CopyFrom = function (source, dest)
  115226. {
  115227. return dest.setTo(source.x, source.y, source.width, source.height);
  115228. };
  115229. module.exports = CopyFrom;
  115230. /***/ }),
  115231. /* 796 */
  115232. /***/ (function(module, exports, __webpack_require__) {
  115233. /**
  115234. * @author Richard Davey <rich@photonstorm.com>
  115235. * @copyright 2018 Photon Storm Ltd.
  115236. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115237. */
  115238. var Contains = __webpack_require__(31);
  115239. /**
  115240. * [description]
  115241. *
  115242. * @function Phaser.Geom.Rectangle.ContainsPoint
  115243. * @since 3.0.0
  115244. *
  115245. * @param {Phaser.Geom.Rectangle} rect - [description]
  115246. * @param {Phaser.Geom.Point} point - [description]
  115247. *
  115248. * @return {boolean} [description]
  115249. */
  115250. var ContainsPoint = function (rect, point)
  115251. {
  115252. return Contains(rect, point.x, point.y);
  115253. };
  115254. module.exports = ContainsPoint;
  115255. /***/ }),
  115256. /* 797 */
  115257. /***/ (function(module, exports, __webpack_require__) {
  115258. /**
  115259. * @author Richard Davey <rich@photonstorm.com>
  115260. * @copyright 2018 Photon Storm Ltd.
  115261. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115262. */
  115263. var Rectangle = __webpack_require__(13);
  115264. /**
  115265. * [description]
  115266. *
  115267. * @function Phaser.Geom.Rectangle.Clone
  115268. * @since 3.0.0
  115269. *
  115270. * @param {Phaser.Geom.Rectangle} source - [description]
  115271. *
  115272. * @return {Phaser.Geom.Rectangle} [description]
  115273. */
  115274. var Clone = function (source)
  115275. {
  115276. return new Rectangle(source.x, source.y, source.width, source.height);
  115277. };
  115278. module.exports = Clone;
  115279. /***/ }),
  115280. /* 798 */
  115281. /***/ (function(module, exports) {
  115282. /**
  115283. * @author Richard Davey <rich@photonstorm.com>
  115284. * @copyright 2018 Photon Storm Ltd.
  115285. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115286. */
  115287. /**
  115288. * [description]
  115289. *
  115290. * @function Phaser.Geom.Rectangle.CeilAll
  115291. * @since 3.0.0
  115292. *
  115293. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  115294. *
  115295. * @param {Phaser.Geom.Rectangle} rect - [description]
  115296. *
  115297. * @return {Phaser.Geom.Rectangle} [description]
  115298. */
  115299. var CeilAll = function (rect)
  115300. {
  115301. rect.x = Math.ceil(rect.x);
  115302. rect.y = Math.ceil(rect.y);
  115303. rect.width = Math.ceil(rect.width);
  115304. rect.height = Math.ceil(rect.height);
  115305. return rect;
  115306. };
  115307. module.exports = CeilAll;
  115308. /***/ }),
  115309. /* 799 */
  115310. /***/ (function(module, exports) {
  115311. /**
  115312. * @author Richard Davey <rich@photonstorm.com>
  115313. * @copyright 2018 Photon Storm Ltd.
  115314. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115315. */
  115316. /**
  115317. * [description]
  115318. *
  115319. * @function Phaser.Geom.Rectangle.Ceil
  115320. * @since 3.0.0
  115321. *
  115322. * @generic {Phaser.Geom.Rectangle} O - [rect,$return]
  115323. *
  115324. * @param {Phaser.Geom.Rectangle} rect - [description]
  115325. *
  115326. * @return {Phaser.Geom.Rectangle} [description]
  115327. */
  115328. var Ceil = function (rect)
  115329. {
  115330. rect.x = Math.ceil(rect.x);
  115331. rect.y = Math.ceil(rect.y);
  115332. return rect;
  115333. };
  115334. module.exports = Ceil;
  115335. /***/ }),
  115336. /* 800 */
  115337. /***/ (function(module, exports) {
  115338. /**
  115339. * @author Richard Davey <rich@photonstorm.com>
  115340. * @copyright 2018 Photon Storm Ltd.
  115341. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115342. */
  115343. /**
  115344. * [description]
  115345. *
  115346. * @function Phaser.Geom.Rectangle.Area
  115347. * @since 3.0.0
  115348. *
  115349. * @param {Phaser.Geom.Rectangle} rect - [description]
  115350. *
  115351. * @return {number} [description]
  115352. */
  115353. var Area = function (rect)
  115354. {
  115355. return rect.width * rect.height;
  115356. };
  115357. module.exports = Area;
  115358. /***/ }),
  115359. /* 801 */
  115360. /***/ (function(module, exports) {
  115361. /**
  115362. * @author Richard Davey <rich@photonstorm.com>
  115363. * @copyright 2018 Photon Storm Ltd.
  115364. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115365. */
  115366. // Export the points as an array of flat numbers, following the sequence [ x,y, x,y, x,y ]
  115367. /**
  115368. * [description]
  115369. *
  115370. * @function Phaser.Geom.Polygon.GetNumberArray
  115371. * @since 3.0.0
  115372. *
  115373. * @generic {number[]} O - [output,$return]
  115374. *
  115375. * @param {Phaser.Geom.Polygon} polygon - [description]
  115376. * @param {(array|number[])} [output] - [description]
  115377. *
  115378. * @return {(array|number[])} [description]
  115379. */
  115380. var GetNumberArray = function (polygon, output)
  115381. {
  115382. if (output === undefined) { output = []; }
  115383. for (var i = 0; i < polygon.points.length; i++)
  115384. {
  115385. output.push(polygon.points[i].x);
  115386. output.push(polygon.points[i].y);
  115387. }
  115388. return output;
  115389. };
  115390. module.exports = GetNumberArray;
  115391. /***/ }),
  115392. /* 802 */
  115393. /***/ (function(module, exports, __webpack_require__) {
  115394. /**
  115395. * @author Richard Davey <rich@photonstorm.com>
  115396. * @copyright 2018 Photon Storm Ltd.
  115397. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115398. */
  115399. var Rectangle = __webpack_require__(13);
  115400. /**
  115401. * [description]
  115402. *
  115403. * @function Phaser.Geom.Polygon.GetAABB
  115404. * @since 3.0.0
  115405. *
  115406. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  115407. *
  115408. * @param {Phaser.Geom.Polygon} polygon - [description]
  115409. * @param {(Phaser.Geom.Rectangle|object)} [out] - [description]
  115410. *
  115411. * @return {(Phaser.Geom.Rectangle|object)} [description]
  115412. */
  115413. var GetAABB = function (polygon, out)
  115414. {
  115415. if (out === undefined) { out = new Rectangle(); }
  115416. var minX = Infinity;
  115417. var minY = Infinity;
  115418. var maxX = -minX;
  115419. var maxY = -minY;
  115420. var p;
  115421. for (var i = 0; i < polygon.points.length; i++)
  115422. {
  115423. p = polygon.points[i];
  115424. minX = Math.min(minX, p.x);
  115425. minY = Math.min(minY, p.y);
  115426. maxX = Math.max(maxX, p.x);
  115427. maxY = Math.max(maxY, p.y);
  115428. }
  115429. out.x = minX;
  115430. out.y = minY;
  115431. out.width = maxX - minX;
  115432. out.height = maxY - minY;
  115433. return out;
  115434. };
  115435. module.exports = GetAABB;
  115436. /***/ }),
  115437. /* 803 */
  115438. /***/ (function(module, exports, __webpack_require__) {
  115439. /**
  115440. * @author Richard Davey <rich@photonstorm.com>
  115441. * @copyright 2018 Photon Storm Ltd.
  115442. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115443. */
  115444. var Contains = __webpack_require__(234);
  115445. /**
  115446. * [description]
  115447. *
  115448. * @function Phaser.Geom.Polygon.ContainsPoint
  115449. * @since 3.0.0
  115450. *
  115451. * @param {Phaser.Geom.Polygon} polygon - [description]
  115452. * @param {Phaser.Geom.Point} point - [description]
  115453. *
  115454. * @return {boolean} [description]
  115455. */
  115456. var ContainsPoint = function (polygon, point)
  115457. {
  115458. return Contains(polygon, point.x, point.y);
  115459. };
  115460. module.exports = ContainsPoint;
  115461. /***/ }),
  115462. /* 804 */
  115463. /***/ (function(module, exports, __webpack_require__) {
  115464. /**
  115465. * @author Richard Davey <rich@photonstorm.com>
  115466. * @copyright 2018 Photon Storm Ltd.
  115467. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115468. */
  115469. var Polygon = __webpack_require__(395);
  115470. /**
  115471. * [description]
  115472. *
  115473. * @function Phaser.Geom.Polygon.Clone
  115474. * @since 3.0.0
  115475. *
  115476. * @param {Phaser.Geom.Polygon} polygon - [description]
  115477. *
  115478. * @return {Phaser.Geom.Polygon} [description]
  115479. */
  115480. var Clone = function (polygon)
  115481. {
  115482. return new Polygon(polygon.points);
  115483. };
  115484. module.exports = Clone;
  115485. /***/ }),
  115486. /* 805 */
  115487. /***/ (function(module, exports, __webpack_require__) {
  115488. /**
  115489. * @author Richard Davey <rich@photonstorm.com>
  115490. * @copyright 2018 Photon Storm Ltd.
  115491. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115492. */
  115493. var Polygon = __webpack_require__(395);
  115494. Polygon.Clone = __webpack_require__(804);
  115495. Polygon.Contains = __webpack_require__(234);
  115496. Polygon.ContainsPoint = __webpack_require__(803);
  115497. Polygon.GetAABB = __webpack_require__(802);
  115498. Polygon.GetNumberArray = __webpack_require__(801);
  115499. module.exports = Polygon;
  115500. /***/ }),
  115501. /* 806 */
  115502. /***/ (function(module, exports, __webpack_require__) {
  115503. /**
  115504. * @author Richard Davey <rich@photonstorm.com>
  115505. * @copyright 2018 Photon Storm Ltd.
  115506. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115507. */
  115508. var GetMagnitude = __webpack_require__(397);
  115509. /**
  115510. * [description]
  115511. *
  115512. * @function Phaser.Geom.Point.SetMagnitude
  115513. * @since 3.0.0
  115514. *
  115515. * @generic {Phaser.Geom.Point} O - [point,$return]
  115516. *
  115517. * @param {Phaser.Geom.Point} point - [description]
  115518. * @param {number} magnitude - [description]
  115519. *
  115520. * @return {Phaser.Geom.Point} [description]
  115521. */
  115522. var SetMagnitude = function (point, magnitude)
  115523. {
  115524. if (point.x !== 0 || point.y !== 0)
  115525. {
  115526. var m = GetMagnitude(point);
  115527. point.x /= m;
  115528. point.y /= m;
  115529. }
  115530. point.x *= magnitude;
  115531. point.y *= magnitude;
  115532. return point;
  115533. };
  115534. module.exports = SetMagnitude;
  115535. /***/ }),
  115536. /* 807 */
  115537. /***/ (function(module, exports, __webpack_require__) {
  115538. /**
  115539. * @author Richard Davey <rich@photonstorm.com>
  115540. * @copyright 2018 Photon Storm Ltd.
  115541. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115542. */
  115543. var Point = __webpack_require__(5);
  115544. /**
  115545. * [description]
  115546. *
  115547. * @function Phaser.Geom.Point.ProjectUnit
  115548. * @since 3.0.0
  115549. *
  115550. * @generic {Phaser.Geom.Point} O - [out,$return]
  115551. *
  115552. * @param {Phaser.Geom.Point} pointA - [description]
  115553. * @param {Phaser.Geom.Point} pointB - [description]
  115554. * @param {Phaser.Geom.Point} [out] - [description]
  115555. *
  115556. * @return {Phaser.Geom.Point} [description]
  115557. */
  115558. var ProjectUnit = function (pointA, pointB, out)
  115559. {
  115560. if (out === undefined) { out = new Point(); }
  115561. var amt = ((pointA.x * pointB.x) + (pointA.y * pointB.y));
  115562. if (amt !== 0)
  115563. {
  115564. out.x = amt * pointB.x;
  115565. out.y = amt * pointB.y;
  115566. }
  115567. return out;
  115568. };
  115569. module.exports = ProjectUnit;
  115570. /***/ }),
  115571. /* 808 */
  115572. /***/ (function(module, exports, __webpack_require__) {
  115573. /**
  115574. * @author Richard Davey <rich@photonstorm.com>
  115575. * @copyright 2018 Photon Storm Ltd.
  115576. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115577. */
  115578. var Point = __webpack_require__(5);
  115579. var GetMagnitudeSq = __webpack_require__(396);
  115580. /**
  115581. * [description]
  115582. *
  115583. * @function Phaser.Geom.Point.Project
  115584. * @since 3.0.0
  115585. *
  115586. * @generic {Phaser.Geom.Point} O - [out,$return]
  115587. *
  115588. * @param {Phaser.Geom.Point} pointA - [description]
  115589. * @param {Phaser.Geom.Point} pointB - [description]
  115590. * @param {Phaser.Geom.Point} [out] - [description]
  115591. *
  115592. * @return {Phaser.Geom.Point} [description]
  115593. */
  115594. var Project = function (pointA, pointB, out)
  115595. {
  115596. if (out === undefined) { out = new Point(); }
  115597. var dot = ((pointA.x * pointB.x) + (pointA.y * pointB.y));
  115598. var amt = dot / GetMagnitudeSq(pointB);
  115599. if (amt !== 0)
  115600. {
  115601. out.x = amt * pointB.x;
  115602. out.y = amt * pointB.y;
  115603. }
  115604. return out;
  115605. };
  115606. module.exports = Project;
  115607. /***/ }),
  115608. /* 809 */
  115609. /***/ (function(module, exports, __webpack_require__) {
  115610. /**
  115611. * @author Richard Davey <rich@photonstorm.com>
  115612. * @copyright 2018 Photon Storm Ltd.
  115613. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115614. */
  115615. var Point = __webpack_require__(5);
  115616. /**
  115617. * [description]
  115618. *
  115619. * @function Phaser.Geom.Point.Negative
  115620. * @since 3.0.0
  115621. *
  115622. * @generic {Phaser.Geom.Point} O - [out,$return]
  115623. *
  115624. * @param {Phaser.Geom.Point} point - [description]
  115625. * @param {Phaser.Geom.Point} [out] - [description]
  115626. *
  115627. * @return {Phaser.Geom.Point} [description]
  115628. */
  115629. var Negative = function (point, out)
  115630. {
  115631. if (out === undefined) { out = new Point(); }
  115632. return out.setTo(-point.x, -point.y);
  115633. };
  115634. module.exports = Negative;
  115635. /***/ }),
  115636. /* 810 */
  115637. /***/ (function(module, exports) {
  115638. /**
  115639. * @author Richard Davey <rich@photonstorm.com>
  115640. * @copyright 2018 Photon Storm Ltd.
  115641. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115642. */
  115643. /**
  115644. * [description]
  115645. *
  115646. * @function Phaser.Geom.Point.Invert
  115647. * @since 3.0.0
  115648. *
  115649. * @generic {Phaser.Geom.Point} O - [point,$return]
  115650. *
  115651. * @param {Phaser.Geom.Point} point - [description]
  115652. *
  115653. * @return {Phaser.Geom.Point} [description]
  115654. */
  115655. var Invert = function (point)
  115656. {
  115657. return point.setTo(point.y, point.x);
  115658. };
  115659. module.exports = Invert;
  115660. /***/ }),
  115661. /* 811 */
  115662. /***/ (function(module, exports, __webpack_require__) {
  115663. /**
  115664. * @author Richard Davey <rich@photonstorm.com>
  115665. * @copyright 2018 Photon Storm Ltd.
  115666. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115667. */
  115668. var Point = __webpack_require__(5);
  115669. /**
  115670. * [description]
  115671. *
  115672. * @function Phaser.Geom.Point.Interpolate
  115673. * @since 3.0.0
  115674. *
  115675. * @generic {Phaser.Geom.Point} O - [out,$return]
  115676. *
  115677. * @param {Phaser.Geom.Point} pointA - [description]
  115678. * @param {Phaser.Geom.Point} pointB - [description]
  115679. * @param {number} [t=0] - [description]
  115680. * @param {(Phaser.Geom.Point|object)} [out] - [description]
  115681. *
  115682. * @return {(Phaser.Geom.Point|object)} [description]
  115683. */
  115684. var Interpolate = function (pointA, pointB, t, out)
  115685. {
  115686. if (t === undefined) { t = 0; }
  115687. if (out === undefined) { out = new Point(); }
  115688. out.x = pointA.x + ((pointB.x - pointA.x) * t);
  115689. out.y = pointA.y + ((pointB.y - pointA.y) * t);
  115690. return out;
  115691. };
  115692. module.exports = Interpolate;
  115693. /***/ }),
  115694. /* 812 */
  115695. /***/ (function(module, exports, __webpack_require__) {
  115696. /**
  115697. * @author Richard Davey <rich@photonstorm.com>
  115698. * @copyright 2018 Photon Storm Ltd.
  115699. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115700. */
  115701. var Rectangle = __webpack_require__(13);
  115702. /**
  115703. * Calculates the Axis Aligned Bounding Box (or aabb) from an array of points.
  115704. *
  115705. * @function Phaser.Geom.Point.GetRectangleFromPoints
  115706. * @since 3.0.0
  115707. *
  115708. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  115709. *
  115710. * @param {Phaser.Geom.Point[]} points - [description]
  115711. * @param {Phaser.Geom.Rectangle} [out] - [description]
  115712. *
  115713. * @return {Phaser.Geom.Rectangle} [description]
  115714. */
  115715. var GetRectangleFromPoints = function (points, out)
  115716. {
  115717. if (out === undefined) { out = new Rectangle(); }
  115718. var xMax = Number.NEGATIVE_INFINITY;
  115719. var xMin = Number.POSITIVE_INFINITY;
  115720. var yMax = Number.NEGATIVE_INFINITY;
  115721. var yMin = Number.POSITIVE_INFINITY;
  115722. for (var i = 0; i < points.length; i++)
  115723. {
  115724. var point = points[i];
  115725. if (point.x > xMax)
  115726. {
  115727. xMax = point.x;
  115728. }
  115729. if (point.x < xMin)
  115730. {
  115731. xMin = point.x;
  115732. }
  115733. if (point.y > yMax)
  115734. {
  115735. yMax = point.y;
  115736. }
  115737. if (point.y < yMin)
  115738. {
  115739. yMin = point.y;
  115740. }
  115741. }
  115742. out.x = xMin;
  115743. out.y = yMin;
  115744. out.width = xMax - xMin;
  115745. out.height = yMax - yMin;
  115746. return out;
  115747. };
  115748. module.exports = GetRectangleFromPoints;
  115749. /***/ }),
  115750. /* 813 */
  115751. /***/ (function(module, exports, __webpack_require__) {
  115752. /**
  115753. * @author Richard Davey <rich@photonstorm.com>
  115754. * @copyright 2018 Photon Storm Ltd.
  115755. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115756. */
  115757. var Point = __webpack_require__(5);
  115758. /**
  115759. * [description]
  115760. *
  115761. * @function Phaser.Geom.Point.GetCentroid
  115762. * @since 3.0.0
  115763. *
  115764. * @generic {Phaser.Geom.Point} O - [out,$return]
  115765. *
  115766. * @param {Phaser.Geom.Point[]} points - [description]
  115767. * @param {Phaser.Geom.Point} [out] - [description]
  115768. *
  115769. * @return {Phaser.Geom.Point} [description]
  115770. */
  115771. var GetCentroid = function (points, out)
  115772. {
  115773. if (out === undefined) { out = new Point(); }
  115774. if (!Array.isArray(points))
  115775. {
  115776. throw new Error('GetCentroid points argument must be an array');
  115777. }
  115778. var len = points.length;
  115779. if (len < 1)
  115780. {
  115781. throw new Error('GetCentroid points array must not be empty');
  115782. }
  115783. else if (len === 1)
  115784. {
  115785. out.x = points[0].x;
  115786. out.y = points[0].y;
  115787. }
  115788. else
  115789. {
  115790. for (var i = 0; i < len; i++)
  115791. {
  115792. out.x += points[i].x;
  115793. out.y += points[i].y;
  115794. }
  115795. out.x /= len;
  115796. out.y /= len;
  115797. }
  115798. return out;
  115799. };
  115800. module.exports = GetCentroid;
  115801. /***/ }),
  115802. /* 814 */
  115803. /***/ (function(module, exports) {
  115804. /**
  115805. * @author Richard Davey <rich@photonstorm.com>
  115806. * @copyright 2018 Photon Storm Ltd.
  115807. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115808. */
  115809. /**
  115810. * Apply `Math.ceil()` to each coordinate of the given Point.
  115811. *
  115812. * @function Phaser.Geom.Point.Floor
  115813. * @since 3.0.0
  115814. *
  115815. * @generic {Phaser.Geom.Point} O - [point,$return]
  115816. *
  115817. * @param {Phaser.Geom.Point} point - The Point to floor.
  115818. *
  115819. * @return {Phaser.Geom.Point} The Point with `Math.floor()` applied to its coordinates.
  115820. */
  115821. var Floor = function (point)
  115822. {
  115823. return point.setTo(Math.floor(point.x), Math.floor(point.y));
  115824. };
  115825. module.exports = Floor;
  115826. /***/ }),
  115827. /* 815 */
  115828. /***/ (function(module, exports) {
  115829. /**
  115830. * @author Richard Davey <rich@photonstorm.com>
  115831. * @copyright 2018 Photon Storm Ltd.
  115832. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115833. */
  115834. /**
  115835. * [description]
  115836. *
  115837. * @function Phaser.Geom.Point.Equals
  115838. * @since 3.0.0
  115839. *
  115840. * @param {Phaser.Geom.Point} point - [description]
  115841. * @param {Phaser.Geom.Point} toCompare - [description]
  115842. *
  115843. * @return {boolean} [description]
  115844. */
  115845. var Equals = function (point, toCompare)
  115846. {
  115847. return (point.x === toCompare.x && point.y === toCompare.y);
  115848. };
  115849. module.exports = Equals;
  115850. /***/ }),
  115851. /* 816 */
  115852. /***/ (function(module, exports) {
  115853. /**
  115854. * @author Richard Davey <rich@photonstorm.com>
  115855. * @copyright 2018 Photon Storm Ltd.
  115856. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115857. */
  115858. /**
  115859. * Copy the values of one Point to a destination Point.
  115860. *
  115861. * @function Phaser.Geom.Point.CopyFrom
  115862. * @since 3.0.0
  115863. *
  115864. * @generic {Phaser.Geom.Point} O - [dest,$return]
  115865. *
  115866. * @param {Phaser.Geom.Point} source - The source Point to copy the values from.
  115867. * @param {Phaser.Geom.Point} dest - The destination Point to copy the values to.
  115868. *
  115869. * @return {Phaser.Geom.Point} The destination Point.
  115870. */
  115871. var CopyFrom = function (source, dest)
  115872. {
  115873. return dest.setTo(source.x, source.y);
  115874. };
  115875. module.exports = CopyFrom;
  115876. /***/ }),
  115877. /* 817 */
  115878. /***/ (function(module, exports, __webpack_require__) {
  115879. /**
  115880. * @author Richard Davey <rich@photonstorm.com>
  115881. * @copyright 2018 Photon Storm Ltd.
  115882. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115883. */
  115884. var Point = __webpack_require__(5);
  115885. /**
  115886. * Clone the given Point.
  115887. *
  115888. * @function Phaser.Geom.Point.Clone
  115889. * @since 3.0.0
  115890. *
  115891. * @param {Phaser.Geom.Point} source - The source Point to clone.
  115892. *
  115893. * @return {Phaser.Geom.Point} The cloned Point.
  115894. */
  115895. var Clone = function (source)
  115896. {
  115897. return new Point(source.x, source.y);
  115898. };
  115899. module.exports = Clone;
  115900. /***/ }),
  115901. /* 818 */
  115902. /***/ (function(module, exports) {
  115903. /**
  115904. * @author Richard Davey <rich@photonstorm.com>
  115905. * @copyright 2018 Photon Storm Ltd.
  115906. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115907. */
  115908. /**
  115909. * Apply `Math.ceil()` to each coordinate of the given Point.
  115910. *
  115911. * @function Phaser.Geom.Point.Ceil
  115912. * @since 3.0.0
  115913. *
  115914. * @generic {Phaser.Geom.Point} O - [point,$return]
  115915. *
  115916. * @param {Phaser.Geom.Point} point - The Point to ceil.
  115917. *
  115918. * @return {Phaser.Geom.Point} The Point with `Math.ceil()` applied to its coordinates.
  115919. */
  115920. var Ceil = function (point)
  115921. {
  115922. return point.setTo(Math.ceil(point.x), Math.ceil(point.y));
  115923. };
  115924. module.exports = Ceil;
  115925. /***/ }),
  115926. /* 819 */
  115927. /***/ (function(module, exports, __webpack_require__) {
  115928. /**
  115929. * @author Richard Davey <rich@photonstorm.com>
  115930. * @copyright 2018 Photon Storm Ltd.
  115931. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115932. */
  115933. var Point = __webpack_require__(5);
  115934. Point.Ceil = __webpack_require__(818);
  115935. Point.Clone = __webpack_require__(817);
  115936. Point.CopyFrom = __webpack_require__(816);
  115937. Point.Equals = __webpack_require__(815);
  115938. Point.Floor = __webpack_require__(814);
  115939. Point.GetCentroid = __webpack_require__(813);
  115940. Point.GetMagnitude = __webpack_require__(397);
  115941. Point.GetMagnitudeSq = __webpack_require__(396);
  115942. Point.GetRectangleFromPoints = __webpack_require__(812);
  115943. Point.Interpolate = __webpack_require__(811);
  115944. Point.Invert = __webpack_require__(810);
  115945. Point.Negative = __webpack_require__(809);
  115946. Point.Project = __webpack_require__(808);
  115947. Point.ProjectUnit = __webpack_require__(807);
  115948. Point.SetMagnitude = __webpack_require__(806);
  115949. module.exports = Point;
  115950. /***/ }),
  115951. /* 820 */
  115952. /***/ (function(module, exports) {
  115953. /**
  115954. * @author Richard Davey <rich@photonstorm.com>
  115955. * @copyright 2018 Photon Storm Ltd.
  115956. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115957. */
  115958. /**
  115959. * Calculate the width of the given line.
  115960. *
  115961. * @function Phaser.Geom.Line.Width
  115962. * @since 3.0.0
  115963. *
  115964. * @param {Phaser.Geom.Line} line - The line to calculate the width of.
  115965. *
  115966. * @return {number} The width of the line.
  115967. */
  115968. var Width = function (line)
  115969. {
  115970. return Math.abs(line.x1 - line.x2);
  115971. };
  115972. module.exports = Width;
  115973. /***/ }),
  115974. /* 821 */
  115975. /***/ (function(module, exports) {
  115976. /**
  115977. * @author Richard Davey <rich@photonstorm.com>
  115978. * @copyright 2018 Photon Storm Ltd.
  115979. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  115980. */
  115981. /**
  115982. * Calculate the slope of the given line.
  115983. *
  115984. * @function Phaser.Geom.Line.Slope
  115985. * @since 3.0.0
  115986. *
  115987. * @param {Phaser.Geom.Line} line - The line to calculate the slope of.
  115988. *
  115989. * @return {number} The slope of the line.
  115990. */
  115991. var Slope = function (line)
  115992. {
  115993. return (line.y2 - line.y1) / (line.x2 - line.x1);
  115994. };
  115995. module.exports = Slope;
  115996. /***/ }),
  115997. /* 822 */
  115998. /***/ (function(module, exports) {
  115999. /**
  116000. * @author Richard Davey <rich@photonstorm.com>
  116001. * @copyright 2018 Photon Storm Ltd.
  116002. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116003. */
  116004. /**
  116005. * Set a line to a given position, angle and length.
  116006. *
  116007. * @function Phaser.Geom.Line.SetToAngle
  116008. * @since 3.0.0
  116009. *
  116010. * @generic {Phaser.Geom.Line} O - [line,$return]
  116011. *
  116012. * @param {Phaser.Geom.Line} line - The line to set.
  116013. * @param {number} x - The horizontal start position of the line.
  116014. * @param {number} y - The vertical start position of the line.
  116015. * @param {number} angle - The angle of the line in radians.
  116016. * @param {number} length - The length of the line.
  116017. *
  116018. * @return {Phaser.Geom.Line} The updated line.
  116019. */
  116020. var SetToAngle = function (line, x, y, angle, length)
  116021. {
  116022. line.x1 = x;
  116023. line.y1 = y;
  116024. line.x2 = x + (Math.cos(angle) * length);
  116025. line.y2 = y + (Math.sin(angle) * length);
  116026. return line;
  116027. };
  116028. module.exports = SetToAngle;
  116029. /***/ }),
  116030. /* 823 */
  116031. /***/ (function(module, exports, __webpack_require__) {
  116032. /**
  116033. * @author Richard Davey <rich@photonstorm.com>
  116034. * @copyright 2018 Photon Storm Ltd.
  116035. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116036. */
  116037. var RotateAroundXY = __webpack_require__(235);
  116038. /**
  116039. * Rotate a line around a point by the given angle in radians.
  116040. *
  116041. * @function Phaser.Geom.Line.RotateAroundPoint
  116042. * @since 3.0.0
  116043. *
  116044. * @generic {Phaser.Geom.Line} O - [line,$return]
  116045. *
  116046. * @param {Phaser.Geom.Line} line - The line to rotate.
  116047. * @param {(Phaser.Geom.Point|object)} point - The point to rotate the line around.
  116048. * @param {number} angle - The angle of rotation in radians.
  116049. *
  116050. * @return {Phaser.Geom.Line} The rotated line.
  116051. */
  116052. var RotateAroundPoint = function (line, point, angle)
  116053. {
  116054. return RotateAroundXY(line, point.x, point.y, angle);
  116055. };
  116056. module.exports = RotateAroundPoint;
  116057. /***/ }),
  116058. /* 824 */
  116059. /***/ (function(module, exports, __webpack_require__) {
  116060. /**
  116061. * @author Richard Davey <rich@photonstorm.com>
  116062. * @copyright 2018 Photon Storm Ltd.
  116063. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116064. */
  116065. var RotateAroundXY = __webpack_require__(235);
  116066. /**
  116067. * Rotate a line around its midpoint by the given angle in radians.
  116068. *
  116069. * @function Phaser.Geom.Line.Rotate
  116070. * @since 3.0.0
  116071. *
  116072. * @generic {Phaser.Geom.Line} O - [line,$return]
  116073. *
  116074. * @param {Phaser.Geom.Line} line - The line to rotate.
  116075. * @param {number} angle - The angle of rotation in radians.
  116076. *
  116077. * @return {Phaser.Geom.Line} The rotated line.
  116078. */
  116079. var Rotate = function (line, angle)
  116080. {
  116081. var x = (line.x1 + line.x2) / 2;
  116082. var y = (line.y1 + line.y2) / 2;
  116083. return RotateAroundXY(line, x, y, angle);
  116084. };
  116085. module.exports = Rotate;
  116086. /***/ }),
  116087. /* 825 */
  116088. /***/ (function(module, exports, __webpack_require__) {
  116089. /**
  116090. * @author Richard Davey <rich@photonstorm.com>
  116091. * @copyright 2018 Photon Storm Ltd.
  116092. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116093. */
  116094. var Angle = __webpack_require__(82);
  116095. var NormalAngle = __webpack_require__(398);
  116096. /**
  116097. * Calculate the reflected angle between two lines.
  116098. *
  116099. * This is the outgoing angle based on the angle of Line 1 and the normalAngle of Line 2.
  116100. *
  116101. * @function Phaser.Geom.Line.ReflectAngle
  116102. * @since 3.0.0
  116103. *
  116104. * @param {Phaser.Geom.Line} lineA - The first line.
  116105. * @param {Phaser.Geom.Line} lineB - The second line.
  116106. *
  116107. * @return {number} The reflected angle between each line.
  116108. */
  116109. var ReflectAngle = function (lineA, lineB)
  116110. {
  116111. return (2 * NormalAngle(lineB) - Math.PI - Angle(lineA));
  116112. };
  116113. module.exports = ReflectAngle;
  116114. /***/ }),
  116115. /* 826 */
  116116. /***/ (function(module, exports) {
  116117. /**
  116118. * @author Richard Davey <rich@photonstorm.com>
  116119. * @copyright 2018 Photon Storm Ltd.
  116120. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116121. */
  116122. /**
  116123. * Calculate the perpendicular slope of the given line.
  116124. *
  116125. * @function Phaser.Geom.Line.PerpSlope
  116126. * @since 3.0.0
  116127. *
  116128. * @param {Phaser.Geom.Line} line - The line to calculate the perpendicular slope of.
  116129. *
  116130. * @return {number} The perpendicular slope of the line.
  116131. */
  116132. var PerpSlope = function (line)
  116133. {
  116134. return -((line.x2 - line.x1) / (line.y2 - line.y1));
  116135. };
  116136. module.exports = PerpSlope;
  116137. /***/ }),
  116138. /* 827 */
  116139. /***/ (function(module, exports) {
  116140. /**
  116141. * @author Richard Davey <rich@photonstorm.com>
  116142. * @copyright 2018 Photon Storm Ltd.
  116143. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116144. */
  116145. /**
  116146. * Offset a line by the given amount.
  116147. *
  116148. * @function Phaser.Geom.Line.Offset
  116149. * @since 3.0.0
  116150. *
  116151. * @generic {Phaser.Geom.Line} O - [line,$return]
  116152. *
  116153. * @param {Phaser.Geom.Line} line - The line to offset.
  116154. * @param {number} x - The horizontal offset to add to the line.
  116155. * @param {number} y - The vertical offset to add to the line.
  116156. *
  116157. * @return {Phaser.Geom.Line} The offset line.
  116158. */
  116159. var Offset = function (line, x, y)
  116160. {
  116161. line.x1 += x;
  116162. line.y1 += y;
  116163. line.x2 += x;
  116164. line.y2 += y;
  116165. return line;
  116166. };
  116167. module.exports = Offset;
  116168. /***/ }),
  116169. /* 828 */
  116170. /***/ (function(module, exports, __webpack_require__) {
  116171. /**
  116172. * @author Richard Davey <rich@photonstorm.com>
  116173. * @copyright 2018 Photon Storm Ltd.
  116174. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116175. */
  116176. var MATH_CONST = __webpack_require__(15);
  116177. var Angle = __webpack_require__(82);
  116178. /**
  116179. * [description]
  116180. *
  116181. * @function Phaser.Geom.Line.NormalY
  116182. * @since 3.0.0
  116183. *
  116184. * @param {Phaser.Geom.Line} line - [description]
  116185. *
  116186. * @return {number} [description]
  116187. */
  116188. var NormalY = function (line)
  116189. {
  116190. return Math.sin(Angle(line) - MATH_CONST.TAU);
  116191. };
  116192. module.exports = NormalY;
  116193. /***/ }),
  116194. /* 829 */
  116195. /***/ (function(module, exports, __webpack_require__) {
  116196. /**
  116197. * @author Richard Davey <rich@photonstorm.com>
  116198. * @copyright 2018 Photon Storm Ltd.
  116199. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116200. */
  116201. var MATH_CONST = __webpack_require__(15);
  116202. var Angle = __webpack_require__(82);
  116203. /**
  116204. * [description]
  116205. *
  116206. * @function Phaser.Geom.Line.NormalX
  116207. * @since 3.0.0
  116208. *
  116209. * @param {Phaser.Geom.Line} line - [description]
  116210. *
  116211. * @return {number} [description]
  116212. */
  116213. var NormalX = function (line)
  116214. {
  116215. return Math.cos(Angle(line) - MATH_CONST.TAU);
  116216. };
  116217. module.exports = NormalX;
  116218. /***/ }),
  116219. /* 830 */
  116220. /***/ (function(module, exports) {
  116221. /**
  116222. * @author Richard Davey <rich@photonstorm.com>
  116223. * @copyright 2018 Photon Storm Ltd.
  116224. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116225. */
  116226. /**
  116227. * Calculate the height of the given line.
  116228. *
  116229. * @function Phaser.Geom.Line.Height
  116230. * @since 3.0.0
  116231. *
  116232. * @param {Phaser.Geom.Line} line - The line to calculate the height of.
  116233. *
  116234. * @return {number} The height of the line.
  116235. */
  116236. var Height = function (line)
  116237. {
  116238. return Math.abs(line.y1 - line.y2);
  116239. };
  116240. module.exports = Height;
  116241. /***/ }),
  116242. /* 831 */
  116243. /***/ (function(module, exports, __webpack_require__) {
  116244. /**
  116245. * @author Richard Davey <rich@photonstorm.com>
  116246. * @copyright 2018 Photon Storm Ltd.
  116247. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116248. */
  116249. var MATH_CONST = __webpack_require__(15);
  116250. var Angle = __webpack_require__(82);
  116251. var Point = __webpack_require__(5);
  116252. /**
  116253. * Calculate the normal of the given line.
  116254. *
  116255. * The normal of a line is a vector that points perpendicular from it.
  116256. *
  116257. * @function Phaser.Geom.Line.GetNormal
  116258. * @since 3.0.0
  116259. *
  116260. * @generic {Phaser.Geom.Point} O - [out,$return]
  116261. *
  116262. * @param {Phaser.Geom.Line} line - The line to calculate the normal of.
  116263. * @param {(Phaser.Geom.Point|object)} [out] - An optional point object to store the normal in.
  116264. *
  116265. * @return {(Phaser.Geom.Point|object)} The normal of the Line.
  116266. */
  116267. var GetNormal = function (line, out)
  116268. {
  116269. if (out === undefined) { out = new Point(); }
  116270. var a = Angle(line) - MATH_CONST.TAU;
  116271. out.x = Math.cos(a);
  116272. out.y = Math.sin(a);
  116273. return out;
  116274. };
  116275. module.exports = GetNormal;
  116276. /***/ }),
  116277. /* 832 */
  116278. /***/ (function(module, exports, __webpack_require__) {
  116279. /**
  116280. * @author Richard Davey <rich@photonstorm.com>
  116281. * @copyright 2018 Photon Storm Ltd.
  116282. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116283. */
  116284. var Point = __webpack_require__(5);
  116285. /**
  116286. * Get the midpoint of the given line.
  116287. *
  116288. * @function Phaser.Geom.Line.GetMidPoint
  116289. * @since 3.0.0
  116290. *
  116291. * @generic {Phaser.Geom.Point} O - [out,$return]
  116292. *
  116293. * @param {Phaser.Geom.Line} line - The line to get the midpoint of.
  116294. * @param {(Phaser.Geom.Point|object)} [out] - An optional point object to store the midpoint in.
  116295. *
  116296. * @return {(Phaser.Geom.Point|object)} The midpoint of the Line.
  116297. */
  116298. var GetMidPoint = function (line, out)
  116299. {
  116300. if (out === undefined) { out = new Point(); }
  116301. out.x = (line.x1 + line.x2) / 2;
  116302. out.y = (line.y1 + line.y2) / 2;
  116303. return out;
  116304. };
  116305. module.exports = GetMidPoint;
  116306. /***/ }),
  116307. /* 833 */
  116308. /***/ (function(module, exports) {
  116309. /**
  116310. * @author Richard Davey <rich@photonstorm.com>
  116311. * @copyright 2018 Photon Storm Ltd.
  116312. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116313. */
  116314. /**
  116315. * Compare two lines for strict equality.
  116316. *
  116317. * @function Phaser.Geom.Line.Equals
  116318. * @since 3.0.0
  116319. *
  116320. * @param {Phaser.Geom.Line} line - The first line to compare.
  116321. * @param {Phaser.Geom.Line} toCompare - The second line to compare.
  116322. *
  116323. * @return {boolean} Whether the two lines are equal.
  116324. */
  116325. var Equals = function (line, toCompare)
  116326. {
  116327. return (
  116328. line.x1 === toCompare.x1 &&
  116329. line.y1 === toCompare.y1 &&
  116330. line.x2 === toCompare.x2 &&
  116331. line.y2 === toCompare.y2
  116332. );
  116333. };
  116334. module.exports = Equals;
  116335. /***/ }),
  116336. /* 834 */
  116337. /***/ (function(module, exports) {
  116338. /**
  116339. * @author Richard Davey <rich@photonstorm.com>
  116340. * @copyright 2018 Photon Storm Ltd.
  116341. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116342. */
  116343. /**
  116344. * Copy the values of one line to a destination line.
  116345. *
  116346. * @function Phaser.Geom.Line.CopyFrom
  116347. * @since 3.0.0
  116348. *
  116349. * @generic {Phaser.Geom.Line} O - [dest,$return]
  116350. *
  116351. * @param {Phaser.Geom.Line} source - The source line to copy the values from.
  116352. * @param {Phaser.Geom.Line} dest - The destination line to copy the values to.
  116353. *
  116354. * @return {Phaser.Geom.Line} The destination line.
  116355. */
  116356. var CopyFrom = function (source, dest)
  116357. {
  116358. return dest.setTo(source.x1, source.y1, source.x2, source.y2);
  116359. };
  116360. module.exports = CopyFrom;
  116361. /***/ }),
  116362. /* 835 */
  116363. /***/ (function(module, exports, __webpack_require__) {
  116364. /**
  116365. * @author Richard Davey <rich@photonstorm.com>
  116366. * @copyright 2018 Photon Storm Ltd.
  116367. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116368. */
  116369. var Line = __webpack_require__(96);
  116370. /**
  116371. * Clone the given line.
  116372. *
  116373. * @function Phaser.Geom.Line.Clone
  116374. * @since 3.0.0
  116375. *
  116376. * @param {Phaser.Geom.Line} source - The source line to clone.
  116377. *
  116378. * @return {Phaser.Geom.Line} The cloned line.
  116379. */
  116380. var Clone = function (source)
  116381. {
  116382. return new Line(source.x1, source.y1, source.x2, source.y2);
  116383. };
  116384. module.exports = Clone;
  116385. /***/ }),
  116386. /* 836 */
  116387. /***/ (function(module, exports) {
  116388. /**
  116389. * @author Richard Davey <rich@photonstorm.com>
  116390. * @copyright 2018 Photon Storm Ltd.
  116391. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116392. */
  116393. /**
  116394. * Center a line on the given coordinates.
  116395. *
  116396. * @function Phaser.Geom.Line.CenterOn
  116397. * @since 3.0.0
  116398. *
  116399. * @param {Phaser.Geom.Line} line - The line to center.
  116400. * @param {number} x - The horizontal coordinate to center the line on.
  116401. * @param {number} y - The vertical coordinate to center the line on.
  116402. *
  116403. * @return {Phaser.Geom.Line} The centered line.
  116404. */
  116405. var CenterOn = function (line, x, y)
  116406. {
  116407. var tx = x - ((line.x1 + line.x2) / 2);
  116408. var ty = y - ((line.y1 + line.y2) / 2);
  116409. line.x1 += tx;
  116410. line.y1 += ty;
  116411. line.x2 += tx;
  116412. line.y2 += ty;
  116413. return line;
  116414. };
  116415. module.exports = CenterOn;
  116416. /***/ }),
  116417. /* 837 */
  116418. /***/ (function(module, exports, __webpack_require__) {
  116419. /**
  116420. * @author Richard Davey <rich@photonstorm.com>
  116421. * @copyright 2018 Photon Storm Ltd.
  116422. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116423. */
  116424. var Line = __webpack_require__(96);
  116425. Line.Angle = __webpack_require__(82);
  116426. Line.BresenhamPoints = __webpack_require__(573);
  116427. Line.CenterOn = __webpack_require__(836);
  116428. Line.Clone = __webpack_require__(835);
  116429. Line.CopyFrom = __webpack_require__(834);
  116430. Line.Equals = __webpack_require__(833);
  116431. Line.GetMidPoint = __webpack_require__(832);
  116432. Line.GetNormal = __webpack_require__(831);
  116433. Line.GetPoint = __webpack_require__(298);
  116434. Line.GetPoints = __webpack_require__(161);
  116435. Line.Height = __webpack_require__(830);
  116436. Line.Length = __webpack_require__(70);
  116437. Line.NormalAngle = __webpack_require__(398);
  116438. Line.NormalX = __webpack_require__(829);
  116439. Line.NormalY = __webpack_require__(828);
  116440. Line.Offset = __webpack_require__(827);
  116441. Line.PerpSlope = __webpack_require__(826);
  116442. Line.Random = __webpack_require__(160);
  116443. Line.ReflectAngle = __webpack_require__(825);
  116444. Line.Rotate = __webpack_require__(824);
  116445. Line.RotateAroundPoint = __webpack_require__(823);
  116446. Line.RotateAroundXY = __webpack_require__(235);
  116447. Line.SetToAngle = __webpack_require__(822);
  116448. Line.Slope = __webpack_require__(821);
  116449. Line.Width = __webpack_require__(820);
  116450. module.exports = Line;
  116451. /***/ }),
  116452. /* 838 */
  116453. /***/ (function(module, exports, __webpack_require__) {
  116454. /**
  116455. * @author Richard Davey <rich@photonstorm.com>
  116456. * @copyright 2018 Photon Storm Ltd.
  116457. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116458. */
  116459. var ContainsArray = __webpack_require__(236);
  116460. var Decompose = __webpack_require__(399);
  116461. var LineToLine = __webpack_require__(146);
  116462. /**
  116463. * [description]
  116464. *
  116465. * @function Phaser.Geom.Intersects.TriangleToTriangle
  116466. * @since 3.0.0
  116467. *
  116468. * @param {Phaser.Geom.Triangle} triangleA - [description]
  116469. * @param {Phaser.Geom.Triangle} triangleB - [description]
  116470. *
  116471. * @return {boolean} [description]
  116472. */
  116473. var TriangleToTriangle = function (triangleA, triangleB)
  116474. {
  116475. // First the cheapest ones:
  116476. if (
  116477. triangleA.left > triangleB.right ||
  116478. triangleA.right < triangleB.left ||
  116479. triangleA.top > triangleB.bottom ||
  116480. triangleA.bottom < triangleB.top)
  116481. {
  116482. return false;
  116483. }
  116484. var lineAA = triangleA.getLineA();
  116485. var lineAB = triangleA.getLineB();
  116486. var lineAC = triangleA.getLineC();
  116487. var lineBA = triangleB.getLineA();
  116488. var lineBB = triangleB.getLineB();
  116489. var lineBC = triangleB.getLineC();
  116490. // Now check the lines against each line of TriangleB
  116491. if (LineToLine(lineAA, lineBA) || LineToLine(lineAA, lineBB) || LineToLine(lineAA, lineBC))
  116492. {
  116493. return true;
  116494. }
  116495. if (LineToLine(lineAB, lineBA) || LineToLine(lineAB, lineBB) || LineToLine(lineAB, lineBC))
  116496. {
  116497. return true;
  116498. }
  116499. if (LineToLine(lineAC, lineBA) || LineToLine(lineAC, lineBB) || LineToLine(lineAC, lineBC))
  116500. {
  116501. return true;
  116502. }
  116503. // Nope, so check to see if any of the points of triangleA are within triangleB
  116504. var points = Decompose(triangleA);
  116505. var within = ContainsArray(triangleB, points, true);
  116506. if (within.length > 0)
  116507. {
  116508. return true;
  116509. }
  116510. // Finally check to see if any of the points of triangleB are within triangleA
  116511. points = Decompose(triangleB);
  116512. within = ContainsArray(triangleA, points, true);
  116513. if (within.length > 0)
  116514. {
  116515. return true;
  116516. }
  116517. return false;
  116518. };
  116519. module.exports = TriangleToTriangle;
  116520. /***/ }),
  116521. /* 839 */
  116522. /***/ (function(module, exports, __webpack_require__) {
  116523. /**
  116524. * @author Richard Davey <rich@photonstorm.com>
  116525. * @copyright 2018 Photon Storm Ltd.
  116526. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116527. */
  116528. var Contains = __webpack_require__(60);
  116529. var LineToLine = __webpack_require__(146);
  116530. /**
  116531. * [description]
  116532. *
  116533. * @function Phaser.Geom.Intersects.TriangleToLine
  116534. * @since 3.0.0
  116535. *
  116536. * @param {Phaser.Geom.Triangle} triangle - [description]
  116537. * @param {Phaser.Geom.Line} line - [description]
  116538. *
  116539. * @return {boolean} [description]
  116540. */
  116541. var TriangleToLine = function (triangle, line)
  116542. {
  116543. // If the Triangle contains either the start or end point of the line, it intersects
  116544. if (Contains(triangle, line.getPointA()) || Contains(triangle, line.getPointB()))
  116545. {
  116546. return true;
  116547. }
  116548. // Now check the line against each line of the Triangle
  116549. if (LineToLine(triangle.getLineA(), line))
  116550. {
  116551. return true;
  116552. }
  116553. if (LineToLine(triangle.getLineB(), line))
  116554. {
  116555. return true;
  116556. }
  116557. if (LineToLine(triangle.getLineC(), line))
  116558. {
  116559. return true;
  116560. }
  116561. return false;
  116562. };
  116563. module.exports = TriangleToLine;
  116564. /***/ }),
  116565. /* 840 */
  116566. /***/ (function(module, exports, __webpack_require__) {
  116567. /**
  116568. * @author Richard Davey <rich@photonstorm.com>
  116569. * @copyright 2018 Photon Storm Ltd.
  116570. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116571. */
  116572. var LineToCircle = __webpack_require__(402);
  116573. var Contains = __webpack_require__(60);
  116574. /**
  116575. * [description]
  116576. *
  116577. * @function Phaser.Geom.Intersects.TriangleToCircle
  116578. * @since 3.0.0
  116579. *
  116580. * @param {Phaser.Geom.Triangle} triangle - [description]
  116581. * @param {Phaser.Geom.Circle} circle - [description]
  116582. *
  116583. * @return {boolean} [description]
  116584. */
  116585. var TriangleToCircle = function (triangle, circle)
  116586. {
  116587. // First the cheapest ones:
  116588. if (
  116589. triangle.left > circle.right ||
  116590. triangle.right < circle.left ||
  116591. triangle.top > circle.bottom ||
  116592. triangle.bottom < circle.top)
  116593. {
  116594. return false;
  116595. }
  116596. if (Contains(triangle, circle.x, circle.y))
  116597. {
  116598. return true;
  116599. }
  116600. if (LineToCircle(triangle.getLineA(), circle))
  116601. {
  116602. return true;
  116603. }
  116604. if (LineToCircle(triangle.getLineB(), circle))
  116605. {
  116606. return true;
  116607. }
  116608. if (LineToCircle(triangle.getLineC(), circle))
  116609. {
  116610. return true;
  116611. }
  116612. return false;
  116613. };
  116614. module.exports = TriangleToCircle;
  116615. /***/ }),
  116616. /* 841 */
  116617. /***/ (function(module, exports) {
  116618. /**
  116619. * @author Richard Davey <rich@photonstorm.com>
  116620. * @copyright 2018 Photon Storm Ltd.
  116621. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116622. */
  116623. /**
  116624. * [description]
  116625. *
  116626. * @function Phaser.Geom.Intersects.RectangleToValues
  116627. * @since 3.0.0
  116628. *
  116629. * @param {Phaser.Geom.Rectangle} rect - [description]
  116630. * @param {number} left - [description]
  116631. * @param {number} right - [description]
  116632. * @param {number} top - [description]
  116633. * @param {number} bottom - [description]
  116634. * @param {number} [tolerance=0] - [description]
  116635. *
  116636. * @return {boolean} [description]
  116637. */
  116638. var RectangleToValues = function (rect, left, right, top, bottom, tolerance)
  116639. {
  116640. if (tolerance === undefined) { tolerance = 0; }
  116641. return !(
  116642. left > rect.right + tolerance ||
  116643. right < rect.left - tolerance ||
  116644. top > rect.bottom + tolerance ||
  116645. bottom < rect.top - tolerance
  116646. );
  116647. };
  116648. module.exports = RectangleToValues;
  116649. /***/ }),
  116650. /* 842 */
  116651. /***/ (function(module, exports, __webpack_require__) {
  116652. /**
  116653. * @author Richard Davey <rich@photonstorm.com>
  116654. * @copyright 2018 Photon Storm Ltd.
  116655. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116656. */
  116657. var LineToLine = __webpack_require__(146);
  116658. var Contains = __webpack_require__(31);
  116659. var ContainsArray = __webpack_require__(236);
  116660. var Decompose = __webpack_require__(400);
  116661. /**
  116662. * [description]
  116663. *
  116664. * @function Phaser.Geom.Intersects.RectangleToTriangle
  116665. * @since 3.0.0
  116666. *
  116667. * @param {Phaser.Geom.Rectangle} rect - [description]
  116668. * @param {Phaser.Geom.Triangle} triangle - [description]
  116669. *
  116670. * @return {boolean} [description]
  116671. */
  116672. var RectangleToTriangle = function (rect, triangle)
  116673. {
  116674. // First the cheapest ones:
  116675. if (
  116676. triangle.left > rect.right ||
  116677. triangle.right < rect.left ||
  116678. triangle.top > rect.bottom ||
  116679. triangle.bottom < rect.top)
  116680. {
  116681. return false;
  116682. }
  116683. var triA = triangle.getLineA();
  116684. var triB = triangle.getLineB();
  116685. var triC = triangle.getLineC();
  116686. // Are any of the triangle points within the rectangle?
  116687. if (Contains(rect, triA.x1, triA.y1) || Contains(rect, triA.x2, triA.y2))
  116688. {
  116689. return true;
  116690. }
  116691. if (Contains(rect, triB.x1, triB.y1) || Contains(rect, triB.x2, triB.y2))
  116692. {
  116693. return true;
  116694. }
  116695. if (Contains(rect, triC.x1, triC.y1) || Contains(rect, triC.x2, triC.y2))
  116696. {
  116697. return true;
  116698. }
  116699. // Cheap tests over, now to see if any of the lines intersect ...
  116700. var rectA = rect.getLineA();
  116701. var rectB = rect.getLineB();
  116702. var rectC = rect.getLineC();
  116703. var rectD = rect.getLineD();
  116704. if (LineToLine(triA, rectA) || LineToLine(triA, rectB) || LineToLine(triA, rectC) || LineToLine(triA, rectD))
  116705. {
  116706. return true;
  116707. }
  116708. if (LineToLine(triB, rectA) || LineToLine(triB, rectB) || LineToLine(triB, rectC) || LineToLine(triB, rectD))
  116709. {
  116710. return true;
  116711. }
  116712. if (LineToLine(triC, rectA) || LineToLine(triC, rectB) || LineToLine(triC, rectC) || LineToLine(triC, rectD))
  116713. {
  116714. return true;
  116715. }
  116716. // None of the lines intersect, so are any rectangle points within the triangle?
  116717. var points = Decompose(rect);
  116718. var within = ContainsArray(triangle, points, true);
  116719. return (within.length > 0);
  116720. };
  116721. module.exports = RectangleToTriangle;
  116722. /***/ }),
  116723. /* 843 */
  116724. /***/ (function(module, exports, __webpack_require__) {
  116725. /**
  116726. * @author Richard Davey <rich@photonstorm.com>
  116727. * @copyright 2018 Photon Storm Ltd.
  116728. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116729. */
  116730. var PointToLine = __webpack_require__(401);
  116731. /**
  116732. * [description]
  116733. *
  116734. * @function Phaser.Geom.Intersects.PointToLineSegment
  116735. * @since 3.0.0
  116736. *
  116737. * @param {Phaser.Geom.Point} point - [description]
  116738. * @param {Phaser.Geom.Line} line - [description]
  116739. *
  116740. * @return {boolean} [description]
  116741. */
  116742. var PointToLineSegment = function (point, line)
  116743. {
  116744. if (!PointToLine(point, line))
  116745. {
  116746. return false;
  116747. }
  116748. var xMin = Math.min(line.x1, line.x2);
  116749. var xMax = Math.max(line.x1, line.x2);
  116750. var yMin = Math.min(line.y1, line.y2);
  116751. var yMax = Math.max(line.y1, line.y2);
  116752. return ((point.x >= xMin && point.x <= xMax) && (point.y >= yMin && point.y <= yMax));
  116753. };
  116754. module.exports = PointToLineSegment;
  116755. /***/ }),
  116756. /* 844 */
  116757. /***/ (function(module, exports) {
  116758. /**
  116759. * @author Richard Davey <rich@photonstorm.com>
  116760. * @copyright 2018 Photon Storm Ltd.
  116761. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116762. */
  116763. /**
  116764. * Checks for intersection between the Line and a Rectangle shape, or a rectangle-like
  116765. * object, with public `x`, `y`, `right` and `bottom` properties, such as a Sprite or Body.
  116766. *
  116767. * An intersection is considered valid if:
  116768. *
  116769. * The line starts within, or ends within, the Rectangle.
  116770. * The line segment intersects one of the 4 rectangle edges.
  116771. *
  116772. * The for the purposes of this function rectangles are considered 'solid'.
  116773. *
  116774. * @function Phaser.Geom.Intersects.LineToRectangle
  116775. * @since 3.0.0
  116776. *
  116777. * @param {Phaser.Geom.Line} line - [description]
  116778. * @param {(Phaser.Geom.Rectangle|object)} rect - [description]
  116779. *
  116780. * @return {boolean} [description]
  116781. */
  116782. var LineToRectangle = function (line, rect)
  116783. {
  116784. var x1 = line.x1;
  116785. var y1 = line.y1;
  116786. var x2 = line.x2;
  116787. var y2 = line.y2;
  116788. var bx1 = rect.x;
  116789. var by1 = rect.y;
  116790. var bx2 = rect.right;
  116791. var by2 = rect.bottom;
  116792. var t = 0;
  116793. // If the start or end of the line is inside the rect then we assume
  116794. // collision, as rects are solid for our use-case.
  116795. if ((x1 >= bx1 && x1 <= bx2 && y1 >= by1 && y1 <= by2) ||
  116796. (x2 >= bx1 && x2 <= bx2 && y2 >= by1 && y2 <= by2))
  116797. {
  116798. return true;
  116799. }
  116800. if (x1 < bx1 && x2 >= bx1)
  116801. {
  116802. // Left edge
  116803. t = y1 + (y2 - y1) * (bx1 - x1) / (x2 - x1);
  116804. if (t > by1 && t <= by2)
  116805. {
  116806. return true;
  116807. }
  116808. }
  116809. else if (x1 > bx2 && x2 <= bx2)
  116810. {
  116811. // Right edge
  116812. t = y1 + (y2 - y1) * (bx2 - x1) / (x2 - x1);
  116813. if (t >= by1 && t <= by2)
  116814. {
  116815. return true;
  116816. }
  116817. }
  116818. if (y1 < by1 && y2 >= by1)
  116819. {
  116820. // Top edge
  116821. t = x1 + (x2 - x1) * (by1 - y1) / (y2 - y1);
  116822. if (t >= bx1 && t <= bx2)
  116823. {
  116824. return true;
  116825. }
  116826. }
  116827. else if (y1 > by2 && y2 <= by2)
  116828. {
  116829. // Bottom edge
  116830. t = x1 + (x2 - x1) * (by2 - y1) / (y2 - y1);
  116831. if (t >= bx1 && t <= bx2)
  116832. {
  116833. return true;
  116834. }
  116835. }
  116836. return false;
  116837. };
  116838. module.exports = LineToRectangle;
  116839. /***/ }),
  116840. /* 845 */
  116841. /***/ (function(module, exports, __webpack_require__) {
  116842. /**
  116843. * @author Richard Davey <rich@photonstorm.com>
  116844. * @copyright 2018 Photon Storm Ltd.
  116845. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116846. */
  116847. var Rectangle = __webpack_require__(13);
  116848. var RectangleToRectangle = __webpack_require__(237);
  116849. /**
  116850. * [description]
  116851. *
  116852. * @function Phaser.Geom.Intersects.GetRectangleIntersection
  116853. * @since 3.0.0
  116854. *
  116855. * @generic {Phaser.Geom.Rectangle} O - [output,$return]
  116856. *
  116857. * @param {Phaser.Geom.Rectangle} rectA - [description]
  116858. * @param {Phaser.Geom.Rectangle} rectB - [description]
  116859. * @param {Phaser.Geom.Rectangle} [output] - [description]
  116860. *
  116861. * @return {Phaser.Geom.Rectangle} [description]
  116862. */
  116863. var GetRectangleIntersection = function (rectA, rectB, output)
  116864. {
  116865. if (output === undefined) { output = new Rectangle(); }
  116866. if (RectangleToRectangle(rectA, rectB))
  116867. {
  116868. output.x = Math.max(rectA.x, rectB.x);
  116869. output.y = Math.max(rectA.y, rectB.y);
  116870. output.width = Math.min(rectA.right, rectB.right) - output.x;
  116871. output.height = Math.min(rectA.bottom, rectB.bottom) - output.y;
  116872. }
  116873. return output;
  116874. };
  116875. module.exports = GetRectangleIntersection;
  116876. /***/ }),
  116877. /* 846 */
  116878. /***/ (function(module, exports) {
  116879. /**
  116880. * @author Richard Davey <rich@photonstorm.com>
  116881. * @copyright 2018 Photon Storm Ltd.
  116882. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116883. */
  116884. /**
  116885. * [description]
  116886. *
  116887. * @function Phaser.Geom.Intersects.CircleToRectangle
  116888. * @since 3.0.0
  116889. *
  116890. * @param {Phaser.Geom.Circle} circle - [description]
  116891. * @param {Phaser.Geom.Rectangle} rect - [description]
  116892. *
  116893. * @return {boolean} [description]
  116894. */
  116895. var CircleToRectangle = function (circle, rect)
  116896. {
  116897. var halfWidth = rect.width / 2;
  116898. var halfHeight = rect.height / 2;
  116899. var cx = Math.abs(circle.x - rect.x - halfWidth);
  116900. var cy = Math.abs(circle.y - rect.y - halfHeight);
  116901. var xDist = halfWidth + circle.radius;
  116902. var yDist = halfHeight + circle.radius;
  116903. if (cx > xDist || cy > yDist)
  116904. {
  116905. return false;
  116906. }
  116907. else if (cx <= halfWidth || cy <= halfHeight)
  116908. {
  116909. return true;
  116910. }
  116911. else
  116912. {
  116913. var xCornerDist = cx - halfWidth;
  116914. var yCornerDist = cy - halfHeight;
  116915. var xCornerDistSq = xCornerDist * xCornerDist;
  116916. var yCornerDistSq = yCornerDist * yCornerDist;
  116917. var maxCornerDistSq = circle.radius * circle.radius;
  116918. return (xCornerDistSq + yCornerDistSq <= maxCornerDistSq);
  116919. }
  116920. };
  116921. module.exports = CircleToRectangle;
  116922. /***/ }),
  116923. /* 847 */
  116924. /***/ (function(module, exports, __webpack_require__) {
  116925. /**
  116926. * @author Richard Davey <rich@photonstorm.com>
  116927. * @copyright 2018 Photon Storm Ltd.
  116928. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116929. */
  116930. var DistanceBetween = __webpack_require__(58);
  116931. /**
  116932. * [description]
  116933. *
  116934. * @function Phaser.Geom.Intersects.CircleToCircle
  116935. * @since 3.0.0
  116936. *
  116937. * @param {Phaser.Geom.Circle} circleA - [description]
  116938. * @param {Phaser.Geom.Circle} circleB - [description]
  116939. *
  116940. * @return {boolean} [description]
  116941. */
  116942. var CircleToCircle = function (circleA, circleB)
  116943. {
  116944. return (DistanceBetween(circleA.x, circleA.y, circleB.x, circleB.y) <= (circleA.radius + circleB.radius));
  116945. };
  116946. module.exports = CircleToCircle;
  116947. /***/ }),
  116948. /* 848 */
  116949. /***/ (function(module, exports) {
  116950. /**
  116951. * @author Richard Davey <rich@photonstorm.com>
  116952. * @copyright 2018 Photon Storm Ltd.
  116953. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116954. */
  116955. /**
  116956. * Offsets the Circle by the values given in the `x` and `y` properties of the Point object.
  116957. *
  116958. * @function Phaser.Geom.Circle.OffsetPoint
  116959. * @since 3.0.0
  116960. *
  116961. * @generic {Phaser.Geom.Circle} O - [circle,$return]
  116962. *
  116963. * @param {Phaser.Geom.Circle} circle - The Circle to be offset (translated.)
  116964. * @param {(Phaser.Geom.Point|object)} point - The Point object containing the values to offset the Circle by.
  116965. *
  116966. * @return {Phaser.Geom.Circle} The Circle that was offset.
  116967. */
  116968. var OffsetPoint = function (circle, point)
  116969. {
  116970. circle.x += point.x;
  116971. circle.y += point.y;
  116972. return circle;
  116973. };
  116974. module.exports = OffsetPoint;
  116975. /***/ }),
  116976. /* 849 */
  116977. /***/ (function(module, exports) {
  116978. /**
  116979. * @author Richard Davey <rich@photonstorm.com>
  116980. * @copyright 2018 Photon Storm Ltd.
  116981. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  116982. */
  116983. /**
  116984. * Offsets the Circle by the values given.
  116985. *
  116986. * @function Phaser.Geom.Circle.Offset
  116987. * @since 3.0.0
  116988. *
  116989. * @generic {Phaser.Geom.Circle} O - [circle,$return]
  116990. *
  116991. * @param {Phaser.Geom.Circle} circle - The Circle to be offset (translated.)
  116992. * @param {number} x - The amount to horizontally offset the Circle by.
  116993. * @param {number} y - The amount to vertically offset the Circle by.
  116994. *
  116995. * @return {Phaser.Geom.Circle} The Circle that was offset.
  116996. */
  116997. var Offset = function (circle, x, y)
  116998. {
  116999. circle.x += x;
  117000. circle.y += y;
  117001. return circle;
  117002. };
  117003. module.exports = Offset;
  117004. /***/ }),
  117005. /* 850 */
  117006. /***/ (function(module, exports, __webpack_require__) {
  117007. /**
  117008. * @author Richard Davey <rich@photonstorm.com>
  117009. * @copyright 2018 Photon Storm Ltd.
  117010. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117011. */
  117012. var Rectangle = __webpack_require__(13);
  117013. /**
  117014. * Returns the bounds of the Circle object.
  117015. *
  117016. * @function Phaser.Geom.Circle.GetBounds
  117017. * @since 3.0.0
  117018. *
  117019. * @generic {Phaser.Geom.Rectangle} O - [out,$return]
  117020. *
  117021. * @param {Phaser.Geom.Circle} circle - The Circle to get the bounds from.
  117022. * @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.
  117023. *
  117024. * @return {(Phaser.Geom.Rectangle|object)} The Rectangle object containing the Circles bounds.
  117025. */
  117026. var GetBounds = function (circle, out)
  117027. {
  117028. if (out === undefined) { out = new Rectangle(); }
  117029. out.x = circle.left;
  117030. out.y = circle.top;
  117031. out.width = circle.diameter;
  117032. out.height = circle.diameter;
  117033. return out;
  117034. };
  117035. module.exports = GetBounds;
  117036. /***/ }),
  117037. /* 851 */
  117038. /***/ (function(module, exports) {
  117039. /**
  117040. * @author Richard Davey <rich@photonstorm.com>
  117041. * @copyright 2018 Photon Storm Ltd.
  117042. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117043. */
  117044. /**
  117045. * Compares the `x`, `y` and `radius` properties of the two given Circles.
  117046. * Returns `true` if they all match, otherwise returns `false`.
  117047. *
  117048. * @function Phaser.Geom.Circle.Equals
  117049. * @since 3.0.0
  117050. *
  117051. * @param {Phaser.Geom.Circle} circle - The first Circle to compare.
  117052. * @param {Phaser.Geom.Circle} toCompare - The second Circle to compare.
  117053. *
  117054. * @return {boolean} `true` if the two Circles equal each other, otherwise `false`.
  117055. */
  117056. var Equals = function (circle, toCompare)
  117057. {
  117058. return (
  117059. circle.x === toCompare.x &&
  117060. circle.y === toCompare.y &&
  117061. circle.radius === toCompare.radius
  117062. );
  117063. };
  117064. module.exports = Equals;
  117065. /***/ }),
  117066. /* 852 */
  117067. /***/ (function(module, exports) {
  117068. /**
  117069. * @author Richard Davey <rich@photonstorm.com>
  117070. * @copyright 2018 Photon Storm Ltd.
  117071. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117072. */
  117073. /**
  117074. * Copies the `x`, `y` and `radius` properties from the `source` Circle
  117075. * into the given `dest` Circle, then returns the `dest` Circle.
  117076. *
  117077. * @function Phaser.Geom.Circle.CopyFrom
  117078. * @since 3.0.0
  117079. *
  117080. * @generic {Phaser.Geom.Circle} O - [dest,$return]
  117081. *
  117082. * @param {Phaser.Geom.Circle} source - The source Circle to copy the values from.
  117083. * @param {Phaser.Geom.Circle} dest - The destination Circle to copy the values to.
  117084. *
  117085. * @return {Phaser.Geom.Circle} The destination Circle.
  117086. */
  117087. var CopyFrom = function (source, dest)
  117088. {
  117089. return dest.setTo(source.x, source.y, source.radius);
  117090. };
  117091. module.exports = CopyFrom;
  117092. /***/ }),
  117093. /* 853 */
  117094. /***/ (function(module, exports, __webpack_require__) {
  117095. /**
  117096. * @author Richard Davey <rich@photonstorm.com>
  117097. * @copyright 2018 Photon Storm Ltd.
  117098. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117099. */
  117100. var Contains = __webpack_require__(33);
  117101. /**
  117102. * Check to see if the Circle contains all four points of the given Rectangle object.
  117103. *
  117104. * @function Phaser.Geom.Circle.ContainsRect
  117105. * @since 3.0.0
  117106. *
  117107. * @param {Phaser.Geom.Circle} circle - The Circle to check.
  117108. * @param {(Phaser.Geom.Rectangle|object)} rect - The Rectangle object to check if it's within the Circle or not.
  117109. *
  117110. * @return {boolean} True if all of the Rectangle coordinates are within the circle, otherwise false.
  117111. */
  117112. var ContainsRect = function (circle, rect)
  117113. {
  117114. return (
  117115. Contains(circle, rect.x, rect.y) &&
  117116. Contains(circle, rect.right, rect.y) &&
  117117. Contains(circle, rect.x, rect.bottom) &&
  117118. Contains(circle, rect.right, rect.bottom)
  117119. );
  117120. };
  117121. module.exports = ContainsRect;
  117122. /***/ }),
  117123. /* 854 */
  117124. /***/ (function(module, exports, __webpack_require__) {
  117125. /**
  117126. * @author Richard Davey <rich@photonstorm.com>
  117127. * @copyright 2018 Photon Storm Ltd.
  117128. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117129. */
  117130. var Contains = __webpack_require__(33);
  117131. /**
  117132. * Check to see if the Circle contains the given Point object.
  117133. *
  117134. * @function Phaser.Geom.Circle.ContainsPoint
  117135. * @since 3.0.0
  117136. *
  117137. * @param {Phaser.Geom.Circle} circle - The Circle to check.
  117138. * @param {(Phaser.Geom.Point|object)} point - The Point object to check if it's within the Circle or not.
  117139. *
  117140. * @return {boolean} True if the Point coordinates are within the circle, otherwise false.
  117141. */
  117142. var ContainsPoint = function (circle, point)
  117143. {
  117144. return Contains(circle, point.x, point.y);
  117145. };
  117146. module.exports = ContainsPoint;
  117147. /***/ }),
  117148. /* 855 */
  117149. /***/ (function(module, exports, __webpack_require__) {
  117150. /**
  117151. * @author Richard Davey <rich@photonstorm.com>
  117152. * @copyright 2018 Photon Storm Ltd.
  117153. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117154. */
  117155. var Circle = __webpack_require__(88);
  117156. /**
  117157. * Creates a new Circle instance based on the values contained in the given source.
  117158. *
  117159. * @function Phaser.Geom.Circle.Clone
  117160. * @since 3.0.0
  117161. *
  117162. * @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.
  117163. *
  117164. * @return {Phaser.Geom.Circle} A clone of the source Circle.
  117165. */
  117166. var Clone = function (source)
  117167. {
  117168. return new Circle(source.x, source.y, source.radius);
  117169. };
  117170. module.exports = Clone;
  117171. /***/ }),
  117172. /* 856 */
  117173. /***/ (function(module, exports) {
  117174. /**
  117175. * @author Richard Davey <rich@photonstorm.com>
  117176. * @copyright 2018 Photon Storm Ltd.
  117177. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117178. */
  117179. /**
  117180. * Calculates the area of the circle.
  117181. *
  117182. * @function Phaser.Geom.Circle.Area
  117183. * @since 3.0.0
  117184. *
  117185. * @param {Phaser.Geom.Circle} circle - The Circle to get the area of.
  117186. *
  117187. * @return {number} The area of the Circle.
  117188. */
  117189. var Area = function (circle)
  117190. {
  117191. return (circle.radius > 0) ? Math.PI * circle.radius * circle.radius : 0;
  117192. };
  117193. module.exports = Area;
  117194. /***/ }),
  117195. /* 857 */
  117196. /***/ (function(module, exports, __webpack_require__) {
  117197. /**
  117198. * @author Richard Davey <rich@photonstorm.com>
  117199. * @copyright 2018 Photon Storm Ltd.
  117200. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117201. */
  117202. var Circle = __webpack_require__(88);
  117203. Circle.Area = __webpack_require__(856);
  117204. Circle.Circumference = __webpack_require__(300);
  117205. Circle.CircumferencePoint = __webpack_require__(137);
  117206. Circle.Clone = __webpack_require__(855);
  117207. Circle.Contains = __webpack_require__(33);
  117208. Circle.ContainsPoint = __webpack_require__(854);
  117209. Circle.ContainsRect = __webpack_require__(853);
  117210. Circle.CopyFrom = __webpack_require__(852);
  117211. Circle.Equals = __webpack_require__(851);
  117212. Circle.GetBounds = __webpack_require__(850);
  117213. Circle.GetPoint = __webpack_require__(303);
  117214. Circle.GetPoints = __webpack_require__(301);
  117215. Circle.Offset = __webpack_require__(849);
  117216. Circle.OffsetPoint = __webpack_require__(848);
  117217. Circle.Random = __webpack_require__(162);
  117218. module.exports = Circle;
  117219. /***/ }),
  117220. /* 858 */
  117221. /***/ (function(module, exports, __webpack_require__) {
  117222. /**
  117223. * @author Richard Davey <rich@photonstorm.com>
  117224. * @copyright 2018 Photon Storm Ltd.
  117225. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117226. */
  117227. var Class = __webpack_require__(0);
  117228. var LightsManager = __webpack_require__(405);
  117229. var PluginCache = __webpack_require__(12);
  117230. /**
  117231. * @classdesc
  117232. * A Scene plugin that provides a {@link Phaser.GameObjects.LightsManager} for the Light2D pipeline.
  117233. *
  117234. * Available from within a Scene via `this.lights`.
  117235. *
  117236. * Add Lights using the {@link Phaser.GameObjects.LightsManager#addLight} method:
  117237. *
  117238. * ```javascript
  117239. * // Enable the Lights Manager because it is disabled by default
  117240. * this.lights.enable();
  117241. *
  117242. * // Create a Light at [400, 300] with a radius of 200
  117243. * this.lights.addLight(400, 300, 200);
  117244. * ```
  117245. *
  117246. * For Game Objects to be affected by the Lights when rendered, you will need to set them to use the `Light2D` pipeline like so:
  117247. *
  117248. * ```javascript
  117249. * sprite.setPipeline('Light2D');
  117250. * ```
  117251. *
  117252. * @class LightsPlugin
  117253. * @extends Phaser.GameObjects.LightsManager
  117254. * @memberOf Phaser.GameObjects
  117255. * @constructor
  117256. * @since 3.0.0
  117257. *
  117258. * @param {Phaser.Scene} scene - The Scene that this Lights Plugin belongs to.
  117259. */
  117260. var LightsPlugin = new Class({
  117261. Extends: LightsManager,
  117262. initialize:
  117263. function LightsPlugin (scene)
  117264. {
  117265. /**
  117266. * A reference to the Scene that this Lights Plugin belongs to.
  117267. *
  117268. * @name Phaser.GameObjects.LightsPlugin#scene
  117269. * @type {Phaser.Scene}
  117270. * @since 3.0.0
  117271. */
  117272. this.scene = scene;
  117273. /**
  117274. * A reference to the Scene's systems.
  117275. *
  117276. * @name Phaser.GameObjects.LightsPlugin#systems
  117277. * @type {Phaser.Scenes.Systems}
  117278. * @since 3.0.0
  117279. */
  117280. this.systems = scene.sys;
  117281. if (!scene.sys.settings.isBooted)
  117282. {
  117283. scene.sys.events.once('boot', this.boot, this);
  117284. }
  117285. LightsManager.call(this);
  117286. },
  117287. /**
  117288. * Boot the Lights Plugin.
  117289. *
  117290. * @method Phaser.GameObjects.LightsPlugin#boot
  117291. * @since 3.0.0
  117292. */
  117293. boot: function ()
  117294. {
  117295. var eventEmitter = this.systems.events;
  117296. eventEmitter.on('shutdown', this.shutdown, this);
  117297. eventEmitter.on('destroy', this.destroy, this);
  117298. },
  117299. /**
  117300. * Destroy the Lights Plugin.
  117301. *
  117302. * Cleans up all references.
  117303. *
  117304. * @method Phaser.GameObjects.LightsPlugin#destroy
  117305. * @since 3.0.0
  117306. */
  117307. destroy: function ()
  117308. {
  117309. this.shutdown();
  117310. this.scene = undefined;
  117311. this.systems = undefined;
  117312. }
  117313. });
  117314. PluginCache.register('LightsPlugin', LightsPlugin, 'lights');
  117315. module.exports = LightsPlugin;
  117316. /***/ }),
  117317. /* 859 */
  117318. /***/ (function(module, exports, __webpack_require__) {
  117319. /**
  117320. * @author Richard Davey <rich@photonstorm.com>
  117321. * @copyright 2018 Photon Storm Ltd.
  117322. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117323. */
  117324. var BuildGameObject = __webpack_require__(25);
  117325. var GameObjectCreator = __webpack_require__(14);
  117326. var GetAdvancedValue = __webpack_require__(10);
  117327. var Quad = __webpack_require__(238);
  117328. /**
  117329. * Creates a new Quad Game Object and returns it.
  117330. *
  117331. * Note: This method will only be available if the Quad Game Object and WebGL support have been built into Phaser.
  117332. *
  117333. * @method Phaser.GameObjects.GameObjectCreator#quad
  117334. * @since 3.0.0
  117335. *
  117336. * @param {object} config - The configuration object this Game Object will use to create itself.
  117337. * @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.
  117338. *
  117339. * @return {Phaser.GameObjects.Quad} The Game Object that was created.
  117340. */
  117341. GameObjectCreator.register('quad', function (config, addToScene)
  117342. {
  117343. if (config === undefined) { config = {}; }
  117344. var x = GetAdvancedValue(config, 'x', 0);
  117345. var y = GetAdvancedValue(config, 'y', 0);
  117346. var key = GetAdvancedValue(config, 'key', null);
  117347. var frame = GetAdvancedValue(config, 'frame', null);
  117348. var quad = new Quad(this.scene, x, y, key, frame);
  117349. if (addToScene !== undefined)
  117350. {
  117351. config.add = addToScene;
  117352. }
  117353. BuildGameObject(this.scene, quad, config);
  117354. return quad;
  117355. });
  117356. /***/ }),
  117357. /* 860 */
  117358. /***/ (function(module, exports, __webpack_require__) {
  117359. /**
  117360. * @author Richard Davey <rich@photonstorm.com>
  117361. * @copyright 2018 Photon Storm Ltd.
  117362. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117363. */
  117364. var BuildGameObject = __webpack_require__(25);
  117365. var GameObjectCreator = __webpack_require__(14);
  117366. var GetAdvancedValue = __webpack_require__(10);
  117367. var GetValue = __webpack_require__(4);
  117368. var Mesh = __webpack_require__(147);
  117369. /**
  117370. * Creates a new Mesh Game Object and returns it.
  117371. *
  117372. * Note: This method will only be available if the Mesh Game Object and WebGL support have been built into Phaser.
  117373. *
  117374. * @method Phaser.GameObjects.GameObjectCreator#mesh
  117375. * @since 3.0.0
  117376. *
  117377. * @param {object} config - The configuration object this Game Object will use to create itself.
  117378. * @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.
  117379. *
  117380. * @return {Phaser.GameObjects.Mesh} The Game Object that was created.
  117381. */
  117382. GameObjectCreator.register('mesh', function (config, addToScene)
  117383. {
  117384. if (config === undefined) { config = {}; }
  117385. var key = GetAdvancedValue(config, 'key', null);
  117386. var frame = GetAdvancedValue(config, 'frame', null);
  117387. var vertices = GetValue(config, 'vertices', []);
  117388. var colors = GetValue(config, 'colors', []);
  117389. var alphas = GetValue(config, 'alphas', []);
  117390. var uv = GetValue(config, 'uv', []);
  117391. var mesh = new Mesh(this.scene, 0, 0, vertices, uv, colors, alphas, key, frame);
  117392. if (addToScene !== undefined)
  117393. {
  117394. config.add = addToScene;
  117395. }
  117396. BuildGameObject(this.scene, mesh, config);
  117397. return mesh;
  117398. });
  117399. // When registering a factory function 'this' refers to the GameObjectCreator context.
  117400. /***/ }),
  117401. /* 861 */
  117402. /***/ (function(module, exports, __webpack_require__) {
  117403. /**
  117404. * @author Richard Davey <rich@photonstorm.com>
  117405. * @copyright 2018 Photon Storm Ltd.
  117406. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117407. */
  117408. var Quad = __webpack_require__(238);
  117409. var GameObjectFactory = __webpack_require__(11);
  117410. /**
  117411. * Creates a new Quad Game Object and adds it to the Scene.
  117412. *
  117413. * Note: This method will only be available if the Quad Game Object and WebGL support have been built into Phaser.
  117414. *
  117415. * @method Phaser.GameObjects.GameObjectFactory#quad
  117416. * @webglOnly
  117417. * @since 3.0.0
  117418. *
  117419. * @param {number} x - The horizontal position of this Game Object in the world.
  117420. * @param {number} y - The vertical position of this Game Object in the world.
  117421. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  117422. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  117423. *
  117424. * @return {Phaser.GameObjects.Quad} The Game Object that was created.
  117425. */
  117426. if (true)
  117427. {
  117428. GameObjectFactory.register('quad', function (x, y, key, frame)
  117429. {
  117430. return this.displayList.add(new Quad(this.scene, x, y, key, frame));
  117431. });
  117432. }
  117433. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117434. //
  117435. // There are several properties available to use:
  117436. //
  117437. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117438. // this.displayList - a reference to the Display List the Scene owns
  117439. // this.updateList - a reference to the Update List the Scene owns
  117440. /***/ }),
  117441. /* 862 */
  117442. /***/ (function(module, exports, __webpack_require__) {
  117443. /**
  117444. * @author Richard Davey <rich@photonstorm.com>
  117445. * @copyright 2018 Photon Storm Ltd.
  117446. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117447. */
  117448. var Mesh = __webpack_require__(147);
  117449. var GameObjectFactory = __webpack_require__(11);
  117450. /**
  117451. * Creates a new Mesh Game Object and adds it to the Scene.
  117452. *
  117453. * Note: This method will only be available if the Mesh Game Object and WebGL support have been built into Phaser.
  117454. *
  117455. * @method Phaser.GameObjects.GameObjectFactory#mesh
  117456. * @webglOnly
  117457. * @since 3.0.0
  117458. *
  117459. * @param {number} x - The horizontal position of this Game Object in the world.
  117460. * @param {number} y - The vertical position of this Game Object in the world.
  117461. * @param {number[]} vertices - An array containing the vertices data for this Mesh.
  117462. * @param {number[]} uv - An array containing the uv data for this Mesh.
  117463. * @param {number[]} colors - An array containing the color data for this Mesh.
  117464. * @param {number[]} alphas - An array containing the alpha data for this Mesh.
  117465. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  117466. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  117467. *
  117468. * @return {Phaser.GameObjects.Mesh} The Game Object that was created.
  117469. */
  117470. if (true)
  117471. {
  117472. GameObjectFactory.register('mesh', function (x, y, vertices, uv, colors, alphas, texture, frame)
  117473. {
  117474. return this.displayList.add(new Mesh(this.scene, x, y, vertices, uv, colors, alphas, texture, frame));
  117475. });
  117476. }
  117477. // When registering a factory function 'this' refers to the GameObjectFactory context.
  117478. //
  117479. // There are several properties available to use:
  117480. //
  117481. // this.scene - a reference to the Scene that owns the GameObjectFactory
  117482. // this.displayList - a reference to the Display List the Scene owns
  117483. // this.updateList - a reference to the Update List the Scene owns
  117484. /***/ }),
  117485. /* 863 */
  117486. /***/ (function(module, exports) {
  117487. /**
  117488. * @author Richard Davey <rich@photonstorm.com>
  117489. * @copyright 2018 Photon Storm Ltd.
  117490. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117491. */
  117492. /**
  117493. * This is a stub function for Mesh.Render. There is no Canvas renderer for Mesh objects.
  117494. *
  117495. * @method Phaser.GameObjects.Mesh#renderCanvas
  117496. * @since 3.0.0
  117497. * @private
  117498. *
  117499. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  117500. * @param {Phaser.GameObjects.Mesh} src - The Game Object being rendered in this call.
  117501. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  117502. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  117503. */
  117504. var MeshCanvasRenderer = function ()
  117505. {
  117506. };
  117507. module.exports = MeshCanvasRenderer;
  117508. /***/ }),
  117509. /* 864 */
  117510. /***/ (function(module, exports, __webpack_require__) {
  117511. /**
  117512. * @author Richard Davey <rich@photonstorm.com>
  117513. * @copyright 2018 Photon Storm Ltd.
  117514. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117515. */
  117516. var GameObject = __webpack_require__(2);
  117517. var Utils = __webpack_require__(21);
  117518. /**
  117519. * Renders this Game Object with the WebGL Renderer to the given Camera.
  117520. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  117521. * This method should not be called directly. It is a utility function of the Render module.
  117522. *
  117523. * @method Phaser.GameObjects.Mesh#renderWebGL
  117524. * @since 3.0.0
  117525. * @private
  117526. *
  117527. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  117528. * @param {Phaser.GameObjects.Mesh} src - The Game Object being rendered in this call.
  117529. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  117530. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  117531. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  117532. */
  117533. var MeshWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  117534. {
  117535. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  117536. {
  117537. return;
  117538. }
  117539. var pipeline = this.pipeline;
  117540. renderer.setPipeline(pipeline, src);
  117541. var camMatrix = pipeline._tempMatrix1;
  117542. var spriteMatrix = pipeline._tempMatrix2;
  117543. var calcMatrix = pipeline._tempMatrix3;
  117544. spriteMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  117545. camMatrix.copyFrom(camera.matrix);
  117546. if (parentMatrix)
  117547. {
  117548. // Multiply the camera by the parent matrix
  117549. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  117550. // Undo the camera scroll
  117551. spriteMatrix.e = src.x;
  117552. spriteMatrix.f = src.y;
  117553. // Multiply by the Sprite matrix, store result in calcMatrix
  117554. camMatrix.multiply(spriteMatrix, calcMatrix);
  117555. }
  117556. else
  117557. {
  117558. spriteMatrix.e -= camera.scrollX * src.scrollFactorX;
  117559. spriteMatrix.f -= camera.scrollY * src.scrollFactorY;
  117560. // Multiply by the Sprite matrix, store result in calcMatrix
  117561. camMatrix.multiply(spriteMatrix, calcMatrix);
  117562. }
  117563. var frame = src.frame;
  117564. var texture = frame.glTexture;
  117565. pipeline.setTexture2D(texture, 0);
  117566. var vertices = src.vertices;
  117567. var uvs = src.uv;
  117568. var colors = src.colors;
  117569. var alphas = src.alphas;
  117570. var meshVerticesLength = vertices.length;
  117571. var vertexCount = Math.floor(meshVerticesLength * 0.5);
  117572. if (pipeline.vertexCount + vertexCount >= pipeline.vertexCapacity)
  117573. {
  117574. pipeline.flush();
  117575. }
  117576. var vertexViewF32 = pipeline.vertexViewF32;
  117577. var vertexViewU32 = pipeline.vertexViewU32;
  117578. var vertexOffset = (pipeline.vertexCount * pipeline.vertexComponentCount) - 1;
  117579. var colorIndex = 0;
  117580. var tintEffect = src.tintFill;
  117581. for (var i = 0; i < meshVerticesLength; i += 2)
  117582. {
  117583. var x = vertices[i + 0];
  117584. var y = vertices[i + 1];
  117585. var tx = x * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  117586. var ty = x * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  117587. if (camera.roundPixels)
  117588. {
  117589. tx |= 0;
  117590. ty |= 0;
  117591. }
  117592. vertexViewF32[++vertexOffset] = tx;
  117593. vertexViewF32[++vertexOffset] = ty;
  117594. vertexViewF32[++vertexOffset] = uvs[i + 0];
  117595. vertexViewF32[++vertexOffset] = uvs[i + 1];
  117596. vertexViewF32[++vertexOffset] = tintEffect;
  117597. vertexViewU32[++vertexOffset] = Utils.getTintAppendFloatAlpha(colors[colorIndex], camera.alpha * alphas[colorIndex]);
  117598. colorIndex++;
  117599. }
  117600. pipeline.vertexCount += vertexCount;
  117601. };
  117602. module.exports = MeshWebGLRenderer;
  117603. /***/ }),
  117604. /* 865 */
  117605. /***/ (function(module, exports, __webpack_require__) {
  117606. /**
  117607. * @author Richard Davey <rich@photonstorm.com>
  117608. * @copyright 2018 Photon Storm Ltd.
  117609. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117610. */
  117611. var renderWebGL = __webpack_require__(3);
  117612. var renderCanvas = __webpack_require__(3);
  117613. if (true)
  117614. {
  117615. renderWebGL = __webpack_require__(864);
  117616. }
  117617. if (true)
  117618. {
  117619. renderCanvas = __webpack_require__(863);
  117620. }
  117621. module.exports = {
  117622. renderWebGL: renderWebGL,
  117623. renderCanvas: renderCanvas
  117624. };
  117625. /***/ }),
  117626. /* 866 */
  117627. /***/ (function(module, exports, __webpack_require__) {
  117628. /**
  117629. * @author Richard Davey <rich@photonstorm.com>
  117630. * @copyright 2018 Photon Storm Ltd.
  117631. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117632. */
  117633. var GameObjectCreator = __webpack_require__(14);
  117634. var GetAdvancedValue = __webpack_require__(10);
  117635. var Zone = __webpack_require__(163);
  117636. /**
  117637. * Creates a new Zone Game Object and returns it.
  117638. *
  117639. * Note: This method will only be available if the Zone Game Object has been built into Phaser.
  117640. *
  117641. * @method Phaser.GameObjects.GameObjectCreator#zone
  117642. * @since 3.0.0
  117643. *
  117644. * @param {object} config - The configuration object this Game Object will use to create itself.
  117645. *
  117646. * @return {Phaser.GameObjects.Zone} The Game Object that was created.
  117647. */
  117648. GameObjectCreator.register('zone', function (config)
  117649. {
  117650. var x = GetAdvancedValue(config, 'x', 0);
  117651. var y = GetAdvancedValue(config, 'y', 0);
  117652. var width = GetAdvancedValue(config, 'width', 1);
  117653. var height = GetAdvancedValue(config, 'height', width);
  117654. return new Zone(this.scene, x, y, width, height);
  117655. });
  117656. // When registering a factory function 'this' refers to the GameObjectCreator context.
  117657. /***/ }),
  117658. /* 867 */
  117659. /***/ (function(module, exports, __webpack_require__) {
  117660. /**
  117661. * @author Richard Davey <rich@photonstorm.com>
  117662. * @copyright 2018 Photon Storm Ltd.
  117663. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117664. */
  117665. var BuildGameObject = __webpack_require__(25);
  117666. var GameObjectCreator = __webpack_require__(14);
  117667. var GetAdvancedValue = __webpack_require__(10);
  117668. var TileSprite = __webpack_require__(239);
  117669. /**
  117670. * @typedef {object} TileSprite
  117671. * @extends GameObjectConfig
  117672. *
  117673. * @property {number} [x=0] - The x coordinate of the Tile Sprite.
  117674. * @property {number} [y=0] - The y coordinate of the Tile Sprite.
  117675. * @property {number} [width=512] - The width of the Tile Sprite.
  117676. * @property {number} [height=512] - The height of the Tile Sprite.
  117677. * @property {string} [key=''] - The key of the Texture this Tile Sprite will use to render with, as stored in the Texture Manager.
  117678. * @property {string} [frame=''] - An optional frame from the Texture this Tile Sprite is rendering with.
  117679. */
  117680. /**
  117681. * Creates a new TileSprite Game Object and returns it.
  117682. *
  117683. * Note: This method will only be available if the TileSprite Game Object has been built into Phaser.
  117684. *
  117685. * @method Phaser.GameObjects.GameObjectCreator#tileSprite
  117686. * @since 3.0.0
  117687. *
  117688. * @param {TileSprite} config - The configuration object this Game Object will use to create itself.
  117689. * @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.
  117690. *
  117691. * @return {Phaser.GameObjects.TileSprite} The Game Object that was created.
  117692. */
  117693. GameObjectCreator.register('tileSprite', function (config, addToScene)
  117694. {
  117695. if (config === undefined) { config = {}; }
  117696. var x = GetAdvancedValue(config, 'x', 0);
  117697. var y = GetAdvancedValue(config, 'y', 0);
  117698. var width = GetAdvancedValue(config, 'width', 512);
  117699. var height = GetAdvancedValue(config, 'height', 512);
  117700. var key = GetAdvancedValue(config, 'key', '');
  117701. var frame = GetAdvancedValue(config, 'frame', '');
  117702. var tile = new TileSprite(this.scene, x, y, width, height, key, frame);
  117703. if (addToScene !== undefined)
  117704. {
  117705. config.add = addToScene;
  117706. }
  117707. BuildGameObject(this.scene, tile, config);
  117708. return tile;
  117709. });
  117710. // When registering a factory function 'this' refers to the GameObjectCreator context.
  117711. /***/ }),
  117712. /* 868 */
  117713. /***/ (function(module, exports, __webpack_require__) {
  117714. /**
  117715. * @author Richard Davey <rich@photonstorm.com>
  117716. * @copyright 2018 Photon Storm Ltd.
  117717. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117718. */
  117719. var BitmapText = __webpack_require__(148);
  117720. var BuildGameObject = __webpack_require__(25);
  117721. var GameObjectCreator = __webpack_require__(14);
  117722. var GetAdvancedValue = __webpack_require__(10);
  117723. var GetValue = __webpack_require__(4);
  117724. /**
  117725. * Creates a new Bitmap Text Game Object and returns it.
  117726. *
  117727. * Note: This method will only be available if the Bitmap Text Game Object has been built into Phaser.
  117728. *
  117729. * @method Phaser.GameObjects.GameObjectCreator#bitmapText
  117730. * @since 3.0.0
  117731. *
  117732. * @param {BitmapTextConfig} config - The configuration object this Game Object will use to create itself.
  117733. * @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.
  117734. *
  117735. * @return {Phaser.GameObjects.BitmapText} The Game Object that was created.
  117736. */
  117737. GameObjectCreator.register('bitmapText', function (config, addToScene)
  117738. {
  117739. if (config === undefined) { config = {}; }
  117740. var font = GetValue(config, 'font', '');
  117741. var text = GetAdvancedValue(config, 'text', '');
  117742. var size = GetAdvancedValue(config, 'size', false);
  117743. var align = GetValue(config, 'align', 0);
  117744. var bitmapText = new BitmapText(this.scene, 0, 0, font, text, size, align);
  117745. if (addToScene !== undefined)
  117746. {
  117747. config.add = addToScene;
  117748. }
  117749. BuildGameObject(this.scene, bitmapText, config);
  117750. return bitmapText;
  117751. });
  117752. // When registering a factory function 'this' refers to the GameObjectCreator context.
  117753. /***/ }),
  117754. /* 869 */
  117755. /***/ (function(module, exports, __webpack_require__) {
  117756. /**
  117757. * @author Richard Davey <rich@photonstorm.com>
  117758. * @copyright 2018 Photon Storm Ltd.
  117759. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117760. */
  117761. var BuildGameObject = __webpack_require__(25);
  117762. var BuildGameObjectAnimation = __webpack_require__(128);
  117763. var GameObjectCreator = __webpack_require__(14);
  117764. var GetAdvancedValue = __webpack_require__(10);
  117765. var Sprite3D = __webpack_require__(154);
  117766. /**
  117767. * Creates a new Sprite3D Game Object and returns it.
  117768. *
  117769. * Note: This method will only be available if the Sprite3D Game Object has been built into Phaser.
  117770. *
  117771. * @method Phaser.GameObjects.GameObjectCreator#sprite3D
  117772. * @since 3.0.0
  117773. *
  117774. * @param {object} config - The configuration object this Game Object will use to create itself.
  117775. * @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.
  117776. *
  117777. * @return {Phaser.GameObjects.Sprite3D} The Game Object that was created.
  117778. */
  117779. GameObjectCreator.register('sprite3D', function (config, addToScene)
  117780. {
  117781. if (config === undefined) { config = {}; }
  117782. var key = GetAdvancedValue(config, 'key', null);
  117783. var frame = GetAdvancedValue(config, 'frame', null);
  117784. var sprite = new Sprite3D(this.scene, 0, 0, key, frame);
  117785. if (addToScene !== undefined)
  117786. {
  117787. config.add = addToScene;
  117788. }
  117789. BuildGameObject(this.scene, sprite, config);
  117790. // Sprite specific config options:
  117791. BuildGameObjectAnimation(sprite, config);
  117792. return sprite;
  117793. });
  117794. // When registering a factory function 'this' refers to the GameObjectCreator context.
  117795. /***/ }),
  117796. /* 870 */
  117797. /***/ (function(module, exports, __webpack_require__) {
  117798. /**
  117799. * @author Richard Davey <rich@photonstorm.com>
  117800. * @copyright 2018 Photon Storm Ltd.
  117801. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117802. */
  117803. var BuildGameObject = __webpack_require__(25);
  117804. var GameObjectCreator = __webpack_require__(14);
  117805. var GetAdvancedValue = __webpack_require__(10);
  117806. var RenderTexture = __webpack_require__(240);
  117807. /**
  117808. * @typedef {object} RenderTextureConfig
  117809. *
  117810. * @property {number} [x=0] - The x coordinate of the RenderTexture's position.
  117811. * @property {number} [y=0] - The y coordinate of the RenderTexture's position.
  117812. * @property {number} [width=32] - The width of the RenderTexture.
  117813. * @property {number} [height=32] - The height of the RenderTexture.
  117814. */
  117815. /**
  117816. * Creates a new Render Texture Game Object and returns it.
  117817. *
  117818. * Note: This method will only be available if the Render Texture Game Object has been built into Phaser.
  117819. *
  117820. * @method Phaser.GameObjects.GameObjectCreator#renderTexture
  117821. * @since 3.2.0
  117822. *
  117823. * @param {RenderTextureConfig} config - The configuration object this Game Object will use to create itself.
  117824. * @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.
  117825. *
  117826. * @return {Phaser.GameObjects.RenderTexture} The Game Object that was created.
  117827. */
  117828. GameObjectCreator.register('renderTexture', function (config, addToScene)
  117829. {
  117830. if (config === undefined) { config = {}; }
  117831. var x = GetAdvancedValue(config, 'x', 0);
  117832. var y = GetAdvancedValue(config, 'y', 0);
  117833. var width = GetAdvancedValue(config, 'width', 32);
  117834. var height = GetAdvancedValue(config, 'height', 32);
  117835. var renderTexture = new RenderTexture(this.scene, x, y, width, height);
  117836. if (addToScene !== undefined)
  117837. {
  117838. config.add = addToScene;
  117839. }
  117840. BuildGameObject(this.scene, renderTexture, config);
  117841. return renderTexture;
  117842. });
  117843. /***/ }),
  117844. /* 871 */
  117845. /***/ (function(module, exports, __webpack_require__) {
  117846. /**
  117847. * @author Richard Davey <rich@photonstorm.com>
  117848. * @copyright 2018 Photon Storm Ltd.
  117849. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117850. */
  117851. var GameObjectCreator = __webpack_require__(14);
  117852. var GetAdvancedValue = __webpack_require__(10);
  117853. var GetFastValue = __webpack_require__(1);
  117854. var ParticleEmitterManager = __webpack_require__(241);
  117855. /**
  117856. * Creates a new Particle Emitter Manager Game Object and returns it.
  117857. *
  117858. * Note: This method will only be available if the Particles Game Object has been built into Phaser.
  117859. *
  117860. * @method Phaser.GameObjects.GameObjectCreator#particles
  117861. * @since 3.0.0
  117862. *
  117863. * @param {object} config - The configuration object this Game Object will use to create itself.
  117864. * @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.
  117865. *
  117866. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} The Game Object that was created.
  117867. */
  117868. GameObjectCreator.register('particles', function (config, addToScene)
  117869. {
  117870. if (config === undefined) { config = {}; }
  117871. var key = GetAdvancedValue(config, 'key', null);
  117872. var frame = GetAdvancedValue(config, 'frame', null);
  117873. var emitters = GetFastValue(config, 'emitters', null);
  117874. // frame is optional and can contain the emitters array or object if skipped
  117875. var manager = new ParticleEmitterManager(this.scene, key, frame, emitters);
  117876. if (addToScene !== undefined)
  117877. {
  117878. config.add = addToScene;
  117879. }
  117880. var add = GetFastValue(config, 'add', false);
  117881. if (add)
  117882. {
  117883. this.displayList.add(manager);
  117884. }
  117885. this.updateList.add(manager);
  117886. return manager;
  117887. });
  117888. /***/ }),
  117889. /* 872 */
  117890. /***/ (function(module, exports, __webpack_require__) {
  117891. /**
  117892. * @author Richard Davey <rich@photonstorm.com>
  117893. * @copyright 2018 Photon Storm Ltd.
  117894. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117895. */
  117896. var GameObjectCreator = __webpack_require__(14);
  117897. var Group = __webpack_require__(112);
  117898. /**
  117899. * Creates a new Group Game Object and returns it.
  117900. *
  117901. * Note: This method will only be available if the Group Game Object has been built into Phaser.
  117902. *
  117903. * @method Phaser.GameObjects.GameObjectCreator#group
  117904. * @since 3.0.0
  117905. *
  117906. * @param {GroupConfig} config - The configuration object this Game Object will use to create itself.
  117907. *
  117908. * @return {Phaser.GameObjects.Group} The Game Object that was created.
  117909. */
  117910. GameObjectCreator.register('group', function (config)
  117911. {
  117912. return new Group(this.scene, null, config);
  117913. });
  117914. // When registering a factory function 'this' refers to the GameObjectCreator context.
  117915. /***/ }),
  117916. /* 873 */
  117917. /***/ (function(module, exports, __webpack_require__) {
  117918. /**
  117919. * @author Richard Davey <rich@photonstorm.com>
  117920. * @copyright 2018 Photon Storm Ltd.
  117921. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117922. */
  117923. var BitmapText = __webpack_require__(244);
  117924. var BuildGameObject = __webpack_require__(25);
  117925. var GameObjectCreator = __webpack_require__(14);
  117926. var GetAdvancedValue = __webpack_require__(10);
  117927. /**
  117928. * @typedef {object} BitmapTextConfig
  117929. * @extends GameObjectConfig
  117930. *
  117931. * @property {string} [font=''] - The key of the font to use from the BitmapFont cache.
  117932. * @property {string} [text=''] - The string, or array of strings, to be set as the content of this Bitmap Text.
  117933. * @property {(number|false)} [size=false] - The font size to set.
  117934. */
  117935. /**
  117936. * Creates a new Dynamic Bitmap Text Game Object and returns it.
  117937. *
  117938. * Note: This method will only be available if the Dynamic Bitmap Text Game Object has been built into Phaser.
  117939. *
  117940. * @method Phaser.GameObjects.GameObjectCreator#dynamicBitmapText
  117941. * @since 3.0.0
  117942. * @param {BitmapTextConfig} config - The configuration object this Game Object will use to create itself.
  117943. * @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.
  117944. *
  117945. * @return {Phaser.GameObjects.DynamicBitmapText} The Game Object that was created.
  117946. */
  117947. GameObjectCreator.register('dynamicBitmapText', function (config, addToScene)
  117948. {
  117949. if (config === undefined) { config = {}; }
  117950. var font = GetAdvancedValue(config, 'font', '');
  117951. var text = GetAdvancedValue(config, 'text', '');
  117952. var size = GetAdvancedValue(config, 'size', false);
  117953. var bitmapText = new BitmapText(this.scene, 0, 0, font, text, size);
  117954. if (addToScene !== undefined)
  117955. {
  117956. config.add = addToScene;
  117957. }
  117958. BuildGameObject(this.scene, bitmapText, config);
  117959. return bitmapText;
  117960. });
  117961. // When registering a factory function 'this' refers to the GameObjectCreator context.
  117962. /***/ }),
  117963. /* 874 */
  117964. /***/ (function(module, exports, __webpack_require__) {
  117965. /**
  117966. * @author Richard Davey <rich@photonstorm.com>
  117967. * @author Felipe Alfonso <@bitnenfer>
  117968. * @copyright 2018 Photon Storm Ltd.
  117969. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  117970. */
  117971. var BuildGameObject = __webpack_require__(25);
  117972. var Container = __webpack_require__(245);
  117973. var GameObjectCreator = __webpack_require__(14);
  117974. var GetAdvancedValue = __webpack_require__(10);
  117975. /**
  117976. * Creates a new Container Game Object and returns it.
  117977. *
  117978. * Note: This method will only be available if the Container Game Object has been built into Phaser.
  117979. *
  117980. * @method Phaser.GameObjects.GameObjectCreator#container
  117981. * @since 3.4.0
  117982. *
  117983. * @param {object} config - The configuration object this Game Object will use to create itself.
  117984. * @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.
  117985. *
  117986. * @return {Phaser.GameObjects.Container} The Game Object that was created.
  117987. */
  117988. GameObjectCreator.register('container', function (config, addToScene)
  117989. {
  117990. if (config === undefined) { config = {}; }
  117991. var x = GetAdvancedValue(config, 'x', 0);
  117992. var y = GetAdvancedValue(config, 'y', 0);
  117993. var container = new Container(this.scene, x, y);
  117994. if (addToScene !== undefined)
  117995. {
  117996. config.add = addToScene;
  117997. }
  117998. BuildGameObject(this.scene, container, config);
  117999. return container;
  118000. });
  118001. /***/ }),
  118002. /* 875 */
  118003. /***/ (function(module, exports, __webpack_require__) {
  118004. /**
  118005. * @author Richard Davey <rich@photonstorm.com>
  118006. * @copyright 2018 Photon Storm Ltd.
  118007. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118008. */
  118009. var Blitter = __webpack_require__(246);
  118010. var BuildGameObject = __webpack_require__(25);
  118011. var GameObjectCreator = __webpack_require__(14);
  118012. var GetAdvancedValue = __webpack_require__(10);
  118013. /**
  118014. * Creates a new Blitter Game Object and returns it.
  118015. *
  118016. * Note: This method will only be available if the Blitter Game Object has been built into Phaser.
  118017. *
  118018. * @method Phaser.GameObjects.GameObjectCreator#blitter
  118019. * @since 3.0.0
  118020. *
  118021. * @param {object} config - The configuration object this Game Object will use to create itself.
  118022. * @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.
  118023. *
  118024. * @return {Phaser.GameObjects.Blitter} The Game Object that was created.
  118025. */
  118026. GameObjectCreator.register('blitter', function (config, addToScene)
  118027. {
  118028. if (config === undefined) { config = {}; }
  118029. var key = GetAdvancedValue(config, 'key', null);
  118030. var frame = GetAdvancedValue(config, 'frame', null);
  118031. var blitter = new Blitter(this.scene, 0, 0, key, frame);
  118032. if (addToScene !== undefined)
  118033. {
  118034. config.add = addToScene;
  118035. }
  118036. BuildGameObject(this.scene, blitter, config);
  118037. return blitter;
  118038. });
  118039. // When registering a factory function 'this' refers to the GameObjectCreator context.
  118040. /***/ }),
  118041. /* 876 */
  118042. /***/ (function(module, exports, __webpack_require__) {
  118043. /**
  118044. * @author Richard Davey <rich@photonstorm.com>
  118045. * @copyright 2018 Photon Storm Ltd.
  118046. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118047. */
  118048. var Zone = __webpack_require__(163);
  118049. var GameObjectFactory = __webpack_require__(11);
  118050. /**
  118051. * Creates a new Zone Game Object and adds it to the Scene.
  118052. *
  118053. * Note: This method will only be available if the Zone Game Object has been built into Phaser.
  118054. *
  118055. * @method Phaser.GameObjects.GameObjectFactory#zone
  118056. * @since 3.0.0
  118057. *
  118058. * @param {number} x - The horizontal position of this Game Object in the world.
  118059. * @param {number} y - The vertical position of this Game Object in the world.
  118060. * @param {number} width - The width of the Game Object.
  118061. * @param {number} height - The height of the Game Object.
  118062. *
  118063. * @return {Phaser.GameObjects.Zone} The Game Object that was created.
  118064. */
  118065. GameObjectFactory.register('zone', function (x, y, width, height)
  118066. {
  118067. return this.displayList.add(new Zone(this.scene, x, y, width, height));
  118068. });
  118069. // When registering a factory function 'this' refers to the GameObjectFactory context.
  118070. //
  118071. // There are several properties available to use:
  118072. //
  118073. // this.scene - a reference to the Scene that owns the GameObjectFactory
  118074. // this.displayList - a reference to the Display List the Scene owns
  118075. // this.updateList - a reference to the Update List the Scene owns
  118076. /***/ }),
  118077. /* 877 */
  118078. /***/ (function(module, exports, __webpack_require__) {
  118079. /**
  118080. * @author Richard Davey <rich@photonstorm.com>
  118081. * @copyright 2018 Photon Storm Ltd.
  118082. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118083. */
  118084. var TileSprite = __webpack_require__(239);
  118085. var GameObjectFactory = __webpack_require__(11);
  118086. /**
  118087. * Creates a new TileSprite Game Object and adds it to the Scene.
  118088. *
  118089. * Note: This method will only be available if the TileSprite Game Object has been built into Phaser.
  118090. *
  118091. * @method Phaser.GameObjects.GameObjectFactory#tileSprite
  118092. * @since 3.0.0
  118093. *
  118094. * @param {number} x - The horizontal position of this Game Object in the world.
  118095. * @param {number} y - The vertical position of this Game Object in the world.
  118096. * @param {number} width - The width of the Game Object.
  118097. * @param {number} height - The height of the Game Object.
  118098. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  118099. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  118100. *
  118101. * @return {Phaser.GameObjects.TileSprite} The Game Object that was created.
  118102. */
  118103. GameObjectFactory.register('tileSprite', function (x, y, width, height, key, frame)
  118104. {
  118105. return this.displayList.add(new TileSprite(this.scene, x, y, width, height, key, frame));
  118106. });
  118107. // When registering a factory function 'this' refers to the GameObjectFactory context.
  118108. //
  118109. // There are several properties available to use:
  118110. //
  118111. // this.scene - a reference to the Scene that owns the GameObjectFactory
  118112. // this.displayList - a reference to the Display List the Scene owns
  118113. // this.updateList - a reference to the Update List the Scene owns
  118114. /***/ }),
  118115. /* 878 */
  118116. /***/ (function(module, exports, __webpack_require__) {
  118117. /**
  118118. * @author Richard Davey <rich@photonstorm.com>
  118119. * @copyright 2018 Photon Storm Ltd.
  118120. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118121. */
  118122. var BitmapText = __webpack_require__(148);
  118123. var GameObjectFactory = __webpack_require__(11);
  118124. /**
  118125. * Creates a new Bitmap Text Game Object and adds it to the Scene.
  118126. *
  118127. * Note: This method will only be available if the Bitmap Text Game Object has been built into Phaser.
  118128. *
  118129. * @method Phaser.GameObjects.GameObjectFactory#bitmapText
  118130. * @since 3.0.0
  118131. *
  118132. * @param {number} x - The x position of the Game Object.
  118133. * @param {number} y - The y position of the Game Object.
  118134. * @param {string} font - The key of the font to use from the BitmapFont cache.
  118135. * @param {(string|string[])} [text] - The string, or array of strings, to be set as the content of this Bitmap Text.
  118136. * @param {number} [size] - The font size to set.
  118137. * @param {integer} [align=0] - The alignment of the text in a multi-line BitmapText object.
  118138. *
  118139. * @return {Phaser.GameObjects.BitmapText} The Game Object that was created.
  118140. */
  118141. GameObjectFactory.register('bitmapText', function (x, y, font, text, size, align)
  118142. {
  118143. return this.displayList.add(new BitmapText(this.scene, x, y, font, text, size, align));
  118144. });
  118145. // When registering a factory function 'this' refers to the GameObjectFactory context.
  118146. //
  118147. // There are several properties available to use:
  118148. //
  118149. // this.scene - a reference to the Scene that owns the GameObjectFactory
  118150. // this.displayList - a reference to the Display List the Scene owns
  118151. // this.updateList - a reference to the Update List the Scene owns
  118152. /***/ }),
  118153. /* 879 */
  118154. /***/ (function(module, exports, __webpack_require__) {
  118155. /**
  118156. * @author Richard Davey <rich@photonstorm.com>
  118157. * @copyright 2018 Photon Storm Ltd.
  118158. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118159. */
  118160. var Sprite3D = __webpack_require__(154);
  118161. var GameObjectFactory = __webpack_require__(11);
  118162. /**
  118163. * Creates a new Sprite3D Game Object and adds it to the Scene.
  118164. *
  118165. * Note: This method will only be available if the Sprite3D Game Object has been built into Phaser.
  118166. *
  118167. * @method Phaser.GameObjects.GameObjectFactory#sprite3D
  118168. * @since 3.0.0
  118169. *
  118170. * @param {number} x - The horizontal position of this Game Object.
  118171. * @param {number} y - The vertical position of this Game Object.
  118172. * @param {number} z - The z position of this Game Object.
  118173. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  118174. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  118175. *
  118176. * @return {Phaser.GameObjects.Sprite3D} The Game Object that was created.
  118177. */
  118178. GameObjectFactory.register('sprite3D', function (x, y, z, key, frame)
  118179. {
  118180. var sprite = new Sprite3D(this.scene, x, y, z, key, frame);
  118181. this.displayList.add(sprite.gameObject);
  118182. this.updateList.add(sprite.gameObject);
  118183. return sprite;
  118184. });
  118185. // When registering a factory function 'this' refers to the GameObjectFactory context.
  118186. //
  118187. // There are several properties available to use:
  118188. //
  118189. // this.scene - a reference to the Scene that owns the GameObjectFactory
  118190. // this.displayList - a reference to the Display List the Scene owns
  118191. // this.updateList - a reference to the Update List the Scene owns
  118192. /***/ }),
  118193. /* 880 */
  118194. /***/ (function(module, exports, __webpack_require__) {
  118195. /**
  118196. * @author Richard Davey <rich@photonstorm.com>
  118197. * @copyright 2018 Photon Storm Ltd.
  118198. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118199. */
  118200. var GameObjectFactory = __webpack_require__(11);
  118201. var RenderTexture = __webpack_require__(240);
  118202. /**
  118203. * Creates a new Render Texture Game Object and adds it to the Scene.
  118204. *
  118205. * Note: This method will only be available if the Render Texture Game Object has been built into Phaser.
  118206. *
  118207. * @method Phaser.GameObjects.GameObjectFactory#renderTexture
  118208. * @since 3.2.0
  118209. *
  118210. * @param {number} x - The horizontal position of this Game Object in the world.
  118211. * @param {number} y - The vertical position of this Game Object in the world.
  118212. * @param {integer} [width=32] - The width of the Render Texture.
  118213. * @param {integer} [height=32] - The height of the Render Texture.
  118214. *
  118215. * @return {Phaser.GameObjects.RenderTexture} The Game Object that was created.
  118216. */
  118217. GameObjectFactory.register('renderTexture', function (x, y, width, height)
  118218. {
  118219. return this.displayList.add(new RenderTexture(this.scene, x, y, width, height));
  118220. });
  118221. /***/ }),
  118222. /* 881 */
  118223. /***/ (function(module, exports, __webpack_require__) {
  118224. /**
  118225. * @author Richard Davey <rich@photonstorm.com>
  118226. * @copyright 2018 Photon Storm Ltd.
  118227. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118228. */
  118229. var GameObjectFactory = __webpack_require__(11);
  118230. var PathFollower = __webpack_require__(422);
  118231. /**
  118232. * Creates a new PathFollower Game Object and adds it to the Scene.
  118233. *
  118234. * Note: This method will only be available if the PathFollower Game Object has been built into Phaser.
  118235. *
  118236. * @method Phaser.GameObjects.GameObjectFactory#follower
  118237. * @since 3.0.0
  118238. *
  118239. * @param {Phaser.Curves.Path} path - The Path this PathFollower is connected to.
  118240. * @param {number} x - The horizontal position of this Game Object in the world.
  118241. * @param {number} y - The vertical position of this Game Object in the world.
  118242. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  118243. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  118244. *
  118245. * @return {Phaser.GameObjects.PathFollower} The Game Object that was created.
  118246. */
  118247. GameObjectFactory.register('follower', function (path, x, y, key, frame)
  118248. {
  118249. var sprite = new PathFollower(this.scene, path, x, y, key, frame);
  118250. this.displayList.add(sprite);
  118251. this.updateList.add(sprite);
  118252. return sprite;
  118253. });
  118254. // When registering a factory function 'this' refers to the GameObjectFactory context.
  118255. //
  118256. // There are several properties available to use:
  118257. //
  118258. // this.scene - a reference to the Scene that owns the GameObjectFactory
  118259. // this.displayList - a reference to the Display List the Scene owns
  118260. // this.updateList - a reference to the Update List the Scene owns
  118261. /***/ }),
  118262. /* 882 */
  118263. /***/ (function(module, exports, __webpack_require__) {
  118264. /**
  118265. * @author Richard Davey <rich@photonstorm.com>
  118266. * @copyright 2018 Photon Storm Ltd.
  118267. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118268. */
  118269. var GameObjectFactory = __webpack_require__(11);
  118270. var ParticleEmitterManager = __webpack_require__(241);
  118271. /**
  118272. * Creates a new Particle Emitter Manager Game Object and adds it to the Scene.
  118273. *
  118274. * Note: This method will only be available if the Particles Game Object has been built into Phaser.
  118275. *
  118276. * @method Phaser.GameObjects.GameObjectFactory#particles
  118277. * @since 3.0.0
  118278. *
  118279. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  118280. * @param {(string|integer|object)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  118281. * @param {ParticleEmitterConfig|ParticleEmitterConfig[]} [emitters] - Configuration settings for one or more emitters to create.
  118282. *
  118283. * @return {Phaser.GameObjects.Particles.ParticleEmitterManager} The Game Object that was created.
  118284. */
  118285. GameObjectFactory.register('particles', function (key, frame, emitters)
  118286. {
  118287. var manager = new ParticleEmitterManager(this.scene, key, frame, emitters);
  118288. this.displayList.add(manager);
  118289. this.updateList.add(manager);
  118290. return manager;
  118291. });
  118292. // When registering a factory function 'this' refers to the GameObjectFactory context.
  118293. //
  118294. // There are several properties available to use:
  118295. //
  118296. // this.scene - a reference to the Scene that owns the GameObjectFactory
  118297. // this.displayList - a reference to the Display List the Scene owns
  118298. // this.updateList - a reference to the Update List the Scene owns
  118299. /***/ }),
  118300. /* 883 */
  118301. /***/ (function(module, exports, __webpack_require__) {
  118302. /**
  118303. * @author Richard Davey <rich@photonstorm.com>
  118304. * @copyright 2018 Photon Storm Ltd.
  118305. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118306. */
  118307. var Group = __webpack_require__(112);
  118308. var GameObjectFactory = __webpack_require__(11);
  118309. /**
  118310. * Creates a new Group Game Object and adds it to the Scene.
  118311. *
  118312. * Note: This method will only be available if the Group Game Object has been built into Phaser.
  118313. *
  118314. * @method Phaser.GameObjects.GameObjectFactory#group
  118315. * @since 3.0.0
  118316. *
  118317. * @param {(Phaser.GameObjects.GameObject[]|GroupConfig)} [children] - Game Objects to add to this Group; or the `config` argument.
  118318. * @param {GroupConfig} [config] - A Group Configuration object.
  118319. *
  118320. * @return {Phaser.GameObjects.Group} The Game Object that was created.
  118321. */
  118322. GameObjectFactory.register('group', function (children, config)
  118323. {
  118324. if (typeof children === 'object' && config === undefined)
  118325. {
  118326. config = children;
  118327. children = [];
  118328. }
  118329. return this.updateList.add(new Group(this.scene, children, config));
  118330. });
  118331. /***/ }),
  118332. /* 884 */
  118333. /***/ (function(module, exports, __webpack_require__) {
  118334. /**
  118335. * @author Richard Davey <rich@photonstorm.com>
  118336. * @copyright 2018 Photon Storm Ltd.
  118337. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118338. */
  118339. var DynamicBitmapText = __webpack_require__(244);
  118340. var GameObjectFactory = __webpack_require__(11);
  118341. /**
  118342. * Creates a new Dynamic Bitmap Text Game Object and adds it to the Scene.
  118343. *
  118344. * Note: This method will only be available if the Dynamic Bitmap Text Game Object has been built into Phaser.
  118345. *
  118346. * @method Phaser.GameObjects.GameObjectFactory#dynamicBitmapText
  118347. * @since 3.0.0
  118348. *
  118349. * @param {number} x - The x position of the Game Object.
  118350. * @param {number} y - The y position of the Game Object.
  118351. * @param {string} font - The key of the font to use from the BitmapFont cache.
  118352. * @param {(string|string[])} [text] - The string, or array of strings, to be set as the content of this Bitmap Text.
  118353. * @param {number} [size] - The font size to set.
  118354. *
  118355. * @return {Phaser.GameObjects.DynamicBitmapText} The Game Object that was created.
  118356. */
  118357. GameObjectFactory.register('dynamicBitmapText', function (x, y, font, text, size)
  118358. {
  118359. return this.displayList.add(new DynamicBitmapText(this.scene, x, y, font, text, size));
  118360. });
  118361. // When registering a factory function 'this' refers to the GameObjectFactory context.
  118362. //
  118363. // There are several properties available to use:
  118364. //
  118365. // this.scene - a reference to the Scene that owns the GameObjectFactory
  118366. // this.displayList - a reference to the Display List the Scene owns
  118367. // this.updateList - a reference to the Update List the Scene owns
  118368. /***/ }),
  118369. /* 885 */
  118370. /***/ (function(module, exports, __webpack_require__) {
  118371. /**
  118372. * @author Richard Davey <rich@photonstorm.com>
  118373. * @author Felipe Alfonso <@bitnenfer>
  118374. * @copyright 2018 Photon Storm Ltd.
  118375. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118376. */
  118377. var Container = __webpack_require__(245);
  118378. var GameObjectFactory = __webpack_require__(11);
  118379. /**
  118380. * Creates a new Container Game Object and adds it to the Scene.
  118381. *
  118382. * Note: This method will only be available if the Container Game Object has been built into Phaser.
  118383. *
  118384. * @method Phaser.GameObjects.GameObjectFactory#container
  118385. * @since 3.4.0
  118386. *
  118387. * @param {number} x - The horizontal position of this Game Object in the world.
  118388. * @param {number} y - The vertical position of this Game Object in the world.
  118389. * @param {Phaser.GameObjects.GameObject|Phaser.GameObjects.GameObject[]} [children] - An optional array of Game Objects to add to this Container.
  118390. *
  118391. * @return {Phaser.GameObjects.Container} The Game Object that was created.
  118392. */
  118393. GameObjectFactory.register('container', function (x, y, children)
  118394. {
  118395. return this.displayList.add(new Container(this.scene, x, y, children));
  118396. });
  118397. /***/ }),
  118398. /* 886 */
  118399. /***/ (function(module, exports, __webpack_require__) {
  118400. /**
  118401. * @author Richard Davey <rich@photonstorm.com>
  118402. * @copyright 2018 Photon Storm Ltd.
  118403. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118404. */
  118405. var Blitter = __webpack_require__(246);
  118406. var GameObjectFactory = __webpack_require__(11);
  118407. /**
  118408. * Creates a new Blitter Game Object and adds it to the Scene.
  118409. *
  118410. * Note: This method will only be available if the Blitter Game Object has been built into Phaser.
  118411. *
  118412. * @method Phaser.GameObjects.GameObjectFactory#blitter
  118413. * @since 3.0.0
  118414. *
  118415. * @param {number} x - The x position of the Game Object.
  118416. * @param {number} y - The y position of the Game Object.
  118417. * @param {string} key - The key of the Texture the Blitter object will use.
  118418. * @param {(string|integer)} [frame] - The default Frame children of the Blitter will use.
  118419. *
  118420. * @return {Phaser.GameObjects.Blitter} The Game Object that was created.
  118421. */
  118422. GameObjectFactory.register('blitter', function (x, y, key, frame)
  118423. {
  118424. return this.displayList.add(new Blitter(this.scene, x, y, key, frame));
  118425. });
  118426. // When registering a factory function 'this' refers to the GameObjectFactory context.
  118427. //
  118428. // There are several properties available to use:
  118429. //
  118430. // this.scene - a reference to the Scene that owns the GameObjectFactory
  118431. // this.displayList - a reference to the Display List the Scene owns
  118432. // this.updateList - a reference to the Update List the Scene owns
  118433. /***/ }),
  118434. /* 887 */
  118435. /***/ (function(module, exports, __webpack_require__) {
  118436. /**
  118437. * @author Richard Davey <rich@photonstorm.com>
  118438. * @copyright 2018 Photon Storm Ltd.
  118439. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118440. */
  118441. var GameObject = __webpack_require__(2);
  118442. /**
  118443. * Renders this Game Object with the Canvas Renderer to the given Camera.
  118444. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118445. * This method should not be called directly. It is a utility function of the Render module.
  118446. *
  118447. * @method Phaser.GameObjects.TileSprite#renderCanvas
  118448. * @since 3.0.0
  118449. * @private
  118450. *
  118451. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  118452. * @param {Phaser.GameObjects.TileSprite} src - The Game Object being rendered in this call.
  118453. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118454. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118455. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118456. */
  118457. var TileSpriteCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  118458. {
  118459. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  118460. {
  118461. return;
  118462. }
  118463. var ctx = renderer.currentContext;
  118464. var frame = src.frame;
  118465. src.updateTileTexture();
  118466. // Alpha
  118467. var alpha = camera.alpha * src.alpha;
  118468. if (alpha === 0)
  118469. {
  118470. // Nothing to see, so abort early
  118471. return;
  118472. }
  118473. else if (renderer.currentAlpha !== alpha)
  118474. {
  118475. renderer.currentAlpha = alpha;
  118476. ctx.globalAlpha = alpha;
  118477. }
  118478. // Blend Mode
  118479. if (renderer.currentBlendMode !== src.blendMode)
  118480. {
  118481. renderer.currentBlendMode = src.blendMode;
  118482. ctx.globalCompositeOperation = renderer.blendModes[src.blendMode];
  118483. }
  118484. // Smoothing
  118485. if (renderer.currentScaleMode !== src.scaleMode)
  118486. {
  118487. renderer.currentScaleMode = src.scaleMode;
  118488. }
  118489. var dx = frame.x - (src.originX * src.width);
  118490. var dy = frame.y - (src.originY * src.height);
  118491. var tx = src.x - camera.scrollX * src.scrollFactorX;
  118492. var ty = src.y - camera.scrollY * src.scrollFactorY;
  118493. var fx = 1;
  118494. var fy = 1;
  118495. // Flipping
  118496. if (src.flipX)
  118497. {
  118498. fx = -1;
  118499. dx += src.width;
  118500. }
  118501. if (src.flipY)
  118502. {
  118503. fy = -1;
  118504. dy += src.height;
  118505. }
  118506. if (camera.roundPixels)
  118507. {
  118508. dx |= 0;
  118509. dy |= 0;
  118510. tx |= 0;
  118511. ty |= 0;
  118512. }
  118513. ctx.save();
  118514. if (parentMatrix !== undefined)
  118515. {
  118516. var matrix = parentMatrix.matrix;
  118517. ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  118518. }
  118519. ctx.translate(dx, dy);
  118520. ctx.translate(tx, ty);
  118521. // Flip
  118522. ctx.scale(fx, fy);
  118523. // Rotate and scale around center
  118524. ctx.translate((src.originX * src.width), (src.originY * src.height));
  118525. ctx.rotate(fx * fy * src.rotation);
  118526. ctx.scale(this.scaleX, this.scaleY);
  118527. ctx.translate(-(src.originX * src.width), -(src.originY * src.height));
  118528. // Draw
  118529. ctx.scale(src.tileScaleX, src.tileScaleY);
  118530. ctx.translate(-this.tilePositionX, -this.tilePositionY);
  118531. ctx.fillStyle = src.tileTexture;
  118532. ctx.fillRect(this.tilePositionX, this.tilePositionY, src.width / src.tileScaleX, src.height / src.tileScaleY);
  118533. ctx.restore();
  118534. };
  118535. module.exports = TileSpriteCanvasRenderer;
  118536. /***/ }),
  118537. /* 888 */
  118538. /***/ (function(module, exports, __webpack_require__) {
  118539. /**
  118540. * @author Richard Davey <rich@photonstorm.com>
  118541. * @copyright 2018 Photon Storm Ltd.
  118542. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118543. */
  118544. var GameObject = __webpack_require__(2);
  118545. var Utils = __webpack_require__(21);
  118546. /**
  118547. * Renders this Game Object with the WebGL Renderer to the given Camera.
  118548. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118549. * This method should not be called directly. It is a utility function of the Render module.
  118550. *
  118551. * @method Phaser.GameObjects.TileSprite#renderWebGL
  118552. * @since 3.0.0
  118553. * @private
  118554. *
  118555. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  118556. * @param {Phaser.GameObjects.TileSprite} src - The Game Object being rendered in this call.
  118557. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118558. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118559. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118560. */
  118561. var TileSpriteWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  118562. {
  118563. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  118564. {
  118565. return;
  118566. }
  118567. src.updateTileTexture();
  118568. var getTint = Utils.getTintAppendFloatAlpha;
  118569. this.pipeline.batchTexture(
  118570. src,
  118571. src.tileTexture,
  118572. src.frame.width * src.tileScaleX, src.frame.height * src.tileScaleY,
  118573. src.x, src.y,
  118574. src.width, src.height,
  118575. src.scaleX, src.scaleY,
  118576. src.rotation,
  118577. src.flipX, src.flipY,
  118578. src.scrollFactorX, src.scrollFactorY,
  118579. src.originX * src.width, src.originY * src.height,
  118580. 0, 0, src.width, src.height,
  118581. getTint(src._tintTL, camera.alpha * src._alphaTL),
  118582. getTint(src._tintTR, camera.alpha * src._alphaTR),
  118583. getTint(src._tintBL, camera.alpha * src._alphaBL),
  118584. getTint(src._tintBR, camera.alpha * src._alphaBR),
  118585. (src._isTinted && src.tintFill),
  118586. (src.tilePositionX % src.frame.width) / src.frame.width,
  118587. (src.tilePositionY % src.frame.height) / src.frame.height,
  118588. camera,
  118589. parentMatrix
  118590. );
  118591. };
  118592. module.exports = TileSpriteWebGLRenderer;
  118593. /***/ }),
  118594. /* 889 */
  118595. /***/ (function(module, exports, __webpack_require__) {
  118596. /**
  118597. * @author Richard Davey <rich@photonstorm.com>
  118598. * @copyright 2018 Photon Storm Ltd.
  118599. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118600. */
  118601. var renderWebGL = __webpack_require__(3);
  118602. var renderCanvas = __webpack_require__(3);
  118603. if (true)
  118604. {
  118605. renderWebGL = __webpack_require__(888);
  118606. }
  118607. if (true)
  118608. {
  118609. renderCanvas = __webpack_require__(887);
  118610. }
  118611. module.exports = {
  118612. renderWebGL: renderWebGL,
  118613. renderCanvas: renderCanvas
  118614. };
  118615. /***/ }),
  118616. /* 890 */
  118617. /***/ (function(module, exports, __webpack_require__) {
  118618. /**
  118619. * @author Richard Davey <rich@photonstorm.com>
  118620. * @copyright 2018 Photon Storm Ltd.
  118621. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118622. */
  118623. var GetValue = __webpack_require__(4);
  118624. /**
  118625. * Parses a Retro Font configuration object so you can pass it to the BitmapText constructor
  118626. * and create a BitmapText object using a fixed-width retro font.
  118627. *
  118628. * @function Phaser.GameObjects.RetroFont.Parse
  118629. * @since 3.0.0
  118630. *
  118631. * @param {Phaser.Scene} scene - A reference to the Phaser Scene.
  118632. * @param {Phaser.GameObjects.RetroFont.Config} config - The font configuration object.
  118633. *
  118634. * @return {object} A parsed Bitmap Font data entry for the Bitmap Font cache.
  118635. */
  118636. var ParseRetroFont = function (scene, config)
  118637. {
  118638. var w = config.width;
  118639. var h = config.height;
  118640. var cx = Math.floor(w / 2);
  118641. var cy = Math.floor(h / 2);
  118642. var letters = GetValue(config, 'chars', '');
  118643. if (letters === '')
  118644. {
  118645. return;
  118646. }
  118647. var key = GetValue(config, 'image', '');
  118648. var offsetX = GetValue(config, 'offset.x', 0);
  118649. var offsetY = GetValue(config, 'offset.y', 0);
  118650. var spacingX = GetValue(config, 'spacing.x', 0);
  118651. var spacingY = GetValue(config, 'spacing.y', 0);
  118652. var charsPerRow = GetValue(config, 'charsPerRow', null);
  118653. if (charsPerRow === null)
  118654. {
  118655. charsPerRow = scene.sys.textures.getFrame(key).width / w;
  118656. if (charsPerRow > letters.length)
  118657. {
  118658. charsPerRow = letters.length;
  118659. }
  118660. }
  118661. var x = offsetX;
  118662. var y = offsetY;
  118663. var data = {
  118664. retroFont: true,
  118665. font: key,
  118666. size: w,
  118667. lineHeight: h,
  118668. chars: {}
  118669. };
  118670. var r = 0;
  118671. for (var i = 0; i < letters.length; i++)
  118672. {
  118673. // var node = letters[i];
  118674. var charCode = letters.charCodeAt(i);
  118675. data.chars[charCode] =
  118676. {
  118677. x: x,
  118678. y: y,
  118679. width: w,
  118680. height: h,
  118681. centerX: cx,
  118682. centerY: cy,
  118683. xOffset: 0,
  118684. yOffset: 0,
  118685. xAdvance: w,
  118686. data: {},
  118687. kerning: {}
  118688. };
  118689. r++;
  118690. if (r === charsPerRow)
  118691. {
  118692. r = 0;
  118693. x = offsetX;
  118694. y += h + spacingY;
  118695. }
  118696. else
  118697. {
  118698. x += w + spacingX;
  118699. }
  118700. }
  118701. var entry = {
  118702. data: data,
  118703. frame: null,
  118704. texture: key
  118705. };
  118706. return entry;
  118707. };
  118708. module.exports = ParseRetroFont;
  118709. /***/ }),
  118710. /* 891 */
  118711. /***/ (function(module, exports) {
  118712. /**
  118713. * @author Richard Davey <rich@photonstorm.com>
  118714. * @copyright 2018 Photon Storm Ltd.
  118715. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118716. */
  118717. var RETRO_FONT_CONST = {
  118718. /**
  118719. * Text Set 1 = !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~
  118720. *
  118721. * @name Phaser.GameObjects.RetroFont.TEXT_SET1
  118722. * @type {string}
  118723. * @since 3.6.0
  118724. */
  118725. TEXT_SET1: ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~',
  118726. /**
  118727. * Text Set 2 = !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
  118728. *
  118729. * @name Phaser.GameObjects.RetroFont.TEXT_SET2
  118730. * @type {string}
  118731. * @since 3.6.0
  118732. */
  118733. TEXT_SET2: ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  118734. /**
  118735. * Text Set 3 = ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
  118736. *
  118737. * @name Phaser.GameObjects.RetroFont.TEXT_SET3
  118738. * @type {string}
  118739. * @since 3.6.0
  118740. */
  118741. TEXT_SET3: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ',
  118742. /**
  118743. * Text Set 4 = ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789
  118744. *
  118745. * @name Phaser.GameObjects.RetroFont.TEXT_SET4
  118746. * @type {string}
  118747. * @since 3.6.0
  118748. */
  118749. TEXT_SET4: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789',
  118750. /**
  118751. * Text Set 5 = ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/() '!?-*:0123456789
  118752. *
  118753. * @name Phaser.GameObjects.RetroFont.TEXT_SET5
  118754. * @type {string}
  118755. * @since 3.6.0
  118756. */
  118757. TEXT_SET5: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ.,/() \'!?-*:0123456789',
  118758. /**
  118759. * Text Set 6 = ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;0123456789"(),-.'
  118760. *
  118761. * @name Phaser.GameObjects.RetroFont.TEXT_SET6
  118762. * @type {string}
  118763. * @since 3.6.0
  118764. */
  118765. TEXT_SET6: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ!?:;0123456789"(),-.\' ',
  118766. /**
  118767. * Text Set 7 = AGMSY+:4BHNTZ!;5CIOU.?06DJPV,(17EKQW")28FLRX-'39
  118768. *
  118769. * @name Phaser.GameObjects.RetroFont.TEXT_SET7
  118770. * @type {string}
  118771. * @since 3.6.0
  118772. */
  118773. TEXT_SET7: 'AGMSY+:4BHNTZ!;5CIOU.?06DJPV,(17EKQW")28FLRX-\'39',
  118774. /**
  118775. * Text Set 8 = 0123456789 .ABCDEFGHIJKLMNOPQRSTUVWXYZ
  118776. *
  118777. * @name Phaser.GameObjects.RetroFont.TEXT_SET8
  118778. * @type {string}
  118779. * @since 3.6.0
  118780. */
  118781. TEXT_SET8: '0123456789 .ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  118782. /**
  118783. * Text Set 9 = ABCDEFGHIJKLMNOPQRSTUVWXYZ()-0123456789.:,'"?!
  118784. *
  118785. * @name Phaser.GameObjects.RetroFont.TEXT_SET9
  118786. * @type {string}
  118787. * @since 3.6.0
  118788. */
  118789. TEXT_SET9: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ()-0123456789.:,\'"?!',
  118790. /**
  118791. * Text Set 10 = ABCDEFGHIJKLMNOPQRSTUVWXYZ
  118792. *
  118793. * @name Phaser.GameObjects.RetroFont.TEXT_SET10
  118794. * @type {string}
  118795. * @since 3.6.0
  118796. */
  118797. TEXT_SET10: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  118798. /**
  118799. * Text Set 11 = ABCDEFGHIJKLMNOPQRSTUVWXYZ.,"-+!?()':;0123456789
  118800. *
  118801. * @name Phaser.GameObjects.RetroFont.TEXT_SET11
  118802. * @since 3.6.0
  118803. * @type {string}
  118804. */
  118805. TEXT_SET11: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ.,"-+!?()\':;0123456789'
  118806. };
  118807. module.exports = RETRO_FONT_CONST;
  118808. /***/ }),
  118809. /* 892 */
  118810. /***/ (function(module, exports, __webpack_require__) {
  118811. /**
  118812. * @author Richard Davey <rich@photonstorm.com>
  118813. * @copyright 2018 Photon Storm Ltd.
  118814. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118815. */
  118816. var RETRO_FONT_CONST = __webpack_require__(891);
  118817. var Extend = __webpack_require__(16);
  118818. /**
  118819. * @typedef {object} Phaser.GameObjects.RetroFont.Config
  118820. *
  118821. * @property {string} image - The key of the image containing the font.
  118822. * @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.
  118823. * @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.
  118824. * @property {number} width - The width of each character in the font set.
  118825. * @property {number} height - The height of each character in the font set.
  118826. * @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.
  118827. * @property {number} charsPerRow - The number of characters per row in the font set. If not given charsPerRow will be the image width / characterWidth.
  118828. * @property {number} spacing.x - If the characters in the font set have horizontal spacing between them set the required amount here.
  118829. * @property {number} spacing.y - If the characters in the font set have vertical spacing between them set the required amount here.
  118830. */
  118831. /**
  118832. * @namespace Phaser.GameObjects.RetroFont
  118833. * @since 3.6.0
  118834. */
  118835. var RetroFont = { Parse: __webpack_require__(890) };
  118836. // Merge in the consts
  118837. RetroFont = Extend(false, RetroFont, RETRO_FONT_CONST);
  118838. module.exports = RetroFont;
  118839. /***/ }),
  118840. /* 893 */
  118841. /***/ (function(module, exports) {
  118842. var RenderTextureWebGL = {
  118843. fill: function (rgb, alpha)
  118844. {
  118845. if (alpha === undefined) { alpha = 1; }
  118846. var ur = ((rgb >> 16)|0) & 0xff;
  118847. var ug = ((rgb >> 8)|0) & 0xff;
  118848. var ub = (rgb|0) & 0xff;
  118849. this.renderer.setFramebuffer(this.framebuffer);
  118850. var gl = this.gl;
  118851. gl.clearColor(ur / 255.0, ug / 255.0, ub / 255.0, alpha);
  118852. gl.clear(gl.COLOR_BUFFER_BIT);
  118853. this.renderer.setFramebuffer(null);
  118854. return this;
  118855. },
  118856. clear: function ()
  118857. {
  118858. this.renderer.setFramebuffer(this.framebuffer);
  118859. var gl = this.gl;
  118860. gl.clearColor(0, 0, 0, 0);
  118861. gl.clear(gl.COLOR_BUFFER_BIT);
  118862. this.renderer.setFramebuffer(null);
  118863. return this;
  118864. },
  118865. draw: function (texture, frame, x, y, tint)
  118866. {
  118867. if (tint === undefined)
  118868. {
  118869. tint = (this.globalTint >> 16) + (this.globalTint & 0xff00) + ((this.globalTint & 0xff) << 16);
  118870. }
  118871. else
  118872. {
  118873. tint = (tint >> 16) + (tint & 0xff00) + ((tint & 0xff) << 16);
  118874. }
  118875. this.renderer.setFramebuffer(this.framebuffer);
  118876. var pipeline = this.pipeline;
  118877. pipeline.projOrtho(0, pipeline.width, 0, pipeline.height, -1000.0, 1000.0);
  118878. pipeline.drawTextureFrame(frame, x, y, tint, this.globalAlpha, this.currentMatrix, null);
  118879. this.renderer.setFramebuffer(null);
  118880. pipeline.projOrtho(0, pipeline.width, pipeline.height, 0, -1000.0, 1000.0);
  118881. return this;
  118882. }
  118883. };
  118884. module.exports = RenderTextureWebGL;
  118885. /***/ }),
  118886. /* 894 */
  118887. /***/ (function(module, exports) {
  118888. var RenderTextureCanvas = {
  118889. fill: function (rgb)
  118890. {
  118891. var ur = ((rgb >> 16)|0) & 0xff;
  118892. var ug = ((rgb >> 8)|0) & 0xff;
  118893. var ub = (rgb|0) & 0xff;
  118894. this.context.fillStyle = 'rgb(' + ur + ',' + ug + ',' + ub + ')';
  118895. this.context.fillRect(0, 0, this.canvas.width, this.canvas.height);
  118896. return this;
  118897. },
  118898. clear: function ()
  118899. {
  118900. this.context.save();
  118901. this.context.setTransform(1, 0, 0, 1, 0, 0);
  118902. this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  118903. this.context.restore();
  118904. return this;
  118905. },
  118906. draw: function (texture, frame, x, y)
  118907. {
  118908. var cd = frame.canvasData;
  118909. var source = frame.source.image;
  118910. var matrix = this.currentMatrix;
  118911. this.context.globalAlpha = this.globalAlpha;
  118912. this.context.setTransform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  118913. this.context.drawImage(source, cd.sx, cd.sy, cd.sWidth, cd.sHeight, x, y, cd.dWidth, cd.dHeight);
  118914. return this;
  118915. }
  118916. };
  118917. module.exports = RenderTextureCanvas;
  118918. /***/ }),
  118919. /* 895 */
  118920. /***/ (function(module, exports, __webpack_require__) {
  118921. /**
  118922. * @author Richard Davey <rich@photonstorm.com>
  118923. * @copyright 2018 Photon Storm Ltd.
  118924. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  118925. */
  118926. var GameObject = __webpack_require__(2);
  118927. /**
  118928. * Renders this Game Object with the Canvas Renderer to the given Camera.
  118929. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  118930. * This method should not be called directly. It is a utility function of the Render module.
  118931. *
  118932. * @method Phaser.GameObjects.RenderTexture#renderCanvas
  118933. * @since 3.2.0
  118934. * @private
  118935. *
  118936. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  118937. * @param {Phaser.GameObjects.RenderTexture} renderTexture - The Game Object being rendered in this call.
  118938. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  118939. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  118940. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  118941. */
  118942. var RenderTextureCanvasRenderer = function (renderer, renderTexture, interpolationPercentage, camera, parentMatrix)
  118943. {
  118944. if (GameObject.RENDER_MASK !== renderTexture.renderFlags || (renderTexture.cameraFilter > 0 && (renderTexture.cameraFilter & camera._id)))
  118945. {
  118946. return;
  118947. }
  118948. var ctx = renderer.currentContext;
  118949. // Alpha
  118950. var alpha = camera.alpha * renderTexture.alpha;
  118951. if (alpha === 0)
  118952. {
  118953. // Nothing to see, so abort early
  118954. return;
  118955. }
  118956. else if (renderer.currentAlpha !== alpha)
  118957. {
  118958. renderer.currentAlpha = alpha;
  118959. ctx.globalAlpha = alpha;
  118960. }
  118961. // Blend Mode
  118962. if (renderer.currentBlendMode !== renderTexture.blendMode)
  118963. {
  118964. renderer.currentBlendMode = renderTexture.blendMode;
  118965. ctx.globalCompositeOperation = renderer.blendModes[renderTexture.blendMode];
  118966. }
  118967. // Scale Mode
  118968. if (renderer.currentScaleMode !== renderTexture.scaleMode)
  118969. {
  118970. renderer.currentScaleMode = renderTexture.scaleMode;
  118971. }
  118972. var dx = 0;
  118973. var dy = 0;
  118974. var fx = 1;
  118975. var fy = 1;
  118976. if (renderTexture.flipX)
  118977. {
  118978. fx = -1;
  118979. dx -= renderTexture.canvas.width - renderTexture.displayOriginX;
  118980. }
  118981. else
  118982. {
  118983. dx -= renderTexture.displayOriginX;
  118984. }
  118985. if (renderTexture.flipY)
  118986. {
  118987. fy = -1;
  118988. dy -= renderTexture.canvas.height - renderTexture.displayOriginY;
  118989. }
  118990. else
  118991. {
  118992. dy -= renderTexture.displayOriginY;
  118993. }
  118994. ctx.save();
  118995. if (parentMatrix !== undefined)
  118996. {
  118997. var matrix = parentMatrix.matrix;
  118998. ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  118999. }
  119000. ctx.translate(renderTexture.x - camera.scrollX * renderTexture.scrollFactorX, renderTexture.y - camera.scrollY * renderTexture.scrollFactorY);
  119001. ctx.rotate(renderTexture.rotation);
  119002. ctx.scale(renderTexture.scaleX, renderTexture.scaleY);
  119003. ctx.scale(fx, fy);
  119004. ctx.drawImage(renderTexture.canvas, dx, dy);
  119005. ctx.restore();
  119006. };
  119007. module.exports = RenderTextureCanvasRenderer;
  119008. /***/ }),
  119009. /* 896 */
  119010. /***/ (function(module, exports, __webpack_require__) {
  119011. /**
  119012. * @author Richard Davey <rich@photonstorm.com>
  119013. * @copyright 2018 Photon Storm Ltd.
  119014. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119015. */
  119016. var GameObject = __webpack_require__(2);
  119017. var Utils = __webpack_require__(21);
  119018. /**
  119019. * Renders this Game Object with the WebGL Renderer to the given Camera.
  119020. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  119021. * This method should not be called directly. It is a utility function of the Render module.
  119022. *
  119023. * @method Phaser.GameObjects.RenderTexture#renderWebGL
  119024. * @since 3.2.0
  119025. * @private
  119026. *
  119027. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active Canvas renderer.
  119028. * @param {Phaser.GameObjects.RenderTexture} src - The Game Object being rendered in this call.
  119029. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  119030. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  119031. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  119032. */
  119033. var RenderTextureWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  119034. {
  119035. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera._id)))
  119036. {
  119037. return;
  119038. }
  119039. var getTint = Utils.getTintAppendFloatAlpha;
  119040. this.pipeline.batchTexture(
  119041. src,
  119042. src.texture,
  119043. src.texture.width, src.texture.height,
  119044. src.x, src.y,
  119045. src.width, src.height,
  119046. src.scaleX, src.scaleY,
  119047. src.rotation,
  119048. src.flipX, !src.flipY,
  119049. src.scrollFactorX, src.scrollFactorY,
  119050. src.displayOriginX, src.displayOriginY,
  119051. 0, 0, src.texture.width, src.texture.height,
  119052. getTint(src._tintTL, camera.alpha * src._alphaTL),
  119053. getTint(src._tintTR, camera.alpha * src._alphaTR),
  119054. getTint(src._tintBL, camera.alpha * src._alphaBL),
  119055. getTint(src._tintBR, camera.alpha * src._alphaBR),
  119056. (src._isTinted && src.tintFill),
  119057. 0, 0,
  119058. camera,
  119059. parentMatrix
  119060. );
  119061. };
  119062. module.exports = RenderTextureWebGLRenderer;
  119063. /***/ }),
  119064. /* 897 */
  119065. /***/ (function(module, exports, __webpack_require__) {
  119066. /**
  119067. * @author Richard Davey <rich@photonstorm.com>
  119068. * @copyright 2018 Photon Storm Ltd.
  119069. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119070. */
  119071. var renderWebGL = __webpack_require__(3);
  119072. var renderCanvas = __webpack_require__(3);
  119073. if (true)
  119074. {
  119075. renderWebGL = __webpack_require__(896);
  119076. }
  119077. if (true)
  119078. {
  119079. renderCanvas = __webpack_require__(895);
  119080. }
  119081. module.exports = {
  119082. renderWebGL: renderWebGL,
  119083. renderCanvas: renderCanvas
  119084. };
  119085. /***/ }),
  119086. /* 898 */
  119087. /***/ (function(module, exports, __webpack_require__) {
  119088. /**
  119089. * @author Richard Davey <rich@photonstorm.com>
  119090. * @copyright 2018 Photon Storm Ltd.
  119091. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119092. */
  119093. /**
  119094. * @namespace Phaser.GameObjects.Particles.Zones
  119095. */
  119096. module.exports = {
  119097. DeathZone: __webpack_require__(426),
  119098. EdgeZone: __webpack_require__(425),
  119099. RandomZone: __webpack_require__(423)
  119100. };
  119101. /***/ }),
  119102. /* 899 */
  119103. /***/ (function(module, exports, __webpack_require__) {
  119104. /**
  119105. * @author Richard Davey <rich@photonstorm.com>
  119106. * @copyright 2018 Photon Storm Ltd.
  119107. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119108. */
  119109. var GameObject = __webpack_require__(2);
  119110. /**
  119111. * Renders this Game Object with the Canvas Renderer to the given Camera.
  119112. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  119113. * This method should not be called directly. It is a utility function of the Render module.
  119114. *
  119115. * @method Phaser.GameObjects.Particles.EmitterManager#renderCanvas
  119116. * @since 3.0.0
  119117. * @private
  119118. *
  119119. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  119120. * @param {Phaser.GameObjects.Particles.ParticleEmitterManager} emitterManager - The Game Object being rendered in this call.
  119121. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  119122. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  119123. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  119124. */
  119125. var ParticleManagerCanvasRenderer = function (renderer, emitterManager, interpolationPercentage, camera, parentMatrix)
  119126. {
  119127. var emitters = emitterManager.emitters.list;
  119128. if (emitters.length === 0 || GameObject.RENDER_MASK !== emitterManager.renderFlags || (emitterManager.cameraFilter > 0 && (emitterManager.cameraFilter & camera._id)))
  119129. {
  119130. return;
  119131. }
  119132. var ctx = renderer.currentContext;
  119133. ctx.save();
  119134. if (parentMatrix !== undefined)
  119135. {
  119136. var matrix = parentMatrix.matrix;
  119137. ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  119138. }
  119139. for (var i = 0; i < emitters.length; i++)
  119140. {
  119141. var emitter = emitters[i];
  119142. var particles = emitter.alive;
  119143. var length = particles.length;
  119144. if (!emitter.visible || length === 0)
  119145. {
  119146. continue;
  119147. }
  119148. var lastAlpha = ctx.globalAlpha;
  119149. var cameraScrollX = camera.scrollX * emitter.scrollFactorX;
  119150. var cameraScrollY = camera.scrollY * emitter.scrollFactorY;
  119151. if (renderer.currentBlendMode !== emitter.blendMode)
  119152. {
  119153. renderer.currentBlendMode = emitter.blendMode;
  119154. ctx.globalCompositeOperation = renderer.blendModes[emitter.blendMode];
  119155. }
  119156. for (var index = 0; index < length; ++index)
  119157. {
  119158. var particle = particles[index];
  119159. var particleAlpha = camera.alpha * ((particle.color >> 24) & 0xFF) / 255;
  119160. if (particleAlpha <= 0)
  119161. {
  119162. continue;
  119163. }
  119164. var frame = particle.frame;
  119165. var width = frame.width;
  119166. var height = frame.height;
  119167. var ox = width * 0.5;
  119168. var oy = height * 0.5;
  119169. var cd = frame.canvasData;
  119170. var x = -ox;
  119171. var y = -oy;
  119172. var tx = particle.x - cameraScrollX;
  119173. var ty = particle.y - cameraScrollY;
  119174. if (camera.roundPixels)
  119175. {
  119176. tx |= 0;
  119177. ty |= 0;
  119178. }
  119179. ctx.globalAlpha = particleAlpha;
  119180. ctx.save();
  119181. ctx.translate(tx, ty);
  119182. ctx.rotate(particle.rotation);
  119183. ctx.scale(particle.scaleX, particle.scaleY);
  119184. ctx.drawImage(frame.source.image, cd.sx, cd.sy, cd.sWidth, cd.sHeight, x, y, cd.dWidth, cd.dHeight);
  119185. ctx.restore();
  119186. }
  119187. ctx.globalAlpha = lastAlpha;
  119188. }
  119189. ctx.restore();
  119190. };
  119191. module.exports = ParticleManagerCanvasRenderer;
  119192. /***/ }),
  119193. /* 900 */
  119194. /***/ (function(module, exports, __webpack_require__) {
  119195. /**
  119196. * @author Richard Davey <rich@photonstorm.com>
  119197. * @copyright 2018 Photon Storm Ltd.
  119198. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119199. */
  119200. var GameObject = __webpack_require__(2);
  119201. /**
  119202. * Renders this Game Object with the WebGL Renderer to the given Camera.
  119203. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  119204. * This method should not be called directly. It is a utility function of the Render module.
  119205. *
  119206. * @method Phaser.GameObjects.Particles.EmitterManager#renderWebGL
  119207. * @since 3.0.0
  119208. * @private
  119209. *
  119210. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  119211. * @param {Phaser.GameObjects.Particles.ParticleEmitterManager} emitterManager - The Game Object being rendered in this call.
  119212. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  119213. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  119214. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  119215. */
  119216. var ParticleManagerWebGLRenderer = function (renderer, emitterManager, interpolationPercentage, camera, parentMatrix)
  119217. {
  119218. var emitters = emitterManager.emitters.list;
  119219. if (emitters.length === 0 || GameObject.RENDER_MASK !== emitterManager.renderFlags || (emitterManager.cameraFilter > 0 && (emitterManager.cameraFilter & camera._id)))
  119220. {
  119221. return;
  119222. }
  119223. var pipeline = this.pipeline;
  119224. var camMatrix = pipeline._tempMatrix1.copyFrom(camera.matrix);
  119225. var calcMatrix = pipeline._tempMatrix2;
  119226. var particleMatrix = pipeline._tempMatrix3;
  119227. renderer.setPipeline(pipeline);
  119228. var roundPixels = camera.roundPixels;
  119229. var texture = emitterManager.defaultFrame.glTexture;
  119230. pipeline.setTexture2D(texture, 0);
  119231. for (var e = 0; e < emitters.length; e++)
  119232. {
  119233. var emitter = emitters[e];
  119234. var particles = emitter.alive;
  119235. var particleCount = particles.length;
  119236. if (!emitter.visible || particleCount === 0)
  119237. {
  119238. continue;
  119239. }
  119240. var scrollX = camera.scrollX * emitter.scrollFactorX;
  119241. var scrollY = camera.scrollY * emitter.scrollFactorY;
  119242. if (parentMatrix)
  119243. {
  119244. // Multiply the camera by the parent matrix
  119245. camMatrix.multiplyWithOffset(parentMatrix, -scrollX, -scrollY);
  119246. scrollX = 0;
  119247. scrollY = 0;
  119248. }
  119249. renderer.setBlendMode(emitter.blendMode);
  119250. var tintEffect = false;
  119251. for (var i = 0; i < particleCount; i++)
  119252. {
  119253. var particle = particles[i];
  119254. if (particle.alpha <= 0)
  119255. {
  119256. continue;
  119257. }
  119258. var frame = particle.frame;
  119259. var color = particle.color;
  119260. var x = -(frame.halfWidth);
  119261. var y = -(frame.halfHeight);
  119262. var xw = x + frame.width;
  119263. var yh = y + frame.height;
  119264. particleMatrix.applyITRS(0, 0, particle.rotation, particle.scaleX, particle.scaleY);
  119265. particleMatrix.e = particle.x - scrollX;
  119266. particleMatrix.f = particle.y - scrollY;
  119267. camMatrix.multiply(particleMatrix, calcMatrix);
  119268. var tx0 = x * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  119269. var ty0 = x * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  119270. var tx1 = x * calcMatrix.a + yh * calcMatrix.c + calcMatrix.e;
  119271. var ty1 = x * calcMatrix.b + yh * calcMatrix.d + calcMatrix.f;
  119272. var tx2 = xw * calcMatrix.a + yh * calcMatrix.c + calcMatrix.e;
  119273. var ty2 = xw * calcMatrix.b + yh * calcMatrix.d + calcMatrix.f;
  119274. var tx3 = xw * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  119275. var ty3 = xw * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  119276. if (roundPixels)
  119277. {
  119278. tx0 |= 0;
  119279. ty0 |= 0;
  119280. tx1 |= 0;
  119281. ty1 |= 0;
  119282. tx2 |= 0;
  119283. ty2 |= 0;
  119284. tx3 |= 0;
  119285. ty3 |= 0;
  119286. }
  119287. if (pipeline.batchVertices(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, frame.u0, frame.v0, frame.u1, frame.v1, color, color, color, color, tintEffect))
  119288. {
  119289. pipeline.setTexture2D(texture, 0);
  119290. }
  119291. }
  119292. }
  119293. };
  119294. module.exports = ParticleManagerWebGLRenderer;
  119295. /***/ }),
  119296. /* 901 */
  119297. /***/ (function(module, exports, __webpack_require__) {
  119298. /**
  119299. * @author Richard Davey <rich@photonstorm.com>
  119300. * @copyright 2018 Photon Storm Ltd.
  119301. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119302. */
  119303. var renderWebGL = __webpack_require__(3);
  119304. var renderCanvas = __webpack_require__(3);
  119305. if (true)
  119306. {
  119307. renderWebGL = __webpack_require__(900);
  119308. }
  119309. if (true)
  119310. {
  119311. renderCanvas = __webpack_require__(899);
  119312. }
  119313. module.exports = {
  119314. renderWebGL: renderWebGL,
  119315. renderCanvas: renderCanvas
  119316. };
  119317. /***/ }),
  119318. /* 902 */
  119319. /***/ (function(module, exports, __webpack_require__) {
  119320. /**
  119321. * @author Richard Davey <rich@photonstorm.com>
  119322. * @copyright 2018 Photon Storm Ltd.
  119323. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119324. */
  119325. var Class = __webpack_require__(0);
  119326. var FloatBetween = __webpack_require__(242);
  119327. var GetEaseFunction = __webpack_require__(63);
  119328. var GetFastValue = __webpack_require__(1);
  119329. var Wrap = __webpack_require__(40);
  119330. /**
  119331. * The returned value sets what the property will be at the START of the particle's life, on emit.
  119332. * @callback EmitterOpOnEmitCallback
  119333. *
  119334. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  119335. * @param {string} key - The name of the property.
  119336. * @param {number} value - The current value of the property.
  119337. *
  119338. * @return {number} The new value of the property.
  119339. */
  119340. /**
  119341. * The returned value updates the property for the duration of the particle's life.
  119342. * @callback EmitterOpOnUpdateCallback
  119343. *
  119344. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  119345. * @param {string} key - The name of the property.
  119346. * @param {number} t - The normalized lifetime of the particle, between 0 (start) and 1 (end).
  119347. * @param {number} value - The current value of the property.
  119348. *
  119349. * @return {number} The new value of the property.
  119350. */
  119351. /**
  119352. * Defines an operation yielding a random value within a range.
  119353. * @typedef {object} EmitterOpRandomConfig
  119354. *
  119355. * @property {number[]} random - The minimum and maximum values, as [min, max].
  119356. */
  119357. /**
  119358. * Defines an operation yielding a random value within a range.
  119359. * @typedef {object} EmitterOpRandomMinMaxConfig
  119360. *
  119361. * @property {number} min - The minimum value.
  119362. * @property {number} max - The maximum value.
  119363. */
  119364. /**
  119365. * Defines an operation yielding a random value within a range.
  119366. * @typedef {object} EmitterOpRandomStartEndConfig
  119367. *
  119368. * @property {number} start - The starting value.
  119369. * @property {number} end - The ending value.
  119370. * @property {boolean} random - If false, this becomes {@link EmitterOpEaseConfig}.
  119371. */
  119372. /**
  119373. * Defines an operation yielding a value incremented continuously across a range.
  119374. * @typedef {object} EmitterOpEaseConfig
  119375. *
  119376. * @property {number} start - The starting value.
  119377. * @property {number} end - The ending value.
  119378. * @property {string} [ease='Linear'] - The name of the easing function.
  119379. */
  119380. /**
  119381. * Defines an operation yielding a value incremented by steps across a range.
  119382. * @typedef {object} EmitterOpSteppedConfig
  119383. *
  119384. * @property {number} start - The starting value.
  119385. * @property {number} end - The ending value.
  119386. * @property {number} steps - The number of steps between start and end.
  119387. */
  119388. /**
  119389. * @typedef {object} EmitterOpCustomEmitConfig
  119390. *
  119391. * @property {EmitterOpOnEmitCallback} onEmit - [description]
  119392. */
  119393. /**
  119394. * @typedef {object} EmitterOpCustomUpdateConfig
  119395. *
  119396. * @property {EmitterOpOnEmitCallback} [onEmit] - [description]
  119397. * @property {EmitterOpOnUpdateCallback} onUpdate - [description]
  119398. */
  119399. /**
  119400. * @classdesc
  119401. * A Particle Emitter property.
  119402. *
  119403. * Facilitates changing Particle properties as they are emitted and throughout their lifetime.
  119404. *
  119405. * @class EmitterOp
  119406. * @memberOf Phaser.GameObjects.Particles
  119407. * @constructor
  119408. * @since 3.0.0
  119409. *
  119410. * @param {ParticleEmitterConfig} config - Settings for the Particle Emitter that owns this property.
  119411. * @param {string} key - The name of the property.
  119412. * @param {number} defaultValue - The default value of the property.
  119413. * @param {boolean} [emitOnly=false] - Whether the property can only be modified when a Particle is emitted.
  119414. */
  119415. var EmitterOp = new Class({
  119416. initialize:
  119417. function EmitterOp (config, key, defaultValue, emitOnly)
  119418. {
  119419. if (emitOnly === undefined)
  119420. {
  119421. emitOnly = false;
  119422. }
  119423. /**
  119424. * The name of this property.
  119425. *
  119426. * @name Phaser.GameObjects.Particles.EmitterOp#propertyKey
  119427. * @type {string}
  119428. * @since 3.0.0
  119429. */
  119430. this.propertyKey = key;
  119431. /**
  119432. * The value of this property.
  119433. *
  119434. * @name Phaser.GameObjects.Particles.EmitterOp#propertyValue
  119435. * @type {number}
  119436. * @since 3.0.0
  119437. */
  119438. this.propertyValue = defaultValue;
  119439. /**
  119440. * The default value of this property.
  119441. *
  119442. * @name Phaser.GameObjects.Particles.EmitterOp#defaultValue
  119443. * @type {number}
  119444. * @since 3.0.0
  119445. */
  119446. this.defaultValue = defaultValue;
  119447. /**
  119448. * The number of steps for stepped easing between {@link Phaser.GameObjects.Particles.EmitterOp#start} and
  119449. * {@link Phaser.GameObjects.Particles.EmitterOp#end} values, per emit.
  119450. *
  119451. * @name Phaser.GameObjects.Particles.EmitterOp#steps
  119452. * @type {number}
  119453. * @default 0
  119454. * @since 3.0.0
  119455. */
  119456. this.steps = 0;
  119457. /**
  119458. * The step counter for stepped easing, per emit.
  119459. *
  119460. * @name Phaser.GameObjects.Particles.EmitterOp#counter
  119461. * @type {number}
  119462. * @default 0
  119463. * @since 3.0.0
  119464. */
  119465. this.counter = 0;
  119466. /**
  119467. * The start value for this property to ease between.
  119468. *
  119469. * @name Phaser.GameObjects.Particles.EmitterOp#start
  119470. * @type {number}
  119471. * @default 0
  119472. * @since 3.0.0
  119473. */
  119474. this.start = 0;
  119475. /**
  119476. * The end value for this property to ease between.
  119477. *
  119478. * @name Phaser.GameObjects.Particles.EmitterOp#end
  119479. * @type {number}
  119480. * @default 0
  119481. * @since 3.0.0
  119482. */
  119483. this.end = 0;
  119484. /**
  119485. * The easing function to use for updating this property.
  119486. *
  119487. * @name Phaser.GameObjects.Particles.EmitterOp#ease
  119488. * @type {?function}
  119489. * @since 3.0.0
  119490. */
  119491. this.ease;
  119492. /**
  119493. * Whether this property can only be modified when a Particle is emitted.
  119494. *
  119495. * Set to `true` to allow only {@link Phaser.GameObjects.Particles.EmitterOp#onEmit} callbacks to be set and
  119496. * affect this property.
  119497. *
  119498. * Set to `false` to allow both {@link Phaser.GameObjects.Particles.EmitterOp#onEmit} and
  119499. * {@link Phaser.GameObjects.Particles.EmitterOp#onUpdate} callbacks to be set and affect this property.
  119500. *
  119501. * @name Phaser.GameObjects.Particles.EmitterOp#emitOnly
  119502. * @type {boolean}
  119503. * @since 3.0.0
  119504. */
  119505. this.emitOnly = emitOnly;
  119506. /**
  119507. * The callback to run for Particles when they are emitted from the Particle Emitter.
  119508. *
  119509. * @name Phaser.GameObjects.Particles.EmitterOp#onEmit
  119510. * @type {EmitterOpOnEmitCallback}
  119511. * @since 3.0.0
  119512. */
  119513. this.onEmit = this.defaultEmit;
  119514. /**
  119515. * The callback to run for Particles when they are updated.
  119516. *
  119517. * @name Phaser.GameObjects.Particles.EmitterOp#onUpdate
  119518. * @type {EmitterOpOnUpdateCallback}
  119519. * @since 3.0.0
  119520. */
  119521. this.onUpdate = this.defaultUpdate;
  119522. this.loadConfig(config);
  119523. },
  119524. /**
  119525. * Load the property from a Particle Emitter configuration object.
  119526. *
  119527. * Optionally accepts a new property key to use, replacing the current one.
  119528. *
  119529. * @method Phaser.GameObjects.Particles.EmitterOp#loadConfig
  119530. * @since 3.0.0
  119531. *
  119532. * @param {ParticleEmitterConfig} [config] - Settings for the Particle Emitter that owns this property.
  119533. * @param {string} [newKey] - The new key to use for this property, if any.
  119534. */
  119535. loadConfig: function (config, newKey)
  119536. {
  119537. if (config === undefined)
  119538. {
  119539. config = {};
  119540. }
  119541. if (newKey)
  119542. {
  119543. this.propertyKey = newKey;
  119544. }
  119545. this.propertyValue = GetFastValue(
  119546. config,
  119547. this.propertyKey,
  119548. this.defaultValue
  119549. );
  119550. this.setMethods();
  119551. if (this.emitOnly)
  119552. {
  119553. // Reset it back again
  119554. this.onUpdate = this.defaultUpdate;
  119555. }
  119556. },
  119557. /**
  119558. * Build a JSON representation of this Particle Emitter property.
  119559. *
  119560. * @method Phaser.GameObjects.Particles.EmitterOp#toJSON
  119561. * @since 3.0.0
  119562. *
  119563. * @return {object} A JSON representation of this Particle Emitter property.
  119564. */
  119565. toJSON: function ()
  119566. {
  119567. return this.propertyValue;
  119568. },
  119569. /**
  119570. * Change the current value of the property and update its callback methods.
  119571. *
  119572. * @method Phaser.GameObjects.Particles.EmitterOp#onChange
  119573. * @since 3.0.0
  119574. *
  119575. * @param {number} value - The value of the property.
  119576. *
  119577. * @return {Phaser.GameObjects.Particles.EmitterOp} This Emitter Op object.
  119578. */
  119579. onChange: function (value)
  119580. {
  119581. this.propertyValue = value;
  119582. return this.setMethods();
  119583. },
  119584. /**
  119585. * Update the {@link Phaser.GameObjects.Particles.EmitterOp#onEmit} and
  119586. * {@link Phaser.GameObjects.Particles.EmitterOp#onUpdate} callbacks based on the type of the current
  119587. * {@link Phaser.GameObjects.Particles.EmitterOp#propertyValue}.
  119588. *
  119589. * @method Phaser.GameObjects.Particles.EmitterOp#setMethods
  119590. * @since 3.0.0
  119591. *
  119592. * @return {Phaser.GameObjects.Particles.EmitterOp} This Emitter Op object.
  119593. */
  119594. setMethods: function ()
  119595. {
  119596. var value = this.propertyValue;
  119597. var t = typeof value;
  119598. if (t === 'number')
  119599. {
  119600. // Explicit static value:
  119601. // x: 400
  119602. this.onEmit = this.staticValueEmit;
  119603. this.onUpdate = this.staticValueUpdate; // How?
  119604. }
  119605. else if (Array.isArray(value))
  119606. {
  119607. // Picks a random element from the array:
  119608. // x: [ 100, 200, 300, 400 ]
  119609. this.onEmit = this.randomStaticValueEmit;
  119610. }
  119611. else if (t === 'function')
  119612. {
  119613. // The same as setting just the onUpdate function and no onEmit (unless this op is an emitOnly one)
  119614. // Custom callback, must return a value:
  119615. /*
  119616. x: function (particle, key, t, value)
  119617. {
  119618. return value + 50;
  119619. }
  119620. */
  119621. if (this.emitOnly)
  119622. {
  119623. this.onEmit = value;
  119624. }
  119625. else
  119626. {
  119627. this.onUpdate = value;
  119628. }
  119629. }
  119630. else if (t === 'object' && (this.has(value, 'random') || this.hasBoth(value, 'start', 'end') || this.hasBoth(value, 'min', 'max')))
  119631. {
  119632. this.start = this.has(value, 'start') ? value.start : value.min;
  119633. this.end = this.has(value, 'end') ? value.end : value.max;
  119634. var isRandom = (this.hasBoth(value, 'min', 'max') || this.has(value, 'random'));
  119635. // A random starting value (using 'min | max' instead of 'start | end' automatically implies a random value)
  119636. // x: { start: 100, end: 400, random: true } OR { min: 100, max: 400 } OR { random: [ 100, 400 ] }
  119637. if (isRandom)
  119638. {
  119639. var rnd = value.random;
  119640. // x: { random: [ 100, 400 ] } = the same as doing: x: { start: 100, end: 400, random: true }
  119641. if (Array.isArray(rnd))
  119642. {
  119643. this.start = rnd[0];
  119644. this.end = rnd[1];
  119645. }
  119646. this.onEmit = this.randomRangedValueEmit;
  119647. }
  119648. if (this.has(value, 'steps'))
  119649. {
  119650. // A stepped (per emit) range
  119651. // x: { start: 100, end: 400, steps: 64 }
  119652. // Increments a value stored in the emitter
  119653. this.steps = value.steps;
  119654. this.counter = this.start;
  119655. this.onEmit = this.steppedEmit;
  119656. }
  119657. else
  119658. {
  119659. // An eased range (defaults to Linear if not specified)
  119660. // x: { start: 100, end: 400, [ ease: 'Linear' ] }
  119661. var easeType = this.has(value, 'ease') ? value.ease : 'Linear';
  119662. this.ease = GetEaseFunction(easeType);
  119663. if (!isRandom)
  119664. {
  119665. this.onEmit = this.easedValueEmit;
  119666. }
  119667. // BUG: alpha, rotate, scaleX, scaleY, or tint are eased here if {min, max} is given.
  119668. // Probably this branch should exclude isRandom entirely.
  119669. this.onUpdate = this.easeValueUpdate;
  119670. }
  119671. }
  119672. else if (t === 'object' && this.hasEither(value, 'onEmit', 'onUpdate'))
  119673. {
  119674. // Custom onEmit and onUpdate callbacks
  119675. /*
  119676. x: {
  119677. // Called at the start of the particles life, when it is being created
  119678. onEmit: function (particle, key, t, value)
  119679. {
  119680. return value;
  119681. },
  119682. // Called during the particles life on each update
  119683. onUpdate: function (particle, key, t, value)
  119684. {
  119685. return value;
  119686. }
  119687. }
  119688. */
  119689. if (this.has(value, 'onEmit'))
  119690. {
  119691. this.onEmit = value.onEmit;
  119692. }
  119693. if (this.has(value, 'onUpdate'))
  119694. {
  119695. this.onUpdate = value.onUpdate;
  119696. }
  119697. }
  119698. return this;
  119699. },
  119700. /**
  119701. * Check whether an object has the given property.
  119702. *
  119703. * @method Phaser.GameObjects.Particles.EmitterOp#has
  119704. * @since 3.0.0
  119705. *
  119706. * @param {object} object - The object to check.
  119707. * @param {string} key - The key of the property to look for in the object.
  119708. *
  119709. * @return {boolean} `true` if the property exists in the object, `false` otherwise.
  119710. */
  119711. has: function (object, key)
  119712. {
  119713. return object.hasOwnProperty(key);
  119714. },
  119715. /**
  119716. * Check whether an object has both of the given properties.
  119717. *
  119718. * @method Phaser.GameObjects.Particles.EmitterOp#hasBoth
  119719. * @since 3.0.0
  119720. *
  119721. * @param {object} object - The object to check.
  119722. * @param {string} key1 - The key of the first property to check the object for.
  119723. * @param {string} key2 - The key of the second property to check the object for.
  119724. *
  119725. * @return {boolean} `true` if both properties exist in the object, `false` otherwise.
  119726. */
  119727. hasBoth: function (object, key1, key2)
  119728. {
  119729. return object.hasOwnProperty(key1) && object.hasOwnProperty(key2);
  119730. },
  119731. /**
  119732. * Check whether an object has at least one of the given properties.
  119733. *
  119734. * @method Phaser.GameObjects.Particles.EmitterOp#hasEither
  119735. * @since 3.0.0
  119736. *
  119737. * @param {object} object - The object to check.
  119738. * @param {string} key1 - The key of the first property to check the object for.
  119739. * @param {string} key2 - The key of the second property to check the object for.
  119740. *
  119741. * @return {boolean} `true` if at least one of the properties exists in the object, `false` if neither exist.
  119742. */
  119743. hasEither: function (object, key1, key2)
  119744. {
  119745. return object.hasOwnProperty(key1) || object.hasOwnProperty(key2);
  119746. },
  119747. /**
  119748. * The returned value sets what the property will be at the START of the particles life, on emit.
  119749. *
  119750. * @method Phaser.GameObjects.Particles.EmitterOp#defaultEmit
  119751. * @since 3.0.0
  119752. *
  119753. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  119754. * @param {string} key - The name of the property.
  119755. * @param {number} [value] - The current value of the property.
  119756. *
  119757. * @return {number} The new value of hte property.
  119758. */
  119759. defaultEmit: function (particle, key, value)
  119760. {
  119761. return value;
  119762. },
  119763. /**
  119764. * The returned value updates the property for the duration of the particles life.
  119765. *
  119766. * @method Phaser.GameObjects.Particles.EmitterOp#defaultUpdate
  119767. * @since 3.0.0
  119768. *
  119769. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  119770. * @param {string} key - The name of the property.
  119771. * @param {number} t - The T value (between 0 and 1)
  119772. * @param {number} value - The current value of the property.
  119773. *
  119774. * @return {number} The new value of the property.
  119775. */
  119776. defaultUpdate: function (particle, key, t, value)
  119777. {
  119778. return value;
  119779. },
  119780. /**
  119781. * An `onEmit` callback that returns the current value of the property.
  119782. *
  119783. * @method Phaser.GameObjects.Particles.EmitterOp#staticValueEmit
  119784. * @since 3.0.0
  119785. *
  119786. * @return {number} The current value of the property.
  119787. */
  119788. staticValueEmit: function ()
  119789. {
  119790. return this.propertyValue;
  119791. },
  119792. /**
  119793. * An `onUpdate` callback that returns the current value of the property.
  119794. *
  119795. * @method Phaser.GameObjects.Particles.EmitterOp#staticValueUpdate
  119796. * @since 3.0.0
  119797. *
  119798. * @return {number} The current value of the property.
  119799. */
  119800. staticValueUpdate: function ()
  119801. {
  119802. return this.propertyValue;
  119803. },
  119804. /**
  119805. * An `onEmit` callback that returns a random value from the current value array.
  119806. *
  119807. * @method Phaser.GameObjects.Particles.EmitterOp#randomStaticValueEmit
  119808. * @since 3.0.0
  119809. *
  119810. * @return {number} The new value of the property.
  119811. */
  119812. randomStaticValueEmit: function ()
  119813. {
  119814. var randomIndex = Math.floor(Math.random() * this.propertyValue.length);
  119815. return this.propertyValue[randomIndex];
  119816. },
  119817. /**
  119818. * An `onEmit` callback that returns a value between the {@link Phaser.GameObjects.Particles.EmitterOp#start} and
  119819. * {@link Phaser.GameObjects.Particles.EmitterOp#end} range.
  119820. *
  119821. * @method Phaser.GameObjects.Particles.EmitterOp#randomRangedValueEmit
  119822. * @since 3.0.0
  119823. *
  119824. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  119825. * @param {string} key - The key of the property.
  119826. *
  119827. * @return {number} The new value of the property.
  119828. */
  119829. randomRangedValueEmit: function (particle, key)
  119830. {
  119831. var value = FloatBetween(this.start, this.end);
  119832. if (particle && particle.data[key])
  119833. {
  119834. particle.data[key].min = value;
  119835. }
  119836. return value;
  119837. },
  119838. /**
  119839. * An `onEmit` callback that returns a stepped value between the
  119840. * {@link Phaser.GameObjects.Particles.EmitterOp#start} and {@link Phaser.GameObjects.Particles.EmitterOp#end}
  119841. * range.
  119842. *
  119843. * @method Phaser.GameObjects.Particles.EmitterOp#steppedEmit
  119844. * @since 3.0.0
  119845. *
  119846. * @return {number} The new value of the property.
  119847. */
  119848. steppedEmit: function ()
  119849. {
  119850. var current = this.counter;
  119851. var next = this.counter + (this.end - this.start) / this.steps;
  119852. this.counter = Wrap(next, this.start, this.end);
  119853. return current;
  119854. },
  119855. /**
  119856. * An `onEmit` callback that returns an eased value between the
  119857. * {@link Phaser.GameObjects.Particles.EmitterOp#start} and {@link Phaser.GameObjects.Particles.EmitterOp#end}
  119858. * range.
  119859. *
  119860. * @method Phaser.GameObjects.Particles.EmitterOp#easedValueEmit
  119861. * @since 3.0.0
  119862. *
  119863. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  119864. * @param {string} key - The name of the property.
  119865. *
  119866. * @return {number} The new value of the property.
  119867. */
  119868. easedValueEmit: function (particle, key)
  119869. {
  119870. if (particle && particle.data[key])
  119871. {
  119872. var data = particle.data[key];
  119873. data.min = this.start;
  119874. data.max = this.end;
  119875. }
  119876. return this.start;
  119877. },
  119878. /**
  119879. * An `onUpdate` callback that returns an eased value between the
  119880. * {@link Phaser.GameObjects.Particles.EmitterOp#start} and {@link Phaser.GameObjects.Particles.EmitterOp#end}
  119881. * range.
  119882. *
  119883. * @method Phaser.GameObjects.Particles.EmitterOp#easeValueUpdate
  119884. * @since 3.0.0
  119885. *
  119886. * @param {Phaser.GameObjects.Particles.Particle} particle - The particle.
  119887. * @param {string} key - The name of the property.
  119888. * @param {number} t - The T value (between 0 and 1)
  119889. *
  119890. * @return {number} The new value of the property.
  119891. */
  119892. easeValueUpdate: function (particle, key, t)
  119893. {
  119894. var data = particle.data[key];
  119895. return (data.max - data.min) * this.ease(t) + data.min;
  119896. }
  119897. });
  119898. module.exports = EmitterOp;
  119899. /***/ }),
  119900. /* 903 */
  119901. /***/ (function(module, exports, __webpack_require__) {
  119902. /**
  119903. * @author Richard Davey <rich@photonstorm.com>
  119904. * @copyright 2018 Photon Storm Ltd.
  119905. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119906. */
  119907. /**
  119908. * @namespace Phaser.GameObjects.Particles
  119909. */
  119910. module.exports = {
  119911. GravityWell: __webpack_require__(429),
  119912. Particle: __webpack_require__(428),
  119913. ParticleEmitter: __webpack_require__(427),
  119914. ParticleEmitterManager: __webpack_require__(241),
  119915. Zones: __webpack_require__(898)
  119916. };
  119917. /***/ }),
  119918. /* 904 */
  119919. /***/ (function(module, exports, __webpack_require__) {
  119920. /**
  119921. * @author Richard Davey <rich@photonstorm.com>
  119922. * @copyright 2018 Photon Storm Ltd.
  119923. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  119924. */
  119925. var GameObject = __webpack_require__(2);
  119926. /**
  119927. * Renders this Game Object with the Canvas Renderer to the given Camera.
  119928. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  119929. * This method should not be called directly. It is a utility function of the Render module.
  119930. *
  119931. * @method Phaser.GameObjects.DynamicBitmapText#renderCanvas
  119932. * @since 3.0.0
  119933. * @private
  119934. *
  119935. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  119936. * @param {Phaser.GameObjects.DynamicBitmapText} src - The Game Object being rendered in this call.
  119937. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  119938. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  119939. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  119940. */
  119941. var DynamicBitmapTextCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  119942. {
  119943. var text = src.text;
  119944. var textLength = text.length;
  119945. if (GameObject.RENDER_MASK !== src.renderFlags || textLength === 0 || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  119946. {
  119947. return;
  119948. }
  119949. var textureFrame = src.frame;
  119950. var displayCallback = src.displayCallback;
  119951. var cameraScrollX = camera.scrollX * src.scrollFactorX;
  119952. var cameraScrollY = camera.scrollY * src.scrollFactorY;
  119953. var chars = src.fontData.chars;
  119954. var lineHeight = src.fontData.lineHeight;
  119955. var xAdvance = 0;
  119956. var yAdvance = 0;
  119957. var indexCount = 0;
  119958. var charCode = 0;
  119959. var glyph = null;
  119960. var glyphX = 0;
  119961. var glyphY = 0;
  119962. var glyphW = 0;
  119963. var glyphH = 0;
  119964. var x = 0;
  119965. var y = 0;
  119966. var lastGlyph = null;
  119967. var lastCharCode = 0;
  119968. var ctx = renderer.currentContext;
  119969. var image = src.frame.source.image;
  119970. var textureX = textureFrame.cutX;
  119971. var textureY = textureFrame.cutY;
  119972. var rotation = 0;
  119973. var scale = (src.fontSize / src.fontData.size);
  119974. // Alpha
  119975. var alpha = camera.alpha * src.alpha;
  119976. if (alpha === 0)
  119977. {
  119978. // Nothing to see, so abort early
  119979. return;
  119980. }
  119981. else if (renderer.currentAlpha !== alpha)
  119982. {
  119983. renderer.currentAlpha = alpha;
  119984. ctx.globalAlpha = alpha;
  119985. }
  119986. // Blend Mode
  119987. if (renderer.currentBlendMode !== src.blendMode)
  119988. {
  119989. renderer.currentBlendMode = src.blendMode;
  119990. ctx.globalCompositeOperation = renderer.blendModes[src.blendMode];
  119991. }
  119992. // Alpha
  119993. if (renderer.currentAlpha !== src.alpha)
  119994. {
  119995. renderer.currentAlpha = src.alpha;
  119996. ctx.globalAlpha = src.alpha;
  119997. }
  119998. // Smoothing
  119999. if (renderer.currentScaleMode !== src.scaleMode)
  120000. {
  120001. renderer.currentScaleMode = src.scaleMode;
  120002. }
  120003. ctx.save();
  120004. if (parentMatrix !== undefined)
  120005. {
  120006. var matrix = parentMatrix.matrix;
  120007. ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  120008. }
  120009. ctx.translate(src.x, src.y);
  120010. ctx.rotate(src.rotation);
  120011. ctx.translate(-src.displayOriginX, -src.displayOriginY);
  120012. ctx.scale(src.scaleX, src.scaleY);
  120013. if (src.cropWidth > 0 && src.cropHeight > 0)
  120014. {
  120015. ctx.save();
  120016. ctx.beginPath();
  120017. ctx.rect(0, 0, src.cropWidth, src.cropHeight);
  120018. ctx.clip();
  120019. }
  120020. for (var index = 0; index < textLength; ++index)
  120021. {
  120022. // Reset the scale (in case the callback changed it)
  120023. scale = (src.fontSize / src.fontData.size);
  120024. rotation = 0;
  120025. charCode = text.charCodeAt(index);
  120026. if (charCode === 10)
  120027. {
  120028. xAdvance = 0;
  120029. indexCount = 0;
  120030. yAdvance += lineHeight;
  120031. lastGlyph = null;
  120032. continue;
  120033. }
  120034. glyph = chars[charCode];
  120035. if (!glyph)
  120036. {
  120037. continue;
  120038. }
  120039. glyphX = textureX + glyph.x;
  120040. glyphY = textureY + glyph.y;
  120041. glyphW = glyph.width;
  120042. glyphH = glyph.height;
  120043. x = (indexCount + glyph.xOffset + xAdvance) - src.scrollX;
  120044. y = (glyph.yOffset + yAdvance) - src.scrollY;
  120045. // This could be optimized so that it doesn't even bother drawing it if the x/y is out of range
  120046. if (lastGlyph !== null)
  120047. {
  120048. var kerningOffset = glyph.kerning[lastCharCode];
  120049. x += (kerningOffset !== undefined) ? kerningOffset : 0;
  120050. }
  120051. if (displayCallback)
  120052. {
  120053. var output = displayCallback({ tint: { topLeft: 0, topRight: 0, bottomLeft: 0, bottomRight: 0 }, index: index, charCode: charCode, x: x, y: y, scale: scale, rotation: 0, data: glyph.data });
  120054. x = output.x;
  120055. y = output.y;
  120056. scale = output.scale;
  120057. rotation = output.rotation;
  120058. }
  120059. x *= scale;
  120060. y *= scale;
  120061. x -= cameraScrollX;
  120062. y -= cameraScrollY;
  120063. if (camera.roundPixels)
  120064. {
  120065. x |= 0;
  120066. y |= 0;
  120067. }
  120068. ctx.save();
  120069. ctx.translate(x, y);
  120070. ctx.rotate(rotation);
  120071. ctx.scale(scale, scale);
  120072. ctx.drawImage(image, glyphX, glyphY, glyphW, glyphH, 0, 0, glyphW, glyphH);
  120073. ctx.restore();
  120074. xAdvance += glyph.xAdvance;
  120075. indexCount += 1;
  120076. lastGlyph = glyph;
  120077. lastCharCode = charCode;
  120078. }
  120079. if (src.cropWidth > 0 && src.cropHeight > 0)
  120080. {
  120081. ctx.restore();
  120082. }
  120083. ctx.restore();
  120084. };
  120085. module.exports = DynamicBitmapTextCanvasRenderer;
  120086. /***/ }),
  120087. /* 905 */
  120088. /***/ (function(module, exports, __webpack_require__) {
  120089. /**
  120090. * @author Richard Davey <rich@photonstorm.com>
  120091. * @copyright 2018 Photon Storm Ltd.
  120092. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120093. */
  120094. var GameObject = __webpack_require__(2);
  120095. var Utils = __webpack_require__(21);
  120096. /**
  120097. * Renders this Game Object with the WebGL Renderer to the given Camera.
  120098. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  120099. * This method should not be called directly. It is a utility function of the Render module.
  120100. *
  120101. * @method Phaser.GameObjects.DynamicBitmapText#renderWebGL
  120102. * @since 3.0.0
  120103. * @private
  120104. *
  120105. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  120106. * @param {Phaser.GameObjects.DynamicBitmapText} src - The Game Object being rendered in this call.
  120107. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  120108. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  120109. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  120110. */
  120111. var DynamicBitmapTextWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  120112. {
  120113. var text = src.text;
  120114. var textLength = text.length;
  120115. if (GameObject.RENDER_MASK !== src.renderFlags || textLength === 0 || (src.cameraFilter > 0 && (src.cameraFilter & camera._id)))
  120116. {
  120117. return;
  120118. }
  120119. var pipeline = this.pipeline;
  120120. renderer.setPipeline(pipeline, src);
  120121. var crop = (src.cropWidth > 0 || src.cropHeight > 0);
  120122. if (crop)
  120123. {
  120124. pipeline.flush();
  120125. renderer.pushScissor(
  120126. src.x,
  120127. src.y,
  120128. src.cropWidth * src.scaleX,
  120129. src.cropHeight * src.scaleY
  120130. );
  120131. }
  120132. var camMatrix = pipeline._tempMatrix1;
  120133. var spriteMatrix = pipeline._tempMatrix2;
  120134. var calcMatrix = pipeline._tempMatrix3;
  120135. var fontMatrix = pipeline._tempMatrix4;
  120136. spriteMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  120137. camMatrix.copyFrom(camera.matrix);
  120138. if (parentMatrix)
  120139. {
  120140. // Multiply the camera by the parent matrix
  120141. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  120142. // Undo the camera scroll
  120143. spriteMatrix.e = src.x;
  120144. spriteMatrix.f = src.y;
  120145. // Multiply by the Sprite matrix, store result in calcMatrix
  120146. camMatrix.multiply(spriteMatrix, calcMatrix);
  120147. }
  120148. else
  120149. {
  120150. spriteMatrix.e -= camera.scrollX * src.scrollFactorX;
  120151. spriteMatrix.f -= camera.scrollY * src.scrollFactorY;
  120152. // Multiply by the Sprite matrix, store result in calcMatrix
  120153. camMatrix.multiply(spriteMatrix, calcMatrix);
  120154. }
  120155. var frame = src.frame;
  120156. var texture = frame.glTexture;
  120157. var textureX = frame.cutX;
  120158. var textureY = frame.cutY;
  120159. var textureWidth = texture.width;
  120160. var textureHeight = texture.height;
  120161. var tintEffect = (src._isTinted && src.tintFill);
  120162. var tintTL = Utils.getTintAppendFloatAlpha(src._tintTL, camera.alpha * src._alphaTL);
  120163. var tintTR = Utils.getTintAppendFloatAlpha(src._tintTR, camera.alpha * src._alphaTR);
  120164. var tintBL = Utils.getTintAppendFloatAlpha(src._tintBL, camera.alpha * src._alphaBL);
  120165. var tintBR = Utils.getTintAppendFloatAlpha(src._tintBR, camera.alpha * src._alphaBR);
  120166. pipeline.setTexture2D(texture, 0);
  120167. var xAdvance = 0;
  120168. var yAdvance = 0;
  120169. var charCode = 0;
  120170. var lastCharCode = 0;
  120171. var letterSpacing = src.letterSpacing;
  120172. var glyph;
  120173. var glyphX = 0;
  120174. var glyphY = 0;
  120175. var glyphW = 0;
  120176. var glyphH = 0;
  120177. var lastGlyph;
  120178. var scrollX = src.scrollX;
  120179. var scrollY = src.scrollY;
  120180. var fontData = src.fontData;
  120181. var chars = fontData.chars;
  120182. var lineHeight = fontData.lineHeight;
  120183. var scale = (src.fontSize / fontData.size);
  120184. var rotation = 0;
  120185. var align = src._align;
  120186. var currentLine = 0;
  120187. var lineOffsetX = 0;
  120188. // Update the bounds - skipped internally if not dirty
  120189. src.getTextBounds(false);
  120190. var lineData = src._bounds.lines;
  120191. if (align === 1)
  120192. {
  120193. lineOffsetX = (lineData.longest - lineData.lengths[0]) / 2;
  120194. }
  120195. else if (align === 2)
  120196. {
  120197. lineOffsetX = (lineData.longest - lineData.lengths[0]);
  120198. }
  120199. var roundPixels = camera.roundPixels;
  120200. var displayCallback = src.displayCallback;
  120201. var callbackData = src.callbackData;
  120202. for (var i = 0; i < textLength; i++)
  120203. {
  120204. charCode = text.charCodeAt(i);
  120205. // Carriage-return
  120206. if (charCode === 10)
  120207. {
  120208. currentLine++;
  120209. if (align === 1)
  120210. {
  120211. lineOffsetX = (lineData.longest - lineData.lengths[currentLine]) / 2;
  120212. }
  120213. else if (align === 2)
  120214. {
  120215. lineOffsetX = (lineData.longest - lineData.lengths[currentLine]);
  120216. }
  120217. xAdvance = 0;
  120218. yAdvance += lineHeight;
  120219. lastGlyph = null;
  120220. continue;
  120221. }
  120222. glyph = chars[charCode];
  120223. if (!glyph)
  120224. {
  120225. continue;
  120226. }
  120227. glyphX = textureX + glyph.x;
  120228. glyphY = textureY + glyph.y;
  120229. glyphW = glyph.width;
  120230. glyphH = glyph.height;
  120231. var x = (glyph.xOffset + xAdvance) - scrollX;
  120232. var y = (glyph.yOffset + yAdvance) - scrollY;
  120233. if (lastGlyph !== null)
  120234. {
  120235. var kerningOffset = glyph.kerning[lastCharCode];
  120236. x += (kerningOffset !== undefined) ? kerningOffset : 0;
  120237. }
  120238. xAdvance += glyph.xAdvance + letterSpacing;
  120239. lastGlyph = glyph;
  120240. lastCharCode = charCode;
  120241. // Nothing to render or a space? Then skip to the next glyph
  120242. if (glyphW === 0 || glyphH === 0 || charCode === 32)
  120243. {
  120244. continue;
  120245. }
  120246. scale = (src.fontSize / src.fontData.size);
  120247. rotation = 0;
  120248. if (displayCallback)
  120249. {
  120250. callbackData.color = 0;
  120251. callbackData.tint.topLeft = tintTL;
  120252. callbackData.tint.topRight = tintTR;
  120253. callbackData.tint.bottomLeft = tintBL;
  120254. callbackData.tint.bottomRight = tintBR;
  120255. callbackData.index = i;
  120256. callbackData.charCode = charCode;
  120257. callbackData.x = x;
  120258. callbackData.y = y;
  120259. callbackData.scale = scale;
  120260. callbackData.rotation = rotation;
  120261. callbackData.data = glyph.data;
  120262. var output = displayCallback(callbackData);
  120263. x = output.x;
  120264. y = output.y;
  120265. scale = output.scale;
  120266. rotation = output.rotation;
  120267. if (output.color)
  120268. {
  120269. tintTL = output.color;
  120270. tintTR = output.color;
  120271. tintBL = output.color;
  120272. tintBR = output.color;
  120273. }
  120274. else
  120275. {
  120276. tintTL = output.tint.topLeft;
  120277. tintTR = output.tint.topRight;
  120278. tintBL = output.tint.bottomLeft;
  120279. tintBR = output.tint.bottomRight;
  120280. }
  120281. tintTL = Utils.getTintAppendFloatAlpha(tintTL, camera.alpha * src._alphaTL);
  120282. tintTR = Utils.getTintAppendFloatAlpha(tintTR, camera.alpha * src._alphaTR);
  120283. tintBL = Utils.getTintAppendFloatAlpha(tintBL, camera.alpha * src._alphaBL);
  120284. tintBR = Utils.getTintAppendFloatAlpha(tintBR, camera.alpha * src._alphaBR);
  120285. }
  120286. x *= scale;
  120287. y *= scale;
  120288. x -= src.displayOriginX;
  120289. y -= src.displayOriginY;
  120290. x += lineOffsetX;
  120291. fontMatrix.applyITRS(x, y, rotation, scale, scale);
  120292. calcMatrix.multiply(fontMatrix, spriteMatrix);
  120293. var u0 = glyphX / textureWidth;
  120294. var v0 = glyphY / textureHeight;
  120295. var u1 = (glyphX + glyphW) / textureWidth;
  120296. var v1 = (glyphY + glyphH) / textureHeight;
  120297. var xw = glyphW;
  120298. var yh = glyphH;
  120299. var tx0 = spriteMatrix.e;
  120300. var ty0 = spriteMatrix.f;
  120301. var tx1 = yh * spriteMatrix.c + spriteMatrix.e;
  120302. var ty1 = yh * spriteMatrix.d + spriteMatrix.f;
  120303. var tx2 = xw * spriteMatrix.a + yh * spriteMatrix.c + spriteMatrix.e;
  120304. var ty2 = xw * spriteMatrix.b + yh * spriteMatrix.d + spriteMatrix.f;
  120305. var tx3 = xw * spriteMatrix.a + spriteMatrix.e;
  120306. var ty3 = xw * spriteMatrix.b + spriteMatrix.f;
  120307. if (roundPixels)
  120308. {
  120309. tx0 |= 0;
  120310. ty0 |= 0;
  120311. tx1 |= 0;
  120312. ty1 |= 0;
  120313. tx2 |= 0;
  120314. ty2 |= 0;
  120315. tx3 |= 0;
  120316. ty3 |= 0;
  120317. }
  120318. pipeline.batchVertices(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect);
  120319. }
  120320. if (crop)
  120321. {
  120322. pipeline.flush();
  120323. renderer.popScissor();
  120324. }
  120325. };
  120326. module.exports = DynamicBitmapTextWebGLRenderer;
  120327. /***/ }),
  120328. /* 906 */
  120329. /***/ (function(module, exports, __webpack_require__) {
  120330. /**
  120331. * @author Richard Davey <rich@photonstorm.com>
  120332. * @copyright 2018 Photon Storm Ltd.
  120333. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120334. */
  120335. var renderWebGL = __webpack_require__(3);
  120336. var renderCanvas = __webpack_require__(3);
  120337. if (true)
  120338. {
  120339. renderWebGL = __webpack_require__(905);
  120340. }
  120341. if (true)
  120342. {
  120343. renderCanvas = __webpack_require__(904);
  120344. }
  120345. module.exports = {
  120346. renderWebGL: renderWebGL,
  120347. renderCanvas: renderCanvas
  120348. };
  120349. /***/ }),
  120350. /* 907 */
  120351. /***/ (function(module, exports, __webpack_require__) {
  120352. /**
  120353. * @author Richard Davey <rich@photonstorm.com>
  120354. * @author Felipe Alfonso <@bitnenfer>
  120355. * @copyright 2018 Photon Storm Ltd.
  120356. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120357. */
  120358. var GameObject = __webpack_require__(2);
  120359. /**
  120360. * Renders this Game Object with the Canvas Renderer to the given Camera.
  120361. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  120362. * This method should not be called directly. It is a utility function of the Render module.
  120363. *
  120364. * @method Phaser.GameObjects.Container#renderCanvas
  120365. * @since 3.4.0
  120366. * @private
  120367. *
  120368. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  120369. * @param {Phaser.GameObjects.Container} container - The Game Object being rendered in this call.
  120370. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  120371. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  120372. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  120373. */
  120374. var ContainerCanvasRenderer = function (renderer, container, interpolationPercentage, camera, parentMatrix)
  120375. {
  120376. if (GameObject.RENDER_MASK !== container.renderFlags || (container.cameraFilter > 0 && (container.cameraFilter & camera._id)))
  120377. {
  120378. return;
  120379. }
  120380. var children = container.list;
  120381. var transformMatrix = container.localTransform;
  120382. if (parentMatrix === undefined)
  120383. {
  120384. transformMatrix.applyITRS(container.x, container.y, container.rotation, container.scaleX, container.scaleY);
  120385. }
  120386. else
  120387. {
  120388. transformMatrix.loadIdentity();
  120389. transformMatrix.multiply(parentMatrix);
  120390. transformMatrix.translate(container.x, container.y);
  120391. transformMatrix.rotate(container.rotation);
  120392. transformMatrix.scale(container.scaleX, container.scaleY);
  120393. }
  120394. var alpha = container._alpha;
  120395. var scrollFactorX = container.scrollFactorX;
  120396. var scrollFactorY = container.scrollFactorY;
  120397. for (var index = 0; index < children.length; ++index)
  120398. {
  120399. var child = children[index];
  120400. var childAlpha = child._alpha;
  120401. var childScrollFactorX = child.scrollFactorX;
  120402. var childScrollFactorY = child.scrollFactorY;
  120403. child.setScrollFactor(childScrollFactorX * scrollFactorX, childScrollFactorY * scrollFactorY);
  120404. child.setAlpha(childAlpha * alpha);
  120405. child.renderCanvas(renderer, child, interpolationPercentage, camera, transformMatrix);
  120406. child.setAlpha(childAlpha);
  120407. child.setScrollFactor(childScrollFactorX, childScrollFactorY);
  120408. }
  120409. };
  120410. module.exports = ContainerCanvasRenderer;
  120411. /***/ }),
  120412. /* 908 */
  120413. /***/ (function(module, exports, __webpack_require__) {
  120414. /**
  120415. * @author Richard Davey <rich@photonstorm.com>
  120416. * @author Felipe Alfonso <@bitnenfer>
  120417. * @copyright 2018 Photon Storm Ltd.
  120418. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120419. */
  120420. var GameObject = __webpack_require__(2);
  120421. /**
  120422. * Renders this Game Object with the WebGL Renderer to the given Camera.
  120423. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  120424. * This method should not be called directly. It is a utility function of the Render module.
  120425. *
  120426. * @method Phaser.GameObjects.Container#renderWebGL
  120427. * @since 3.4.0
  120428. * @private
  120429. *
  120430. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  120431. * @param {Phaser.GameObjects.Container} container - The Game Object being rendered in this call.
  120432. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  120433. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  120434. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  120435. */
  120436. var ContainerWebGLRenderer = function (renderer, container, interpolationPercentage, camera, parentMatrix)
  120437. {
  120438. if (GameObject.RENDER_MASK !== container.renderFlags || (container.cameraFilter > 0 && (container.cameraFilter & camera._id)))
  120439. {
  120440. return;
  120441. }
  120442. var children = container.list;
  120443. var transformMatrix = container.localTransform;
  120444. if (parentMatrix === undefined)
  120445. {
  120446. transformMatrix.applyITRS(container.x, container.y, container.rotation, container.scaleX, container.scaleY);
  120447. }
  120448. else
  120449. {
  120450. transformMatrix.loadIdentity();
  120451. transformMatrix.multiply(parentMatrix);
  120452. transformMatrix.translate(container.x, container.y);
  120453. transformMatrix.rotate(container.rotation);
  120454. transformMatrix.scale(container.scaleX, container.scaleY);
  120455. }
  120456. var alpha = container._alpha;
  120457. var scrollFactorX = container.scrollFactorX;
  120458. var scrollFactorY = container.scrollFactorY;
  120459. for (var index = 0; index < children.length; ++index)
  120460. {
  120461. var child = children[index];
  120462. var childAlpha = child._alpha;
  120463. var childScrollFactorX = child.scrollFactorX;
  120464. var childScrollFactorY = child.scrollFactorY;
  120465. child.setScrollFactor(childScrollFactorX * scrollFactorX, childScrollFactorY * scrollFactorY);
  120466. child.setAlpha(childAlpha * alpha);
  120467. child.renderWebGL(renderer, child, interpolationPercentage, camera, transformMatrix);
  120468. child.setAlpha(childAlpha);
  120469. child.setScrollFactor(childScrollFactorX, childScrollFactorY);
  120470. }
  120471. };
  120472. module.exports = ContainerWebGLRenderer;
  120473. /***/ }),
  120474. /* 909 */
  120475. /***/ (function(module, exports, __webpack_require__) {
  120476. /**
  120477. * @author Richard Davey <rich@photonstorm.com>
  120478. * @author Felipe Alfonso <@bitnenfer>
  120479. * @copyright 2018 Photon Storm Ltd.
  120480. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120481. */
  120482. var renderWebGL = __webpack_require__(3);
  120483. var renderCanvas = __webpack_require__(3);
  120484. if (true)
  120485. {
  120486. renderWebGL = __webpack_require__(908);
  120487. }
  120488. if (true)
  120489. {
  120490. renderCanvas = __webpack_require__(907);
  120491. }
  120492. module.exports = {
  120493. renderWebGL: renderWebGL,
  120494. renderCanvas: renderCanvas
  120495. };
  120496. /***/ }),
  120497. /* 910 */
  120498. /***/ (function(module, exports, __webpack_require__) {
  120499. /**
  120500. * @author Richard Davey <rich@photonstorm.com>
  120501. * @copyright 2018 Photon Storm Ltd.
  120502. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120503. */
  120504. var Class = __webpack_require__(0);
  120505. /**
  120506. * @classdesc
  120507. * A Bob Game Object.
  120508. *
  120509. * A Bob belongs to a Blitter Game Object. The Blitter is responsible for managing and rendering this object.
  120510. *
  120511. * A Bob has a position, alpha value and a frame from a texture that it uses to render with. You can also toggle
  120512. * the flipped and visible state of the Bob. The Frame the Bob uses to render can be changed dynamically, but it
  120513. * must be a Frame within the Texture used by the parent Blitter.
  120514. *
  120515. * Bob positions are relative to the Blitter parent. So if you move the Blitter parent, all Bob children will
  120516. * have their positions impacted by this change as well.
  120517. *
  120518. * You can manipulate Bob objects directly from your game code, but the creation and destruction of them should be
  120519. * handled via the Blitter parent.
  120520. *
  120521. * @class Bob
  120522. * @memberOf Phaser.GameObjects.Blitter
  120523. * @constructor
  120524. * @since 3.0.0
  120525. *
  120526. * @param {Phaser.GameObjects.Blitter} blitter - The parent Blitter object is responsible for updating this Bob.
  120527. * @param {number} x - The horizontal position of this Game Object in the world, relative to the parent Blitter position.
  120528. * @param {number} y - The vertical position of this Game Object in the world, relative to the parent Blitter position.
  120529. * @param {(string|integer)} frame - The Frame this Bob will render with, as defined in the Texture the parent Blitter is using.
  120530. * @param {boolean} visible - Should the Bob render visible or not to start with?
  120531. */
  120532. var Bob = new Class({
  120533. initialize:
  120534. function Bob (blitter, x, y, frame, visible)
  120535. {
  120536. /**
  120537. * The Blitter object that this Bob belongs to.
  120538. *
  120539. * @name Phaser.GameObjects.Blitter.Bob#parent
  120540. * @type {Phaser.GameObjects.Blitter}
  120541. * @since 3.0.0
  120542. */
  120543. this.parent = blitter;
  120544. /**
  120545. * The x position of this Bob, relative to the x position of the Blitter.
  120546. *
  120547. * @name Phaser.GameObjects.Blitter.Bob#x
  120548. * @type {number}
  120549. * @since 3.0.0
  120550. */
  120551. this.x = x;
  120552. /**
  120553. * The y position of this Bob, relative to the y position of the Blitter.
  120554. *
  120555. * @name Phaser.GameObjects.Blitter.Bob#y
  120556. * @type {number}
  120557. * @since 3.0.0
  120558. */
  120559. this.y = y;
  120560. /**
  120561. * The frame that the Bob uses to render with.
  120562. * To change the frame use the `Bob.setFrame` method.
  120563. *
  120564. * @name Phaser.GameObjects.Blitter.Bob#frame
  120565. * @type {Phaser.Textures.Frame}
  120566. * @protected
  120567. * @since 3.0.0
  120568. */
  120569. this.frame = frame;
  120570. /**
  120571. * A blank object which can be used to store data related to this Bob in.
  120572. *
  120573. * @name Phaser.GameObjects.Blitter.Bob#data
  120574. * @type {object}
  120575. * @default {}
  120576. * @since 3.0.0
  120577. */
  120578. this.data = {};
  120579. /**
  120580. * The visible state of this Bob.
  120581. *
  120582. * @name Phaser.GameObjects.Blitter.Bob#_visible
  120583. * @type {boolean}
  120584. * @private
  120585. * @since 3.0.0
  120586. */
  120587. this._visible = visible;
  120588. /**
  120589. * The alpha value of this Bob.
  120590. *
  120591. * @name Phaser.GameObjects.Blitter.Bob#_alpha
  120592. * @type {number}
  120593. * @private
  120594. * @default 1
  120595. * @since 3.0.0
  120596. */
  120597. this._alpha = 1;
  120598. /**
  120599. * The horizontally flipped state of the Bob.
  120600. * A Bob that is flipped horizontally will render inversed on the horizontal axis.
  120601. * Flipping always takes place from the middle of the texture.
  120602. *
  120603. * @name Phaser.GameObjects.Blitter.Bob#flipX
  120604. * @type {boolean}
  120605. * @since 3.0.0
  120606. */
  120607. this.flipX = false;
  120608. /**
  120609. * The vertically flipped state of the Bob.
  120610. * A Bob that is flipped vertically will render inversed on the vertical axis (i.e. upside down)
  120611. * Flipping always takes place from the middle of the texture.
  120612. *
  120613. * @name Phaser.GameObjects.Blitter.Bob#flipY
  120614. * @type {boolean}
  120615. * @since 3.0.0
  120616. */
  120617. this.flipY = false;
  120618. },
  120619. /**
  120620. * Changes the Texture Frame being used by this Bob.
  120621. * The frame must be part of the Texture the parent Blitter is using.
  120622. * If no value is given it will use the default frame of the Blitter parent.
  120623. *
  120624. * @method Phaser.GameObjects.Blitter.Bob#setFrame
  120625. * @since 3.0.0
  120626. *
  120627. * @param {(string|integer|Phaser.Textures.Frame)} [frame] - The frame to be used during rendering.
  120628. *
  120629. * @return {Phaser.GameObjects.Blitter.Bob} This Bob Game Object.
  120630. */
  120631. setFrame: function (frame)
  120632. {
  120633. if (frame === undefined)
  120634. {
  120635. this.frame = this.parent.frame;
  120636. }
  120637. else
  120638. {
  120639. this.frame = this.parent.texture.get(frame);
  120640. }
  120641. return this;
  120642. },
  120643. /**
  120644. * Resets the horizontal and vertical flipped state of this Bob back to their default un-flipped state.
  120645. *
  120646. * @method Phaser.GameObjects.Blitter.Bob#resetFlip
  120647. * @since 3.0.0
  120648. *
  120649. * @return {Phaser.GameObjects.Blitter.Bob} This Bob Game Object.
  120650. */
  120651. resetFlip: function ()
  120652. {
  120653. this.flipX = false;
  120654. this.flipY = false;
  120655. return this;
  120656. },
  120657. /**
  120658. * Resets this Bob.
  120659. *
  120660. * Changes the position to the values given, and optionally changes the frame.
  120661. *
  120662. * Also resets the flipX and flipY values, sets alpha back to 1 and visible to true.
  120663. *
  120664. * @method Phaser.GameObjects.Blitter.Bob#reset
  120665. * @since 3.0.0
  120666. *
  120667. * @param {number} x - The x position of the Bob. Bob coordinate are relative to the position of the Blitter object.
  120668. * @param {number} y - The y position of the Bob. Bob coordinate are relative to the position of the Blitter object.
  120669. * @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.
  120670. *
  120671. * @return {Phaser.GameObjects.Blitter.Bob} This Bob Game Object.
  120672. */
  120673. reset: function (x, y, frame)
  120674. {
  120675. this.x = x;
  120676. this.y = y;
  120677. this.flipX = false;
  120678. this.flipY = false;
  120679. this._alpha = 1;
  120680. this._visible = true;
  120681. this.parent.dirty = true;
  120682. if (frame)
  120683. {
  120684. this.setFrame(frame);
  120685. }
  120686. return this;
  120687. },
  120688. /**
  120689. * Sets the horizontal flipped state of this Bob.
  120690. *
  120691. * @method Phaser.GameObjects.Blitter.Bob#setFlipX
  120692. * @since 3.0.0
  120693. *
  120694. * @param {boolean} value - The flipped state. `false` for no flip, or `true` to be flipped.
  120695. *
  120696. * @return {Phaser.GameObjects.Blitter.Bob} This Bob Game Object.
  120697. */
  120698. setFlipX: function (value)
  120699. {
  120700. this.flipX = value;
  120701. return this;
  120702. },
  120703. /**
  120704. * Sets the vertical flipped state of this Bob.
  120705. *
  120706. * @method Phaser.GameObjects.Blitter.Bob#setFlipY
  120707. * @since 3.0.0
  120708. *
  120709. * @param {boolean} value - The flipped state. `false` for no flip, or `true` to be flipped.
  120710. *
  120711. * @return {Phaser.GameObjects.Blitter.Bob} This Bob Game Object.
  120712. */
  120713. setFlipY: function (value)
  120714. {
  120715. this.flipY = value;
  120716. return this;
  120717. },
  120718. /**
  120719. * Sets the horizontal and vertical flipped state of this Bob.
  120720. *
  120721. * @method Phaser.GameObjects.Blitter.Bob#setFlip
  120722. * @since 3.0.0
  120723. *
  120724. * @param {boolean} x - The horizontal flipped state. `false` for no flip, or `true` to be flipped.
  120725. * @param {boolean} y - The horizontal flipped state. `false` for no flip, or `true` to be flipped.
  120726. *
  120727. * @return {Phaser.GameObjects.Blitter.Bob} This Bob Game Object.
  120728. */
  120729. setFlip: function (x, y)
  120730. {
  120731. this.flipX = x;
  120732. this.flipY = y;
  120733. return this;
  120734. },
  120735. /**
  120736. * Sets the visibility of this Bob.
  120737. *
  120738. * An invisible Bob will skip rendering.
  120739. *
  120740. * @method Phaser.GameObjects.Blitter.Bob#setVisible
  120741. * @since 3.0.0
  120742. *
  120743. * @param {boolean} value - The visible state of the Game Object.
  120744. *
  120745. * @return {Phaser.GameObjects.Blitter.Bob} This Bob Game Object.
  120746. */
  120747. setVisible: function (value)
  120748. {
  120749. this.visible = value;
  120750. return this;
  120751. },
  120752. /**
  120753. * Set the Alpha level of this Bob. The alpha controls the opacity of the Game Object as it renders.
  120754. * Alpha values are provided as a float between 0, fully transparent, and 1, fully opaque.
  120755. *
  120756. * A Bob with alpha 0 will skip rendering.
  120757. *
  120758. * @method Phaser.GameObjects.Blitter.Bob#setAlpha
  120759. * @since 3.0.0
  120760. *
  120761. * @param {number} value - The alpha value used for this Bob. Between 0 and 1.
  120762. *
  120763. * @return {Phaser.GameObjects.Blitter.Bob} This Bob Game Object.
  120764. */
  120765. setAlpha: function (value)
  120766. {
  120767. this.alpha = value;
  120768. return this;
  120769. },
  120770. /**
  120771. * Destroys this Bob instance.
  120772. * Removes itself from the Blitter and clears the parent, frame and data properties.
  120773. *
  120774. * @method Phaser.GameObjects.Blitter.Bob#destroy
  120775. * @since 3.0.0
  120776. */
  120777. destroy: function ()
  120778. {
  120779. this.parent.dirty = true;
  120780. this.parent.children.remove(this);
  120781. this.parent = undefined;
  120782. this.frame = undefined;
  120783. this.data = undefined;
  120784. },
  120785. /**
  120786. * The visible state of the Bob.
  120787. *
  120788. * An invisible Bob will skip rendering.
  120789. *
  120790. * @name Phaser.GameObjects.Blitter.Bob#visible
  120791. * @type {boolean}
  120792. * @since 3.0.0
  120793. */
  120794. visible: {
  120795. get: function ()
  120796. {
  120797. return this._visible;
  120798. },
  120799. set: function (value)
  120800. {
  120801. this._visible = value;
  120802. this.parent.dirty = true;
  120803. }
  120804. },
  120805. /**
  120806. * The alpha value of the Bob, between 0 and 1.
  120807. *
  120808. * A Bob with alpha 0 will skip rendering.
  120809. *
  120810. * @name Phaser.GameObjects.Blitter.Bob#alpha
  120811. * @type {number}
  120812. * @since 3.0.0
  120813. */
  120814. alpha: {
  120815. get: function ()
  120816. {
  120817. return this._alpha;
  120818. },
  120819. set: function (value)
  120820. {
  120821. this._alpha = value;
  120822. this.parent.dirty = true;
  120823. }
  120824. }
  120825. });
  120826. module.exports = Bob;
  120827. /***/ }),
  120828. /* 911 */
  120829. /***/ (function(module, exports, __webpack_require__) {
  120830. /**
  120831. * @author Richard Davey <rich@photonstorm.com>
  120832. * @copyright 2018 Photon Storm Ltd.
  120833. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120834. */
  120835. var GameObject = __webpack_require__(2);
  120836. /**
  120837. * Renders this Game Object with the Canvas Renderer to the given Camera.
  120838. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  120839. * This method should not be called directly. It is a utility function of the Render module.
  120840. *
  120841. * @method Phaser.GameObjects.Blitter#renderCanvas
  120842. * @since 3.0.0
  120843. * @private
  120844. *
  120845. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  120846. * @param {Phaser.GameObjects.Blitter} src - The Game Object being rendered in this call.
  120847. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  120848. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  120849. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  120850. */
  120851. var BlitterCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  120852. {
  120853. var list = src.getRenderList();
  120854. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)) || list.length === 0)
  120855. {
  120856. return;
  120857. }
  120858. var ctx = renderer.gameContext;
  120859. // Alpha
  120860. var alpha = camera.alpha * src.alpha;
  120861. if (alpha === 0)
  120862. {
  120863. // Nothing to see, so abort early
  120864. return;
  120865. }
  120866. else if (renderer.currentAlpha !== alpha)
  120867. {
  120868. renderer.currentAlpha = alpha;
  120869. ctx.globalAlpha = alpha;
  120870. }
  120871. // Blend Mode
  120872. renderer.setBlendMode(src.blendMode);
  120873. var cameraScrollX = src.x - camera.scrollX * src.scrollFactorX;
  120874. var cameraScrollY = src.y - camera.scrollY * src.scrollFactorY;
  120875. ctx.save();
  120876. if (parentMatrix !== undefined)
  120877. {
  120878. var matrix = parentMatrix.matrix;
  120879. ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  120880. }
  120881. // Render bobs
  120882. for (var i = 0; i < list.length; i++)
  120883. {
  120884. var bob = list[i];
  120885. var flip = (bob.flipX || bob.flipY);
  120886. var frame = bob.frame;
  120887. var cd = frame.canvasData;
  120888. var dx = frame.x;
  120889. var dy = frame.y;
  120890. var fx = 1;
  120891. var fy = 1;
  120892. var bobAlpha = bob.alpha * alpha;
  120893. if (bobAlpha === 0)
  120894. {
  120895. continue;
  120896. }
  120897. else if (renderer.currentAlpha !== bobAlpha)
  120898. {
  120899. renderer.currentAlpha = bobAlpha;
  120900. ctx.globalAlpha = bobAlpha;
  120901. }
  120902. if (!flip)
  120903. {
  120904. renderer.blitImage(dx + bob.x + cameraScrollX, dy + bob.y + cameraScrollY, bob.frame);
  120905. }
  120906. else
  120907. {
  120908. if (bob.flipX)
  120909. {
  120910. fx = -1;
  120911. dx -= cd.dWidth;
  120912. }
  120913. if (bob.flipY)
  120914. {
  120915. fy = -1;
  120916. dy -= cd.dHeight;
  120917. }
  120918. ctx.save();
  120919. ctx.translate(bob.x + cameraScrollX, bob.y + cameraScrollY);
  120920. ctx.scale(fx, fy);
  120921. ctx.drawImage(frame.source.image, cd.sx, cd.sy, cd.sWidth, cd.sHeight, dx, dy, cd.dWidth, cd.dHeight);
  120922. ctx.restore();
  120923. }
  120924. }
  120925. ctx.restore();
  120926. };
  120927. module.exports = BlitterCanvasRenderer;
  120928. /***/ }),
  120929. /* 912 */
  120930. /***/ (function(module, exports, __webpack_require__) {
  120931. /**
  120932. * @author Richard Davey <rich@photonstorm.com>
  120933. * @copyright 2018 Photon Storm Ltd.
  120934. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  120935. */
  120936. var GameObject = __webpack_require__(2);
  120937. var Utils = __webpack_require__(21);
  120938. /**
  120939. * Renders this Game Object with the WebGL Renderer to the given Camera.
  120940. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  120941. * This method should not be called directly. It is a utility function of the Render module.
  120942. *
  120943. * @method Phaser.GameObjects.Blitter#renderWebGL
  120944. * @since 3.0.0
  120945. * @private
  120946. *
  120947. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  120948. * @param {Phaser.GameObjects.Blitter} src - The Game Object being rendered in this call.
  120949. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  120950. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  120951. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  120952. */
  120953. var BlitterWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  120954. {
  120955. if (GameObject.RENDER_MASK !== src.renderFlags || (src.cameraFilter > 0 && (src.cameraFilter & camera._id)))
  120956. {
  120957. return;
  120958. }
  120959. var pipeline = this.pipeline;
  120960. renderer.setPipeline(pipeline, src);
  120961. var cameraScrollX = camera.scrollX * src.scrollFactorX;
  120962. var cameraScrollY = camera.scrollY * src.scrollFactorY;
  120963. var matrix = pipeline._tempMatrix1;
  120964. matrix.copyFrom(camera.matrix);
  120965. if (parentMatrix)
  120966. {
  120967. matrix.multiplyWithOffset(parentMatrix, -cameraScrollX, -cameraScrollY);
  120968. cameraScrollX = 0;
  120969. cameraScrollY = 0;
  120970. }
  120971. var list = src.getRenderList();
  120972. var blitterX = src.x - cameraScrollX;
  120973. var blitterY = src.y - cameraScrollY;
  120974. var prevTextureSourceIndex = -1;
  120975. var tintEffect = false;
  120976. var alpha = camera.alpha * src.alpha;
  120977. var roundPixels = camera.roundPixels;
  120978. for (var index = 0; index < list.length; index++)
  120979. {
  120980. var bob = list[index];
  120981. var frame = bob.frame;
  120982. var bobAlpha = bob.alpha * alpha;
  120983. if (bobAlpha === 0)
  120984. {
  120985. continue;
  120986. }
  120987. var width = frame.width;
  120988. var height = frame.height;
  120989. var x = blitterX + bob.x + frame.x;
  120990. var y = blitterY + bob.y + frame.y;
  120991. if (bob.flipX)
  120992. {
  120993. width *= -1;
  120994. x += frame.width;
  120995. }
  120996. if (bob.flipY)
  120997. {
  120998. height *= -1;
  120999. y += frame.height;
  121000. }
  121001. var xw = x + width;
  121002. var yh = y + height;
  121003. var tx0 = x * matrix.a + y * matrix.c + matrix.e;
  121004. var ty0 = x * matrix.b + y * matrix.d + matrix.f;
  121005. var tx1 = xw * matrix.a + yh * matrix.c + matrix.e;
  121006. var ty1 = xw * matrix.b + yh * matrix.d + matrix.f;
  121007. var tint = Utils.getTintAppendFloatAlpha(0xffffff, bobAlpha);
  121008. // Bind texture only if the Texture Source is different from before
  121009. if (frame.sourceIndex !== prevTextureSourceIndex)
  121010. {
  121011. pipeline.setTexture2D(frame.glTexture, 0);
  121012. prevTextureSourceIndex = frame.sourceIndex;
  121013. }
  121014. if (roundPixels)
  121015. {
  121016. tx0 |= 0;
  121017. ty0 |= 0;
  121018. tx1 |= 0;
  121019. ty1 |= 0;
  121020. }
  121021. // TL x/y, BL x/y, BR x/y, TR x/y
  121022. if (pipeline.batchVertices(tx0, ty0, tx0, ty1, tx1, ty1, tx1, ty0, frame.u0, frame.v0, frame.u1, frame.v1, tint, tint, tint, tint, tintEffect))
  121023. {
  121024. prevTextureSourceIndex = -1;
  121025. }
  121026. }
  121027. };
  121028. module.exports = BlitterWebGLRenderer;
  121029. /***/ }),
  121030. /* 913 */
  121031. /***/ (function(module, exports, __webpack_require__) {
  121032. /**
  121033. * @author Richard Davey <rich@photonstorm.com>
  121034. * @copyright 2018 Photon Storm Ltd.
  121035. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121036. */
  121037. var renderWebGL = __webpack_require__(3);
  121038. var renderCanvas = __webpack_require__(3);
  121039. if (true)
  121040. {
  121041. renderWebGL = __webpack_require__(912);
  121042. }
  121043. if (true)
  121044. {
  121045. renderCanvas = __webpack_require__(911);
  121046. }
  121047. module.exports = {
  121048. renderWebGL: renderWebGL,
  121049. renderCanvas: renderCanvas
  121050. };
  121051. /***/ }),
  121052. /* 914 */
  121053. /***/ (function(module, exports, __webpack_require__) {
  121054. /**
  121055. * @author Richard Davey <rich@photonstorm.com>
  121056. * @copyright 2018 Photon Storm Ltd.
  121057. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121058. */
  121059. var GameObject = __webpack_require__(2);
  121060. /**
  121061. * Renders this Game Object with the Canvas Renderer to the given Camera.
  121062. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  121063. * This method should not be called directly. It is a utility function of the Render module.
  121064. *
  121065. * @method Phaser.GameObjects.BitmapText#renderCanvas
  121066. * @since 3.0.0
  121067. * @private
  121068. *
  121069. * @param {Phaser.Renderer.Canvas.CanvasRenderer} renderer - A reference to the current active Canvas renderer.
  121070. * @param {Phaser.GameObjects.BitmapText} src - The Game Object being rendered in this call.
  121071. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  121072. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  121073. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  121074. */
  121075. var BitmapTextCanvasRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  121076. {
  121077. var text = src._text;
  121078. var textLength = text.length;
  121079. if (GameObject.RENDER_MASK !== src.renderFlags || textLength === 0 || (src.cameraFilter > 0 && (src.cameraFilter & camera.id)))
  121080. {
  121081. return;
  121082. }
  121083. var textureFrame = src.frame;
  121084. var chars = src.fontData.chars;
  121085. var lineHeight = src.fontData.lineHeight;
  121086. var letterSpacing = src._letterSpacing;
  121087. var xAdvance = 0;
  121088. var yAdvance = 0;
  121089. var charCode = 0;
  121090. var glyph = null;
  121091. var glyphX = 0;
  121092. var glyphY = 0;
  121093. var glyphW = 0;
  121094. var glyphH = 0;
  121095. var x = 0;
  121096. var y = 0;
  121097. var lastGlyph = null;
  121098. var lastCharCode = 0;
  121099. var ctx = renderer.currentContext;
  121100. var image = src.frame.source.image;
  121101. var textureX = textureFrame.cutX;
  121102. var textureY = textureFrame.cutY;
  121103. var scale = (src._fontSize / src.fontData.size);
  121104. var align = src._align;
  121105. var currentLine = 0;
  121106. var lineOffsetX = 0;
  121107. // Update the bounds - skipped internally if not dirty
  121108. src.getTextBounds(false);
  121109. var lineData = src._bounds.lines;
  121110. if (align === 1)
  121111. {
  121112. lineOffsetX = (lineData.longest - lineData.lengths[0]) / 2;
  121113. }
  121114. else if (align === 2)
  121115. {
  121116. lineOffsetX = (lineData.longest - lineData.lengths[0]);
  121117. }
  121118. // Alpha
  121119. var alpha = camera.alpha * src.alpha;
  121120. if (alpha === 0)
  121121. {
  121122. // Nothing to see, so abort early
  121123. return;
  121124. }
  121125. else if (renderer.currentAlpha !== alpha)
  121126. {
  121127. renderer.currentAlpha = alpha;
  121128. ctx.globalAlpha = alpha;
  121129. }
  121130. // Blend Mode
  121131. if (renderer.currentBlendMode !== src.blendMode)
  121132. {
  121133. renderer.currentBlendMode = src.blendMode;
  121134. ctx.globalCompositeOperation = renderer.blendModes[src.blendMode];
  121135. }
  121136. // Smoothing
  121137. if (renderer.currentScaleMode !== src.scaleMode)
  121138. {
  121139. renderer.currentScaleMode = src.scaleMode;
  121140. }
  121141. var tx = (src.x - camera.scrollX * src.scrollFactorX) + src.frame.x;
  121142. var ty = (src.y - camera.scrollY * src.scrollFactorY) + src.frame.y;
  121143. var roundPixels = camera.roundPixels;
  121144. if (roundPixels)
  121145. {
  121146. tx |= 0;
  121147. ty |= 0;
  121148. }
  121149. ctx.save();
  121150. if (parentMatrix !== undefined)
  121151. {
  121152. var matrix = parentMatrix.matrix;
  121153. ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
  121154. }
  121155. ctx.translate(tx, ty);
  121156. ctx.rotate(src.rotation);
  121157. ctx.translate(-src.displayOriginX, -src.displayOriginY);
  121158. ctx.scale(src.scaleX, src.scaleY);
  121159. for (var i = 0; i < textLength; i++)
  121160. {
  121161. charCode = text.charCodeAt(i);
  121162. if (charCode === 10)
  121163. {
  121164. currentLine++;
  121165. if (align === 1)
  121166. {
  121167. lineOffsetX = (lineData.longest - lineData.lengths[currentLine]) / 2;
  121168. }
  121169. else if (align === 2)
  121170. {
  121171. lineOffsetX = (lineData.longest - lineData.lengths[currentLine]);
  121172. }
  121173. xAdvance = 0;
  121174. yAdvance += lineHeight;
  121175. lastGlyph = null;
  121176. continue;
  121177. }
  121178. glyph = chars[charCode];
  121179. if (!glyph)
  121180. {
  121181. continue;
  121182. }
  121183. glyphX = textureX + glyph.x;
  121184. glyphY = textureY + glyph.y;
  121185. glyphW = glyph.width;
  121186. glyphH = glyph.height;
  121187. x = glyph.xOffset + xAdvance;
  121188. y = glyph.yOffset + yAdvance;
  121189. if (lastGlyph !== null)
  121190. {
  121191. var kerningOffset = glyph.kerning[lastCharCode];
  121192. x += (kerningOffset !== undefined) ? kerningOffset : 0;
  121193. }
  121194. x *= scale;
  121195. y *= scale;
  121196. x += lineOffsetX;
  121197. xAdvance += glyph.xAdvance + letterSpacing;
  121198. lastGlyph = glyph;
  121199. lastCharCode = charCode;
  121200. // Nothing to render or a space? Then skip to the next glyph
  121201. if (glyphW === 0 || glyphH === 0 || charCode === 32)
  121202. {
  121203. continue;
  121204. }
  121205. if (roundPixels)
  121206. {
  121207. x |= 0;
  121208. y |= 0;
  121209. }
  121210. ctx.save();
  121211. ctx.translate(x, y);
  121212. ctx.scale(scale, scale);
  121213. ctx.drawImage(image, glyphX, glyphY, glyphW, glyphH, 0, 0, glyphW, glyphH);
  121214. ctx.restore();
  121215. }
  121216. ctx.restore();
  121217. };
  121218. module.exports = BitmapTextCanvasRenderer;
  121219. /***/ }),
  121220. /* 915 */
  121221. /***/ (function(module, exports, __webpack_require__) {
  121222. /**
  121223. * @author Richard Davey <rich@photonstorm.com>
  121224. * @copyright 2018 Photon Storm Ltd.
  121225. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121226. */
  121227. var GameObject = __webpack_require__(2);
  121228. var Utils = __webpack_require__(21);
  121229. /**
  121230. * Renders this Game Object with the WebGL Renderer to the given Camera.
  121231. * The object will not render if any of its renderFlags are set or it is being actively filtered out by the Camera.
  121232. * This method should not be called directly. It is a utility function of the Render module.
  121233. *
  121234. * @method Phaser.GameObjects.BitmapText#renderWebGL
  121235. * @since 3.0.0
  121236. * @private
  121237. *
  121238. * @param {Phaser.Renderer.WebGL.WebGLRenderer} renderer - A reference to the current active WebGL renderer.
  121239. * @param {Phaser.GameObjects.BitmapText} src - The Game Object being rendered in this call.
  121240. * @param {number} interpolationPercentage - Reserved for future use and custom pipelines.
  121241. * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera that is rendering the Game Object.
  121242. * @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - This transform matrix is defined if the game object is nested
  121243. */
  121244. var BitmapTextWebGLRenderer = function (renderer, src, interpolationPercentage, camera, parentMatrix)
  121245. {
  121246. var text = src._text;
  121247. var textLength = text.length;
  121248. if (GameObject.RENDER_MASK !== src.renderFlags || textLength === 0 || (src.cameraFilter > 0 && (src.cameraFilter & camera._id)))
  121249. {
  121250. return;
  121251. }
  121252. var pipeline = this.pipeline;
  121253. renderer.setPipeline(pipeline, src);
  121254. var camMatrix = pipeline._tempMatrix1;
  121255. var spriteMatrix = pipeline._tempMatrix2;
  121256. var calcMatrix = pipeline._tempMatrix3;
  121257. spriteMatrix.applyITRS(src.x, src.y, src.rotation, src.scaleX, src.scaleY);
  121258. camMatrix.copyFrom(camera.matrix);
  121259. if (parentMatrix)
  121260. {
  121261. // Multiply the camera by the parent matrix
  121262. camMatrix.multiplyWithOffset(parentMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
  121263. // Undo the camera scroll
  121264. spriteMatrix.e = src.x;
  121265. spriteMatrix.f = src.y;
  121266. // Multiply by the Sprite matrix, store result in calcMatrix
  121267. camMatrix.multiply(spriteMatrix, calcMatrix);
  121268. }
  121269. else
  121270. {
  121271. spriteMatrix.e -= camera.scrollX * src.scrollFactorX;
  121272. spriteMatrix.f -= camera.scrollY * src.scrollFactorY;
  121273. // Multiply by the Sprite matrix, store result in calcMatrix
  121274. camMatrix.multiply(spriteMatrix, calcMatrix);
  121275. }
  121276. var frame = src.frame;
  121277. var texture = frame.glTexture;
  121278. var textureX = frame.cutX;
  121279. var textureY = frame.cutY;
  121280. var textureWidth = texture.width;
  121281. var textureHeight = texture.height;
  121282. var tintEffect = (src._isTinted && src.tintFill);
  121283. var tintTL = Utils.getTintAppendFloatAlpha(src._tintTL, camera.alpha * src._alphaTL);
  121284. var tintTR = Utils.getTintAppendFloatAlpha(src._tintTR, camera.alpha * src._alphaTR);
  121285. var tintBL = Utils.getTintAppendFloatAlpha(src._tintBL, camera.alpha * src._alphaBL);
  121286. var tintBR = Utils.getTintAppendFloatAlpha(src._tintBR, camera.alpha * src._alphaBR);
  121287. pipeline.setTexture2D(texture, 0);
  121288. var xAdvance = 0;
  121289. var yAdvance = 0;
  121290. var charCode = 0;
  121291. var lastCharCode = 0;
  121292. var letterSpacing = src._letterSpacing;
  121293. var glyph;
  121294. var glyphX = 0;
  121295. var glyphY = 0;
  121296. var glyphW = 0;
  121297. var glyphH = 0;
  121298. var lastGlyph;
  121299. var fontData = src.fontData;
  121300. var chars = fontData.chars;
  121301. var lineHeight = fontData.lineHeight;
  121302. var scale = (src._fontSize / fontData.size);
  121303. var align = src._align;
  121304. var currentLine = 0;
  121305. var lineOffsetX = 0;
  121306. // Update the bounds - skipped internally if not dirty
  121307. src.getTextBounds(false);
  121308. var lineData = src._bounds.lines;
  121309. if (align === 1)
  121310. {
  121311. lineOffsetX = (lineData.longest - lineData.lengths[0]) / 2;
  121312. }
  121313. else if (align === 2)
  121314. {
  121315. lineOffsetX = (lineData.longest - lineData.lengths[0]);
  121316. }
  121317. var roundPixels = camera.roundPixels;
  121318. for (var i = 0; i < textLength; i++)
  121319. {
  121320. charCode = text.charCodeAt(i);
  121321. // Carriage-return
  121322. if (charCode === 10)
  121323. {
  121324. currentLine++;
  121325. if (align === 1)
  121326. {
  121327. lineOffsetX = (lineData.longest - lineData.lengths[currentLine]) / 2;
  121328. }
  121329. else if (align === 2)
  121330. {
  121331. lineOffsetX = (lineData.longest - lineData.lengths[currentLine]);
  121332. }
  121333. xAdvance = 0;
  121334. yAdvance += lineHeight;
  121335. lastGlyph = null;
  121336. continue;
  121337. }
  121338. glyph = chars[charCode];
  121339. if (!glyph)
  121340. {
  121341. continue;
  121342. }
  121343. glyphX = textureX + glyph.x;
  121344. glyphY = textureY + glyph.y;
  121345. glyphW = glyph.width;
  121346. glyphH = glyph.height;
  121347. var x = glyph.xOffset + xAdvance;
  121348. var y = glyph.yOffset + yAdvance;
  121349. if (lastGlyph !== null)
  121350. {
  121351. var kerningOffset = glyph.kerning[lastCharCode];
  121352. x += (kerningOffset !== undefined) ? kerningOffset : 0;
  121353. }
  121354. xAdvance += glyph.xAdvance + letterSpacing;
  121355. lastGlyph = glyph;
  121356. lastCharCode = charCode;
  121357. // Nothing to render or a space? Then skip to the next glyph
  121358. if (glyphW === 0 || glyphH === 0 || charCode === 32)
  121359. {
  121360. continue;
  121361. }
  121362. x *= scale;
  121363. y *= scale;
  121364. x -= src.displayOriginX;
  121365. y -= src.displayOriginY;
  121366. x += lineOffsetX;
  121367. var u0 = glyphX / textureWidth;
  121368. var v0 = glyphY / textureHeight;
  121369. var u1 = (glyphX + glyphW) / textureWidth;
  121370. var v1 = (glyphY + glyphH) / textureHeight;
  121371. var xw = x + (glyphW * scale);
  121372. var yh = y + (glyphH * scale);
  121373. var tx0 = x * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  121374. var ty0 = x * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  121375. var tx1 = x * calcMatrix.a + yh * calcMatrix.c + calcMatrix.e;
  121376. var ty1 = x * calcMatrix.b + yh * calcMatrix.d + calcMatrix.f;
  121377. var tx2 = xw * calcMatrix.a + yh * calcMatrix.c + calcMatrix.e;
  121378. var ty2 = xw * calcMatrix.b + yh * calcMatrix.d + calcMatrix.f;
  121379. var tx3 = xw * calcMatrix.a + y * calcMatrix.c + calcMatrix.e;
  121380. var ty3 = xw * calcMatrix.b + y * calcMatrix.d + calcMatrix.f;
  121381. if (roundPixels)
  121382. {
  121383. tx0 |= 0;
  121384. ty0 |= 0;
  121385. tx1 |= 0;
  121386. ty1 |= 0;
  121387. tx2 |= 0;
  121388. ty2 |= 0;
  121389. tx3 |= 0;
  121390. ty3 |= 0;
  121391. }
  121392. pipeline.batchVertices(tx0, ty0, tx1, ty1, tx2, ty2, tx3, ty3, u0, v0, u1, v1, tintTL, tintTR, tintBL, tintBR, tintEffect);
  121393. }
  121394. };
  121395. module.exports = BitmapTextWebGLRenderer;
  121396. /***/ }),
  121397. /* 916 */
  121398. /***/ (function(module, exports, __webpack_require__) {
  121399. /**
  121400. * @author Richard Davey <rich@photonstorm.com>
  121401. * @copyright 2018 Photon Storm Ltd.
  121402. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121403. */
  121404. var renderWebGL = __webpack_require__(3);
  121405. var renderCanvas = __webpack_require__(3);
  121406. if (true)
  121407. {
  121408. renderWebGL = __webpack_require__(915);
  121409. }
  121410. if (true)
  121411. {
  121412. renderCanvas = __webpack_require__(914);
  121413. }
  121414. module.exports = {
  121415. renderWebGL: renderWebGL,
  121416. renderCanvas: renderCanvas
  121417. };
  121418. /***/ }),
  121419. /* 917 */
  121420. /***/ (function(module, exports, __webpack_require__) {
  121421. /**
  121422. * @author Richard Davey <rich@photonstorm.com>
  121423. * @copyright 2018 Photon Storm Ltd.
  121424. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121425. */
  121426. var ParseXMLBitmapFont = __webpack_require__(445);
  121427. /**
  121428. * Parse an XML Bitmap Font from an Atlas.
  121429. *
  121430. * Adds the parsed Bitmap Font data to the cache with the `fontName` key.
  121431. *
  121432. * @function ParseFromAtlas
  121433. * @since 3.0.0
  121434. * @private
  121435. *
  121436. * @param {Phaser.Scene} scene - The Scene to parse the Bitmap Font for.
  121437. * @param {string} fontName - The key of the font to add to the Bitmap Font cache.
  121438. * @param {string} textureKey - The key of the BitmapFont's texture.
  121439. * @param {string} frameKey - The key of the BitmapFont texture's frame.
  121440. * @param {string} xmlKey - The key of the XML data of the font to parse.
  121441. * @param {integer} xSpacing - The x-axis spacing to add between each letter.
  121442. * @param {integer} ySpacing - The y-axis spacing to add to the line height.
  121443. *
  121444. * @return {boolean} Whether the parsing was successful or not.
  121445. */
  121446. var ParseFromAtlas = function (scene, fontName, textureKey, frameKey, xmlKey, xSpacing, ySpacing)
  121447. {
  121448. var frame = scene.sys.textures.getFrame(textureKey, frameKey);
  121449. var xml = scene.sys.cache.xml.get(xmlKey);
  121450. if (frame && xml)
  121451. {
  121452. var data = ParseXMLBitmapFont(xml, xSpacing, ySpacing, frame);
  121453. scene.sys.cache.bitmapFont.add(fontName, { data: data, texture: textureKey, frame: frameKey });
  121454. return true;
  121455. }
  121456. else
  121457. {
  121458. return false;
  121459. }
  121460. };
  121461. module.exports = ParseFromAtlas;
  121462. /***/ }),
  121463. /* 918 */
  121464. /***/ (function(module, exports) {
  121465. /**
  121466. * @author Richard Davey <rich@photonstorm.com>
  121467. * @copyright 2018 Photon Storm Ltd.
  121468. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121469. */
  121470. /**
  121471. * @typedef {object} BitmapTextSize
  121472. *
  121473. * @property {GlobalBitmapTextSize} global - The position and size of the BitmapText, taking into account the position and scale of the Game Object.
  121474. * @property {LocalBitmapTextSize} local - The position and size of the BitmapText, taking just the font size into account.
  121475. */
  121476. /**
  121477. * The position and size of the Bitmap Text in global space, taking into account the Game Object's scale and world position.
  121478. *
  121479. * @typedef {object} GlobalBitmapTextSize
  121480. *
  121481. * @property {number} x - The x position of the BitmapText, taking into account the x position and scale of the Game Object.
  121482. * @property {number} y - The y position of the BitmapText, taking into account the y position and scale of the Game Object.
  121483. * @property {number} width - The width of the BitmapText, taking into account the x scale of the Game Object.
  121484. * @property {number} height - The height of the BitmapText, taking into account the y scale of the Game Object.
  121485. */
  121486. /**
  121487. * The position and size of the Bitmap Text in local space, taking just the font size into account.
  121488. *
  121489. * @typedef {object} LocalBitmapTextSize
  121490. *
  121491. * @property {number} x - The x position of the BitmapText.
  121492. * @property {number} y - The y position of the BitmapText.
  121493. * @property {number} width - The width of the BitmapText.
  121494. * @property {number} height - The height of the BitmapText.
  121495. */
  121496. /**
  121497. * Calculate the position, width and height of a BitmapText Game Object.
  121498. *
  121499. * Returns a BitmapTextSize object that contains global and local variants of the Game Objects x and y coordinates and
  121500. * its width and height.
  121501. *
  121502. * The global position and size take into account the Game Object's position and scale.
  121503. *
  121504. * The local position and size just takes into account the font data.
  121505. *
  121506. * @function GetBitmapTextSize
  121507. * @since 3.0.0
  121508. * @private
  121509. *
  121510. * @param {(Phaser.GameObjects.DynamicBitmapText|Phaser.GameObjects.BitmapText)} src - The BitmapText to calculate the position, width and height of.
  121511. * @param {boolean} [round] - Whether to round the results to the nearest integer.
  121512. * @param {object} [out] - Optional object to store the results in, to save constant object creation.
  121513. *
  121514. * @return {BitmapTextSize} The calculated position, width and height of the BitmapText.
  121515. */
  121516. var GetBitmapTextSize = function (src, round, out)
  121517. {
  121518. if (out === undefined)
  121519. {
  121520. out = {
  121521. local: {
  121522. x: 0,
  121523. y: 0,
  121524. width: 0,
  121525. height: 0
  121526. },
  121527. global: {
  121528. x: 0,
  121529. y: 0,
  121530. width: 0,
  121531. height: 0
  121532. },
  121533. lines: {
  121534. shortest: 0,
  121535. longest: 0,
  121536. lengths: null
  121537. }
  121538. };
  121539. }
  121540. var text = src.text;
  121541. var textLength = text.length;
  121542. var bx = Number.MAX_VALUE;
  121543. var by = Number.MAX_VALUE;
  121544. var bw = 0;
  121545. var bh = 0;
  121546. var chars = src.fontData.chars;
  121547. var lineHeight = src.fontData.lineHeight;
  121548. var letterSpacing = src.letterSpacing;
  121549. var xAdvance = 0;
  121550. var yAdvance = 0;
  121551. var charCode = 0;
  121552. var glyph = null;
  121553. var x = 0;
  121554. var y = 0;
  121555. var scale = (src.fontSize / src.fontData.size);
  121556. var sx = scale * src.scaleX;
  121557. var sy = scale * src.scaleY;
  121558. var lastGlyph = null;
  121559. var lastCharCode = 0;
  121560. var lineWidths = [];
  121561. var shortestLine = Number.MAX_VALUE;
  121562. var longestLine = 0;
  121563. var currentLine = 0;
  121564. var currentLineWidth = 0;
  121565. for (var i = 0; i < textLength; i++)
  121566. {
  121567. charCode = text.charCodeAt(i);
  121568. if (charCode === 10)
  121569. {
  121570. xAdvance = 0;
  121571. yAdvance += lineHeight;
  121572. lastGlyph = null;
  121573. lineWidths[currentLine] = currentLineWidth;
  121574. if (currentLineWidth > longestLine)
  121575. {
  121576. longestLine = currentLineWidth;
  121577. }
  121578. if (currentLineWidth < shortestLine)
  121579. {
  121580. shortestLine = currentLineWidth;
  121581. }
  121582. currentLine++;
  121583. currentLineWidth = 0;
  121584. continue;
  121585. }
  121586. glyph = chars[charCode];
  121587. if (!glyph)
  121588. {
  121589. continue;
  121590. }
  121591. x = xAdvance;
  121592. y = yAdvance;
  121593. if (lastGlyph !== null)
  121594. {
  121595. var kerningOffset = glyph.kerning[lastCharCode];
  121596. x += (kerningOffset !== undefined) ? kerningOffset : 0;
  121597. }
  121598. if (bx > x)
  121599. {
  121600. bx = x;
  121601. }
  121602. if (by > y)
  121603. {
  121604. by = y;
  121605. }
  121606. var gw = x + glyph.xAdvance;
  121607. var gh = y + lineHeight;
  121608. if (bw < gw)
  121609. {
  121610. bw = gw;
  121611. }
  121612. if (bh < gh)
  121613. {
  121614. bh = gh;
  121615. }
  121616. xAdvance += glyph.xAdvance + letterSpacing;
  121617. lastGlyph = glyph;
  121618. lastCharCode = charCode;
  121619. currentLineWidth = gw * scale;
  121620. }
  121621. lineWidths[currentLine] = currentLineWidth;
  121622. if (currentLineWidth > longestLine)
  121623. {
  121624. longestLine = currentLineWidth;
  121625. }
  121626. if (currentLineWidth < shortestLine)
  121627. {
  121628. shortestLine = currentLineWidth;
  121629. }
  121630. var local = out.local;
  121631. var global = out.global;
  121632. var lines = out.lines;
  121633. local.x = bx * scale;
  121634. local.y = by * scale;
  121635. local.width = bw * scale;
  121636. local.height = bh * scale;
  121637. global.x = (src.x - src.displayOriginX) + (bx * sx);
  121638. global.y = (src.y - src.displayOriginY) + (by * sy);
  121639. global.width = bw * sx;
  121640. global.height = bh * sy;
  121641. lines.shortest = shortestLine;
  121642. lines.longest = longestLine;
  121643. lines.lengths = lineWidths;
  121644. if (round)
  121645. {
  121646. local.x = Math.round(local.x);
  121647. local.y = Math.round(local.y);
  121648. local.width = Math.round(local.width);
  121649. local.height = Math.round(local.height);
  121650. global.x = Math.round(global.x);
  121651. global.y = Math.round(global.y);
  121652. global.width = Math.round(global.width);
  121653. global.height = Math.round(global.height);
  121654. lines.shortest = Math.round(shortestLine);
  121655. lines.longest = Math.round(longestLine);
  121656. }
  121657. return out;
  121658. };
  121659. module.exports = GetBitmapTextSize;
  121660. /***/ }),
  121661. /* 919 */
  121662. /***/ (function(module, exports, __webpack_require__) {
  121663. /**
  121664. * @author Richard Davey <rich@photonstorm.com>
  121665. * @copyright 2018 Photon Storm Ltd.
  121666. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121667. */
  121668. /**
  121669. * @namespace Phaser.GameObjects
  121670. */
  121671. var GameObjects = {
  121672. DisplayList: __webpack_require__(474),
  121673. GameObjectCreator: __webpack_require__(14),
  121674. GameObjectFactory: __webpack_require__(11),
  121675. UpdateList: __webpack_require__(446),
  121676. Components: __webpack_require__(17),
  121677. BuildGameObject: __webpack_require__(25),
  121678. BuildGameObjectAnimation: __webpack_require__(128),
  121679. GameObject: __webpack_require__(2),
  121680. BitmapText: __webpack_require__(148),
  121681. Blitter: __webpack_require__(246),
  121682. Container: __webpack_require__(245),
  121683. DynamicBitmapText: __webpack_require__(244),
  121684. Graphics: __webpack_require__(115),
  121685. Group: __webpack_require__(112),
  121686. Image: __webpack_require__(68),
  121687. Particles: __webpack_require__(903),
  121688. PathFollower: __webpack_require__(422),
  121689. RenderTexture: __webpack_require__(240),
  121690. RetroFont: __webpack_require__(892),
  121691. Sprite3D: __webpack_require__(154),
  121692. Sprite: __webpack_require__(35),
  121693. Text: __webpack_require__(110),
  121694. TileSprite: __webpack_require__(239),
  121695. Zone: __webpack_require__(163),
  121696. // Game Object Factories
  121697. Factories: {
  121698. Blitter: __webpack_require__(886),
  121699. Container: __webpack_require__(885),
  121700. DynamicBitmapText: __webpack_require__(884),
  121701. Graphics: __webpack_require__(414),
  121702. Group: __webpack_require__(883),
  121703. Image: __webpack_require__(413),
  121704. Particles: __webpack_require__(882),
  121705. PathFollower: __webpack_require__(881),
  121706. RenderTexture: __webpack_require__(880),
  121707. Sprite3D: __webpack_require__(879),
  121708. Sprite: __webpack_require__(412),
  121709. StaticBitmapText: __webpack_require__(878),
  121710. Text: __webpack_require__(411),
  121711. TileSprite: __webpack_require__(877),
  121712. Zone: __webpack_require__(876)
  121713. },
  121714. Creators: {
  121715. Blitter: __webpack_require__(875),
  121716. Container: __webpack_require__(874),
  121717. DynamicBitmapText: __webpack_require__(873),
  121718. Graphics: __webpack_require__(410),
  121719. Group: __webpack_require__(872),
  121720. Image: __webpack_require__(409),
  121721. Particles: __webpack_require__(871),
  121722. RenderTexture: __webpack_require__(870),
  121723. Sprite3D: __webpack_require__(869),
  121724. Sprite: __webpack_require__(408),
  121725. StaticBitmapText: __webpack_require__(868),
  121726. Text: __webpack_require__(407),
  121727. TileSprite: __webpack_require__(867),
  121728. Zone: __webpack_require__(866)
  121729. }
  121730. };
  121731. if (true)
  121732. {
  121733. // WebGL only Game Objects
  121734. GameObjects.Mesh = __webpack_require__(147);
  121735. GameObjects.Quad = __webpack_require__(238);
  121736. GameObjects.Factories.Mesh = __webpack_require__(862);
  121737. GameObjects.Factories.Quad = __webpack_require__(861);
  121738. GameObjects.Creators.Mesh = __webpack_require__(860);
  121739. GameObjects.Creators.Quad = __webpack_require__(859);
  121740. GameObjects.Light = __webpack_require__(406);
  121741. __webpack_require__(405);
  121742. __webpack_require__(858);
  121743. }
  121744. module.exports = GameObjects;
  121745. /***/ }),
  121746. /* 920 */
  121747. /***/ (function(module, exports, __webpack_require__) {
  121748. /**
  121749. * @author Richard Davey <rich@photonstorm.com>
  121750. * @copyright 2018 Photon Storm Ltd.
  121751. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121752. */
  121753. /**
  121754. * @namespace Phaser.DOM
  121755. */
  121756. module.exports = {
  121757. AddToDOM: __webpack_require__(131),
  121758. DOMContentLoaded: __webpack_require__(265),
  121759. ParseXML: __webpack_require__(264),
  121760. RemoveFromDOM: __webpack_require__(263),
  121761. RequestAnimationFrame: __webpack_require__(262)
  121762. };
  121763. /***/ }),
  121764. /* 921 */
  121765. /***/ (function(module, exports, __webpack_require__) {
  121766. /**
  121767. * @author Richard Davey <rich@photonstorm.com>
  121768. * @copyright 2018 Photon Storm Ltd.
  121769. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121770. */
  121771. var ComponentToHex = __webpack_require__(511);
  121772. /**
  121773. * Converts the color values into an HTML compatible color string, prefixed with either `#` or `0x`.
  121774. *
  121775. * @function Phaser.Display.Color.RGBToString
  121776. * @since 3.0.0
  121777. *
  121778. * @param {integer} r - The red color value. A number between 0 and 255.
  121779. * @param {integer} g - The green color value. A number between 0 and 255.
  121780. * @param {integer} b - The blue color value. A number between 0 and 255.
  121781. * @param {integer} [a=255] - The alpha value. A number between 0 and 255.
  121782. * @param {string} [prefix=#] - The prefix of the string. Either `#` or `0x`.
  121783. *
  121784. * @return {string} A string-based representation of the color values.
  121785. */
  121786. var RGBToString = function (r, g, b, a, prefix)
  121787. {
  121788. if (a === undefined) { a = 255; }
  121789. if (prefix === undefined) { prefix = '#'; }
  121790. if (prefix === '#')
  121791. {
  121792. return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
  121793. }
  121794. else
  121795. {
  121796. return '0x' + ComponentToHex(a) + ComponentToHex(r) + ComponentToHex(g) + ComponentToHex(b);
  121797. }
  121798. };
  121799. module.exports = RGBToString;
  121800. /***/ }),
  121801. /* 922 */
  121802. /***/ (function(module, exports) {
  121803. /**
  121804. * @author Richard Davey <rich@photonstorm.com>
  121805. * @copyright 2018 Photon Storm Ltd.
  121806. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121807. */
  121808. /**
  121809. * @typedef {object} HSLColorObject
  121810. *
  121811. * @property {number} h - The hue color value. A number between 0 and 1
  121812. * @property {number} s - The saturation color value. A number between 0 and 1
  121813. * @property {number} l - The lightness color value. A number between 0 and 1
  121814. */
  121815. /**
  121816. * Converts an RGB color value to HSV (hue, saturation and value).
  121817. * Conversion forumla from http://en.wikipedia.org/wiki/HSL_color_space.
  121818. * Assumes RGB values are contained in the set [0, 255] and returns h, s and v in the set [0, 1].
  121819. * Based on code by Michael Jackson (https://github.com/mjijackson)
  121820. *
  121821. * @function Phaser.Display.Color.RGBToHSV
  121822. * @since 3.0.0
  121823. *
  121824. * @param {integer} r - The red color value. A number between 0 and 255.
  121825. * @param {integer} g - The green color value. A number between 0 and 255.
  121826. * @param {integer} b - The blue color value. A number between 0 and 255.
  121827. *
  121828. * @return {HSLColorObject} An object with the properties `h`, `s` and `v`.
  121829. */
  121830. var RGBToHSV = function (r, g, b)
  121831. {
  121832. r /= 255;
  121833. g /= 255;
  121834. b /= 255;
  121835. var min = Math.min(r, g, b);
  121836. var max = Math.max(r, g, b);
  121837. var d = max - min;
  121838. // achromatic by default
  121839. var h = 0;
  121840. var s = (max === 0) ? 0 : d / max;
  121841. var v = max;
  121842. if (max !== min)
  121843. {
  121844. if (max === r)
  121845. {
  121846. h = (g - b) / d + ((g < b) ? 6 : 0);
  121847. }
  121848. else if (max === g)
  121849. {
  121850. h = (b - r) / d + 2;
  121851. }
  121852. else if (max === b)
  121853. {
  121854. h = (r - g) / d + 4;
  121855. }
  121856. h /= 6;
  121857. }
  121858. return { h: h, s: s, v: v };
  121859. };
  121860. module.exports = RGBToHSV;
  121861. /***/ }),
  121862. /* 923 */
  121863. /***/ (function(module, exports, __webpack_require__) {
  121864. /**
  121865. * @author Richard Davey <rich@photonstorm.com>
  121866. * @copyright 2018 Photon Storm Ltd.
  121867. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121868. */
  121869. var Between = __webpack_require__(152);
  121870. var Color = __webpack_require__(30);
  121871. /**
  121872. * Creates a new Color object where the r, g, and b values have been set to random values
  121873. * based on the given min max values.
  121874. *
  121875. * @function Phaser.Display.Color.RandomRGB
  121876. * @since 3.0.0
  121877. *
  121878. * @param {integer} [min=0] - The minimum value to set the random range from (between 0 and 255)
  121879. * @param {integer} [max=255] - The maximum value to set the random range from (between 0 and 255)
  121880. *
  121881. * @return {Phaser.Display.Color} A Color object.
  121882. */
  121883. var RandomRGB = function (min, max)
  121884. {
  121885. if (min === undefined) { min = 0; }
  121886. if (max === undefined) { max = 255; }
  121887. return new Color(Between(min, max), Between(min, max), Between(min, max));
  121888. };
  121889. module.exports = RandomRGB;
  121890. /***/ }),
  121891. /* 924 */
  121892. /***/ (function(module, exports, __webpack_require__) {
  121893. /**
  121894. * @author Richard Davey <rich@photonstorm.com>
  121895. * @copyright 2018 Photon Storm Ltd.
  121896. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121897. */
  121898. var Linear = __webpack_require__(122);
  121899. /**
  121900. * Interpolates color values
  121901. *
  121902. * @namespace Phaser.Display.Color.Interpolate
  121903. * @since 3.0.0
  121904. */
  121905. /**
  121906. * Interpolates between the two given color ranges over the length supplied.
  121907. *
  121908. * @function Phaser.Display.Color.Interpolate.RGBWithRGB
  121909. * @since 3.0.0
  121910. *
  121911. * @param {number} r1 - Red value.
  121912. * @param {number} g1 - Blue value.
  121913. * @param {number} b1 - Green value.
  121914. * @param {number} r2 - Red value.
  121915. * @param {number} g2 - Blue value.
  121916. * @param {number} b2 - Green value.
  121917. * @param {number} [length=100] - Distance to interpolate over.
  121918. * @param {number} [index=0] - Index to start from.
  121919. *
  121920. * @return {ColorObject} An object containing the interpolated color values.
  121921. */
  121922. var RGBWithRGB = function (r1, g1, b1, r2, g2, b2, length, index)
  121923. {
  121924. if (length === undefined) { length = 100; }
  121925. if (index === undefined) { index = 0; }
  121926. var t = index / length;
  121927. return {
  121928. r: Linear(r1, r2, t),
  121929. g: Linear(g1, g2, t),
  121930. b: Linear(b1, b2, t)
  121931. };
  121932. };
  121933. /**
  121934. * Interpolates between the two given color objects over the length supplied.
  121935. *
  121936. * @function Phaser.Display.Color.Interpolate.ColorWithColor
  121937. * @since 3.0.0
  121938. *
  121939. * @param {Phaser.Display.Color} color1 - The first Color object.
  121940. * @param {Phaser.Display.Color} color2 - The second Color object.
  121941. * @param {number} [length=100] - Distance to interpolate over.
  121942. * @param {number} [index=0] - Index to start from.
  121943. *
  121944. * @return {ColorObject} An object containing the interpolated color values.
  121945. */
  121946. var ColorWithColor = function (color1, color2, length, index)
  121947. {
  121948. if (length === undefined) { length = 100; }
  121949. if (index === undefined) { index = 0; }
  121950. return RGBWithRGB(color1.r, color1.g, color1.b, color2.r, color2.g, color2.b, length, index);
  121951. };
  121952. /**
  121953. * Interpolates between the Color object and color values over the length supplied.
  121954. *
  121955. * @function Phaser.Display.Color.Interpolate.ColorWithRGB
  121956. * @since 3.0.0
  121957. *
  121958. * @param {Phaser.Display.Color} color1 - The first Color object.
  121959. * @param {number} r - Red value.
  121960. * @param {number} g - Blue value.
  121961. * @param {number} b - Green value.
  121962. * @param {number} [length=100] - Distance to interpolate over.
  121963. * @param {number} [index=0] - Index to start from.
  121964. *
  121965. * @return {ColorObject} An object containing the interpolated color values.
  121966. */
  121967. var ColorWithRGB = function (color, r, g, b, length, index)
  121968. {
  121969. if (length === undefined) { length = 100; }
  121970. if (index === undefined) { index = 0; }
  121971. return RGBWithRGB(color.r, color.g, color.b, r, g, b, length, index);
  121972. };
  121973. module.exports = {
  121974. RGBWithRGB: RGBWithRGB,
  121975. ColorWithRGB: ColorWithRGB,
  121976. ColorWithColor: ColorWithColor
  121977. };
  121978. /***/ }),
  121979. /* 925 */
  121980. /***/ (function(module, exports, __webpack_require__) {
  121981. /**
  121982. * @author Richard Davey <rich@photonstorm.com>
  121983. * @copyright 2018 Photon Storm Ltd.
  121984. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  121985. */
  121986. var HSVToRGB = __webpack_require__(509);
  121987. /**
  121988. * Get HSV color wheel values in an array which will be 360 elements in size.
  121989. *
  121990. * @function Phaser.Display.Color.HSVColorWheel
  121991. * @since 3.0.0
  121992. *
  121993. * @param {number} [s=1] - The saturation, in the range 0 - 1.
  121994. * @param {number} [v=1] - The value, in the range 0 - 1.
  121995. *
  121996. * @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.
  121997. */
  121998. var HSVColorWheel = function (s, v)
  121999. {
  122000. if (s === undefined) { s = 1; }
  122001. if (v === undefined) { v = 1; }
  122002. var colors = [];
  122003. for (var c = 0; c <= 359; c++)
  122004. {
  122005. colors.push(HSVToRGB(c / 359, s, v));
  122006. }
  122007. return colors;
  122008. };
  122009. module.exports = HSVColorWheel;
  122010. /***/ }),
  122011. /* 926 */
  122012. /***/ (function(module, exports, __webpack_require__) {
  122013. /**
  122014. * @author Richard Davey <rich@photonstorm.com>
  122015. * @copyright 2018 Photon Storm Ltd.
  122016. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122017. */
  122018. var Color = __webpack_require__(30);
  122019. var HueToComponent = __webpack_require__(510);
  122020. /**
  122021. * Converts HSL (hue, saturation and lightness) values to a Phaser Color object.
  122022. *
  122023. * @function Phaser.Display.Color.HSLToColor
  122024. * @since 3.0.0
  122025. *
  122026. * @param {number} h - The hue value in the range 0 to 1.
  122027. * @param {number} s - The saturation value in the range 0 to 1.
  122028. * @param {number} l - The lightness value in the range 0 to 1.
  122029. *
  122030. * @return {Phaser.Display.Color} A Color object created from the results of the h, s and l values.
  122031. */
  122032. var HSLToColor = function (h, s, l)
  122033. {
  122034. // achromatic by default
  122035. var r = l;
  122036. var g = l;
  122037. var b = l;
  122038. if (s !== 0)
  122039. {
  122040. var q = (l < 0.5) ? l * (1 + s) : l + s - l * s;
  122041. var p = 2 * l - q;
  122042. r = HueToComponent(p, q, h + 1 / 3);
  122043. g = HueToComponent(p, q, h);
  122044. b = HueToComponent(p, q, h - 1 / 3);
  122045. }
  122046. var color = new Color();
  122047. return color.setGLTo(r, g, b, 1);
  122048. };
  122049. module.exports = HSLToColor;
  122050. /***/ }),
  122051. /* 927 */
  122052. /***/ (function(module, exports) {
  122053. /**
  122054. * @author Richard Davey <rich@photonstorm.com>
  122055. * @copyright 2018 Photon Storm Ltd.
  122056. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122057. */
  122058. /**
  122059. * Converts the given color value into an Object containing r,g,b and a properties.
  122060. *
  122061. * @function Phaser.Display.Color.ColorToRGBA
  122062. * @since 3.0.0
  122063. *
  122064. * @param {number} color - A color value, optionally including the alpha value.
  122065. *
  122066. * @return {ColorObject} An object containing the parsed color values.
  122067. */
  122068. var ColorToRGBA = function (color)
  122069. {
  122070. var output = {
  122071. r: color >> 16 & 0xFF,
  122072. g: color >> 8 & 0xFF,
  122073. b: color & 0xFF,
  122074. a: 255
  122075. };
  122076. if (color > 16777215)
  122077. {
  122078. output.a = color >>> 24;
  122079. }
  122080. return output;
  122081. };
  122082. module.exports = ColorToRGBA;
  122083. /***/ }),
  122084. /* 928 */
  122085. /***/ (function(module, exports) {
  122086. /**
  122087. * @author Richard Davey <rich@photonstorm.com>
  122088. * @copyright 2018 Photon Storm Ltd.
  122089. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122090. */
  122091. /**
  122092. * Sets the user-select property on the canvas style. Can be used to disable default browser selection actions.
  122093. *
  122094. * @function Phaser.Display.Canvas.UserSelect
  122095. * @since 3.0.0
  122096. *
  122097. * @param {HTMLCanvasElement} canvas - The canvas element to have the style applied to.
  122098. * @param {string} [value='none'] - The touch callout value to set on the canvas. Set to `none` to disable touch callouts.
  122099. *
  122100. * @return {HTMLCanvasElement} The canvas element.
  122101. */
  122102. var UserSelect = function (canvas, value)
  122103. {
  122104. if (value === undefined) { value = 'none'; }
  122105. var vendors = [
  122106. '-webkit-',
  122107. '-khtml-',
  122108. '-moz-',
  122109. '-ms-',
  122110. ''
  122111. ];
  122112. vendors.forEach(function (vendor)
  122113. {
  122114. canvas.style[vendor + 'user-select'] = value;
  122115. });
  122116. canvas.style['-webkit-touch-callout'] = value;
  122117. canvas.style['-webkit-tap-highlight-color'] = 'rgba(0, 0, 0, 0)';
  122118. return canvas;
  122119. };
  122120. module.exports = UserSelect;
  122121. /***/ }),
  122122. /* 929 */
  122123. /***/ (function(module, exports) {
  122124. /**
  122125. * @author Richard Davey <rich@photonstorm.com>
  122126. * @copyright 2018 Photon Storm Ltd.
  122127. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122128. */
  122129. /**
  122130. * Sets the touch-action property on the canvas style. Can be used to disable default browser touch actions.
  122131. *
  122132. * @function Phaser.Display.Canvas.TouchAction
  122133. * @since 3.0.0
  122134. *
  122135. * @param {HTMLCanvasElement} canvas - The canvas element to have the style applied to.
  122136. * @param {string} [value='none'] - The touch action value to set on the canvas. Set to `none` to disable touch actions.
  122137. *
  122138. * @return {HTMLCanvasElement} The canvas element.
  122139. */
  122140. var TouchAction = function (canvas, value)
  122141. {
  122142. if (value === undefined) { value = 'none'; }
  122143. canvas.style['msTouchAction'] = value;
  122144. canvas.style['ms-touch-action'] = value;
  122145. canvas.style['touch-action'] = value;
  122146. return canvas;
  122147. };
  122148. module.exports = TouchAction;
  122149. /***/ }),
  122150. /* 930 */
  122151. /***/ (function(module, exports, __webpack_require__) {
  122152. /**
  122153. * @author Richard Davey <rich@photonstorm.com>
  122154. * @copyright 2018 Photon Storm Ltd.
  122155. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122156. */
  122157. /**
  122158. * @namespace Phaser.Display.Canvas
  122159. */
  122160. module.exports = {
  122161. Interpolation: __webpack_require__(266),
  122162. Pool: __webpack_require__(24),
  122163. Smoothing: __webpack_require__(132),
  122164. TouchAction: __webpack_require__(929),
  122165. UserSelect: __webpack_require__(928)
  122166. };
  122167. /***/ }),
  122168. /* 931 */
  122169. /***/ (function(module, exports) {
  122170. /**
  122171. * @author Richard Davey <rich@photonstorm.com>
  122172. * @copyright 2018 Photon Storm Ltd.
  122173. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122174. */
  122175. /**
  122176. * Returns the amount the Game Object is visually offset from its y coordinate.
  122177. * This is the same as `width * origin.y`.
  122178. * This value will only be > 0 if `origin.y` is not equal to zero.
  122179. *
  122180. * @function Phaser.Display.Bounds.GetOffsetY
  122181. * @since 3.0.0
  122182. *
  122183. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  122184. *
  122185. * @return {number} The vertical offset of the Game Object.
  122186. */
  122187. var GetOffsetY = function (gameObject)
  122188. {
  122189. return gameObject.height * gameObject.originY;
  122190. };
  122191. module.exports = GetOffsetY;
  122192. /***/ }),
  122193. /* 932 */
  122194. /***/ (function(module, exports) {
  122195. /**
  122196. * @author Richard Davey <rich@photonstorm.com>
  122197. * @copyright 2018 Photon Storm Ltd.
  122198. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122199. */
  122200. /**
  122201. * Returns the amount the Game Object is visually offset from its x coordinate.
  122202. * This is the same as `width * origin.x`.
  122203. * This value will only be > 0 if `origin.x` is not equal to zero.
  122204. *
  122205. * @function Phaser.Display.Bounds.GetOffsetX
  122206. * @since 3.0.0
  122207. *
  122208. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to get the bounds value from.
  122209. *
  122210. * @return {number} The horizontal offset of the Game Object.
  122211. */
  122212. var GetOffsetX = function (gameObject)
  122213. {
  122214. return gameObject.width * gameObject.originX;
  122215. };
  122216. module.exports = GetOffsetX;
  122217. /***/ }),
  122218. /* 933 */
  122219. /***/ (function(module, exports, __webpack_require__) {
  122220. /**
  122221. * @author Richard Davey <rich@photonstorm.com>
  122222. * @copyright 2018 Photon Storm Ltd.
  122223. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122224. */
  122225. /**
  122226. * @namespace Phaser.Display.Bounds
  122227. */
  122228. module.exports = {
  122229. CenterOn: __webpack_require__(598),
  122230. GetBottom: __webpack_require__(51),
  122231. GetCenterX: __webpack_require__(92),
  122232. GetCenterY: __webpack_require__(89),
  122233. GetLeft: __webpack_require__(49),
  122234. GetOffsetX: __webpack_require__(932),
  122235. GetOffsetY: __webpack_require__(931),
  122236. GetRight: __webpack_require__(47),
  122237. GetTop: __webpack_require__(45),
  122238. SetBottom: __webpack_require__(50),
  122239. SetCenterX: __webpack_require__(91),
  122240. SetCenterY: __webpack_require__(90),
  122241. SetLeft: __webpack_require__(48),
  122242. SetRight: __webpack_require__(46),
  122243. SetTop: __webpack_require__(44)
  122244. };
  122245. /***/ }),
  122246. /* 934 */
  122247. /***/ (function(module, exports, __webpack_require__) {
  122248. /**
  122249. * @author Richard Davey <rich@photonstorm.com>
  122250. * @copyright 2018 Photon Storm Ltd.
  122251. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122252. */
  122253. var GetRight = __webpack_require__(47);
  122254. var GetTop = __webpack_require__(45);
  122255. var SetBottom = __webpack_require__(50);
  122256. var SetRight = __webpack_require__(46);
  122257. /**
  122258. * Takes given Game Object and aligns it so that it is positioned next to the top right position of the other.
  122259. *
  122260. * @function Phaser.Display.Align.To.TopRight
  122261. * @since 3.0.0
  122262. *
  122263. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  122264. *
  122265. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  122266. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  122267. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  122268. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  122269. *
  122270. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  122271. */
  122272. var TopRight = function (gameObject, alignTo, offsetX, offsetY)
  122273. {
  122274. if (offsetX === undefined) { offsetX = 0; }
  122275. if (offsetY === undefined) { offsetY = 0; }
  122276. SetRight(gameObject, GetRight(alignTo) + offsetX);
  122277. SetBottom(gameObject, GetTop(alignTo) - offsetY);
  122278. return gameObject;
  122279. };
  122280. module.exports = TopRight;
  122281. /***/ }),
  122282. /* 935 */
  122283. /***/ (function(module, exports, __webpack_require__) {
  122284. /**
  122285. * @author Richard Davey <rich@photonstorm.com>
  122286. * @copyright 2018 Photon Storm Ltd.
  122287. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122288. */
  122289. var GetLeft = __webpack_require__(49);
  122290. var GetTop = __webpack_require__(45);
  122291. var SetBottom = __webpack_require__(50);
  122292. var SetLeft = __webpack_require__(48);
  122293. /**
  122294. * Takes given Game Object and aligns it so that it is positioned next to the top left position of the other.
  122295. *
  122296. * @function Phaser.Display.Align.To.TopLeft
  122297. * @since 3.0.0
  122298. *
  122299. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  122300. *
  122301. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  122302. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  122303. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  122304. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  122305. *
  122306. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  122307. */
  122308. var TopLeft = function (gameObject, alignTo, offsetX, offsetY)
  122309. {
  122310. if (offsetX === undefined) { offsetX = 0; }
  122311. if (offsetY === undefined) { offsetY = 0; }
  122312. SetLeft(gameObject, GetLeft(alignTo) - offsetX);
  122313. SetBottom(gameObject, GetTop(alignTo) - offsetY);
  122314. return gameObject;
  122315. };
  122316. module.exports = TopLeft;
  122317. /***/ }),
  122318. /* 936 */
  122319. /***/ (function(module, exports, __webpack_require__) {
  122320. /**
  122321. * @author Richard Davey <rich@photonstorm.com>
  122322. * @copyright 2018 Photon Storm Ltd.
  122323. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122324. */
  122325. var GetCenterX = __webpack_require__(92);
  122326. var GetTop = __webpack_require__(45);
  122327. var SetBottom = __webpack_require__(50);
  122328. var SetCenterX = __webpack_require__(91);
  122329. /**
  122330. * Takes given Game Object and aligns it so that it is positioned next to the top center position of the other.
  122331. *
  122332. * @function Phaser.Display.Align.To.TopCenter
  122333. * @since 3.0.0
  122334. *
  122335. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  122336. *
  122337. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  122338. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  122339. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  122340. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  122341. *
  122342. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  122343. */
  122344. var TopCenter = function (gameObject, alignTo, offsetX, offsetY)
  122345. {
  122346. if (offsetX === undefined) { offsetX = 0; }
  122347. if (offsetY === undefined) { offsetY = 0; }
  122348. SetCenterX(gameObject, GetCenterX(alignTo) + offsetX);
  122349. SetBottom(gameObject, GetTop(alignTo) - offsetY);
  122350. return gameObject;
  122351. };
  122352. module.exports = TopCenter;
  122353. /***/ }),
  122354. /* 937 */
  122355. /***/ (function(module, exports, __webpack_require__) {
  122356. /**
  122357. * @author Richard Davey <rich@photonstorm.com>
  122358. * @copyright 2018 Photon Storm Ltd.
  122359. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122360. */
  122361. var GetRight = __webpack_require__(47);
  122362. var GetTop = __webpack_require__(45);
  122363. var SetLeft = __webpack_require__(48);
  122364. var SetTop = __webpack_require__(44);
  122365. /**
  122366. * Takes given Game Object and aligns it so that it is positioned next to the right top position of the other.
  122367. *
  122368. * @function Phaser.Display.Align.To.RightTop
  122369. * @since 3.0.0
  122370. *
  122371. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  122372. *
  122373. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  122374. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  122375. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  122376. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  122377. *
  122378. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  122379. */
  122380. var RightTop = function (gameObject, alignTo, offsetX, offsetY)
  122381. {
  122382. if (offsetX === undefined) { offsetX = 0; }
  122383. if (offsetY === undefined) { offsetY = 0; }
  122384. SetLeft(gameObject, GetRight(alignTo) + offsetX);
  122385. SetTop(gameObject, GetTop(alignTo) - offsetY);
  122386. return gameObject;
  122387. };
  122388. module.exports = RightTop;
  122389. /***/ }),
  122390. /* 938 */
  122391. /***/ (function(module, exports, __webpack_require__) {
  122392. /**
  122393. * @author Richard Davey <rich@photonstorm.com>
  122394. * @copyright 2018 Photon Storm Ltd.
  122395. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122396. */
  122397. var GetCenterY = __webpack_require__(89);
  122398. var GetRight = __webpack_require__(47);
  122399. var SetCenterY = __webpack_require__(90);
  122400. var SetLeft = __webpack_require__(48);
  122401. /**
  122402. * Takes given Game Object and aligns it so that it is positioned next to the right center position of the other.
  122403. *
  122404. * @function Phaser.Display.Align.To.RightCenter
  122405. * @since 3.0.0
  122406. *
  122407. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  122408. *
  122409. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  122410. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  122411. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  122412. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  122413. *
  122414. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  122415. */
  122416. var RightCenter = function (gameObject, alignTo, offsetX, offsetY)
  122417. {
  122418. if (offsetX === undefined) { offsetX = 0; }
  122419. if (offsetY === undefined) { offsetY = 0; }
  122420. SetLeft(gameObject, GetRight(alignTo) + offsetX);
  122421. SetCenterY(gameObject, GetCenterY(alignTo) + offsetY);
  122422. return gameObject;
  122423. };
  122424. module.exports = RightCenter;
  122425. /***/ }),
  122426. /* 939 */
  122427. /***/ (function(module, exports, __webpack_require__) {
  122428. /**
  122429. * @author Richard Davey <rich@photonstorm.com>
  122430. * @copyright 2018 Photon Storm Ltd.
  122431. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122432. */
  122433. var GetBottom = __webpack_require__(51);
  122434. var GetRight = __webpack_require__(47);
  122435. var SetBottom = __webpack_require__(50);
  122436. var SetLeft = __webpack_require__(48);
  122437. /**
  122438. * Takes given Game Object and aligns it so that it is positioned next to the right bottom position of the other.
  122439. *
  122440. * @function Phaser.Display.Align.To.RightBottom
  122441. * @since 3.0.0
  122442. *
  122443. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  122444. *
  122445. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  122446. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  122447. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  122448. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  122449. *
  122450. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  122451. */
  122452. var RightBottom = function (gameObject, alignTo, offsetX, offsetY)
  122453. {
  122454. if (offsetX === undefined) { offsetX = 0; }
  122455. if (offsetY === undefined) { offsetY = 0; }
  122456. SetLeft(gameObject, GetRight(alignTo) + offsetX);
  122457. SetBottom(gameObject, GetBottom(alignTo) + offsetY);
  122458. return gameObject;
  122459. };
  122460. module.exports = RightBottom;
  122461. /***/ }),
  122462. /* 940 */
  122463. /***/ (function(module, exports, __webpack_require__) {
  122464. /**
  122465. * @author Richard Davey <rich@photonstorm.com>
  122466. * @copyright 2018 Photon Storm Ltd.
  122467. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122468. */
  122469. var GetLeft = __webpack_require__(49);
  122470. var GetTop = __webpack_require__(45);
  122471. var SetRight = __webpack_require__(46);
  122472. var SetTop = __webpack_require__(44);
  122473. /**
  122474. * Takes given Game Object and aligns it so that it is positioned next to the left top position of the other.
  122475. *
  122476. * @function Phaser.Display.Align.To.LeftTop
  122477. * @since 3.0.0
  122478. *
  122479. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  122480. *
  122481. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  122482. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  122483. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  122484. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  122485. *
  122486. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  122487. */
  122488. var LeftTop = function (gameObject, alignTo, offsetX, offsetY)
  122489. {
  122490. if (offsetX === undefined) { offsetX = 0; }
  122491. if (offsetY === undefined) { offsetY = 0; }
  122492. SetRight(gameObject, GetLeft(alignTo) - offsetX);
  122493. SetTop(gameObject, GetTop(alignTo) - offsetY);
  122494. return gameObject;
  122495. };
  122496. module.exports = LeftTop;
  122497. /***/ }),
  122498. /* 941 */
  122499. /***/ (function(module, exports, __webpack_require__) {
  122500. /**
  122501. * @author Richard Davey <rich@photonstorm.com>
  122502. * @copyright 2018 Photon Storm Ltd.
  122503. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122504. */
  122505. var GetCenterY = __webpack_require__(89);
  122506. var GetLeft = __webpack_require__(49);
  122507. var SetCenterY = __webpack_require__(90);
  122508. var SetRight = __webpack_require__(46);
  122509. /**
  122510. * Takes given Game Object and aligns it so that it is positioned next to the left center position of the other.
  122511. *
  122512. * @function Phaser.Display.Align.To.LeftCenter
  122513. * @since 3.0.0
  122514. *
  122515. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  122516. *
  122517. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  122518. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  122519. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  122520. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  122521. *
  122522. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  122523. */
  122524. var LeftCenter = function (gameObject, alignTo, offsetX, offsetY)
  122525. {
  122526. if (offsetX === undefined) { offsetX = 0; }
  122527. if (offsetY === undefined) { offsetY = 0; }
  122528. SetRight(gameObject, GetLeft(alignTo) - offsetX);
  122529. SetCenterY(gameObject, GetCenterY(alignTo) + offsetY);
  122530. return gameObject;
  122531. };
  122532. module.exports = LeftCenter;
  122533. /***/ }),
  122534. /* 942 */
  122535. /***/ (function(module, exports, __webpack_require__) {
  122536. /**
  122537. * @author Richard Davey <rich@photonstorm.com>
  122538. * @copyright 2018 Photon Storm Ltd.
  122539. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122540. */
  122541. var GetBottom = __webpack_require__(51);
  122542. var GetLeft = __webpack_require__(49);
  122543. var SetBottom = __webpack_require__(50);
  122544. var SetRight = __webpack_require__(46);
  122545. /**
  122546. * Takes given Game Object and aligns it so that it is positioned next to the left bottom position of the other.
  122547. *
  122548. * @function Phaser.Display.Align.To.LeftBottom
  122549. * @since 3.0.0
  122550. *
  122551. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  122552. *
  122553. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  122554. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  122555. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  122556. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  122557. *
  122558. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  122559. */
  122560. var LeftBottom = function (gameObject, alignTo, offsetX, offsetY)
  122561. {
  122562. if (offsetX === undefined) { offsetX = 0; }
  122563. if (offsetY === undefined) { offsetY = 0; }
  122564. SetRight(gameObject, GetLeft(alignTo) - offsetX);
  122565. SetBottom(gameObject, GetBottom(alignTo) + offsetY);
  122566. return gameObject;
  122567. };
  122568. module.exports = LeftBottom;
  122569. /***/ }),
  122570. /* 943 */
  122571. /***/ (function(module, exports, __webpack_require__) {
  122572. /**
  122573. * @author Richard Davey <rich@photonstorm.com>
  122574. * @copyright 2018 Photon Storm Ltd.
  122575. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122576. */
  122577. var GetBottom = __webpack_require__(51);
  122578. var GetRight = __webpack_require__(47);
  122579. var SetRight = __webpack_require__(46);
  122580. var SetTop = __webpack_require__(44);
  122581. /**
  122582. * Takes given Game Object and aligns it so that it is positioned next to the bottom right position of the other.
  122583. *
  122584. * @function Phaser.Display.Align.To.BottomRight
  122585. * @since 3.0.0
  122586. *
  122587. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  122588. *
  122589. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  122590. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  122591. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  122592. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  122593. *
  122594. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  122595. */
  122596. var BottomRight = function (gameObject, alignTo, offsetX, offsetY)
  122597. {
  122598. if (offsetX === undefined) { offsetX = 0; }
  122599. if (offsetY === undefined) { offsetY = 0; }
  122600. SetRight(gameObject, GetRight(alignTo) + offsetX);
  122601. SetTop(gameObject, GetBottom(alignTo) + offsetY);
  122602. return gameObject;
  122603. };
  122604. module.exports = BottomRight;
  122605. /***/ }),
  122606. /* 944 */
  122607. /***/ (function(module, exports, __webpack_require__) {
  122608. /**
  122609. * @author Richard Davey <rich@photonstorm.com>
  122610. * @copyright 2018 Photon Storm Ltd.
  122611. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122612. */
  122613. var GetBottom = __webpack_require__(51);
  122614. var GetLeft = __webpack_require__(49);
  122615. var SetLeft = __webpack_require__(48);
  122616. var SetTop = __webpack_require__(44);
  122617. /**
  122618. * Takes given Game Object and aligns it so that it is positioned next to the bottom left position of the other.
  122619. *
  122620. * @function Phaser.Display.Align.To.BottomLeft
  122621. * @since 3.0.0
  122622. *
  122623. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  122624. *
  122625. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  122626. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  122627. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  122628. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  122629. *
  122630. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  122631. */
  122632. var BottomLeft = function (gameObject, alignTo, offsetX, offsetY)
  122633. {
  122634. if (offsetX === undefined) { offsetX = 0; }
  122635. if (offsetY === undefined) { offsetY = 0; }
  122636. SetLeft(gameObject, GetLeft(alignTo) - offsetX);
  122637. SetTop(gameObject, GetBottom(alignTo) + offsetY);
  122638. return gameObject;
  122639. };
  122640. module.exports = BottomLeft;
  122641. /***/ }),
  122642. /* 945 */
  122643. /***/ (function(module, exports, __webpack_require__) {
  122644. /**
  122645. * @author Richard Davey <rich@photonstorm.com>
  122646. * @copyright 2018 Photon Storm Ltd.
  122647. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122648. */
  122649. var GetBottom = __webpack_require__(51);
  122650. var GetCenterX = __webpack_require__(92);
  122651. var SetCenterX = __webpack_require__(91);
  122652. var SetTop = __webpack_require__(44);
  122653. /**
  122654. * Takes given Game Object and aligns it so that it is positioned next to the bottom center position of the other.
  122655. *
  122656. * @function Phaser.Display.Align.To.BottomCenter
  122657. * @since 3.0.0
  122658. *
  122659. * @generic {Phaser.GameObjects.GameObject} G - [gameObject,$return]
  122660. *
  122661. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object that will be positioned.
  122662. * @param {Phaser.GameObjects.GameObject} alignTo - The Game Object to base the alignment position on.
  122663. * @param {number} [offsetX=0] - Optional horizontal offset from the position.
  122664. * @param {number} [offsetY=0] - Optional vertical offset from the position.
  122665. *
  122666. * @return {Phaser.GameObjects.GameObject} The Game Object that was aligned.
  122667. */
  122668. var BottomCenter = function (gameObject, alignTo, offsetX, offsetY)
  122669. {
  122670. if (offsetX === undefined) { offsetX = 0; }
  122671. if (offsetY === undefined) { offsetY = 0; }
  122672. SetCenterX(gameObject, GetCenterX(alignTo) + offsetX);
  122673. SetTop(gameObject, GetBottom(alignTo) + offsetY);
  122674. return gameObject;
  122675. };
  122676. module.exports = BottomCenter;
  122677. /***/ }),
  122678. /* 946 */
  122679. /***/ (function(module, exports, __webpack_require__) {
  122680. /**
  122681. * @author Richard Davey <rich@photonstorm.com>
  122682. * @copyright 2018 Photon Storm Ltd.
  122683. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122684. */
  122685. /**
  122686. * @namespace Phaser.Display.Align.To
  122687. */
  122688. module.exports = {
  122689. BottomCenter: __webpack_require__(945),
  122690. BottomLeft: __webpack_require__(944),
  122691. BottomRight: __webpack_require__(943),
  122692. LeftBottom: __webpack_require__(942),
  122693. LeftCenter: __webpack_require__(941),
  122694. LeftTop: __webpack_require__(940),
  122695. RightBottom: __webpack_require__(939),
  122696. RightCenter: __webpack_require__(938),
  122697. RightTop: __webpack_require__(937),
  122698. TopCenter: __webpack_require__(936),
  122699. TopLeft: __webpack_require__(935),
  122700. TopRight: __webpack_require__(934)
  122701. };
  122702. /***/ }),
  122703. /* 947 */
  122704. /***/ (function(module, exports, __webpack_require__) {
  122705. /**
  122706. * @author Richard Davey <rich@photonstorm.com>
  122707. * @copyright 2018 Photon Storm Ltd.
  122708. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122709. */
  122710. /**
  122711. * @namespace Phaser.Display.Align.In
  122712. */
  122713. module.exports = {
  122714. BottomCenter: __webpack_require__(602),
  122715. BottomLeft: __webpack_require__(601),
  122716. BottomRight: __webpack_require__(600),
  122717. Center: __webpack_require__(599),
  122718. LeftCenter: __webpack_require__(597),
  122719. QuickSet: __webpack_require__(603),
  122720. RightCenter: __webpack_require__(596),
  122721. TopCenter: __webpack_require__(595),
  122722. TopLeft: __webpack_require__(594),
  122723. TopRight: __webpack_require__(593)
  122724. };
  122725. /***/ }),
  122726. /* 948 */
  122727. /***/ (function(module, exports, __webpack_require__) {
  122728. /**
  122729. * @author Richard Davey <rich@photonstorm.com>
  122730. * @copyright 2018 Photon Storm Ltd.
  122731. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122732. */
  122733. var CONST = __webpack_require__(304);
  122734. var Extend = __webpack_require__(16);
  122735. /**
  122736. * @namespace Phaser.Display.Align
  122737. */
  122738. var Align = {
  122739. In: __webpack_require__(947),
  122740. To: __webpack_require__(946)
  122741. };
  122742. // Merge in the consts
  122743. Align = Extend(false, Align, CONST);
  122744. module.exports = Align;
  122745. /***/ }),
  122746. /* 949 */
  122747. /***/ (function(module, exports, __webpack_require__) {
  122748. /**
  122749. * @author Richard Davey <rich@photonstorm.com>
  122750. * @copyright 2018 Photon Storm Ltd.
  122751. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122752. */
  122753. /**
  122754. * @namespace Phaser.Display
  122755. */
  122756. module.exports = {
  122757. Align: __webpack_require__(948),
  122758. Bounds: __webpack_require__(933),
  122759. Canvas: __webpack_require__(930),
  122760. Color: __webpack_require__(512),
  122761. Masks: __webpack_require__(508)
  122762. };
  122763. /***/ }),
  122764. /* 950 */
  122765. /***/ (function(module, exports, __webpack_require__) {
  122766. /**
  122767. * @author Richard Davey <rich@photonstorm.com>
  122768. * @copyright 2018 Photon Storm Ltd.
  122769. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122770. */
  122771. var Class = __webpack_require__(0);
  122772. var Vector2 = __webpack_require__(6);
  122773. /**
  122774. * @classdesc
  122775. * [description]
  122776. *
  122777. * @class MoveTo
  122778. * @memberOf Phaser.Curves
  122779. * @constructor
  122780. * @since 3.0.0
  122781. *
  122782. * @param {number} [x] - [description]
  122783. * @param {number} [y] - [description]
  122784. */
  122785. var MoveTo = new Class({
  122786. initialize:
  122787. function MoveTo (x, y)
  122788. {
  122789. // Skip length calcs in paths
  122790. /**
  122791. * [description]
  122792. *
  122793. * @name Phaser.Curves.MoveTo#active
  122794. * @type {boolean}
  122795. * @default false
  122796. * @since 3.0.0
  122797. */
  122798. this.active = false;
  122799. /**
  122800. * [description]
  122801. *
  122802. * @name Phaser.Curves.MoveTo#p0
  122803. * @type {Phaser.Math.Vector2}
  122804. * @since 3.0.0
  122805. */
  122806. this.p0 = new Vector2(x, y);
  122807. },
  122808. /**
  122809. * Get point at relative position in curve according to length.
  122810. *
  122811. * @method Phaser.Curves.MoveTo#getPoint
  122812. * @since 3.0.0
  122813. *
  122814. * @generic {Phaser.Math.Vector2} O - [out,$return]
  122815. *
  122816. * @param {number} t - The position along the curve to return. Where 0 is the start and 1 is the end.
  122817. * @param {Phaser.Math.Vector2} [out] - A Vector2 object to store the result in. If not given will be created.
  122818. *
  122819. * @return {Phaser.Math.Vector2} The coordinates of the point on the curve. If an `out` object was given this will be returned.
  122820. */
  122821. getPoint: function (t, out)
  122822. {
  122823. if (out === undefined) { out = new Vector2(); }
  122824. return out.copy(this.p0);
  122825. },
  122826. /**
  122827. * [description]
  122828. *
  122829. * @method Phaser.Curves.MoveTo#getPointAt
  122830. * @since 3.0.0
  122831. *
  122832. * @generic {Phaser.Math.Vector2} O - [out,$return]
  122833. *
  122834. * @param {number} u - [description]
  122835. * @param {Phaser.Math.Vector2} [out] - [description]
  122836. *
  122837. * @return {Phaser.Math.Vector2} [description]
  122838. */
  122839. getPointAt: function (u, out)
  122840. {
  122841. return this.getPoint(u, out);
  122842. },
  122843. /**
  122844. * Gets the resolution of this curve.
  122845. *
  122846. * @method Phaser.Curves.MoveTo#getResolution
  122847. * @since 3.0.0
  122848. *
  122849. * @return {number} The resolution of this curve. For a MoveTo the value is always 1.
  122850. */
  122851. getResolution: function ()
  122852. {
  122853. return 1;
  122854. },
  122855. /**
  122856. * Gets the length of this curve.
  122857. *
  122858. * @method Phaser.Curves.MoveTo#getLength
  122859. * @since 3.0.0
  122860. *
  122861. * @return {number} The length of this curve. For a MoveTo the value is always 0.
  122862. */
  122863. getLength: function ()
  122864. {
  122865. return 0;
  122866. },
  122867. /**
  122868. * [description]
  122869. *
  122870. * @method Phaser.Curves.MoveTo#toJSON
  122871. * @since 3.0.0
  122872. *
  122873. * @return {JSONCurve} [description]
  122874. */
  122875. toJSON: function ()
  122876. {
  122877. return {
  122878. type: 'MoveTo',
  122879. points: [
  122880. this.p0.x, this.p0.y
  122881. ]
  122882. };
  122883. }
  122884. });
  122885. module.exports = MoveTo;
  122886. /***/ }),
  122887. /* 951 */
  122888. /***/ (function(module, exports, __webpack_require__) {
  122889. /**
  122890. * @author Richard Davey <rich@photonstorm.com>
  122891. * @copyright 2018 Photon Storm Ltd.
  122892. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  122893. */
  122894. // Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
  122895. var Class = __webpack_require__(0);
  122896. var CubicBezierCurve = __webpack_require__(521);
  122897. var EllipseCurve = __webpack_require__(519);
  122898. var GameObjectFactory = __webpack_require__(11);
  122899. var LineCurve = __webpack_require__(518);
  122900. var MovePathTo = __webpack_require__(950);
  122901. var QuadraticBezierCurve = __webpack_require__(517);
  122902. var Rectangle = __webpack_require__(13);
  122903. var SplineCurve = __webpack_require__(515);
  122904. var Vector2 = __webpack_require__(6);
  122905. /**
  122906. * @typedef {object} JSONPath
  122907. *
  122908. * @property {string} type - The of the curve.
  122909. * @property {number} x - [description]
  122910. * @property {number} y - [description]
  122911. * @property {boolean} autoClose - The path is auto closed.
  122912. * @property {JSONCurve[]} curves - The list of the curves
  122913. */
  122914. /**
  122915. * @classdesc
  122916. * [description]
  122917. *
  122918. * @class Path
  122919. * @memberOf Phaser.Curves
  122920. * @constructor
  122921. * @since 3.0.0
  122922. *
  122923. * @param {number} [x=0] - [description]
  122924. * @param {number} [y=0] - [description]
  122925. */
  122926. var Path = new Class({
  122927. initialize:
  122928. function Path (x, y)
  122929. {
  122930. if (x === undefined) { x = 0; }
  122931. if (y === undefined) { y = 0; }
  122932. /**
  122933. * [description]
  122934. *
  122935. * @name Phaser.Curves.Path#name
  122936. * @type {string}
  122937. * @default ''
  122938. * @since 3.0.0
  122939. */
  122940. this.name = '';
  122941. /**
  122942. * [description]
  122943. *
  122944. * @name Phaser.Curves.Path#curves
  122945. * @type {Phaser.Curves.Curve[]}
  122946. * @default []
  122947. * @since 3.0.0
  122948. */
  122949. this.curves = [];
  122950. /**
  122951. * [description]
  122952. *
  122953. * @name Phaser.Curves.Path#cacheLengths
  122954. * @type {number[]}
  122955. * @default []
  122956. * @since 3.0.0
  122957. */
  122958. this.cacheLengths = [];
  122959. /**
  122960. * Automatically closes the path.
  122961. *
  122962. * @name Phaser.Curves.Path#autoClose
  122963. * @type {boolean}
  122964. * @default false
  122965. * @since 3.0.0
  122966. */
  122967. this.autoClose = false;
  122968. /**
  122969. * [description]
  122970. *
  122971. * @name Phaser.Curves.Path#startPoint
  122972. * @type {Phaser.Math.Vector2}
  122973. * @since 3.0.0
  122974. */
  122975. this.startPoint = new Vector2();
  122976. /**
  122977. * [description]
  122978. *
  122979. * @name Phaser.Curves.Path#_tmpVec2A
  122980. * @type {Phaser.Math.Vector2}
  122981. * @private
  122982. * @since 3.0.0
  122983. */
  122984. this._tmpVec2A = new Vector2();
  122985. /**
  122986. * [description]
  122987. *
  122988. * @name Phaser.Curves.Path#_tmpVec2B
  122989. * @type {Phaser.Math.Vector2}
  122990. * @private
  122991. * @since 3.0.0
  122992. */
  122993. this._tmpVec2B = new Vector2();
  122994. if (typeof x === 'object')
  122995. {
  122996. this.fromJSON(x);
  122997. }
  122998. else
  122999. {
  123000. this.startPoint.set(x, y);
  123001. }
  123002. },
  123003. /**
  123004. * [description]
  123005. *
  123006. * @method Phaser.Curves.Path#add
  123007. * @since 3.0.0
  123008. *
  123009. * @param {Phaser.Curves.Curve} curve - [description]
  123010. *
  123011. * @return {Phaser.Curves.Path} [description]
  123012. */
  123013. add: function (curve)
  123014. {
  123015. this.curves.push(curve);
  123016. return this;
  123017. },
  123018. /**
  123019. * [description]
  123020. *
  123021. * @method Phaser.Curves.Path#circleTo
  123022. * @since 3.0.0
  123023. *
  123024. * @param {number} radius - [description]
  123025. * @param {boolean} [clockwise=false] - [description]
  123026. * @param {number} [rotation=0] - [description]
  123027. *
  123028. * @return {Phaser.Curves.Path} [description]
  123029. */
  123030. circleTo: function (radius, clockwise, rotation)
  123031. {
  123032. if (clockwise === undefined) { clockwise = false; }
  123033. return this.ellipseTo(radius, radius, 0, 360, clockwise, rotation);
  123034. },
  123035. /**
  123036. * [description]
  123037. *
  123038. * @method Phaser.Curves.Path#closePath
  123039. * @since 3.0.0
  123040. *
  123041. * @return {Phaser.Curves.Path} [description]
  123042. */
  123043. closePath: function ()
  123044. {
  123045. // Add a line curve if start and end of lines are not connected
  123046. var startPoint = this.curves[0].getPoint(0);
  123047. var endPoint = this.curves[this.curves.length - 1].getPoint(1);
  123048. if (!startPoint.equals(endPoint))
  123049. {
  123050. // This will copy a reference to the vectors, which probably isn't sensible
  123051. this.curves.push(new LineCurve(endPoint, startPoint));
  123052. }
  123053. return this;
  123054. },
  123055. /**
  123056. * Creates a cubic bezier curve starting at the previous end point and ending at p3, using p1 and p2 as control points.
  123057. *
  123058. * @method Phaser.Curves.Path#cubicBezierTo
  123059. * @since 3.0.0
  123060. *
  123061. * @param {(number|Phaser.Math.Vector2)} x - The x coordinate of the end point. Or, if a Vec2, the p1 value.
  123062. * @param {(number|Phaser.Math.Vector2)} y - The y coordinate of the end point. Or, if a Vec2, the p2 value.
  123063. * @param {(number|Phaser.Math.Vector2)} control1X - The x coordinate of the first control point. Or, if a Vec2, the p3 value.
  123064. * @param {number} [control1Y] - The y coordinate of the first control point. Not used if vec2s are provided as the first 3 arguments.
  123065. * @param {number} [control2X] - The x coordinate of the second control point. Not used if vec2s are provided as the first 3 arguments.
  123066. * @param {number} [control2Y] - The y coordinate of the second control point. Not used if vec2s are provided as the first 3 arguments.
  123067. *
  123068. * @return {Phaser.Curves.Path} [description]
  123069. */
  123070. cubicBezierTo: function (x, y, control1X, control1Y, control2X, control2Y)
  123071. {
  123072. var p0 = this.getEndPoint();
  123073. var p1;
  123074. var p2;
  123075. var p3;
  123076. // Assume they're all vec2s
  123077. if (x instanceof Vector2)
  123078. {
  123079. p1 = x;
  123080. p2 = y;
  123081. p3 = control1X;
  123082. }
  123083. else
  123084. {
  123085. p1 = new Vector2(control1X, control1Y);
  123086. p2 = new Vector2(control2X, control2Y);
  123087. p3 = new Vector2(x, y);
  123088. }
  123089. return this.add(new CubicBezierCurve(p0, p1, p2, p3));
  123090. },
  123091. // Creates a quadratic bezier curve starting at the previous end point and ending at p2, using p1 as a control point
  123092. /**
  123093. * [description]
  123094. *
  123095. * @method Phaser.Curves.Path#quadraticBezierTo
  123096. * @since 3.2.0
  123097. *
  123098. * @param {(number|Phaser.Math.Vector2[])} x - [description]
  123099. * @param {number} [y] - [description]
  123100. * @param {number} [controlX] - [description]
  123101. * @param {number} [controlY] - [description]
  123102. *
  123103. * @return {Phaser.Curves.Path} [description]
  123104. */
  123105. quadraticBezierTo: function (x, y, controlX, controlY)
  123106. {
  123107. var p0 = this.getEndPoint();
  123108. var p1;
  123109. var p2;
  123110. // Assume they're all vec2s
  123111. if (x instanceof Vector2)
  123112. {
  123113. p1 = x;
  123114. p2 = y;
  123115. }
  123116. else
  123117. {
  123118. p1 = new Vector2(controlX, controlY);
  123119. p2 = new Vector2(x, y);
  123120. }
  123121. return this.add(new QuadraticBezierCurve(p0, p1, p2));
  123122. },
  123123. /**
  123124. * [description]
  123125. *
  123126. * @method Phaser.Curves.Path#draw
  123127. * @since 3.0.0
  123128. *
  123129. * @generic {Phaser.GameObjects.Graphics} G - [out,$return]
  123130. *
  123131. * @param {Phaser.GameObjects.Graphics} graphics - [description]
  123132. * @param {integer} [pointsTotal=32] - [description]
  123133. *
  123134. * @return {Phaser.GameObjects.Graphics} [description]
  123135. */
  123136. draw: function (graphics, pointsTotal)
  123137. {
  123138. for (var i = 0; i < this.curves.length; i++)
  123139. {
  123140. var curve = this.curves[i];
  123141. if (!curve.active)
  123142. {
  123143. continue;
  123144. }
  123145. curve.draw(graphics, pointsTotal);
  123146. }
  123147. return graphics;
  123148. },
  123149. /**
  123150. * Creates an ellipse curve positioned at the previous end point, using the given parameters.
  123151. *
  123152. * @method Phaser.Curves.Path#ellipseTo
  123153. * @since 3.0.0
  123154. *
  123155. * @param {number} xRadius - [description]
  123156. * @param {number} yRadius - [description]
  123157. * @param {number} startAngle - [description]
  123158. * @param {number} endAngle - [description]
  123159. * @param {boolean} clockwise - [description]
  123160. * @param {number} rotation - [description]
  123161. *
  123162. * @return {Phaser.Curves.Path} [description]
  123163. */
  123164. ellipseTo: function (xRadius, yRadius, startAngle, endAngle, clockwise, rotation)
  123165. {
  123166. var ellipse = new EllipseCurve(0, 0, xRadius, yRadius, startAngle, endAngle, clockwise, rotation);
  123167. var end = this.getEndPoint(this._tmpVec2A);
  123168. // Calculate where to center the ellipse
  123169. var start = ellipse.getStartPoint(this._tmpVec2B);
  123170. end.subtract(start);
  123171. ellipse.x = end.x;
  123172. ellipse.y = end.y;
  123173. return this.add(ellipse);
  123174. },
  123175. /**
  123176. * [description]
  123177. *
  123178. * @method Phaser.Curves.Path#fromJSON
  123179. * @since 3.0.0
  123180. *
  123181. * @param {object} data - [description]
  123182. *
  123183. * @return {Phaser.Curves.Path} [description]
  123184. */
  123185. fromJSON: function (data)
  123186. {
  123187. // data should be an object matching the Path.toJSON object structure.
  123188. this.curves = [];
  123189. this.cacheLengths = [];
  123190. this.startPoint.set(data.x, data.y);
  123191. this.autoClose = data.autoClose;
  123192. for (var i = 0; i < data.curves.length; i++)
  123193. {
  123194. var curve = data.curves[i];
  123195. switch (curve.type)
  123196. {
  123197. case 'LineCurve':
  123198. this.add(LineCurve.fromJSON(curve));
  123199. break;
  123200. case 'EllipseCurve':
  123201. this.add(EllipseCurve.fromJSON(curve));
  123202. break;
  123203. case 'SplineCurve':
  123204. this.add(SplineCurve.fromJSON(curve));
  123205. break;
  123206. case 'CubicBezierCurve':
  123207. this.add(CubicBezierCurve.fromJSON(curve));
  123208. break;
  123209. case 'QuadraticBezierCurve':
  123210. this.add(QuadraticBezierCurve.fromJSON(curve));
  123211. break;
  123212. }
  123213. }
  123214. return this;
  123215. },
  123216. /**
  123217. * [description]
  123218. *
  123219. * @method Phaser.Curves.Path#getBounds
  123220. * @since 3.0.0
  123221. *
  123222. * @generic {Phaser.Math.Vector2} O - [out,$return]
  123223. *
  123224. * @param {Phaser.Geom.Rectangle} [out] - [description]
  123225. * @param {integer} [accuracy=16] - [description]
  123226. *
  123227. * @return {Phaser.Geom.Rectangle} [description]
  123228. */
  123229. getBounds: function (out, accuracy)
  123230. {
  123231. if (out === undefined) { out = new Rectangle(); }
  123232. if (accuracy === undefined) { accuracy = 16; }
  123233. out.x = Number.MAX_VALUE;
  123234. out.y = Number.MAX_VALUE;
  123235. var bounds = new Rectangle();
  123236. var maxRight = Number.MIN_SAFE_INTEGER;
  123237. var maxBottom = Number.MIN_SAFE_INTEGER;
  123238. for (var i = 0; i < this.curves.length; i++)
  123239. {
  123240. var curve = this.curves[i];
  123241. if (!curve.active)
  123242. {
  123243. continue;
  123244. }
  123245. curve.getBounds(bounds, accuracy);
  123246. out.x = Math.min(out.x, bounds.x);
  123247. out.y = Math.min(out.y, bounds.y);
  123248. maxRight = Math.max(maxRight, bounds.right);
  123249. maxBottom = Math.max(maxBottom, bounds.bottom);
  123250. }
  123251. out.right = maxRight;
  123252. out.bottom = maxBottom;
  123253. return out;
  123254. },
  123255. /**
  123256. * [description]
  123257. *
  123258. * @method Phaser.Curves.Path#getCurveLengths
  123259. * @since 3.0.0
  123260. *
  123261. * @return {number[]} [description]
  123262. */
  123263. getCurveLengths: function ()
  123264. {
  123265. // We use cache values if curves and cache array are same length
  123266. if (this.cacheLengths.length === this.curves.length)
  123267. {
  123268. return this.cacheLengths;
  123269. }
  123270. // Get length of sub-curve
  123271. // Push sums into cached array
  123272. var lengths = [];
  123273. var sums = 0;
  123274. for (var i = 0; i < this.curves.length; i++)
  123275. {
  123276. sums += this.curves[i].getLength();
  123277. lengths.push(sums);
  123278. }
  123279. this.cacheLengths = lengths;
  123280. return lengths;
  123281. },
  123282. /**
  123283. * [description]
  123284. *
  123285. * @method Phaser.Curves.Path#getEndPoint
  123286. * @since 3.0.0
  123287. *
  123288. * @generic {Phaser.Math.Vector2} O - [out,$return]
  123289. *
  123290. * @param {Phaser.Math.Vector2} [out] - [description]
  123291. *
  123292. * @return {Phaser.Math.Vector2} [description]
  123293. */
  123294. getEndPoint: function (out)
  123295. {
  123296. if (out === undefined) { out = new Vector2(); }
  123297. if (this.curves.length > 0)
  123298. {
  123299. this.curves[this.curves.length - 1].getPoint(1, out);
  123300. }
  123301. else
  123302. {
  123303. out.copy(this.startPoint);
  123304. }
  123305. return out;
  123306. },
  123307. /**
  123308. * [description]
  123309. *
  123310. * @method Phaser.Curves.Path#getLength
  123311. * @since 3.0.0
  123312. *
  123313. * @return {number} [description]
  123314. */
  123315. getLength: function ()
  123316. {
  123317. var lens = this.getCurveLengths();
  123318. return lens[lens.length - 1];
  123319. },
  123320. // To get accurate point with reference to
  123321. // entire path distance at time t,
  123322. // following has to be done:
  123323. // 1. Length of each sub path have to be known
  123324. // 2. Locate and identify type of curve
  123325. // 3. Get t for the curve
  123326. // 4. Return curve.getPointAt(t')
  123327. /**
  123328. * [description]
  123329. *
  123330. * @method Phaser.Curves.Path#getPoint
  123331. * @since 3.0.0
  123332. *
  123333. * @generic {Phaser.Math.Vector2} O - [out,$return]
  123334. *
  123335. * @param {number} t - [description]
  123336. * @param {Phaser.Math.Vector2} [out] - [description]
  123337. *
  123338. * @return {?Phaser.Math.Vector2} [description]
  123339. */
  123340. getPoint: function (t, out)
  123341. {
  123342. if (out === undefined) { out = new Vector2(); }
  123343. var d = t * this.getLength();
  123344. var curveLengths = this.getCurveLengths();
  123345. var i = 0;
  123346. while (i < curveLengths.length)
  123347. {
  123348. if (curveLengths[i] >= d)
  123349. {
  123350. var diff = curveLengths[i] - d;
  123351. var curve = this.curves[i];
  123352. var segmentLength = curve.getLength();
  123353. var u = (segmentLength === 0) ? 0 : 1 - diff / segmentLength;
  123354. return curve.getPointAt(u, out);
  123355. }
  123356. i++;
  123357. }
  123358. // loop where sum != 0, sum > d , sum+1 <d
  123359. return null;
  123360. },
  123361. /**
  123362. * [description]
  123363. *
  123364. * @method Phaser.Curves.Path#getPoints
  123365. * @since 3.0.0
  123366. *
  123367. * @param {integer} [divisions=12] - [description]
  123368. *
  123369. * @return {Phaser.Math.Vector2[]} [description]
  123370. */
  123371. getPoints: function (divisions)
  123372. {
  123373. if (divisions === undefined) { divisions = 12; }
  123374. var points = [];
  123375. var last;
  123376. for (var i = 0; i < this.curves.length; i++)
  123377. {
  123378. var curve = this.curves[i];
  123379. if (!curve.active)
  123380. {
  123381. continue;
  123382. }
  123383. var resolution = curve.getResolution(divisions);
  123384. var pts = curve.getPoints(resolution);
  123385. for (var j = 0; j < pts.length; j++)
  123386. {
  123387. var point = pts[j];
  123388. if (last && last.equals(point))
  123389. {
  123390. // ensures no consecutive points are duplicates
  123391. continue;
  123392. }
  123393. points.push(point);
  123394. last = point;
  123395. }
  123396. }
  123397. if (this.autoClose && points.length > 1 && !points[points.length - 1].equals(points[0]))
  123398. {
  123399. points.push(points[0]);
  123400. }
  123401. return points;
  123402. },
  123403. /**
  123404. * [description]
  123405. *
  123406. * @method Phaser.Curves.Path#getRandomPoint
  123407. * @since 3.0.0
  123408. *
  123409. * @generic {Phaser.Math.Vector2} O - [out,$return]
  123410. *
  123411. * @param {Phaser.Math.Vector2} [out] - [description]
  123412. *
  123413. * @return {Phaser.Math.Vector2} [description]
  123414. */
  123415. getRandomPoint: function (out)
  123416. {
  123417. if (out === undefined) { out = new Vector2(); }
  123418. return this.getPoint(Math.random(), out);
  123419. },
  123420. /**
  123421. * [description]
  123422. *
  123423. * @method Phaser.Curves.Path#getSpacedPoints
  123424. * @since 3.0.0
  123425. *
  123426. * @param {integer} [divisions=40] - [description]
  123427. *
  123428. * @return {Phaser.Math.Vector2[]} [description]
  123429. */
  123430. getSpacedPoints: function (divisions)
  123431. {
  123432. if (divisions === undefined) { divisions = 40; }
  123433. var points = [];
  123434. for (var i = 0; i <= divisions; i++)
  123435. {
  123436. points.push(this.getPoint(i / divisions));
  123437. }
  123438. if (this.autoClose)
  123439. {
  123440. points.push(points[0]);
  123441. }
  123442. return points;
  123443. },
  123444. /**
  123445. * [description]
  123446. *
  123447. * @method Phaser.Curves.Path#getStartPoint
  123448. * @since 3.0.0
  123449. *
  123450. * @generic {Phaser.Math.Vector2} O - [out,$return]
  123451. *
  123452. * @param {Phaser.Math.Vector2} [out] - [description]
  123453. *
  123454. * @return {Phaser.Math.Vector2} [description]
  123455. */
  123456. getStartPoint: function (out)
  123457. {
  123458. if (out === undefined) { out = new Vector2(); }
  123459. return out.copy(this.startPoint);
  123460. },
  123461. // Creates a line curve from the previous end point to x/y
  123462. /**
  123463. * [description]
  123464. *
  123465. * @method Phaser.Curves.Path#lineTo
  123466. * @since 3.0.0
  123467. *
  123468. * @param {(number|Phaser.Math.Vector2)} x - [description]
  123469. * @param {number} [y] - [description]
  123470. *
  123471. * @return {Phaser.Curves.Path} [description]
  123472. */
  123473. lineTo: function (x, y)
  123474. {
  123475. if (x instanceof Vector2)
  123476. {
  123477. this._tmpVec2B.copy(x);
  123478. }
  123479. else
  123480. {
  123481. this._tmpVec2B.set(x, y);
  123482. }
  123483. var end = this.getEndPoint(this._tmpVec2A);
  123484. return this.add(new LineCurve([ end.x, end.y, this._tmpVec2B.x, this._tmpVec2B.y ]));
  123485. },
  123486. // Creates a spline curve starting at the previous end point, using the given parameters
  123487. /**
  123488. * [description]
  123489. *
  123490. * @method Phaser.Curves.Path#splineTo
  123491. * @since 3.0.0
  123492. *
  123493. * @param {Phaser.Math.Vector2[]} points - [description]
  123494. *
  123495. * @return {Phaser.Curves.Path} [description]
  123496. */
  123497. splineTo: function (points)
  123498. {
  123499. points.unshift(this.getEndPoint());
  123500. return this.add(new SplineCurve(points));
  123501. },
  123502. /**
  123503. * [description]
  123504. *
  123505. * @method Phaser.Curves.Path#moveTo
  123506. * @since 3.0.0
  123507. *
  123508. * @param {number} x - [description]
  123509. * @param {number} y - [description]
  123510. *
  123511. * @return {Phaser.Curves.Path} [description]
  123512. */
  123513. moveTo: function (x, y)
  123514. {
  123515. return this.add(new MovePathTo(x, y));
  123516. },
  123517. /**
  123518. * [description]
  123519. *
  123520. * @method Phaser.Curves.Path#toJSON
  123521. * @since 3.0.0
  123522. *
  123523. * @return {JSONPath} [description]
  123524. */
  123525. toJSON: function ()
  123526. {
  123527. var out = [];
  123528. for (var i = 0; i < this.curves.length; i++)
  123529. {
  123530. out.push(this.curves[i].toJSON());
  123531. }
  123532. return {
  123533. type: 'Path',
  123534. x: this.startPoint.x,
  123535. y: this.startPoint.y,
  123536. autoClose: this.autoClose,
  123537. curves: out
  123538. };
  123539. },
  123540. // cacheLengths must be recalculated.
  123541. /**
  123542. * [description]
  123543. *
  123544. * @method Phaser.Curves.Path#updateArcLengths
  123545. * @since 3.0.0
  123546. */
  123547. updateArcLengths: function ()
  123548. {
  123549. this.cacheLengths = [];
  123550. this.getCurveLengths();
  123551. },
  123552. /**
  123553. * [description]
  123554. *
  123555. * @method Phaser.Curves.Path#destroy
  123556. * @since 3.0.0
  123557. */
  123558. destroy: function ()
  123559. {
  123560. this.curves.length = 0;
  123561. this.cacheLengths.length = 0;
  123562. this.startPoint = undefined;
  123563. }
  123564. });
  123565. /**
  123566. * Creates a new Path Object.
  123567. *
  123568. * @method Phaser.GameObjects.GameObjectFactory#path
  123569. * @since 3.0.0
  123570. *
  123571. * @param {number} x - The horizontal position of this Path.
  123572. * @param {number} y - The vertical position of this Path.
  123573. *
  123574. * @return {Phaser.Curves.Path} The Path Object that was created.
  123575. */
  123576. GameObjectFactory.register('path', function (x, y)
  123577. {
  123578. return new Path(x, y);
  123579. });
  123580. // When registering a factory function 'this' refers to the GameObjectFactory context.
  123581. //
  123582. // There are several properties available to use:
  123583. //
  123584. // this.scene - a reference to the Scene that owns the GameObjectFactory
  123585. // this.displayList - a reference to the Display List the Scene owns
  123586. // this.updateList - a reference to the Update List the Scene owns
  123587. module.exports = Path;
  123588. /***/ }),
  123589. /* 952 */
  123590. /***/ (function(module, exports, __webpack_require__) {
  123591. /**
  123592. * @author Richard Davey <rich@photonstorm.com>
  123593. * @copyright 2018 Photon Storm Ltd.
  123594. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123595. */
  123596. /**
  123597. * @namespace Phaser.Curves
  123598. */
  123599. /**
  123600. * @typedef {object} JSONCurve
  123601. *
  123602. * @property {string} type - The of the curve
  123603. * @property {number[]} points - The arrays of points like `[x1, y1, x2, y2]`
  123604. */
  123605. module.exports = {
  123606. Path: __webpack_require__(951),
  123607. CubicBezier: __webpack_require__(521),
  123608. Curve: __webpack_require__(86),
  123609. Ellipse: __webpack_require__(519),
  123610. Line: __webpack_require__(518),
  123611. QuadraticBezier: __webpack_require__(517),
  123612. Spline: __webpack_require__(515)
  123613. };
  123614. /***/ }),
  123615. /* 953 */
  123616. /***/ (function(module, exports) {
  123617. /**
  123618. * @author Richard Davey <rich@photonstorm.com>
  123619. * @copyright 2018 Photon Storm Ltd.
  123620. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123621. */
  123622. /**
  123623. * A 16 color palette inspired by Japanese computers like the MSX.
  123624. *
  123625. * @name Phaser.Create.Palettes.MSX
  123626. * @since 3.0.0
  123627. *
  123628. * @type {Palette}
  123629. */
  123630. module.exports = {
  123631. 0: '#000',
  123632. 1: '#191028',
  123633. 2: '#46af45',
  123634. 3: '#a1d685',
  123635. 4: '#453e78',
  123636. 5: '#7664fe',
  123637. 6: '#833129',
  123638. 7: '#9ec2e8',
  123639. 8: '#dc534b',
  123640. 9: '#e18d79',
  123641. A: '#d6b97b',
  123642. B: '#e9d8a1',
  123643. C: '#216c4b',
  123644. D: '#d365c8',
  123645. E: '#afaab9',
  123646. F: '#fff'
  123647. };
  123648. /***/ }),
  123649. /* 954 */
  123650. /***/ (function(module, exports) {
  123651. /**
  123652. * @author Richard Davey <rich@photonstorm.com>
  123653. * @copyright 2018 Photon Storm Ltd.
  123654. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123655. */
  123656. /**
  123657. * A 16 color JMP palette by [Arne](http://androidarts.com/palette/16pal.htm)
  123658. *
  123659. * @name Phaser.Create.Palettes.JMP
  123660. * @since 3.0.0
  123661. *
  123662. * @type {Palette}
  123663. */
  123664. module.exports = {
  123665. 0: '#000',
  123666. 1: '#191028',
  123667. 2: '#46af45',
  123668. 3: '#a1d685',
  123669. 4: '#453e78',
  123670. 5: '#7664fe',
  123671. 6: '#833129',
  123672. 7: '#9ec2e8',
  123673. 8: '#dc534b',
  123674. 9: '#e18d79',
  123675. A: '#d6b97b',
  123676. B: '#e9d8a1',
  123677. C: '#216c4b',
  123678. D: '#d365c8',
  123679. E: '#afaab9',
  123680. F: '#f5f4eb'
  123681. };
  123682. /***/ }),
  123683. /* 955 */
  123684. /***/ (function(module, exports) {
  123685. /**
  123686. * @author Richard Davey <rich@photonstorm.com>
  123687. * @copyright 2018 Photon Storm Ltd.
  123688. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123689. */
  123690. /**
  123691. * A 16 color CGA inspired palette by [Arne](http://androidarts.com/palette/16pal.htm)
  123692. *
  123693. * @name Phaser.Create.Palettes.CGA
  123694. * @since 3.0.0
  123695. *
  123696. * @type {Palette}
  123697. */
  123698. module.exports = {
  123699. 0: '#000',
  123700. 1: '#2234d1',
  123701. 2: '#0c7e45',
  123702. 3: '#44aacc',
  123703. 4: '#8a3622',
  123704. 5: '#5c2e78',
  123705. 6: '#aa5c3d',
  123706. 7: '#b5b5b5',
  123707. 8: '#5e606e',
  123708. 9: '#4c81fb',
  123709. A: '#6cd947',
  123710. B: '#7be2f9',
  123711. C: '#eb8a60',
  123712. D: '#e23d69',
  123713. E: '#ffd93f',
  123714. F: '#fff'
  123715. };
  123716. /***/ }),
  123717. /* 956 */
  123718. /***/ (function(module, exports) {
  123719. /**
  123720. * @author Richard Davey <rich@photonstorm.com>
  123721. * @copyright 2018 Photon Storm Ltd.
  123722. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123723. */
  123724. /**
  123725. * A 16 color palette inspired by the Commodore 64.
  123726. *
  123727. * @name Phaser.Create.Palettes.C64
  123728. * @since 3.0.0
  123729. *
  123730. * @type {Palette}
  123731. */
  123732. module.exports = {
  123733. 0: '#000',
  123734. 1: '#fff',
  123735. 2: '#8b4131',
  123736. 3: '#7bbdc5',
  123737. 4: '#8b41ac',
  123738. 5: '#6aac41',
  123739. 6: '#3931a4',
  123740. 7: '#d5de73',
  123741. 8: '#945a20',
  123742. 9: '#5a4100',
  123743. A: '#bd736a',
  123744. B: '#525252',
  123745. C: '#838383',
  123746. D: '#acee8b',
  123747. E: '#7b73de',
  123748. F: '#acacac'
  123749. };
  123750. /***/ }),
  123751. /* 957 */
  123752. /***/ (function(module, exports, __webpack_require__) {
  123753. /**
  123754. * @author Richard Davey <rich@photonstorm.com>
  123755. * @copyright 2018 Photon Storm Ltd.
  123756. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123757. */
  123758. /**
  123759. * @typedef {object} Palette
  123760. *
  123761. * @property {string} 0 - Color value 1.
  123762. * @property {string} 1 - Color value 2.
  123763. * @property {string} 2 - Color value 3.
  123764. * @property {string} 3 - Color value 4.
  123765. * @property {string} 4 - Color value 5.
  123766. * @property {string} 5 - Color value 6.
  123767. * @property {string} 6 - Color value 7.
  123768. * @property {string} 7 - Color value 8.
  123769. * @property {string} 8 - Color value 9.
  123770. * @property {string} 9 - Color value 10.
  123771. * @property {string} A - Color value 11.
  123772. * @property {string} B - Color value 12.
  123773. * @property {string} C - Color value 13.
  123774. * @property {string} D - Color value 14.
  123775. * @property {string} E - Color value 15.
  123776. * @property {string} F - Color value 16.
  123777. */
  123778. /**
  123779. * @namespace Phaser.Create.Palettes
  123780. */
  123781. module.exports = {
  123782. ARNE16: __webpack_require__(269),
  123783. C64: __webpack_require__(956),
  123784. CGA: __webpack_require__(955),
  123785. JMP: __webpack_require__(954),
  123786. MSX: __webpack_require__(953)
  123787. };
  123788. /***/ }),
  123789. /* 958 */
  123790. /***/ (function(module, exports, __webpack_require__) {
  123791. /**
  123792. * @author Richard Davey <rich@photonstorm.com>
  123793. * @copyright 2018 Photon Storm Ltd.
  123794. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123795. */
  123796. /**
  123797. * @namespace Phaser.Create
  123798. */
  123799. module.exports = {
  123800. GenerateTexture: __webpack_require__(270),
  123801. Palettes: __webpack_require__(957)
  123802. };
  123803. /***/ }),
  123804. /* 959 */
  123805. /***/ (function(module, exports, __webpack_require__) {
  123806. /**
  123807. * @author Richard Davey <rich@photonstorm.com>
  123808. * @copyright 2018 Photon Storm Ltd.
  123809. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  123810. */
  123811. var Class = __webpack_require__(0);
  123812. var OrthographicCamera = __webpack_require__(523);
  123813. var PerspectiveCamera = __webpack_require__(522);
  123814. var PluginCache = __webpack_require__(12);
  123815. /**
  123816. * @classdesc
  123817. * [description]
  123818. *
  123819. * @class CameraManager
  123820. * @memberOf Phaser.Cameras.Sprite3D
  123821. * @constructor
  123822. * @since 3.0.0
  123823. *
  123824. * @param {Phaser.Scene} scene - [description]
  123825. */
  123826. var CameraManager = new Class({
  123827. initialize:
  123828. function CameraManager (scene)
  123829. {
  123830. /**
  123831. * [description]
  123832. *
  123833. * @name Phaser.Cameras.Sprite3D.CameraManager#scene
  123834. * @type {Phaser.Scene}
  123835. * @since 3.0.0
  123836. */
  123837. this.scene = scene;
  123838. /**
  123839. * [description]
  123840. *
  123841. * @name Phaser.Cameras.Sprite3D.CameraManager#systems
  123842. * @type {Phaser.Scenes.Systems}
  123843. * @since 3.0.0
  123844. */
  123845. this.systems = scene.sys;
  123846. /**
  123847. * An Array of the Camera objects being managed by this Camera Manager.
  123848. *
  123849. * @name Phaser.Cameras.Sprite3D.CameraManager#cameras
  123850. * @type {Phaser.Cameras.Sprite3D.Camera[]}
  123851. * @since 3.0.0
  123852. */
  123853. this.cameras = [];
  123854. scene.sys.events.once('boot', this.boot, this);
  123855. scene.sys.events.on('start', this.start, this);
  123856. },
  123857. /**
  123858. * This method is called automatically, only once, when the Scene is first created.
  123859. * Do not invoke it directly.
  123860. *
  123861. * @method Phaser.Cameras.Scene3D.CameraManager#boot
  123862. * @private
  123863. * @since 3.5.1
  123864. */
  123865. boot: function ()
  123866. {
  123867. this.systems.events.once('destroy', this.destroy, this);
  123868. },
  123869. /**
  123870. * This method is called automatically by the Scene when it is starting up.
  123871. * It is responsible for creating local systems, properties and listening for Scene events.
  123872. * Do not invoke it directly.
  123873. *
  123874. * @method Phaser.Cameras.Sprite3D.CameraManager#start
  123875. * @private
  123876. * @since 3.5.0
  123877. */
  123878. start: function ()
  123879. {
  123880. var eventEmitter = this.systems.events;
  123881. eventEmitter.on('update', this.update, this);
  123882. eventEmitter.once('shutdown', this.shutdown, this);
  123883. },
  123884. /**
  123885. * [description]
  123886. *
  123887. * @method Phaser.Cameras.Sprite3D.CameraManager#add
  123888. * @since 3.0.0
  123889. *
  123890. * @param {number} [fieldOfView=80] - [description]
  123891. * @param {number} [width] - [description]
  123892. * @param {number} [height] - [description]
  123893. *
  123894. * @return {Phaser.Cameras.Sprite3D.PerspectiveCamera} [description]
  123895. */
  123896. add: function (fieldOfView, width, height)
  123897. {
  123898. return this.addPerspectiveCamera(fieldOfView, width, height);
  123899. },
  123900. /**
  123901. * [description]
  123902. *
  123903. * @method Phaser.Cameras.Sprite3D.CameraManager#addOrthographicCamera
  123904. * @since 3.0.0
  123905. *
  123906. * @param {number} width - [description]
  123907. * @param {number} height - [description]
  123908. *
  123909. * @return {Phaser.Cameras.Sprite3D.OrthographicCamera} [description]
  123910. */
  123911. addOrthographicCamera: function (width, height)
  123912. {
  123913. var config = this.scene.sys.game.config;
  123914. if (width === undefined) { width = config.width; }
  123915. if (height === undefined) { height = config.height; }
  123916. var camera = new OrthographicCamera(this.scene, width, height);
  123917. this.cameras.push(camera);
  123918. return camera;
  123919. },
  123920. /**
  123921. * [description]
  123922. *
  123923. * @method Phaser.Cameras.Sprite3D.CameraManager#addPerspectiveCamera
  123924. * @since 3.0.0
  123925. *
  123926. * @param {number} [fieldOfView=80] - [description]
  123927. * @param {number} [width] - [description]
  123928. * @param {number} [height] - [description]
  123929. *
  123930. * @return {Phaser.Cameras.Sprite3D.PerspectiveCamera} [description]
  123931. */
  123932. addPerspectiveCamera: function (fieldOfView, width, height)
  123933. {
  123934. var config = this.scene.sys.game.config;
  123935. if (fieldOfView === undefined) { fieldOfView = 80; }
  123936. if (width === undefined) { width = config.width; }
  123937. if (height === undefined) { height = config.height; }
  123938. var camera = new PerspectiveCamera(this.scene, fieldOfView, width, height);
  123939. this.cameras.push(camera);
  123940. return camera;
  123941. },
  123942. /**
  123943. * [description]
  123944. *
  123945. * @method Phaser.Cameras.Sprite3D.CameraManager#getCamera
  123946. * @since 3.0.0
  123947. *
  123948. * @param {string} name - [description]
  123949. *
  123950. * @return {(Phaser.Cameras.Sprite3D.OrthographicCamera|Phaser.Cameras.Sprite3D.PerspectiveCamera)} [description]
  123951. */
  123952. getCamera: function (name)
  123953. {
  123954. for (var i = 0; i < this.cameras.length; i++)
  123955. {
  123956. if (this.cameras[i].name === name)
  123957. {
  123958. return this.cameras[i];
  123959. }
  123960. }
  123961. return null;
  123962. },
  123963. /**
  123964. * [description]
  123965. *
  123966. * @method Phaser.Cameras.Sprite3D.CameraManager#removeCamera
  123967. * @since 3.0.0
  123968. *
  123969. * @param {(Phaser.Cameras.Sprite3D.OrthographicCamera|Phaser.Cameras.Sprite3D.PerspectiveCamera)} camera - [description]
  123970. */
  123971. removeCamera: function (camera)
  123972. {
  123973. var cameraIndex = this.cameras.indexOf(camera);
  123974. if (cameraIndex !== -1)
  123975. {
  123976. this.cameras.splice(cameraIndex, 1);
  123977. }
  123978. },
  123979. /**
  123980. * [description]
  123981. *
  123982. * @method Phaser.Cameras.Sprite3D.CameraManager#removeAll
  123983. * @since 3.0.0
  123984. *
  123985. * @return {(Phaser.Cameras.Sprite3D.OrthographicCamera|Phaser.Cameras.Sprite3D.PerspectiveCamera)} [description]
  123986. */
  123987. removeAll: function ()
  123988. {
  123989. while (this.cameras.length > 0)
  123990. {
  123991. var camera = this.cameras.pop();
  123992. camera.destroy();
  123993. }
  123994. return this.main;
  123995. },
  123996. /**
  123997. * [description]
  123998. *
  123999. * @method Phaser.Cameras.Sprite3D.CameraManager#update
  124000. * @since 3.0.0
  124001. *
  124002. * @param {number} timestep - [description]
  124003. * @param {number} delta - [description]
  124004. */
  124005. update: function (timestep, delta)
  124006. {
  124007. for (var i = 0, l = this.cameras.length; i < l; ++i)
  124008. {
  124009. this.cameras[i].update(timestep, delta);
  124010. }
  124011. },
  124012. /**
  124013. * The Scene that owns this plugin is shutting down.
  124014. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  124015. *
  124016. * @method Phaser.Cameras.Sprite3D.CameraManager#shutdown
  124017. * @private
  124018. * @since 3.0.0
  124019. */
  124020. shutdown: function ()
  124021. {
  124022. var eventEmitter = this.systems.events;
  124023. eventEmitter.off('update', this.update, this);
  124024. eventEmitter.off('shutdown', this.shutdown, this);
  124025. this.removeAll();
  124026. },
  124027. /**
  124028. * The Scene that owns this plugin is being destroyed.
  124029. * We need to shutdown and then kill off all external references.
  124030. *
  124031. * @method Phaser.Cameras.Sprite3D.CameraManager#destroy
  124032. * @private
  124033. * @since 3.0.0
  124034. */
  124035. destroy: function ()
  124036. {
  124037. this.shutdown();
  124038. this.scene.sys.events.off('start', this.start, this);
  124039. this.scene = null;
  124040. this.systems = null;
  124041. }
  124042. });
  124043. PluginCache.register('CameraManager3D', CameraManager, 'cameras3d');
  124044. module.exports = CameraManager;
  124045. /***/ }),
  124046. /* 960 */
  124047. /***/ (function(module, exports, __webpack_require__) {
  124048. /**
  124049. * @author Richard Davey <rich@photonstorm.com>
  124050. * @copyright 2018 Photon Storm Ltd.
  124051. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124052. */
  124053. /**
  124054. * @namespace Phaser.Cameras.Sprite3D
  124055. */
  124056. module.exports = {
  124057. Camera: __webpack_require__(273),
  124058. CameraManager: __webpack_require__(959),
  124059. OrthographicCamera: __webpack_require__(523),
  124060. PerspectiveCamera: __webpack_require__(522)
  124061. };
  124062. /***/ }),
  124063. /* 961 */
  124064. /***/ (function(module, exports, __webpack_require__) {
  124065. /**
  124066. * @author Richard Davey <rich@photonstorm.com>
  124067. * @copyright 2018 Photon Storm Ltd.
  124068. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124069. */
  124070. var Class = __webpack_require__(0);
  124071. var GetValue = __webpack_require__(4);
  124072. // var controlConfig = {
  124073. // camera: this.cameras.main,
  124074. // left: cursors.left,
  124075. // right: cursors.right,
  124076. // up: cursors.up,
  124077. // down: cursors.down,
  124078. // zoomIn: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.Q),
  124079. // zoomOut: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.E),
  124080. // zoomSpeed: 0.02,
  124081. // acceleration: 0.06,
  124082. // drag: 0.0005,
  124083. // maxSpeed: 1.0
  124084. // };
  124085. /**
  124086. * @typedef {object} SmoothedKeyControlConfig
  124087. *
  124088. * @property {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera that this Control will update.
  124089. * @property {Phaser.Input.Keyboard.Key} [left] - The Key to be pressed that will move the Camera left.
  124090. * @property {Phaser.Input.Keyboard.Key} [right] - The Key to be pressed that will move the Camera right.
  124091. * @property {Phaser.Input.Keyboard.Key} [up] - The Key to be pressed that will move the Camera up.
  124092. * @property {Phaser.Input.Keyboard.Key} [zoomIn] - The Key to be pressed that will zoom the Camera in.
  124093. * @property {Phaser.Input.Keyboard.Key} [zoomOut] - The Key to be pressed that will zoom the Camera out.
  124094. * @property {number} [zoomSpeed=0.01] - The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed.
  124095. * @property {(number|{x:number,y:number})} [acceleration=0] - The horizontal and vertical acceleration the camera will move.
  124096. * @property {(number|{x:number,y:number})} [drag=0] - The horizontal and vertical drag applied to the camera when it is moving.
  124097. * @property {(number|{x:number,y:number})} [maxSpeed=0] - The maximum horizontal and vertical speed the camera will move.
  124098. */
  124099. /**
  124100. * @classdesc
  124101. * [description]
  124102. *
  124103. * @class SmoothedKeyControl
  124104. * @memberOf Phaser.Cameras.Controls
  124105. * @constructor
  124106. * @since 3.0.0
  124107. *
  124108. * @param {SmoothedKeyControlConfig} config - [description]
  124109. */
  124110. var SmoothedKeyControl = new Class({
  124111. initialize:
  124112. function SmoothedKeyControl (config)
  124113. {
  124114. /**
  124115. * The Camera that this Control will update.
  124116. *
  124117. * @name Phaser.Cameras.Controls.SmoothedKeyControl#camera
  124118. * @type {?Phaser.Cameras.Scene2D.Camera}
  124119. * @default null
  124120. * @since 3.0.0
  124121. */
  124122. this.camera = GetValue(config, 'camera', null);
  124123. /**
  124124. * The Key to be pressed that will move the Camera left.
  124125. *
  124126. * @name Phaser.Cameras.Controls.SmoothedKeyControl#left
  124127. * @type {?Phaser.Input.Keyboard.Key}
  124128. * @default null
  124129. * @since 3.0.0
  124130. */
  124131. this.left = GetValue(config, 'left', null);
  124132. /**
  124133. * The Key to be pressed that will move the Camera right.
  124134. *
  124135. * @name Phaser.Cameras.Controls.SmoothedKeyControl#right
  124136. * @type {?Phaser.Input.Keyboard.Key}
  124137. * @default null
  124138. * @since 3.0.0
  124139. */
  124140. this.right = GetValue(config, 'right', null);
  124141. /**
  124142. * The Key to be pressed that will move the Camera up.
  124143. *
  124144. * @name Phaser.Cameras.Controls.SmoothedKeyControl#up
  124145. * @type {?Phaser.Input.Keyboard.Key}
  124146. * @default null
  124147. * @since 3.0.0
  124148. */
  124149. this.up = GetValue(config, 'up', null);
  124150. /**
  124151. * The Key to be pressed that will move the Camera down.
  124152. *
  124153. * @name Phaser.Cameras.Controls.SmoothedKeyControl#down
  124154. * @type {?Phaser.Input.Keyboard.Key}
  124155. * @default null
  124156. * @since 3.0.0
  124157. */
  124158. this.down = GetValue(config, 'down', null);
  124159. /**
  124160. * The Key to be pressed that will zoom the Camera in.
  124161. *
  124162. * @name Phaser.Cameras.Controls.SmoothedKeyControl#zoomIn
  124163. * @type {?Phaser.Input.Keyboard.Key}
  124164. * @default null
  124165. * @since 3.0.0
  124166. */
  124167. this.zoomIn = GetValue(config, 'zoomIn', null);
  124168. /**
  124169. * The Key to be pressed that will zoom the Camera out.
  124170. *
  124171. * @name Phaser.Cameras.Controls.SmoothedKeyControl#zoomOut
  124172. * @type {?Phaser.Input.Keyboard.Key}
  124173. * @default null
  124174. * @since 3.0.0
  124175. */
  124176. this.zoomOut = GetValue(config, 'zoomOut', null);
  124177. /**
  124178. * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed.
  124179. *
  124180. * @name Phaser.Cameras.Controls.SmoothedKeyControl#zoomSpeed
  124181. * @type {number}
  124182. * @default 0.01
  124183. * @since 3.0.0
  124184. */
  124185. this.zoomSpeed = GetValue(config, 'zoomSpeed', 0.01);
  124186. /**
  124187. * The horizontal acceleration the camera will move.
  124188. *
  124189. * @name Phaser.Cameras.Controls.SmoothedKeyControl#accelX
  124190. * @type {number}
  124191. * @default 0
  124192. * @since 3.0.0
  124193. */
  124194. this.accelX = 0;
  124195. /**
  124196. * The vertical acceleration the camera will move.
  124197. *
  124198. * @name Phaser.Cameras.Controls.SmoothedKeyControl#accelY
  124199. * @type {number}
  124200. * @default 0
  124201. * @since 3.0.0
  124202. */
  124203. this.accelY = 0;
  124204. var accel = GetValue(config, 'acceleration', null);
  124205. if (typeof accel === 'number')
  124206. {
  124207. this.accelX = accel;
  124208. this.accelY = accel;
  124209. }
  124210. else
  124211. {
  124212. this.accelX = GetValue(config, 'acceleration.x', 0);
  124213. this.accelY = GetValue(config, 'acceleration.y', 0);
  124214. }
  124215. /**
  124216. * The horizontal drag applied to the camera when it is moving.
  124217. *
  124218. * @name Phaser.Cameras.Controls.SmoothedKeyControl#dragX
  124219. * @type {number}
  124220. * @default 0
  124221. * @since 3.0.0
  124222. */
  124223. this.dragX = 0;
  124224. /**
  124225. * The vertical drag applied to the camera when it is moving.
  124226. *
  124227. * @name Phaser.Cameras.Controls.SmoothedKeyControl#dragY
  124228. * @type {number}
  124229. * @default 0
  124230. * @since 3.0.0
  124231. */
  124232. this.dragY = 0;
  124233. var drag = GetValue(config, 'drag', null);
  124234. if (typeof drag === 'number')
  124235. {
  124236. this.dragX = drag;
  124237. this.dragY = drag;
  124238. }
  124239. else
  124240. {
  124241. this.dragX = GetValue(config, 'drag.x', 0);
  124242. this.dragY = GetValue(config, 'drag.y', 0);
  124243. }
  124244. /**
  124245. * The maximum horizontal speed the camera will move.
  124246. *
  124247. * @name Phaser.Cameras.Controls.SmoothedKeyControl#maxSpeedX
  124248. * @type {number}
  124249. * @default 0
  124250. * @since 3.0.0
  124251. */
  124252. this.maxSpeedX = 0;
  124253. /**
  124254. * The maximum vertical speed the camera will move.
  124255. *
  124256. * @name Phaser.Cameras.Controls.SmoothedKeyControl#maxSpeedY
  124257. * @type {number}
  124258. * @default 0
  124259. * @since 3.0.0
  124260. */
  124261. this.maxSpeedY = 0;
  124262. var maxSpeed = GetValue(config, 'maxSpeed', null);
  124263. if (typeof maxSpeed === 'number')
  124264. {
  124265. this.maxSpeedX = maxSpeed;
  124266. this.maxSpeedY = maxSpeed;
  124267. }
  124268. else
  124269. {
  124270. this.maxSpeedX = GetValue(config, 'maxSpeed.x', 0);
  124271. this.maxSpeedY = GetValue(config, 'maxSpeed.y', 0);
  124272. }
  124273. /**
  124274. * [description]
  124275. *
  124276. * @name Phaser.Cameras.Controls.SmoothedKeyControl#_speedX
  124277. * @type {number}
  124278. * @private
  124279. * @default 0
  124280. * @since 3.0.0
  124281. */
  124282. this._speedX = 0;
  124283. /**
  124284. * [description]
  124285. *
  124286. * @name Phaser.Cameras.Controls.SmoothedKeyControl#_speedY
  124287. * @type {number}
  124288. * @private
  124289. * @default 0
  124290. * @since 3.0.0
  124291. */
  124292. this._speedY = 0;
  124293. /**
  124294. * [description]
  124295. *
  124296. * @name Phaser.Cameras.Controls.SmoothedKeyControl#_zoom
  124297. * @type {number}
  124298. * @private
  124299. * @default 0
  124300. * @since 3.0.0
  124301. */
  124302. this._zoom = 0;
  124303. /**
  124304. * A flag controlling if the Controls will update the Camera or not.
  124305. *
  124306. * @name Phaser.Cameras.Controls.SmoothedKeyControl#active
  124307. * @type {boolean}
  124308. * @since 3.0.0
  124309. */
  124310. this.active = (this.camera !== null);
  124311. },
  124312. /**
  124313. * Starts the Key Control running, providing it has been linked to a camera.
  124314. *
  124315. * @method Phaser.Cameras.Controls.SmoothedKeyControl#start
  124316. * @since 3.0.0
  124317. *
  124318. * @return {Phaser.Cameras.Controls.SmoothedKeyControl} This Key Control instance.
  124319. */
  124320. start: function ()
  124321. {
  124322. this.active = (this.camera !== null);
  124323. return this;
  124324. },
  124325. /**
  124326. * Stops this Key Control from running. Call `start` to start it again.
  124327. *
  124328. * @method Phaser.Cameras.Controls.SmoothedKeyControl#stop
  124329. * @since 3.0.0
  124330. *
  124331. * @return {Phaser.Cameras.Controls.SmoothedKeyControl} This Key Control instance.
  124332. */
  124333. stop: function ()
  124334. {
  124335. this.active = false;
  124336. return this;
  124337. },
  124338. /**
  124339. * Binds this Key Control to a camera.
  124340. *
  124341. * @method Phaser.Cameras.Controls.SmoothedKeyControl#setCamera
  124342. * @since 3.0.0
  124343. *
  124344. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera to bind this Key Control to.
  124345. *
  124346. * @return {Phaser.Cameras.Controls.SmoothedKeyControl} This Key Control instance.
  124347. */
  124348. setCamera: function (camera)
  124349. {
  124350. this.camera = camera;
  124351. return this;
  124352. },
  124353. /**
  124354. * [description]
  124355. *
  124356. * @method Phaser.Cameras.Controls.SmoothedKeyControl#update
  124357. * @since 3.0.0
  124358. *
  124359. * @param {number} delta - The delta time, in ms, elapsed since the last frame.
  124360. */
  124361. update: function (delta)
  124362. {
  124363. if (!this.active)
  124364. {
  124365. return;
  124366. }
  124367. if (delta === undefined) { delta = 1; }
  124368. var cam = this.camera;
  124369. // Apply Deceleration
  124370. if (this._speedX > 0)
  124371. {
  124372. this._speedX -= this.dragX * delta;
  124373. if (this._speedX < 0)
  124374. {
  124375. this._speedX = 0;
  124376. }
  124377. }
  124378. else if (this._speedX < 0)
  124379. {
  124380. this._speedX += this.dragX * delta;
  124381. if (this._speedX > 0)
  124382. {
  124383. this._speedX = 0;
  124384. }
  124385. }
  124386. if (this._speedY > 0)
  124387. {
  124388. this._speedY -= this.dragY * delta;
  124389. if (this._speedY < 0)
  124390. {
  124391. this._speedY = 0;
  124392. }
  124393. }
  124394. else if (this._speedY < 0)
  124395. {
  124396. this._speedY += this.dragY * delta;
  124397. if (this._speedY > 0)
  124398. {
  124399. this._speedY = 0;
  124400. }
  124401. }
  124402. // Check for keys
  124403. if (this.up && this.up.isDown)
  124404. {
  124405. this._speedY += this.accelY;
  124406. if (this._speedY > this.maxSpeedY)
  124407. {
  124408. this._speedY = this.maxSpeedY;
  124409. }
  124410. }
  124411. else if (this.down && this.down.isDown)
  124412. {
  124413. this._speedY -= this.accelY;
  124414. if (this._speedY < -this.maxSpeedY)
  124415. {
  124416. this._speedY = -this.maxSpeedY;
  124417. }
  124418. }
  124419. if (this.left && this.left.isDown)
  124420. {
  124421. this._speedX += this.accelX;
  124422. if (this._speedX > this.maxSpeedX)
  124423. {
  124424. this._speedX = this.maxSpeedX;
  124425. }
  124426. }
  124427. else if (this.right && this.right.isDown)
  124428. {
  124429. this._speedX -= this.accelX;
  124430. if (this._speedX < -this.maxSpeedX)
  124431. {
  124432. this._speedX = -this.maxSpeedX;
  124433. }
  124434. }
  124435. // Camera zoom
  124436. if (this.zoomIn && this.zoomIn.isDown)
  124437. {
  124438. this._zoom = -this.zoomSpeed;
  124439. }
  124440. else if (this.zoomOut && this.zoomOut.isDown)
  124441. {
  124442. this._zoom = this.zoomSpeed;
  124443. }
  124444. else
  124445. {
  124446. this._zoom = 0;
  124447. }
  124448. // Apply to Camera
  124449. if (this._speedX !== 0)
  124450. {
  124451. cam.scrollX -= ((this._speedX * delta) | 0);
  124452. }
  124453. if (this._speedY !== 0)
  124454. {
  124455. cam.scrollY -= ((this._speedY * delta) | 0);
  124456. }
  124457. if (this._zoom !== 0)
  124458. {
  124459. cam.zoom += this._zoom;
  124460. if (cam.zoom < 0.1)
  124461. {
  124462. cam.zoom = 0.1;
  124463. }
  124464. }
  124465. },
  124466. /**
  124467. * Destroys this Key Control.
  124468. *
  124469. * @method Phaser.Cameras.Controls.SmoothedKeyControl#destroy
  124470. * @since 3.0.0
  124471. */
  124472. destroy: function ()
  124473. {
  124474. this.camera = null;
  124475. this.left = null;
  124476. this.right = null;
  124477. this.up = null;
  124478. this.down = null;
  124479. this.zoomIn = null;
  124480. this.zoomOut = null;
  124481. }
  124482. });
  124483. module.exports = SmoothedKeyControl;
  124484. /***/ }),
  124485. /* 962 */
  124486. /***/ (function(module, exports, __webpack_require__) {
  124487. /**
  124488. * @author Richard Davey <rich@photonstorm.com>
  124489. * @copyright 2018 Photon Storm Ltd.
  124490. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124491. */
  124492. var Class = __webpack_require__(0);
  124493. var GetValue = __webpack_require__(4);
  124494. // var camControl = new CameraControl({
  124495. // camera: this.cameras.main,
  124496. // left: cursors.left,
  124497. // right: cursors.right,
  124498. // speed: float OR { x: 0, y: 0 }
  124499. // })
  124500. /**
  124501. * @typedef {object} FixedKeyControlConfig
  124502. *
  124503. * @property {Phaser.Cameras.Scene2D.Camera} [camera] - The Camera that this Control will update.
  124504. * @property {Phaser.Input.Keyboard.Key} [left] - The Key to be pressed that will move the Camera left.
  124505. * @property {Phaser.Input.Keyboard.Key} [right] - The Key to be pressed that will move the Camera right.
  124506. * @property {Phaser.Input.Keyboard.Key} [up] - The Key to be pressed that will move the Camera up.
  124507. * @property {Phaser.Input.Keyboard.Key} [zoomIn] - The Key to be pressed that will zoom the Camera in.
  124508. * @property {Phaser.Input.Keyboard.Key} [zoomOut] - The Key to be pressed that will zoom the Camera out.
  124509. * @property {number} [zoomSpeed=0.01] - The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed.
  124510. * @property {(number|{x:number,y:number})} [speed=0] - The horizontal and vertical speed the camera will move.
  124511. */
  124512. /**
  124513. * @classdesc
  124514. * [description]
  124515. *
  124516. * @class FixedKeyControl
  124517. * @memberOf Phaser.Cameras.Controls
  124518. * @constructor
  124519. * @since 3.0.0
  124520. *
  124521. * @param {FixedKeyControlConfig} config - [description]
  124522. */
  124523. var FixedKeyControl = new Class({
  124524. initialize:
  124525. function FixedKeyControl (config)
  124526. {
  124527. /**
  124528. * The Camera that this Control will update.
  124529. *
  124530. * @name Phaser.Cameras.Controls.FixedKeyControl#camera
  124531. * @type {?Phaser.Cameras.Scene2D.Camera}
  124532. * @default null
  124533. * @since 3.0.0
  124534. */
  124535. this.camera = GetValue(config, 'camera', null);
  124536. /**
  124537. * The Key to be pressed that will move the Camera left.
  124538. *
  124539. * @name Phaser.Cameras.Controls.FixedKeyControl#left
  124540. * @type {?Phaser.Input.Keyboard.Key}
  124541. * @default null
  124542. * @since 3.0.0
  124543. */
  124544. this.left = GetValue(config, 'left', null);
  124545. /**
  124546. * The Key to be pressed that will move the Camera right.
  124547. *
  124548. * @name Phaser.Cameras.Controls.FixedKeyControl#right
  124549. * @type {?Phaser.Input.Keyboard.Key}
  124550. * @default null
  124551. * @since 3.0.0
  124552. */
  124553. this.right = GetValue(config, 'right', null);
  124554. /**
  124555. * The Key to be pressed that will move the Camera up.
  124556. *
  124557. * @name Phaser.Cameras.Controls.FixedKeyControl#up
  124558. * @type {?Phaser.Input.Keyboard.Key}
  124559. * @default null
  124560. * @since 3.0.0
  124561. */
  124562. this.up = GetValue(config, 'up', null);
  124563. /**
  124564. * The Key to be pressed that will move the Camera down.
  124565. *
  124566. * @name Phaser.Cameras.Controls.FixedKeyControl#down
  124567. * @type {?Phaser.Input.Keyboard.Key}
  124568. * @default null
  124569. * @since 3.0.0
  124570. */
  124571. this.down = GetValue(config, 'down', null);
  124572. /**
  124573. * The Key to be pressed that will zoom the Camera in.
  124574. *
  124575. * @name Phaser.Cameras.Controls.FixedKeyControl#zoomIn
  124576. * @type {?Phaser.Input.Keyboard.Key}
  124577. * @default null
  124578. * @since 3.0.0
  124579. */
  124580. this.zoomIn = GetValue(config, 'zoomIn', null);
  124581. /**
  124582. * The Key to be pressed that will zoom the Camera out.
  124583. *
  124584. * @name Phaser.Cameras.Controls.FixedKeyControl#zoomOut
  124585. * @type {?Phaser.Input.Keyboard.Key}
  124586. * @default null
  124587. * @since 3.0.0
  124588. */
  124589. this.zoomOut = GetValue(config, 'zoomOut', null);
  124590. /**
  124591. * The speed at which the camera will zoom if the `zoomIn` or `zoomOut` keys are pressed.
  124592. *
  124593. * @name Phaser.Cameras.Controls.FixedKeyControl#zoomSpeed
  124594. * @type {number}
  124595. * @default 0.01
  124596. * @since 3.0.0
  124597. */
  124598. this.zoomSpeed = GetValue(config, 'zoomSpeed', 0.01);
  124599. /**
  124600. * The horizontal speed the camera will move.
  124601. *
  124602. * @name Phaser.Cameras.Controls.FixedKeyControl#speedX
  124603. * @type {number}
  124604. * @default 0
  124605. * @since 3.0.0
  124606. */
  124607. this.speedX = 0;
  124608. /**
  124609. * The vertical speed the camera will move.
  124610. *
  124611. * @name Phaser.Cameras.Controls.FixedKeyControl#speedY
  124612. * @type {number}
  124613. * @default 0
  124614. * @since 3.0.0
  124615. */
  124616. this.speedY = 0;
  124617. var speed = GetValue(config, 'speed', null);
  124618. if (typeof speed === 'number')
  124619. {
  124620. this.speedX = speed;
  124621. this.speedY = speed;
  124622. }
  124623. else
  124624. {
  124625. this.speedX = GetValue(config, 'speed.x', 0);
  124626. this.speedY = GetValue(config, 'speed.y', 0);
  124627. }
  124628. /**
  124629. * [description]
  124630. *
  124631. * @name Phaser.Cameras.Controls.FixedKeyControl#_zoom
  124632. * @type {number}
  124633. * @private
  124634. * @default 0
  124635. * @since 3.0.0
  124636. */
  124637. this._zoom = 0;
  124638. /**
  124639. * A flag controlling if the Controls will update the Camera or not.
  124640. *
  124641. * @name Phaser.Cameras.Controls.FixedKeyControl#active
  124642. * @type {boolean}
  124643. * @since 3.0.0
  124644. */
  124645. this.active = (this.camera !== null);
  124646. },
  124647. /**
  124648. * Starts the Key Control running, providing it has been linked to a camera.
  124649. *
  124650. * @method Phaser.Cameras.Controls.FixedKeyControl#start
  124651. * @since 3.0.0
  124652. *
  124653. * @return {Phaser.Cameras.Controls.FixedKeyControl} This Key Control instance.
  124654. */
  124655. start: function ()
  124656. {
  124657. this.active = (this.camera !== null);
  124658. return this;
  124659. },
  124660. /**
  124661. * Stops this Key Control from running. Call `start` to start it again.
  124662. *
  124663. * @method Phaser.Cameras.Controls.FixedKeyControl#stop
  124664. * @since 3.0.0
  124665. *
  124666. * @return {Phaser.Cameras.Controls.FixedKeyControl} This Key Control instance.
  124667. */
  124668. stop: function ()
  124669. {
  124670. this.active = false;
  124671. return this;
  124672. },
  124673. /**
  124674. * Binds this Key Control to a camera.
  124675. *
  124676. * @method Phaser.Cameras.Controls.FixedKeyControl#setCamera
  124677. * @since 3.0.0
  124678. *
  124679. * @param {Phaser.Cameras.Scene2D.Camera} camera - The camera to bind this Key Control to.
  124680. *
  124681. * @return {Phaser.Cameras.Controls.FixedKeyControl} This Key Control instance.
  124682. */
  124683. setCamera: function (camera)
  124684. {
  124685. this.camera = camera;
  124686. return this;
  124687. },
  124688. /**
  124689. * [description]
  124690. *
  124691. * @method Phaser.Cameras.Controls.FixedKeyControl#update
  124692. * @since 3.0.0
  124693. *
  124694. * @param {number} delta - [description]
  124695. */
  124696. update: function (delta)
  124697. {
  124698. if (!this.active)
  124699. {
  124700. return;
  124701. }
  124702. if (delta === undefined) { delta = 1; }
  124703. var cam = this.camera;
  124704. if (this.up && this.up.isDown)
  124705. {
  124706. cam.scrollY -= ((this.speedY * delta) | 0);
  124707. }
  124708. else if (this.down && this.down.isDown)
  124709. {
  124710. cam.scrollY += ((this.speedY * delta) | 0);
  124711. }
  124712. if (this.left && this.left.isDown)
  124713. {
  124714. cam.scrollX -= ((this.speedX * delta) | 0);
  124715. }
  124716. else if (this.right && this.right.isDown)
  124717. {
  124718. cam.scrollX += ((this.speedX * delta) | 0);
  124719. }
  124720. // Camera zoom
  124721. if (this.zoomIn && this.zoomIn.isDown)
  124722. {
  124723. cam.zoom -= this.zoomSpeed;
  124724. if (cam.zoom < 0.1)
  124725. {
  124726. cam.zoom = 0.1;
  124727. }
  124728. }
  124729. else if (this.zoomOut && this.zoomOut.isDown)
  124730. {
  124731. cam.zoom += this.zoomSpeed;
  124732. }
  124733. },
  124734. /**
  124735. * Destroys this Key Control.
  124736. *
  124737. * @method Phaser.Cameras.Controls.FixedKeyControl#destroy
  124738. * @since 3.0.0
  124739. */
  124740. destroy: function ()
  124741. {
  124742. this.camera = null;
  124743. this.left = null;
  124744. this.right = null;
  124745. this.up = null;
  124746. this.down = null;
  124747. this.zoomIn = null;
  124748. this.zoomOut = null;
  124749. }
  124750. });
  124751. module.exports = FixedKeyControl;
  124752. /***/ }),
  124753. /* 963 */
  124754. /***/ (function(module, exports, __webpack_require__) {
  124755. /**
  124756. * @author Richard Davey <rich@photonstorm.com>
  124757. * @copyright 2018 Photon Storm Ltd.
  124758. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124759. */
  124760. /**
  124761. * @namespace Phaser.Cameras.Controls
  124762. */
  124763. module.exports = {
  124764. FixedKeyControl: __webpack_require__(962),
  124765. SmoothedKeyControl: __webpack_require__(961)
  124766. };
  124767. /***/ }),
  124768. /* 964 */
  124769. /***/ (function(module, exports, __webpack_require__) {
  124770. /**
  124771. * @author Richard Davey <rich@photonstorm.com>
  124772. * @copyright 2018 Photon Storm Ltd.
  124773. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124774. */
  124775. /**
  124776. * @namespace Phaser.Cameras
  124777. */
  124778. module.exports = {
  124779. Controls: __webpack_require__(963),
  124780. Scene2D: __webpack_require__(570),
  124781. Sprite3D: __webpack_require__(960)
  124782. };
  124783. /***/ }),
  124784. /* 965 */
  124785. /***/ (function(module, exports, __webpack_require__) {
  124786. /**
  124787. * @author Richard Davey <rich@photonstorm.com>
  124788. * @author samme <samme.npm@gmail.com>
  124789. * @copyright 2018 Photon Storm Ltd.
  124790. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124791. */
  124792. var Wrap = __webpack_require__(40);
  124793. /**
  124794. * Wrap each item's coordinates within a rectangle's area.
  124795. *
  124796. * @function Phaser.Actions.WrapInRectangle
  124797. * @since 3.0.0
  124798. * @see Phaser.Math.Wrap
  124799. *
  124800. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  124801. *
  124802. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  124803. * @param {Phaser.Geom.Rectangle} rect - The rectangle.
  124804. * @param {number} [padding=0] - An amount added to each side of the rectangle during the operation.
  124805. *
  124806. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  124807. */
  124808. var WrapInRectangle = function (items, rect, padding)
  124809. {
  124810. if (padding === undefined)
  124811. {
  124812. padding = 0;
  124813. }
  124814. for (var i = 0; i < items.length; i++)
  124815. {
  124816. var item = items[i];
  124817. item.x = Wrap(item.x, rect.left - padding, rect.right + padding);
  124818. item.y = Wrap(item.y, rect.top - padding, rect.bottom + padding);
  124819. }
  124820. return items;
  124821. };
  124822. module.exports = WrapInRectangle;
  124823. /***/ }),
  124824. /* 966 */
  124825. /***/ (function(module, exports) {
  124826. /**
  124827. * @author Richard Davey <rich@photonstorm.com>
  124828. * @copyright 2018 Photon Storm Ltd.
  124829. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124830. */
  124831. /**
  124832. * [description]
  124833. *
  124834. * @function Phaser.Actions.ToggleVisible
  124835. * @since 3.0.0
  124836. *
  124837. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  124838. *
  124839. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  124840. *
  124841. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  124842. */
  124843. var ToggleVisible = function (items)
  124844. {
  124845. for (var i = 0; i < items.length; i++)
  124846. {
  124847. items[i].visible = !items[i].visible;
  124848. }
  124849. return items;
  124850. };
  124851. module.exports = ToggleVisible;
  124852. /***/ }),
  124853. /* 967 */
  124854. /***/ (function(module, exports) {
  124855. /**
  124856. * @author Richard Davey <rich@photonstorm.com>
  124857. * @copyright 2018 Photon Storm Ltd.
  124858. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124859. */
  124860. /**
  124861. * [description]
  124862. *
  124863. * @function Phaser.Actions.Spread
  124864. * @since 3.0.0
  124865. *
  124866. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  124867. *
  124868. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  124869. * @param {string} property - [description]
  124870. * @param {number} min - [description]
  124871. * @param {number} max - [description]
  124872. * @param {number} [inc=false] - [description]
  124873. *
  124874. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  124875. */
  124876. var Spread = function (items, property, min, max, inc)
  124877. {
  124878. if (inc === undefined) { inc = false; }
  124879. var step = Math.abs(max - min) / items.length;
  124880. var i;
  124881. if (inc)
  124882. {
  124883. for (i = 0; i < items.length; i++)
  124884. {
  124885. items[i][property] += i * step;
  124886. }
  124887. }
  124888. else
  124889. {
  124890. for (i = 0; i < items.length; i++)
  124891. {
  124892. items[i][property] = i * step;
  124893. }
  124894. }
  124895. return items;
  124896. };
  124897. module.exports = Spread;
  124898. /***/ }),
  124899. /* 968 */
  124900. /***/ (function(module, exports, __webpack_require__) {
  124901. /**
  124902. * @author Richard Davey <rich@photonstorm.com>
  124903. * @copyright 2018 Photon Storm Ltd.
  124904. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124905. */
  124906. var MathSmoothStep = __webpack_require__(157);
  124907. /**
  124908. * [description]
  124909. *
  124910. * @function Phaser.Actions.SmoothStep
  124911. * @since 3.0.0
  124912. *
  124913. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  124914. *
  124915. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  124916. * @param {string} property - [description]
  124917. * @param {number} min - [description]
  124918. * @param {number} max - [description]
  124919. * @param {number} inc - [description]
  124920. *
  124921. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  124922. */
  124923. var SmoothStep = function (items, property, min, max, inc)
  124924. {
  124925. if (inc === undefined) { inc = false; }
  124926. var step = Math.abs(max - min) / items.length;
  124927. var i;
  124928. if (inc)
  124929. {
  124930. for (i = 0; i < items.length; i++)
  124931. {
  124932. items[i][property] += MathSmoothStep(i * step, min, max);
  124933. }
  124934. }
  124935. else
  124936. {
  124937. for (i = 0; i < items.length; i++)
  124938. {
  124939. items[i][property] = MathSmoothStep(i * step, min, max);
  124940. }
  124941. }
  124942. return items;
  124943. };
  124944. module.exports = SmoothStep;
  124945. /***/ }),
  124946. /* 969 */
  124947. /***/ (function(module, exports, __webpack_require__) {
  124948. /**
  124949. * @author Richard Davey <rich@photonstorm.com>
  124950. * @copyright 2018 Photon Storm Ltd.
  124951. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124952. */
  124953. var MathSmootherStep = __webpack_require__(292);
  124954. /**
  124955. * [description]
  124956. *
  124957. * @function Phaser.Actions.SmootherStep
  124958. * @since 3.0.0
  124959. *
  124960. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  124961. *
  124962. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  124963. * @param {string} property - [description]
  124964. * @param {number} min - [description]
  124965. * @param {number} max - [description]
  124966. * @param {number} inc - [description]
  124967. *
  124968. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  124969. */
  124970. var SmootherStep = function (items, property, min, max, inc)
  124971. {
  124972. if (inc === undefined) { inc = false; }
  124973. var step = Math.abs(max - min) / items.length;
  124974. var i;
  124975. if (inc)
  124976. {
  124977. for (i = 0; i < items.length; i++)
  124978. {
  124979. items[i][property] += MathSmootherStep(i * step, min, max);
  124980. }
  124981. }
  124982. else
  124983. {
  124984. for (i = 0; i < items.length; i++)
  124985. {
  124986. items[i][property] = MathSmootherStep(i * step, min, max);
  124987. }
  124988. }
  124989. return items;
  124990. };
  124991. module.exports = SmootherStep;
  124992. /***/ }),
  124993. /* 970 */
  124994. /***/ (function(module, exports, __webpack_require__) {
  124995. /**
  124996. * @author Richard Davey <rich@photonstorm.com>
  124997. * @copyright 2018 Photon Storm Ltd.
  124998. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  124999. */
  125000. var ArrayShuffle = __webpack_require__(95);
  125001. /**
  125002. * Shuffles the array in place. The shuffled array is both modified and returned.
  125003. *
  125004. * @function Phaser.Actions.Shuffle
  125005. * @since 3.0.0
  125006. * @see Phaser.Utils.Array.Shuffle
  125007. *
  125008. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125009. *
  125010. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  125011. *
  125012. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  125013. */
  125014. var Shuffle = function (items)
  125015. {
  125016. return ArrayShuffle(items);
  125017. };
  125018. module.exports = Shuffle;
  125019. /***/ }),
  125020. /* 971 */
  125021. /***/ (function(module, exports, __webpack_require__) {
  125022. /**
  125023. * @author Richard Davey <rich@photonstorm.com>
  125024. * @copyright 2018 Photon Storm Ltd.
  125025. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125026. */
  125027. var Vector2 = __webpack_require__(6);
  125028. /**
  125029. * Iterate through items changing the position of each element to
  125030. * be that of the element that came before it in the array (or after it if direction = 1)
  125031. * The first items position is set to x/y.
  125032. * The final x/y coords are returned
  125033. *
  125034. * @function Phaser.Actions.ShiftPosition
  125035. * @since 3.0.0
  125036. *
  125037. * @generic {Phaser.GameObjects.GameObject[]} G - [items]
  125038. * @generic {Phaser.Math.Vector2} O - [output,$return]
  125039. *
  125040. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  125041. * @param {number} x - [description]
  125042. * @param {number} y - [description]
  125043. * @param {integer} [direction=0] - [description]
  125044. * @param {(Phaser.Math.Vector2|object)} [output] - [description]
  125045. *
  125046. * @return {Phaser.Math.Vector2} The output vector.
  125047. */
  125048. var ShiftPosition = function (items, x, y, direction, output)
  125049. {
  125050. if (direction === undefined) { direction = 0; }
  125051. if (output === undefined) { output = new Vector2(); }
  125052. var px;
  125053. var py;
  125054. if (items.length > 1)
  125055. {
  125056. var i;
  125057. var cx;
  125058. var cy;
  125059. var cur;
  125060. if (direction === 0)
  125061. {
  125062. // Bottom to Top
  125063. var len = items.length - 1;
  125064. px = items[len].x;
  125065. py = items[len].y;
  125066. for (i = len - 1; i >= 0; i--)
  125067. {
  125068. // Current item
  125069. cur = items[i];
  125070. // Get current item x/y, to be passed to the next item in the list
  125071. cx = cur.x;
  125072. cy = cur.y;
  125073. // Set current item to the previous items x/y
  125074. cur.x = px;
  125075. cur.y = py;
  125076. // Set current as previous
  125077. px = cx;
  125078. py = cy;
  125079. }
  125080. // Update the head item to the new x/y coordinates
  125081. items[len].x = x;
  125082. items[len].y = y;
  125083. }
  125084. else
  125085. {
  125086. // Top to Bottom
  125087. px = items[0].x;
  125088. py = items[0].y;
  125089. for (i = 1; i < items.length; i++)
  125090. {
  125091. // Current item
  125092. cur = items[i];
  125093. // Get current item x/y, to be passed to the next item in the list
  125094. cx = cur.x;
  125095. cy = cur.y;
  125096. // Set current item to the previous items x/y
  125097. cur.x = px;
  125098. cur.y = py;
  125099. // Set current as previous
  125100. px = cx;
  125101. py = cy;
  125102. }
  125103. // Update the head item to the new x/y coordinates
  125104. items[0].x = x;
  125105. items[0].y = y;
  125106. }
  125107. }
  125108. else
  125109. {
  125110. px = items[0].x;
  125111. py = items[0].y;
  125112. items[0].x = x;
  125113. items[0].y = y;
  125114. }
  125115. // Return the final set of coordinates as they're effectively lost from the shift and may be needed
  125116. output.x = px;
  125117. output.y = py;
  125118. return output;
  125119. };
  125120. module.exports = ShiftPosition;
  125121. /***/ }),
  125122. /* 972 */
  125123. /***/ (function(module, exports, __webpack_require__) {
  125124. /**
  125125. * @author Richard Davey <rich@photonstorm.com>
  125126. * @copyright 2018 Photon Storm Ltd.
  125127. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125128. */
  125129. var PropertyValueSet = __webpack_require__(26);
  125130. /**
  125131. * Takes an array of Game Objects, or any objects that have the public property `y`
  125132. * and then sets it to the given value.
  125133. *
  125134. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  125135. *
  125136. * To use this with a Group: `SetY(group.getChildren(), value, step)`
  125137. *
  125138. * @function Phaser.Actions.SetY
  125139. * @since 3.0.0
  125140. *
  125141. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125142. *
  125143. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125144. * @param {number} value - The amount to set the property to.
  125145. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  125146. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125147. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125148. *
  125149. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125150. */
  125151. var SetY = function (items, value, step, index, direction)
  125152. {
  125153. return PropertyValueSet(items, 'y', value, step, index, direction);
  125154. };
  125155. module.exports = SetY;
  125156. /***/ }),
  125157. /* 973 */
  125158. /***/ (function(module, exports, __webpack_require__) {
  125159. /**
  125160. * @author Richard Davey <rich@photonstorm.com>
  125161. * @copyright 2018 Photon Storm Ltd.
  125162. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125163. */
  125164. var PropertyValueSet = __webpack_require__(26);
  125165. /**
  125166. * Takes an array of Game Objects, or any objects that have the public properties `x` and `y`
  125167. * and then sets them to the given values.
  125168. *
  125169. * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array.
  125170. *
  125171. * To use this with a Group: `SetXY(group.getChildren(), x, y, stepX, stepY)`
  125172. *
  125173. * @function Phaser.Actions.SetXY
  125174. * @since 3.0.0
  125175. *
  125176. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125177. *
  125178. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125179. * @param {number} x - The amount to set the `x` property to.
  125180. * @param {number} [y=x] - The amount to set the `y` property to. If `undefined` or `null` it uses the `x` value.
  125181. * @param {number} [stepX=0] - This is added to the `x` amount, multiplied by the iteration counter.
  125182. * @param {number} [stepY=0] - This is added to the `y` amount, multiplied by the iteration counter.
  125183. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125184. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125185. *
  125186. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125187. */
  125188. var SetXY = function (items, x, y, stepX, stepY, index, direction)
  125189. {
  125190. if (y === undefined || y === null) { y = x; }
  125191. PropertyValueSet(items, 'x', x, stepX, index, direction);
  125192. return PropertyValueSet(items, 'y', y, stepY, index, direction);
  125193. };
  125194. module.exports = SetXY;
  125195. /***/ }),
  125196. /* 974 */
  125197. /***/ (function(module, exports, __webpack_require__) {
  125198. /**
  125199. * @author Richard Davey <rich@photonstorm.com>
  125200. * @copyright 2018 Photon Storm Ltd.
  125201. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125202. */
  125203. var PropertyValueSet = __webpack_require__(26);
  125204. /**
  125205. * Takes an array of Game Objects, or any objects that have the public property `x`
  125206. * and then sets it to the given value.
  125207. *
  125208. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  125209. *
  125210. * To use this with a Group: `SetX(group.getChildren(), value, step)`
  125211. *
  125212. * @function Phaser.Actions.SetX
  125213. * @since 3.0.0
  125214. *
  125215. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125216. *
  125217. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125218. * @param {number} value - The amount to set the property to.
  125219. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  125220. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125221. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125222. *
  125223. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125224. */
  125225. var SetX = function (items, value, step, index, direction)
  125226. {
  125227. return PropertyValueSet(items, 'x', value, step, index, direction);
  125228. };
  125229. module.exports = SetX;
  125230. /***/ }),
  125231. /* 975 */
  125232. /***/ (function(module, exports, __webpack_require__) {
  125233. /**
  125234. * @author Richard Davey <rich@photonstorm.com>
  125235. * @copyright 2018 Photon Storm Ltd.
  125236. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125237. */
  125238. var PropertyValueSet = __webpack_require__(26);
  125239. /**
  125240. * Takes an array of Game Objects, or any objects that have the public property `visible`
  125241. * and then sets it to the given value.
  125242. *
  125243. * To use this with a Group: `SetVisible(group.getChildren(), value)`
  125244. *
  125245. * @function Phaser.Actions.SetVisible
  125246. * @since 3.0.0
  125247. *
  125248. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125249. *
  125250. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125251. * @param {boolean} value - The value to set the property to.
  125252. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125253. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125254. *
  125255. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125256. */
  125257. var SetVisible = function (items, value, index, direction)
  125258. {
  125259. return PropertyValueSet(items, 'visible', value, 0, index, direction);
  125260. };
  125261. module.exports = SetVisible;
  125262. /***/ }),
  125263. /* 976 */
  125264. /***/ (function(module, exports) {
  125265. /**
  125266. * @author Richard Davey <rich@photonstorm.com>
  125267. * @copyright 2018 Photon Storm Ltd.
  125268. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125269. */
  125270. /**
  125271. * [description]
  125272. *
  125273. * @function Phaser.Actions.SetTint
  125274. * @since 3.0.0
  125275. *
  125276. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125277. *
  125278. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  125279. * @param {number} topLeft - [description]
  125280. * @param {number} [topRight] - [description]
  125281. * @param {number} [bottomLeft] - [description]
  125282. * @param {number} [bottomRight] - [description]
  125283. *
  125284. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  125285. */
  125286. var SetTint = function (items, topLeft, topRight, bottomLeft, bottomRight)
  125287. {
  125288. for (var i = 0; i < items.length; i++)
  125289. {
  125290. items[i].setTint(topLeft, topRight, bottomLeft, bottomRight);
  125291. }
  125292. return items;
  125293. };
  125294. module.exports = SetTint;
  125295. /***/ }),
  125296. /* 977 */
  125297. /***/ (function(module, exports, __webpack_require__) {
  125298. /**
  125299. * @author Richard Davey <rich@photonstorm.com>
  125300. * @copyright 2018 Photon Storm Ltd.
  125301. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125302. */
  125303. var PropertyValueSet = __webpack_require__(26);
  125304. /**
  125305. * Takes an array of Game Objects, or any objects that have the public property `scaleY`
  125306. * and then sets it to the given value.
  125307. *
  125308. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  125309. *
  125310. * To use this with a Group: `SetScaleY(group.getChildren(), value, step)`
  125311. *
  125312. * @function Phaser.Actions.SetScaleY
  125313. * @since 3.0.0
  125314. *
  125315. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125316. *
  125317. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125318. * @param {number} value - The amount to set the property to.
  125319. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  125320. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125321. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125322. *
  125323. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125324. */
  125325. var SetScaleY = function (items, value, step, index, direction)
  125326. {
  125327. return PropertyValueSet(items, 'scaleY', value, step, index, direction);
  125328. };
  125329. module.exports = SetScaleY;
  125330. /***/ }),
  125331. /* 978 */
  125332. /***/ (function(module, exports, __webpack_require__) {
  125333. /**
  125334. * @author Richard Davey <rich@photonstorm.com>
  125335. * @copyright 2018 Photon Storm Ltd.
  125336. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125337. */
  125338. var PropertyValueSet = __webpack_require__(26);
  125339. /**
  125340. * Takes an array of Game Objects, or any objects that have the public property `scaleX`
  125341. * and then sets it to the given value.
  125342. *
  125343. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  125344. *
  125345. * To use this with a Group: `SetScaleX(group.getChildren(), value, step)`
  125346. *
  125347. * @function Phaser.Actions.SetScaleX
  125348. * @since 3.0.0
  125349. *
  125350. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125351. *
  125352. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125353. * @param {number} value - The amount to set the property to.
  125354. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  125355. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125356. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125357. *
  125358. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125359. */
  125360. var SetScaleX = function (items, value, step, index, direction)
  125361. {
  125362. return PropertyValueSet(items, 'scaleX', value, step, index, direction);
  125363. };
  125364. module.exports = SetScaleX;
  125365. /***/ }),
  125366. /* 979 */
  125367. /***/ (function(module, exports, __webpack_require__) {
  125368. /**
  125369. * @author Richard Davey <rich@photonstorm.com>
  125370. * @copyright 2018 Photon Storm Ltd.
  125371. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125372. */
  125373. var PropertyValueSet = __webpack_require__(26);
  125374. /**
  125375. * Takes an array of Game Objects, or any objects that have the public properties `scaleX` and `scaleY`
  125376. * and then sets them to the given values.
  125377. *
  125378. * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array.
  125379. *
  125380. * To use this with a Group: `SetScale(group.getChildren(), scaleX, scaleY, stepX, stepY)`
  125381. *
  125382. * @function Phaser.Actions.SetScale
  125383. * @since 3.0.0
  125384. *
  125385. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125386. *
  125387. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125388. * @param {number} scaleX - The amount to set the `scaleX` property to.
  125389. * @param {number} [scaleY] - The amount to set the `scaleY` property to. If `undefined` or `null` it uses the `scaleX` value.
  125390. * @param {number} [stepX=0] - This is added to the `scaleX` amount, multiplied by the iteration counter.
  125391. * @param {number} [stepY=0] - This is added to the `scaleY` amount, multiplied by the iteration counter.
  125392. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125393. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125394. *
  125395. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125396. */
  125397. var SetScale = function (items, scaleX, scaleY, stepX, stepY, index, direction)
  125398. {
  125399. if (scaleY === undefined || scaleY === null) { scaleY = scaleX; }
  125400. PropertyValueSet(items, 'scaleX', scaleX, stepX, index, direction);
  125401. return PropertyValueSet(items, 'scaleY', scaleY, stepY, index, direction);
  125402. };
  125403. module.exports = SetScale;
  125404. /***/ }),
  125405. /* 980 */
  125406. /***/ (function(module, exports, __webpack_require__) {
  125407. /**
  125408. * @author Richard Davey <rich@photonstorm.com>
  125409. * @copyright 2018 Photon Storm Ltd.
  125410. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125411. */
  125412. var PropertyValueSet = __webpack_require__(26);
  125413. /**
  125414. * Takes an array of Game Objects, or any objects that have the public property `rotation`
  125415. * and then sets it to the given value.
  125416. *
  125417. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  125418. *
  125419. * To use this with a Group: `SetRotation(group.getChildren(), value, step)`
  125420. *
  125421. * @function Phaser.Actions.SetRotation
  125422. * @since 3.0.0
  125423. *
  125424. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125425. *
  125426. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125427. * @param {number} value - The amount to set the property to.
  125428. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  125429. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125430. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125431. *
  125432. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125433. */
  125434. var SetRotation = function (items, value, step, index, direction)
  125435. {
  125436. return PropertyValueSet(items, 'rotation', value, step, index, direction);
  125437. };
  125438. module.exports = SetRotation;
  125439. /***/ }),
  125440. /* 981 */
  125441. /***/ (function(module, exports, __webpack_require__) {
  125442. /**
  125443. * @author Richard Davey <rich@photonstorm.com>
  125444. * @copyright 2018 Photon Storm Ltd.
  125445. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125446. */
  125447. var PropertyValueSet = __webpack_require__(26);
  125448. /**
  125449. * Takes an array of Game Objects, or any objects that have the public properties `originX` and `originY`
  125450. * and then sets them to the given values.
  125451. *
  125452. * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array.
  125453. *
  125454. * To use this with a Group: `SetOrigin(group.getChildren(), originX, originY, stepX, stepY)`
  125455. *
  125456. * @function Phaser.Actions.SetOrigin
  125457. * @since 3.0.0
  125458. *
  125459. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125460. *
  125461. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125462. * @param {number} originX - The amount to set the `originX` property to.
  125463. * @param {number} [originY] - The amount to set the `originY` property to. If `undefined` or `null` it uses the `originX` value.
  125464. * @param {number} [stepX=0] - This is added to the `originX` amount, multiplied by the iteration counter.
  125465. * @param {number} [stepY=0] - This is added to the `originY` amount, multiplied by the iteration counter.
  125466. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125467. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125468. *
  125469. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125470. */
  125471. var SetOrigin = function (items, originX, originY, stepX, stepY, index, direction)
  125472. {
  125473. if (originY === undefined || originY === null) { originY = originX; }
  125474. PropertyValueSet(items, 'originX', originX, stepX, index, direction);
  125475. return PropertyValueSet(items, 'originY', originY, stepY, index, direction);
  125476. };
  125477. module.exports = SetOrigin;
  125478. /***/ }),
  125479. /* 982 */
  125480. /***/ (function(module, exports) {
  125481. /**
  125482. * @author Richard Davey <rich@photonstorm.com>
  125483. * @copyright 2018 Photon Storm Ltd.
  125484. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125485. */
  125486. /**
  125487. * [description]
  125488. *
  125489. * @function Phaser.Actions.SetHitArea
  125490. * @since 3.0.0
  125491. *
  125492. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125493. *
  125494. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  125495. * @param {*} hitArea - [description]
  125496. * @param {HitAreaCallback} hitAreaCallback - [description]
  125497. *
  125498. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  125499. */
  125500. var SetHitArea = function (items, hitArea, hitAreaCallback)
  125501. {
  125502. for (var i = 0; i < items.length; i++)
  125503. {
  125504. items[i].setInteractive(hitArea, hitAreaCallback);
  125505. }
  125506. return items;
  125507. };
  125508. module.exports = SetHitArea;
  125509. /***/ }),
  125510. /* 983 */
  125511. /***/ (function(module, exports, __webpack_require__) {
  125512. /**
  125513. * @author Richard Davey <rich@photonstorm.com>
  125514. * @copyright 2018 Photon Storm Ltd.
  125515. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125516. */
  125517. var PropertyValueSet = __webpack_require__(26);
  125518. /**
  125519. * Takes an array of Game Objects, or any objects that have the public property `depth`
  125520. * and then sets it to the given value.
  125521. *
  125522. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  125523. *
  125524. * To use this with a Group: `SetDepth(group.getChildren(), value, step)`
  125525. *
  125526. * @function Phaser.Actions.SetDepth
  125527. * @since 3.0.0
  125528. *
  125529. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125530. *
  125531. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125532. * @param {number} value - The amount to set the property to.
  125533. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  125534. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125535. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125536. *
  125537. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125538. */
  125539. var SetDepth = function (items, value, step, index, direction)
  125540. {
  125541. return PropertyValueSet(items, 'depth', value, step, index, direction);
  125542. };
  125543. module.exports = SetDepth;
  125544. /***/ }),
  125545. /* 984 */
  125546. /***/ (function(module, exports, __webpack_require__) {
  125547. /**
  125548. * @author Richard Davey <rich@photonstorm.com>
  125549. * @copyright 2018 Photon Storm Ltd.
  125550. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125551. */
  125552. var PropertyValueSet = __webpack_require__(26);
  125553. /**
  125554. * Takes an array of Game Objects, or any objects that have the public property `blendMode`
  125555. * and then sets it to the given value.
  125556. *
  125557. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  125558. *
  125559. * To use this with a Group: `SetBlendMode(group.getChildren(), value)`
  125560. *
  125561. * @function Phaser.Actions.SetBlendMode
  125562. * @since 3.0.0
  125563. *
  125564. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125565. *
  125566. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125567. * @param {number} value - The amount to set the property to.
  125568. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125569. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125570. *
  125571. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125572. */
  125573. var SetBlendMode = function (items, value, index, direction)
  125574. {
  125575. return PropertyValueSet(items, 'blendMode', value, 0, index, direction);
  125576. };
  125577. module.exports = SetBlendMode;
  125578. /***/ }),
  125579. /* 985 */
  125580. /***/ (function(module, exports, __webpack_require__) {
  125581. /**
  125582. * @author Richard Davey <rich@photonstorm.com>
  125583. * @copyright 2018 Photon Storm Ltd.
  125584. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125585. */
  125586. var PropertyValueSet = __webpack_require__(26);
  125587. /**
  125588. * Takes an array of Game Objects, or any objects that have the public property `alpha`
  125589. * and then sets it to the given value.
  125590. *
  125591. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  125592. *
  125593. * To use this with a Group: `SetAlpha(group.getChildren(), value, step)`
  125594. *
  125595. * @function Phaser.Actions.SetAlpha
  125596. * @since 3.0.0
  125597. *
  125598. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125599. *
  125600. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125601. * @param {number} value - The amount to set the property to.
  125602. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  125603. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125604. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125605. *
  125606. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125607. */
  125608. var SetAlpha = function (items, value, step, index, direction)
  125609. {
  125610. return PropertyValueSet(items, 'alpha', value, step, index, direction);
  125611. };
  125612. module.exports = SetAlpha;
  125613. /***/ }),
  125614. /* 986 */
  125615. /***/ (function(module, exports, __webpack_require__) {
  125616. /**
  125617. * @author Richard Davey <rich@photonstorm.com>
  125618. * @copyright 2018 Photon Storm Ltd.
  125619. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125620. */
  125621. var PropertyValueInc = __webpack_require__(36);
  125622. /**
  125623. * Takes an array of Game Objects, or any objects that have a public `scaleY` property,
  125624. * and then adds the given value to each of their `scaleY` properties.
  125625. *
  125626. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  125627. *
  125628. * To use this with a Group: `ScaleY(group.getChildren(), value, step)`
  125629. *
  125630. * @function Phaser.Actions.ScaleY
  125631. * @since 3.0.0
  125632. *
  125633. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125634. *
  125635. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125636. * @param {number} value - The amount to be added to the `scaleY` property.
  125637. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  125638. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125639. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125640. *
  125641. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125642. */
  125643. var ScaleY = function (items, value, step, index, direction)
  125644. {
  125645. return PropertyValueInc(items, 'scaleY', value, step, index, direction);
  125646. };
  125647. module.exports = ScaleY;
  125648. /***/ }),
  125649. /* 987 */
  125650. /***/ (function(module, exports, __webpack_require__) {
  125651. /**
  125652. * @author Richard Davey <rich@photonstorm.com>
  125653. * @copyright 2018 Photon Storm Ltd.
  125654. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125655. */
  125656. var PropertyValueInc = __webpack_require__(36);
  125657. /**
  125658. * Takes an array of Game Objects, or any objects that have public `scaleX` and `scaleY` properties,
  125659. * and then adds the given value to each of them.
  125660. *
  125661. * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array.
  125662. *
  125663. * To use this with a Group: `ScaleXY(group.getChildren(), scaleX, scaleY, stepX, stepY)`
  125664. *
  125665. * @function Phaser.Actions.ScaleXY
  125666. * @since 3.0.0
  125667. *
  125668. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125669. *
  125670. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125671. * @param {number} scaleX - The amount to be added to the `scaleX` property.
  125672. * @param {number} [scaleY] - The amount to be added to the `scaleY` property. If `undefined` or `null` it uses the `scaleX` value.
  125673. * @param {number} [stepX=0] - This is added to the `scaleX` amount, multiplied by the iteration counter.
  125674. * @param {number} [stepY=0] - This is added to the `y` amount, multiplied by the iteration counter.
  125675. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125676. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125677. *
  125678. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125679. */
  125680. var ScaleXY = function (items, scaleX, scaleY, stepX, stepY, index, direction)
  125681. {
  125682. if (scaleY === undefined || scaleY === null) { scaleY = scaleX; }
  125683. PropertyValueInc(items, 'scaleX', scaleX, stepX, index, direction);
  125684. return PropertyValueInc(items, 'scaleY', scaleY, stepY, index, direction);
  125685. };
  125686. module.exports = ScaleXY;
  125687. /***/ }),
  125688. /* 988 */
  125689. /***/ (function(module, exports, __webpack_require__) {
  125690. /**
  125691. * @author Richard Davey <rich@photonstorm.com>
  125692. * @copyright 2018 Photon Storm Ltd.
  125693. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125694. */
  125695. var PropertyValueInc = __webpack_require__(36);
  125696. /**
  125697. * Takes an array of Game Objects, or any objects that have a public `scaleX` property,
  125698. * and then adds the given value to each of their `scaleX` properties.
  125699. *
  125700. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  125701. *
  125702. * To use this with a Group: `ScaleX(group.getChildren(), value, step)`
  125703. *
  125704. * @function Phaser.Actions.ScaleX
  125705. * @since 3.0.0
  125706. *
  125707. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125708. *
  125709. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125710. * @param {number} value - The amount to be added to the `scaleX` property.
  125711. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  125712. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125713. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125714. *
  125715. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125716. */
  125717. var ScaleX = function (items, value, step, index, direction)
  125718. {
  125719. return PropertyValueInc(items, 'scaleX', value, step, index, direction);
  125720. };
  125721. module.exports = ScaleX;
  125722. /***/ }),
  125723. /* 989 */
  125724. /***/ (function(module, exports, __webpack_require__) {
  125725. /**
  125726. * @author Richard Davey <rich@photonstorm.com>
  125727. * @copyright 2018 Photon Storm Ltd.
  125728. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125729. */
  125730. var MathRotateAroundDistance = __webpack_require__(293);
  125731. /**
  125732. * [description]
  125733. *
  125734. * @function Phaser.Actions.RotateAroundDistance
  125735. * @since 3.0.0
  125736. *
  125737. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125738. *
  125739. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  125740. * @param {object} point - Any object with public `x` and `y` properties.
  125741. * @param {number} angle - The angle to rotate by, in radians.
  125742. * @param {number} distance - The distance from the point of rotation in pixels.
  125743. *
  125744. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  125745. */
  125746. var RotateAroundDistance = function (items, point, angle, distance)
  125747. {
  125748. var x = point.x;
  125749. var y = point.y;
  125750. // There's nothing to do
  125751. if (distance === 0)
  125752. {
  125753. return items;
  125754. }
  125755. for (var i = 0; i < items.length; i++)
  125756. {
  125757. MathRotateAroundDistance(items[i], x, y, angle, distance);
  125758. }
  125759. return items;
  125760. };
  125761. module.exports = RotateAroundDistance;
  125762. /***/ }),
  125763. /* 990 */
  125764. /***/ (function(module, exports, __webpack_require__) {
  125765. /**
  125766. * @author Richard Davey <rich@photonstorm.com>
  125767. * @copyright 2018 Photon Storm Ltd.
  125768. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125769. */
  125770. var RotateAroundDistance = __webpack_require__(293);
  125771. var DistanceBetween = __webpack_require__(58);
  125772. /**
  125773. * Rotates each item around the given point by the given angle.
  125774. *
  125775. * @function Phaser.Actions.RotateAround
  125776. * @since 3.0.0
  125777. * @see Phaser.Math.RotateAroundDistance
  125778. *
  125779. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125780. *
  125781. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  125782. * @param {object} point - Any object with public `x` and `y` properties.
  125783. * @param {number} angle - The angle to rotate by, in radians.
  125784. *
  125785. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  125786. */
  125787. var RotateAround = function (items, point, angle)
  125788. {
  125789. var x = point.x;
  125790. var y = point.y;
  125791. for (var i = 0; i < items.length; i++)
  125792. {
  125793. var item = items[i];
  125794. RotateAroundDistance(item, x, y, angle, Math.max(1, DistanceBetween(item.x, item.y, x, y)));
  125795. }
  125796. return items;
  125797. };
  125798. module.exports = RotateAround;
  125799. /***/ }),
  125800. /* 991 */
  125801. /***/ (function(module, exports, __webpack_require__) {
  125802. /**
  125803. * @author Richard Davey <rich@photonstorm.com>
  125804. * @copyright 2018 Photon Storm Ltd.
  125805. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125806. */
  125807. var PropertyValueInc = __webpack_require__(36);
  125808. /**
  125809. * Takes an array of Game Objects, or any objects that have a public `rotation` property,
  125810. * and then adds the given value to each of their `rotation` properties.
  125811. *
  125812. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  125813. *
  125814. * To use this with a Group: `Rotate(group.getChildren(), value, step)`
  125815. *
  125816. * @function Phaser.Actions.Rotate
  125817. * @since 3.0.0
  125818. *
  125819. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125820. *
  125821. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  125822. * @param {number} value - The amount to be added to the `rotation` property (in radians).
  125823. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  125824. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  125825. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  125826. *
  125827. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  125828. */
  125829. var Rotate = function (items, value, step, index, direction)
  125830. {
  125831. return PropertyValueInc(items, 'rotation', value, step, index, direction);
  125832. };
  125833. module.exports = Rotate;
  125834. /***/ }),
  125835. /* 992 */
  125836. /***/ (function(module, exports, __webpack_require__) {
  125837. /**
  125838. * @author Richard Davey <rich@photonstorm.com>
  125839. * @copyright 2018 Photon Storm Ltd.
  125840. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125841. */
  125842. var Random = __webpack_require__(158);
  125843. /**
  125844. * [description]
  125845. *
  125846. * @function Phaser.Actions.RandomTriangle
  125847. * @since 3.0.0
  125848. *
  125849. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125850. *
  125851. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  125852. * @param {Phaser.Geom.Triangle} triangle - [description]
  125853. *
  125854. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  125855. */
  125856. var RandomTriangle = function (items, triangle)
  125857. {
  125858. for (var i = 0; i < items.length; i++)
  125859. {
  125860. Random(triangle, items[i]);
  125861. }
  125862. return items;
  125863. };
  125864. module.exports = RandomTriangle;
  125865. /***/ }),
  125866. /* 993 */
  125867. /***/ (function(module, exports, __webpack_require__) {
  125868. /**
  125869. * @author Richard Davey <rich@photonstorm.com>
  125870. * @copyright 2018 Photon Storm Ltd.
  125871. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125872. */
  125873. var Random = __webpack_require__(159);
  125874. /**
  125875. * [description]
  125876. *
  125877. * @function Phaser.Actions.RandomRectangle
  125878. * @since 3.0.0
  125879. *
  125880. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125881. *
  125882. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  125883. * @param {Phaser.Geom.Rectangle} rect - [description]
  125884. *
  125885. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  125886. */
  125887. var RandomRectangle = function (items, rect)
  125888. {
  125889. for (var i = 0; i < items.length; i++)
  125890. {
  125891. Random(rect, items[i]);
  125892. }
  125893. return items;
  125894. };
  125895. module.exports = RandomRectangle;
  125896. /***/ }),
  125897. /* 994 */
  125898. /***/ (function(module, exports, __webpack_require__) {
  125899. /**
  125900. * @author Richard Davey <rich@photonstorm.com>
  125901. * @copyright 2018 Photon Storm Ltd.
  125902. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125903. */
  125904. var Random = __webpack_require__(160);
  125905. /**
  125906. * [description]
  125907. *
  125908. * @function Phaser.Actions.RandomLine
  125909. * @since 3.0.0
  125910. *
  125911. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125912. *
  125913. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  125914. * @param {Phaser.Geom.Line} line - [description]
  125915. *
  125916. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  125917. */
  125918. var RandomLine = function (items, line)
  125919. {
  125920. for (var i = 0; i < items.length; i++)
  125921. {
  125922. Random(line, items[i]);
  125923. }
  125924. return items;
  125925. };
  125926. module.exports = RandomLine;
  125927. /***/ }),
  125928. /* 995 */
  125929. /***/ (function(module, exports, __webpack_require__) {
  125930. /**
  125931. * @author Richard Davey <rich@photonstorm.com>
  125932. * @copyright 2018 Photon Storm Ltd.
  125933. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125934. */
  125935. var Random = __webpack_require__(135);
  125936. /**
  125937. * [description]
  125938. *
  125939. * @function Phaser.Actions.RandomEllipse
  125940. * @since 3.0.0
  125941. *
  125942. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125943. *
  125944. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  125945. * @param {Phaser.Geom.Ellipse} ellipse - [description]
  125946. *
  125947. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  125948. */
  125949. var RandomEllipse = function (items, ellipse)
  125950. {
  125951. for (var i = 0; i < items.length; i++)
  125952. {
  125953. Random(ellipse, items[i]);
  125954. }
  125955. return items;
  125956. };
  125957. module.exports = RandomEllipse;
  125958. /***/ }),
  125959. /* 996 */
  125960. /***/ (function(module, exports, __webpack_require__) {
  125961. /**
  125962. * @author Richard Davey <rich@photonstorm.com>
  125963. * @copyright 2018 Photon Storm Ltd.
  125964. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125965. */
  125966. var Random = __webpack_require__(162);
  125967. /**
  125968. * [description]
  125969. *
  125970. * @function Phaser.Actions.RandomCircle
  125971. * @since 3.0.0
  125972. *
  125973. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  125974. *
  125975. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  125976. * @param {Phaser.Geom.Circle} circle - [description]
  125977. *
  125978. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  125979. */
  125980. var RandomCircle = function (items, circle)
  125981. {
  125982. for (var i = 0; i < items.length; i++)
  125983. {
  125984. Random(circle, items[i]);
  125985. }
  125986. return items;
  125987. };
  125988. module.exports = RandomCircle;
  125989. /***/ }),
  125990. /* 997 */
  125991. /***/ (function(module, exports) {
  125992. /**
  125993. * @author Richard Davey <rich@photonstorm.com>
  125994. * @copyright 2018 Photon Storm Ltd.
  125995. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  125996. */
  125997. /**
  125998. * Play an animation with the given key, starting at the given startFrame on all Game Objects in items.
  125999. *
  126000. * @function Phaser.Actions.PlayAnimation
  126001. * @since 3.0.0
  126002. *
  126003. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126004. *
  126005. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  126006. * @param {string} key - The name of the animation to play.
  126007. * @param {(string|integer)} [startFrame] - The starting frame of the animation with the given key.
  126008. *
  126009. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  126010. */
  126011. var PlayAnimation = function (items, key, startFrame)
  126012. {
  126013. for (var i = 0; i < items.length; i++)
  126014. {
  126015. items[i].anims.play(key, startFrame);
  126016. }
  126017. return items;
  126018. };
  126019. module.exports = PlayAnimation;
  126020. /***/ }),
  126021. /* 998 */
  126022. /***/ (function(module, exports, __webpack_require__) {
  126023. /**
  126024. * @author Richard Davey <rich@photonstorm.com>
  126025. * @copyright 2018 Photon Storm Ltd.
  126026. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126027. */
  126028. // var GetPointsOnLine = require('../geom/line/GetPointsOnLine');
  126029. var BresenhamPoints = __webpack_require__(573);
  126030. /**
  126031. * [description]
  126032. *
  126033. * @function Phaser.Actions.PlaceOnTriangle
  126034. * @since 3.0.0
  126035. *
  126036. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126037. *
  126038. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  126039. * @param {Phaser.Geom.Triangle} triangle - [description]
  126040. * @param {number} [stepRate=1] - [description]
  126041. *
  126042. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  126043. */
  126044. var PlaceOnTriangle = function (items, triangle, stepRate)
  126045. {
  126046. var p1 = BresenhamPoints({ x1: triangle.x1, y1: triangle.y1, x2: triangle.x2, y2: triangle.y2 }, stepRate);
  126047. var p2 = BresenhamPoints({ x1: triangle.x2, y1: triangle.y2, x2: triangle.x3, y2: triangle.y3 }, stepRate);
  126048. var p3 = BresenhamPoints({ x1: triangle.x3, y1: triangle.y3, x2: triangle.x1, y2: triangle.y1 }, stepRate);
  126049. // Remove overlaps
  126050. p1.pop();
  126051. p2.pop();
  126052. p3.pop();
  126053. p1 = p1.concat(p2, p3);
  126054. var step = p1.length / items.length;
  126055. var p = 0;
  126056. for (var i = 0; i < items.length; i++)
  126057. {
  126058. var item = items[i];
  126059. var point = p1[Math.floor(p)];
  126060. item.x = point.x;
  126061. item.y = point.y;
  126062. p += step;
  126063. }
  126064. return items;
  126065. };
  126066. module.exports = PlaceOnTriangle;
  126067. /***/ }),
  126068. /* 999 */
  126069. /***/ (function(module, exports, __webpack_require__) {
  126070. /**
  126071. * @author Richard Davey <rich@photonstorm.com>
  126072. * @copyright 2018 Photon Storm Ltd.
  126073. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126074. */
  126075. var MarchingAnts = __webpack_require__(574);
  126076. var RotateLeft = __webpack_require__(295);
  126077. var RotateRight = __webpack_require__(294);
  126078. // Place the items in the array around the perimeter of the given rectangle.
  126079. // Placement starts from the top-left of the rectangle, and proceeds in a
  126080. // clockwise direction. If the shift parameter is given you can offset where
  126081. // placement begins.
  126082. /**
  126083. * [description]
  126084. *
  126085. * @function Phaser.Actions.PlaceOnRectangle
  126086. * @since 3.0.0
  126087. *
  126088. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126089. *
  126090. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  126091. * @param {Phaser.Geom.Rectangle} rect - [description]
  126092. * @param {integer} [shift=1] - [description]
  126093. *
  126094. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  126095. */
  126096. var PlaceOnRectangle = function (items, rect, shift)
  126097. {
  126098. if (shift === undefined) { shift = 0; }
  126099. var points = MarchingAnts(rect, false, items.length);
  126100. if (shift > 0)
  126101. {
  126102. RotateLeft(points, shift);
  126103. }
  126104. else if (shift < 0)
  126105. {
  126106. RotateRight(points, Math.abs(shift));
  126107. }
  126108. for (var i = 0; i < items.length; i++)
  126109. {
  126110. items[i].x = points[i].x;
  126111. items[i].y = points[i].y;
  126112. }
  126113. return items;
  126114. };
  126115. module.exports = PlaceOnRectangle;
  126116. /***/ }),
  126117. /* 1000 */
  126118. /***/ (function(module, exports, __webpack_require__) {
  126119. /**
  126120. * @author Richard Davey <rich@photonstorm.com>
  126121. * @copyright 2018 Photon Storm Ltd.
  126122. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126123. */
  126124. var GetPoints = __webpack_require__(161);
  126125. /**
  126126. * [description]
  126127. *
  126128. * @function Phaser.Actions.PlaceOnLine
  126129. * @since 3.0.0
  126130. *
  126131. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126132. *
  126133. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  126134. * @param {Phaser.Geom.Line} line - [description]
  126135. *
  126136. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  126137. */
  126138. var PlaceOnLine = function (items, line)
  126139. {
  126140. var points = GetPoints(line, items.length);
  126141. for (var i = 0; i < items.length; i++)
  126142. {
  126143. var item = items[i];
  126144. var point = points[i];
  126145. item.x = point.x;
  126146. item.y = point.y;
  126147. }
  126148. return items;
  126149. };
  126150. module.exports = PlaceOnLine;
  126151. /***/ }),
  126152. /* 1001 */
  126153. /***/ (function(module, exports) {
  126154. /**
  126155. * @author Richard Davey <rich@photonstorm.com>
  126156. * @copyright 2018 Photon Storm Ltd.
  126157. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126158. */
  126159. /**
  126160. * [description]
  126161. *
  126162. * @function Phaser.Actions.PlaceOnEllipse
  126163. * @since 3.0.0
  126164. *
  126165. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126166. *
  126167. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  126168. * @param {Phaser.Geom.Ellipse} ellipse - [description]
  126169. * @param {number} [startAngle=0] - [description]
  126170. * @param {number} [endAngle=6.28] - [description]
  126171. *
  126172. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  126173. */
  126174. var PlaceOnEllipse = function (items, ellipse, startAngle, endAngle)
  126175. {
  126176. if (startAngle === undefined) { startAngle = 0; }
  126177. if (endAngle === undefined) { endAngle = 6.28; }
  126178. var angle = startAngle;
  126179. var angleStep = (endAngle - startAngle) / items.length;
  126180. var a = ellipse.width / 2;
  126181. var b = ellipse.height / 2;
  126182. for (var i = 0; i < items.length; i++)
  126183. {
  126184. items[i].x = ellipse.x + a * Math.cos(angle);
  126185. items[i].y = ellipse.y + b * Math.sin(angle);
  126186. angle += angleStep;
  126187. }
  126188. return items;
  126189. };
  126190. module.exports = PlaceOnEllipse;
  126191. /***/ }),
  126192. /* 1002 */
  126193. /***/ (function(module, exports) {
  126194. /**
  126195. * @author Richard Davey <rich@photonstorm.com>
  126196. * @copyright 2018 Photon Storm Ltd.
  126197. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126198. */
  126199. /**
  126200. * [description]
  126201. *
  126202. * @function Phaser.Actions.PlaceOnCircle
  126203. * @since 3.0.0
  126204. *
  126205. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126206. *
  126207. * @param {(array|Phaser.GameObjects.GameObject[])} items - An array of Game Objects. The contents of this array are updated by this Action.
  126208. * @param {Phaser.Geom.Circle} circle - [description]
  126209. * @param {number} [startAngle=0] - [description]
  126210. * @param {number} [endAngle=6.28] - [description]
  126211. *
  126212. * @return {(array|Phaser.GameObjects.GameObject[])} The array of Game Objects that was passed to this Action.
  126213. */
  126214. var PlaceOnCircle = function (items, circle, startAngle, endAngle)
  126215. {
  126216. if (startAngle === undefined) { startAngle = 0; }
  126217. if (endAngle === undefined) { endAngle = 6.28; }
  126218. var angle = startAngle;
  126219. var angleStep = (endAngle - startAngle) / items.length;
  126220. for (var i = 0; i < items.length; i++)
  126221. {
  126222. items[i].x = circle.x + (circle.radius * Math.cos(angle));
  126223. items[i].y = circle.y + (circle.radius * Math.sin(angle));
  126224. angle += angleStep;
  126225. }
  126226. return items;
  126227. };
  126228. module.exports = PlaceOnCircle;
  126229. /***/ }),
  126230. /* 1003 */
  126231. /***/ (function(module, exports, __webpack_require__) {
  126232. /**
  126233. * @author Richard Davey <rich@photonstorm.com>
  126234. * @copyright 2018 Photon Storm Ltd.
  126235. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126236. */
  126237. var PropertyValueInc = __webpack_require__(36);
  126238. /**
  126239. * Takes an array of Game Objects, or any objects that have a public `y` property,
  126240. * and then adds the given value to each of their `y` properties.
  126241. *
  126242. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  126243. *
  126244. * To use this with a Group: `IncY(group.getChildren(), value, step)`
  126245. *
  126246. * @function Phaser.Actions.IncY
  126247. * @since 3.0.0
  126248. *
  126249. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126250. *
  126251. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  126252. * @param {number} value - The amount to be added to the `y` property.
  126253. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  126254. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  126255. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  126256. *
  126257. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  126258. */
  126259. var IncY = function (items, value, step, index, direction)
  126260. {
  126261. return PropertyValueInc(items, 'y', value, step, index, direction);
  126262. };
  126263. module.exports = IncY;
  126264. /***/ }),
  126265. /* 1004 */
  126266. /***/ (function(module, exports, __webpack_require__) {
  126267. /**
  126268. * @author Richard Davey <rich@photonstorm.com>
  126269. * @copyright 2018 Photon Storm Ltd.
  126270. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126271. */
  126272. var PropertyValueInc = __webpack_require__(36);
  126273. /**
  126274. * Takes an array of Game Objects, or any objects that have public `x` and `y` properties,
  126275. * and then adds the given value to each of them.
  126276. *
  126277. * The optional `stepX` and `stepY` properties are applied incrementally, multiplied by each item in the array.
  126278. *
  126279. * To use this with a Group: `IncXY(group.getChildren(), x, y, stepX, stepY)`
  126280. *
  126281. * @function Phaser.Actions.IncXY
  126282. * @since 3.0.0
  126283. *
  126284. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126285. *
  126286. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  126287. * @param {number} x - The amount to be added to the `x` property.
  126288. * @param {number} [y=x] - The amount to be added to the `y` property. If `undefined` or `null` it uses the `x` value.
  126289. * @param {number} [stepX=0] - This is added to the `x` amount, multiplied by the iteration counter.
  126290. * @param {number} [stepY=0] - This is added to the `y` amount, multiplied by the iteration counter.
  126291. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  126292. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  126293. *
  126294. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  126295. */
  126296. var IncXY = function (items, x, y, stepX, stepY, index, direction)
  126297. {
  126298. if (y === undefined || y === null) { y = x; }
  126299. PropertyValueInc(items, 'x', x, stepX, index, direction);
  126300. return PropertyValueInc(items, 'y', y, stepY, index, direction);
  126301. };
  126302. module.exports = IncXY;
  126303. /***/ }),
  126304. /* 1005 */
  126305. /***/ (function(module, exports, __webpack_require__) {
  126306. /**
  126307. * @author Richard Davey <rich@photonstorm.com>
  126308. * @copyright 2018 Photon Storm Ltd.
  126309. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126310. */
  126311. var PropertyValueInc = __webpack_require__(36);
  126312. /**
  126313. * Takes an array of Game Objects, or any objects that have a public `x` property,
  126314. * and then adds the given value to each of their `x` properties.
  126315. *
  126316. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  126317. *
  126318. * To use this with a Group: `IncX(group.getChildren(), value, step)`
  126319. *
  126320. * @function Phaser.Actions.IncX
  126321. * @since 3.0.0
  126322. *
  126323. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126324. *
  126325. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  126326. * @param {number} value - The amount to be added to the `x` property.
  126327. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  126328. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  126329. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  126330. *
  126331. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  126332. */
  126333. var IncX = function (items, value, step, index, direction)
  126334. {
  126335. return PropertyValueInc(items, 'x', value, step, index, direction);
  126336. };
  126337. module.exports = IncX;
  126338. /***/ }),
  126339. /* 1006 */
  126340. /***/ (function(module, exports, __webpack_require__) {
  126341. /**
  126342. * @author Richard Davey <rich@photonstorm.com>
  126343. * @copyright 2018 Photon Storm Ltd.
  126344. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126345. */
  126346. var PropertyValueInc = __webpack_require__(36);
  126347. /**
  126348. * Takes an array of Game Objects, or any objects that have a public `alpha` property,
  126349. * and then adds the given value to each of their `alpha` properties.
  126350. *
  126351. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  126352. *
  126353. * To use this with a Group: `IncAlpha(group.getChildren(), value, step)`
  126354. *
  126355. * @function Phaser.Actions.IncAlpha
  126356. * @since 3.0.0
  126357. *
  126358. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126359. *
  126360. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  126361. * @param {number} value - The amount to be added to the `alpha` property.
  126362. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  126363. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  126364. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  126365. *
  126366. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  126367. */
  126368. var IncAlpha = function (items, value, step, index, direction)
  126369. {
  126370. return PropertyValueInc(items, 'alpha', value, step, index, direction);
  126371. };
  126372. module.exports = IncAlpha;
  126373. /***/ }),
  126374. /* 1007 */
  126375. /***/ (function(module, exports, __webpack_require__) {
  126376. /**
  126377. * @author Richard Davey <rich@photonstorm.com>
  126378. * @copyright 2018 Photon Storm Ltd.
  126379. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126380. */
  126381. var AlignIn = __webpack_require__(603);
  126382. var CONST = __webpack_require__(304);
  126383. var GetFastValue = __webpack_require__(1);
  126384. var NOOP = __webpack_require__(3);
  126385. var Zone = __webpack_require__(163);
  126386. var tempZone = new Zone({ sys: { queueDepthSort: NOOP, events: { once: NOOP } } }, 0, 0, 1, 1);
  126387. /**
  126388. * @typedef {object} GridAlignConfig
  126389. *
  126390. * @property {integer} [width=-1] - The width of the grid in items (not pixels). -1 means lay all items out horizontally, regardless of quantity.
  126391. * If both this value and height are set to -1 then this value overrides it and the `height` value is ignored.
  126392. * @property {integer} [height=-1] - The height of the grid in items (not pixels). -1 means lay all items out vertically, regardless of quantity.
  126393. * If both this value and `width` are set to -1 then `width` overrides it and this value is ignored.
  126394. * @property {integer} [cellWidth=1] - The width of the cell, in pixels, in which the item is positioned.
  126395. * @property {integer} [cellHeight=1] - The height of the cell, in pixels, in which the item is positioned.
  126396. * @property {integer} [position=0] - The alignment position. One of the Phaser.Display.Align consts such as `TOP_LEFT` or `RIGHT_CENTER`.
  126397. * @property {number} [x=0] - Optionally place the top-left of the final grid at this coordinate.
  126398. * @property {number} [y=0] - Optionally place the top-left of the final grid at this coordinate.
  126399. */
  126400. /**
  126401. * Takes an array of Game Objects, or any objects that have public `x` and `y` properties,
  126402. * and then aligns them based on the grid configuration given to this action.
  126403. *
  126404. * @function Phaser.Actions.GridAlign
  126405. * @since 3.0.0
  126406. *
  126407. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126408. *
  126409. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  126410. * @param {GridAlignConfig} options - The GridAlign Configuration object.
  126411. *
  126412. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  126413. */
  126414. var GridAlign = function (items, options)
  126415. {
  126416. if (options === undefined) { options = {}; }
  126417. var width = GetFastValue(options, 'width', -1);
  126418. var height = GetFastValue(options, 'height', -1);
  126419. var cellWidth = GetFastValue(options, 'cellWidth', 1);
  126420. var cellHeight = GetFastValue(options, 'cellHeight', cellWidth);
  126421. var position = GetFastValue(options, 'position', CONST.TOP_LEFT);
  126422. var x = GetFastValue(options, 'x', 0);
  126423. var y = GetFastValue(options, 'y', 0);
  126424. var cx = 0;
  126425. var cy = 0;
  126426. var w = (width * cellWidth);
  126427. var h = (height * cellHeight);
  126428. tempZone.setPosition(x, y);
  126429. tempZone.setSize(cellWidth, cellHeight);
  126430. for (var i = 0; i < items.length; i++)
  126431. {
  126432. AlignIn(items[i], tempZone, position);
  126433. if (width === -1)
  126434. {
  126435. // We keep laying them out horizontally until we've done them all
  126436. cy += cellHeight;
  126437. tempZone.y += cellHeight;
  126438. if (cy === h)
  126439. {
  126440. cy = 0;
  126441. tempZone.x += cellWidth;
  126442. tempZone.y = y;
  126443. }
  126444. }
  126445. else if (height === -1)
  126446. {
  126447. // We keep laying them out vertically until we've done them all
  126448. cx += cellWidth;
  126449. tempZone.x += cellWidth;
  126450. if (cx === w)
  126451. {
  126452. cx = 0;
  126453. tempZone.x = x;
  126454. tempZone.y += cellHeight;
  126455. }
  126456. }
  126457. else
  126458. {
  126459. // We keep laying them out until we hit the column limit
  126460. cx += cellWidth;
  126461. tempZone.x += cellWidth;
  126462. if (cx === w)
  126463. {
  126464. cx = 0;
  126465. cy += cellHeight;
  126466. tempZone.x = x;
  126467. tempZone.y += cellHeight;
  126468. if (cy === h)
  126469. {
  126470. // We've hit the column limit, so return, even if there are items left
  126471. break;
  126472. }
  126473. }
  126474. }
  126475. }
  126476. return items;
  126477. };
  126478. module.exports = GridAlign;
  126479. /***/ }),
  126480. /* 1008 */
  126481. /***/ (function(module, exports) {
  126482. /**
  126483. * @author Richard Davey <rich@photonstorm.com>
  126484. * @copyright 2018 Photon Storm Ltd.
  126485. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126486. */
  126487. /**
  126488. * Takes an array of objects and returns the last element in the array that has properties which match
  126489. * all of those specified in the `compare` object. For example, if the compare object was: `{ scaleX: 0.5, alpha: 1 }`
  126490. * then it would return the last item which had the property `scaleX` set to 0.5 and `alpha` set to 1.
  126491. *
  126492. * To use this with a Group: `GetLast(group.getChildren(), compare, index)`
  126493. *
  126494. * @function Phaser.Actions.GetLast
  126495. * @since 3.3.0
  126496. *
  126497. * @generic {Phaser.GameObjects.GameObject[]} G - [items]
  126498. *
  126499. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be searched by this action.
  126500. * @param {object} compare - The comparison object. Each property in this object will be checked against the items of the array.
  126501. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  126502. *
  126503. * @return {?(object|Phaser.GameObjects.GameObject)} The last object in the array that matches the comparison object, or `null` if no match was found.
  126504. */
  126505. var GetLast = function (items, compare, index)
  126506. {
  126507. if (index === undefined) { index = 0; }
  126508. for (var i = index; i < items.length; i++)
  126509. {
  126510. var item = items[i];
  126511. var match = true;
  126512. for (var property in compare)
  126513. {
  126514. if (item[property] !== compare[property])
  126515. {
  126516. match = false;
  126517. }
  126518. }
  126519. if (match)
  126520. {
  126521. return item;
  126522. }
  126523. }
  126524. return null;
  126525. };
  126526. module.exports = GetLast;
  126527. /***/ }),
  126528. /* 1009 */
  126529. /***/ (function(module, exports) {
  126530. /**
  126531. * @author Richard Davey <rich@photonstorm.com>
  126532. * @copyright 2018 Photon Storm Ltd.
  126533. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126534. */
  126535. /**
  126536. * Takes an array of objects and returns the first element in the array that has properties which match
  126537. * all of those specified in the `compare` object. For example, if the compare object was: `{ scaleX: 0.5, alpha: 1 }`
  126538. * then it would return the first item which had the property `scaleX` set to 0.5 and `alpha` set to 1.
  126539. *
  126540. * To use this with a Group: `GetFirst(group.getChildren(), compare, index)`
  126541. *
  126542. * @function Phaser.Actions.GetFirst
  126543. * @since 3.0.0
  126544. *
  126545. * @generic {Phaser.GameObjects.GameObject[]} G - [items]
  126546. *
  126547. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be searched by this action.
  126548. * @param {object} compare - The comparison object. Each property in this object will be checked against the items of the array.
  126549. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  126550. *
  126551. * @return {?(object|Phaser.GameObjects.GameObject)} The first object in the array that matches the comparison object, or `null` if no match was found.
  126552. */
  126553. var GetFirst = function (items, compare, index)
  126554. {
  126555. if (index === undefined) { index = 0; }
  126556. for (var i = index; i < items.length; i++)
  126557. {
  126558. var item = items[i];
  126559. var match = true;
  126560. for (var property in compare)
  126561. {
  126562. if (item[property] !== compare[property])
  126563. {
  126564. match = false;
  126565. }
  126566. }
  126567. if (match)
  126568. {
  126569. return item;
  126570. }
  126571. }
  126572. return null;
  126573. };
  126574. module.exports = GetFirst;
  126575. /***/ }),
  126576. /* 1010 */
  126577. /***/ (function(module, exports) {
  126578. /**
  126579. * @author Richard Davey <rich@photonstorm.com>
  126580. * @copyright 2018 Photon Storm Ltd.
  126581. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126582. */
  126583. /**
  126584. * @callback CallCallback
  126585. *
  126586. * @param {Phaser.GameObjects.GameObject} item - [description]
  126587. */
  126588. /**
  126589. * Takes an array of objects and passes each of them to the given callback.
  126590. *
  126591. * @function Phaser.Actions.Call
  126592. * @since 3.0.0
  126593. *
  126594. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126595. *
  126596. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  126597. * @param {CallCallback} callback - The callback to be invoked. It will be passed just one argument: the item from the array.
  126598. * @param {*} context - The scope in which the callback will be invoked.
  126599. *
  126600. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that was passed to this Action.
  126601. */
  126602. var Call = function (items, callback, context)
  126603. {
  126604. for (var i = 0; i < items.length; i++)
  126605. {
  126606. var item = items[i];
  126607. callback.call(context, item);
  126608. }
  126609. return items;
  126610. };
  126611. module.exports = Call;
  126612. /***/ }),
  126613. /* 1011 */
  126614. /***/ (function(module, exports, __webpack_require__) {
  126615. /**
  126616. * @author Richard Davey <rich@photonstorm.com>
  126617. * @copyright 2018 Photon Storm Ltd.
  126618. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126619. */
  126620. var PropertyValueInc = __webpack_require__(36);
  126621. /**
  126622. * Takes an array of Game Objects, or any objects that have a public `angle` property,
  126623. * and then adds the given value to each of their `angle` properties.
  126624. *
  126625. * The optional `step` property is applied incrementally, multiplied by each item in the array.
  126626. *
  126627. * To use this with a Group: `Angle(group.getChildren(), value, step)`
  126628. *
  126629. * @function Phaser.Actions.Angle
  126630. * @since 3.0.0
  126631. *
  126632. * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
  126633. *
  126634. * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
  126635. * @param {number} value - The amount to be added to the `angle` property.
  126636. * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
  126637. * @param {integer} [index=0] - An optional offset to start searching from within the items array.
  126638. * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
  126639. *
  126640. * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
  126641. */
  126642. var Angle = function (items, value, step, index, direction)
  126643. {
  126644. return PropertyValueInc(items, 'angle', value, step, index, direction);
  126645. };
  126646. module.exports = Angle;
  126647. /***/ }),
  126648. /* 1012 */
  126649. /***/ (function(module, exports, __webpack_require__) {
  126650. /**
  126651. * @author Richard Davey <rich@photonstorm.com>
  126652. * @copyright 2018 Photon Storm Ltd.
  126653. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  126654. */
  126655. var Bodies = __webpack_require__(171);
  126656. var Class = __webpack_require__(0);
  126657. var Common = __webpack_require__(42);
  126658. var Composite = __webpack_require__(226);
  126659. var Engine = __webpack_require__(1013);
  126660. var EventEmitter = __webpack_require__(9);
  126661. var GetFastValue = __webpack_require__(1);
  126662. var GetValue = __webpack_require__(4);
  126663. var MatterBody = __webpack_require__(73);
  126664. var MatterEvents = __webpack_require__(306);
  126665. var MatterTileBody = __webpack_require__(684);
  126666. var MatterWorld = __webpack_require__(679);
  126667. var Vector = __webpack_require__(106);
  126668. /**
  126669. * @classdesc
  126670. * [description]
  126671. *
  126672. * @class World
  126673. * @extends Phaser.Events.EventEmitter
  126674. * @memberOf Phaser.Physics.Matter
  126675. * @constructor
  126676. * @since 3.0.0
  126677. *
  126678. * @param {Phaser.Scene} scene - [description]
  126679. * @param {object} config - [description]
  126680. */
  126681. var World = new Class({
  126682. Extends: EventEmitter,
  126683. initialize:
  126684. function World (scene, config)
  126685. {
  126686. EventEmitter.call(this);
  126687. /**
  126688. * [description]
  126689. *
  126690. * @name Phaser.Physics.Matter.World#scene
  126691. * @type {Phaser.Scene}
  126692. * @since 3.0.0
  126693. */
  126694. this.scene = scene;
  126695. /**
  126696. * [description]
  126697. *
  126698. * @name Phaser.Physics.Matter.World#engine
  126699. * @type {MatterJS.Engine}
  126700. * @since 3.0.0
  126701. */
  126702. this.engine = Engine.create(config);
  126703. /**
  126704. * A `World` composite object that will contain all simulated bodies and constraints.
  126705. *
  126706. * @name Phaser.Physics.Matter.World#localWorld
  126707. * @type {MatterJS.World}
  126708. * @since 3.0.0
  126709. */
  126710. this.localWorld = this.engine.world;
  126711. var gravity = GetValue(config, 'gravity', null);
  126712. if (gravity)
  126713. {
  126714. this.setGravity(gravity.x, gravity.y, gravity.scale);
  126715. }
  126716. /**
  126717. * An object containing the 4 wall bodies that bound the physics world.
  126718. *
  126719. * @name Phaser.Physics.Matter.World#walls
  126720. * @type {object}
  126721. * @since 3.0.0
  126722. */
  126723. this.walls = { left: null, right: null, top: null, bottom: null };
  126724. if (GetFastValue(config, 'setBounds', false))
  126725. {
  126726. var boundsConfig = config['setBounds'];
  126727. if (typeof boundsConfig === 'boolean')
  126728. {
  126729. this.setBounds();
  126730. }
  126731. else
  126732. {
  126733. var x = GetFastValue(boundsConfig, 'x', 0);
  126734. var y = GetFastValue(boundsConfig, 'y', 0);
  126735. var width = GetFastValue(boundsConfig, 'width', scene.sys.game.config.width);
  126736. var height = GetFastValue(boundsConfig, 'height', scene.sys.game.config.height);
  126737. var thickness = GetFastValue(boundsConfig, 'thickness', 64);
  126738. var left = GetFastValue(boundsConfig, 'left', true);
  126739. var right = GetFastValue(boundsConfig, 'right', true);
  126740. var top = GetFastValue(boundsConfig, 'top', true);
  126741. var bottom = GetFastValue(boundsConfig, 'bottom', true);
  126742. this.setBounds(x, y, width, height, thickness, left, right, top, bottom);
  126743. }
  126744. }
  126745. /**
  126746. * [description]
  126747. *
  126748. * @name Phaser.Physics.Matter.World#enabled
  126749. * @type {boolean}
  126750. * @default true
  126751. * @since 3.0.0
  126752. */
  126753. this.enabled = GetValue(config, 'enabled', true);
  126754. /**
  126755. * The correction argument is an optional Number that specifies the time correction factor to apply to the update.
  126756. * This can help improve the accuracy of the simulation in cases where delta is changing between updates.
  126757. * The value of correction is defined as delta / lastDelta, i.e. the percentage change of delta over the last step.
  126758. * Therefore the value is always 1 (no correction) when delta constant (or when no correction is desired, which is the default).
  126759. * See the paper on Time Corrected Verlet for more information.
  126760. *
  126761. * @name Phaser.Physics.Matter.World#correction
  126762. * @type {number}
  126763. * @default 1
  126764. * @since 3.4.0
  126765. */
  126766. this.correction = GetValue(config, 'correction', 1);
  126767. /**
  126768. * This function is called every time the core game loop steps, which is bound to the
  126769. * Request Animation Frame frequency unless otherwise modified.
  126770. *
  126771. * The function is passed two values: `time` and `delta`, both of which come from the game step values.
  126772. *
  126773. * It must return a number. This number is used as the delta value passed to Matter.Engine.update.
  126774. *
  126775. * You can override this function with your own to define your own timestep.
  126776. *
  126777. * If you need to update the Engine multiple times in a single game step then call
  126778. * `World.update` as many times as required. Each call will trigger the `getDelta` function.
  126779. * If you wish to have full control over when the Engine updates then see the property `autoUpdate`.
  126780. *
  126781. * You can also adjust the number of iterations that Engine.update performs.
  126782. * Use the Scene Matter Physics config object to set the following properties:
  126783. *
  126784. * positionIterations (defaults to 6)
  126785. * velocityIterations (defaults to 4)
  126786. * constraintIterations (defaults to 2)
  126787. *
  126788. * Adjusting these values can help performance in certain situations, depending on the physics requirements
  126789. * of your game.
  126790. *
  126791. * @name Phaser.Physics.Matter.World#getDelta
  126792. * @type {function}
  126793. * @since 3.4.0
  126794. */
  126795. this.getDelta = GetValue(config, 'getDelta', this.update60Hz);
  126796. /**
  126797. * Automatically call Engine.update every time the game steps.
  126798. * If you disable this then you are responsible for calling `World.step` directly from your game.
  126799. * If you call `set60Hz` or `set30Hz` then `autoUpdate` is reset to `true`.
  126800. *
  126801. * @name Phaser.Physics.Matter.World#autoUpdate
  126802. * @type {boolean}
  126803. * @default true
  126804. * @since 3.4.0
  126805. */
  126806. this.autoUpdate = GetValue(config, 'autoUpdate', true);
  126807. /**
  126808. * [description]
  126809. *
  126810. * @name Phaser.Physics.Matter.World#drawDebug
  126811. * @type {boolean}
  126812. * @default false
  126813. * @since 3.0.0
  126814. */
  126815. this.drawDebug = GetValue(config, 'debug', false);
  126816. /**
  126817. * [description]
  126818. *
  126819. * @name Phaser.Physics.Matter.World#debugGraphic
  126820. * @type {Phaser.GameObjects.Graphics}
  126821. * @since 3.0.0
  126822. */
  126823. this.debugGraphic;
  126824. /**
  126825. * [description]
  126826. *
  126827. * @name Phaser.Physics.Matter.World#defaults
  126828. * @type {object}
  126829. * @since 3.0.0
  126830. */
  126831. this.defaults = {
  126832. debugShowBody: GetValue(config, 'debugShowBody', true),
  126833. debugShowStaticBody: GetValue(config, 'debugShowStaticBody', true),
  126834. debugShowVelocity: GetValue(config, 'debugShowVelocity', true),
  126835. bodyDebugColor: GetValue(config, 'debugBodyColor', 0xff00ff),
  126836. staticBodyDebugColor: GetValue(config, 'debugBodyColor', 0x0000ff),
  126837. velocityDebugColor: GetValue(config, 'debugVelocityColor', 0x00ff00),
  126838. debugShowJoint: GetValue(config, 'debugShowJoint', true),
  126839. jointDebugColor: GetValue(config, 'debugJointColor', 0x000000)
  126840. };
  126841. if (this.drawDebug)
  126842. {
  126843. this.createDebugGraphic();
  126844. }
  126845. this.setEventsProxy();
  126846. },
  126847. /**
  126848. * [description]
  126849. *
  126850. * @method Phaser.Physics.Matter.World#setEventsProxy
  126851. * @since 3.0.0
  126852. */
  126853. setEventsProxy: function ()
  126854. {
  126855. var _this = this;
  126856. var engine = this.engine;
  126857. MatterEvents.on(engine, 'beforeUpdate', function (event)
  126858. {
  126859. _this.emit('beforeupdate', event);
  126860. });
  126861. MatterEvents.on(engine, 'afterUpdate', function (event)
  126862. {
  126863. _this.emit('afterupdate', event);
  126864. });
  126865. MatterEvents.on(engine, 'collisionStart', function (event)
  126866. {
  126867. var pairs = event.pairs;
  126868. var bodyA;
  126869. var bodyB;
  126870. if (pairs.length > 0)
  126871. {
  126872. bodyA = pairs[0].bodyA;
  126873. bodyB = pairs[0].bodyB;
  126874. }
  126875. _this.emit('collisionstart', event, bodyA, bodyB);
  126876. });
  126877. MatterEvents.on(engine, 'collisionActive', function (event)
  126878. {
  126879. var pairs = event.pairs;
  126880. var bodyA;
  126881. var bodyB;
  126882. if (pairs.length > 0)
  126883. {
  126884. bodyA = pairs[0].bodyA;
  126885. bodyB = pairs[0].bodyB;
  126886. }
  126887. _this.emit('collisionactive', event, bodyA, bodyB);
  126888. });
  126889. MatterEvents.on(engine, 'collisionEnd', function (event)
  126890. {
  126891. var pairs = event.pairs;
  126892. var bodyA;
  126893. var bodyB;
  126894. if (pairs.length > 0)
  126895. {
  126896. bodyA = pairs[0].bodyA;
  126897. bodyB = pairs[0].bodyB;
  126898. }
  126899. _this.emit('collisionend', event, bodyA, bodyB);
  126900. });
  126901. },
  126902. /**
  126903. * Sets the bounds of the Physics world to match the given world pixel dimensions.
  126904. * You can optionally set which 'walls' to create: left, right, top or bottom.
  126905. * If none of the walls are given it will default to use the walls settings it had previously.
  126906. * I.e. if you previously told it to not have the left or right walls, and you then adjust the world size
  126907. * the newly created bounds will also not have the left and right walls.
  126908. * Explicitly state them in the parameters to override this.
  126909. *
  126910. * @method Phaser.Physics.Matter.World#setBounds
  126911. * @since 3.0.0
  126912. *
  126913. * @param {number} [x=0] - The x coordinate of the top-left corner of the bounds.
  126914. * @param {number} [y=0] - The y coordinate of the top-left corner of the bounds.
  126915. * @param {number} [width] - The width of the bounds.
  126916. * @param {number} [height] - The height of the bounds.
  126917. * @param {number} [thickness=128] - The thickness of each wall, in pixels.
  126918. * @param {boolean} [left=true] - If true will create the left bounds wall.
  126919. * @param {boolean} [right=true] - If true will create the right bounds wall.
  126920. * @param {boolean} [top=true] - If true will create the top bounds wall.
  126921. * @param {boolean} [bottom=true] - If true will create the bottom bounds wall.
  126922. *
  126923. * @return {Phaser.Physics.Matter.World} This Matter World object.
  126924. */
  126925. setBounds: function (x, y, width, height, thickness, left, right, top, bottom)
  126926. {
  126927. if (x === undefined) { x = 0; }
  126928. if (y === undefined) { y = 0; }
  126929. if (width === undefined) { width = this.scene.sys.game.config.width; }
  126930. if (height === undefined) { height = this.scene.sys.game.config.height; }
  126931. if (thickness === undefined) { thickness = 128; }
  126932. if (left === undefined) { left = true; }
  126933. if (right === undefined) { right = true; }
  126934. if (top === undefined) { top = true; }
  126935. if (bottom === undefined) { bottom = true; }
  126936. this.updateWall(left, 'left', x - thickness, y, thickness, height);
  126937. this.updateWall(right, 'right', x + width, y, thickness, height);
  126938. this.updateWall(top, 'top', x, y - thickness, width, thickness);
  126939. this.updateWall(bottom, 'bottom', x, y + height, width, thickness);
  126940. return this;
  126941. },
  126942. // position = 'left', 'right', 'top' or 'bottom'
  126943. /**
  126944. * [description]
  126945. *
  126946. * @method Phaser.Physics.Matter.World#updateWall
  126947. * @since 3.0.0
  126948. *
  126949. * @param {boolean} add - [description]
  126950. * @param {string} position - [description]
  126951. * @param {number} x - [description]
  126952. * @param {number} y - [description]
  126953. * @param {number} width - [description]
  126954. * @param {number} height - [description]
  126955. */
  126956. updateWall: function (add, position, x, y, width, height)
  126957. {
  126958. var wall = this.walls[position];
  126959. if (add)
  126960. {
  126961. if (wall)
  126962. {
  126963. MatterWorld.remove(this.localWorld, wall);
  126964. }
  126965. // adjust center
  126966. x += (width / 2);
  126967. y += (height / 2);
  126968. this.walls[position] = this.create(x, y, width, height, { isStatic: true, friction: 0, frictionStatic: 0 });
  126969. }
  126970. else
  126971. {
  126972. if (wall)
  126973. {
  126974. MatterWorld.remove(this.localWorld, wall);
  126975. }
  126976. this.walls[position] = null;
  126977. }
  126978. },
  126979. /**
  126980. * [description]
  126981. *
  126982. * @method Phaser.Physics.Matter.World#createDebugGraphic
  126983. * @since 3.0.0
  126984. *
  126985. * @return {Phaser.GameObjects.Graphics} [description]
  126986. */
  126987. createDebugGraphic: function ()
  126988. {
  126989. var graphic = this.scene.sys.add.graphics({ x: 0, y: 0 });
  126990. graphic.setDepth(Number.MAX_VALUE);
  126991. this.debugGraphic = graphic;
  126992. this.drawDebug = true;
  126993. return graphic;
  126994. },
  126995. /**
  126996. * [description]
  126997. *
  126998. * @method Phaser.Physics.Matter.World#disableGravity
  126999. * @since 3.0.0
  127000. *
  127001. * @return {Phaser.Physics.Matter.World} This Matter World object.
  127002. */
  127003. disableGravity: function ()
  127004. {
  127005. this.localWorld.gravity.x = 0;
  127006. this.localWorld.gravity.y = 0;
  127007. this.localWorld.gravity.scale = 0;
  127008. return this;
  127009. },
  127010. /**
  127011. * [description]
  127012. *
  127013. * @method Phaser.Physics.Matter.World#setGravity
  127014. * @since 3.0.0
  127015. *
  127016. * @param {number} [x=0] - [description]
  127017. * @param {number} [y=1] - [description]
  127018. * @param {number} [scale] - [description]
  127019. *
  127020. * @return {Phaser.Physics.Matter.World} This Matter World object.
  127021. */
  127022. setGravity: function (x, y, scale)
  127023. {
  127024. if (x === undefined) { x = 0; }
  127025. if (y === undefined) { y = 1; }
  127026. this.localWorld.gravity.x = x;
  127027. this.localWorld.gravity.y = y;
  127028. if (scale !== undefined)
  127029. {
  127030. this.localWorld.gravity.scale = scale;
  127031. }
  127032. return this;
  127033. },
  127034. /**
  127035. * [description]
  127036. *
  127037. * @method Phaser.Physics.Matter.World#create
  127038. * @since 3.0.0
  127039. *
  127040. * @param {number} x - [description]
  127041. * @param {number} y - [description]
  127042. * @param {number} width - [description]
  127043. * @param {number} height - [description]
  127044. * @param {object} options - [description]
  127045. *
  127046. * @return {MatterJS.Body} [description]
  127047. */
  127048. create: function (x, y, width, height, options)
  127049. {
  127050. var body = Bodies.rectangle(x, y, width, height, options);
  127051. MatterWorld.add(this.localWorld, body);
  127052. return body;
  127053. },
  127054. /**
  127055. * [description]
  127056. *
  127057. * @method Phaser.Physics.Matter.World#add
  127058. * @since 3.0.0
  127059. *
  127060. * @param {(object|object[])} object - Can be single or an array, and can be a body, composite or constraint
  127061. *
  127062. * @return {Phaser.Physics.Matter.World} This Matter World object.
  127063. */
  127064. add: function (object)
  127065. {
  127066. MatterWorld.add(this.localWorld, object);
  127067. return this;
  127068. },
  127069. /**
  127070. * [description]
  127071. *
  127072. * @method Phaser.Physics.Matter.World#remove
  127073. * @since 3.0.0
  127074. *
  127075. * @param {object} object - The object to be removed from the world.
  127076. * @param {boolean} deep - [description]
  127077. *
  127078. * @return {Phaser.Physics.Matter.World} This Matter World object.
  127079. */
  127080. remove: function (object, deep)
  127081. {
  127082. var body = (object.body) ? object.body : object;
  127083. Composite.removeBody(this.localWorld, body, deep);
  127084. return this;
  127085. },
  127086. /**
  127087. * [description]
  127088. *
  127089. * @method Phaser.Physics.Matter.World#removeConstraint
  127090. * @since 3.0.0
  127091. *
  127092. * @param {MatterJS.Constraint} constraint - [description]
  127093. * @param {boolean} deep - [description]
  127094. *
  127095. * @return {Phaser.Physics.Matter.World} This Matter World object.
  127096. */
  127097. removeConstraint: function (constraint, deep)
  127098. {
  127099. Composite.remove(this.localWorld, constraint, deep);
  127100. return this;
  127101. },
  127102. /**
  127103. * Adds MatterTileBody instances for all the colliding tiles within the given tilemap layer. Set
  127104. * the appropriate tiles in your layer to collide before calling this method!
  127105. *
  127106. * @method Phaser.Physics.Matter.World#convertTilemapLayer
  127107. * @since 3.0.0
  127108. *
  127109. * @param {(Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} tilemapLayer -
  127110. * An array of tiles.
  127111. * @param {object} [options] - Options to be passed to the MatterTileBody constructor. {@ee Phaser.Physics.Matter.TileBody}
  127112. *
  127113. * @return {Phaser.Physics.Matter.World} This Matter World object.
  127114. */
  127115. convertTilemapLayer: function (tilemapLayer, options)
  127116. {
  127117. var layerData = tilemapLayer.layer;
  127118. var tiles = tilemapLayer.getTilesWithin(0, 0, layerData.width, layerData.height, {isColliding: true});
  127119. this.convertTiles(tiles, options);
  127120. return this;
  127121. },
  127122. /**
  127123. * Adds MatterTileBody instances for the given tiles. This adds bodies regardless of whether the
  127124. * tiles are set to collide or not.
  127125. *
  127126. * @method Phaser.Physics.Matter.World#convertTiles
  127127. * @since 3.0.0
  127128. *
  127129. * @param {Phaser.Tilemaps.Tile[]} tiles - An array of tiles.
  127130. * @param {object} [options] - Options to be passed to the MatterTileBody constructor. {@see Phaser.Physics.Matter.TileBody}
  127131. *
  127132. * @return {Phaser.Physics.Matter.World} This Matter World object.
  127133. */
  127134. convertTiles: function (tiles, options)
  127135. {
  127136. if (tiles.length === 0)
  127137. {
  127138. return this;
  127139. }
  127140. for (var i = 0; i < tiles.length; i++)
  127141. {
  127142. new MatterTileBody(this, tiles[i], options);
  127143. }
  127144. return this;
  127145. },
  127146. /**
  127147. * [description]
  127148. *
  127149. * @method Phaser.Physics.Matter.World#nextGroup
  127150. * @since 3.0.0
  127151. *
  127152. * @param {boolean} isNonColliding - [description]
  127153. *
  127154. * @return {number} [description]
  127155. */
  127156. nextGroup: function (isNonColliding)
  127157. {
  127158. return MatterBody.nextGroup(isNonColliding);
  127159. },
  127160. /**
  127161. * [description]
  127162. *
  127163. * @method Phaser.Physics.Matter.World#nextCategory
  127164. * @since 3.0.0
  127165. *
  127166. * @return {number} [description]
  127167. */
  127168. nextCategory: function ()
  127169. {
  127170. return MatterBody.nextCategory();
  127171. },
  127172. /**
  127173. * [description]
  127174. *
  127175. * @method Phaser.Physics.Matter.World#pause
  127176. * @since 3.0.0
  127177. *
  127178. * @return {Phaser.Physics.Matter.World} This Matter World object.
  127179. */
  127180. pause: function ()
  127181. {
  127182. this.enabled = false;
  127183. this.emit('pause');
  127184. return this;
  127185. },
  127186. /**
  127187. * [description]
  127188. *
  127189. * @method Phaser.Physics.Matter.World#resume
  127190. * @since 3.0.0
  127191. *
  127192. * @return {Phaser.Physics.Matter.World} This Matter World object.
  127193. */
  127194. resume: function ()
  127195. {
  127196. this.enabled = true;
  127197. this.emit('resume');
  127198. return this;
  127199. },
  127200. /**
  127201. * [description]
  127202. *
  127203. * @method Phaser.Physics.Matter.World#update
  127204. * @since 3.0.0
  127205. *
  127206. * @param {number} time - [description]
  127207. * @param {number} delta - [description]
  127208. */
  127209. update: function (time, delta)
  127210. {
  127211. if (this.enabled && this.autoUpdate)
  127212. {
  127213. Engine.update(this.engine, this.getDelta(time, delta), this.correction);
  127214. }
  127215. },
  127216. /**
  127217. * Manually advances the physics simulation by one iteration.
  127218. *
  127219. * You can optionally pass in the `delta` and `correction` values to be used by Engine.update.
  127220. * If undefined they use the Matter defaults of 60Hz and no correction.
  127221. *
  127222. * Calling `step` directly bypasses any checks of `enabled` or `autoUpdate`.
  127223. *
  127224. * It also ignores any custom `getDelta` functions, as you should be passing the delta
  127225. * value in to this call.
  127226. *
  127227. * You can adjust the number of iterations that Engine.update performs internally.
  127228. * Use the Scene Matter Physics config object to set the following properties:
  127229. *
  127230. * positionIterations (defaults to 6)
  127231. * velocityIterations (defaults to 4)
  127232. * constraintIterations (defaults to 2)
  127233. *
  127234. * Adjusting these values can help performance in certain situations, depending on the physics requirements
  127235. * of your game.
  127236. *
  127237. * @method Phaser.Physics.Matter.World#step
  127238. * @since 3.4.0
  127239. *
  127240. * @param {number} [delta=16.666] - [description]
  127241. * @param {number} [correction=1] - [description]
  127242. */
  127243. step: function (delta, correction)
  127244. {
  127245. Engine.update(this.engine, delta, correction);
  127246. },
  127247. /**
  127248. * Runs the Matter Engine.update at a fixed timestep of 60Hz.
  127249. *
  127250. * @method Phaser.Physics.Matter.World#update60Hz
  127251. * @since 3.4.0
  127252. *
  127253. * @return {number} The delta value to be passed to Engine.update.
  127254. */
  127255. update60Hz: function ()
  127256. {
  127257. return 1000 / 60;
  127258. },
  127259. /**
  127260. * Runs the Matter Engine.update at a fixed timestep of 30Hz.
  127261. *
  127262. * @method Phaser.Physics.Matter.World#update30Hz
  127263. * @since 3.4.0
  127264. *
  127265. * @return {number} The delta value to be passed to Engine.update.
  127266. */
  127267. update30Hz: function ()
  127268. {
  127269. return 1000 / 30;
  127270. },
  127271. /**
  127272. * [description]
  127273. *
  127274. * @method Phaser.Physics.Matter.World#postUpdate
  127275. * @since 3.0.0
  127276. */
  127277. postUpdate: function ()
  127278. {
  127279. if (!this.drawDebug)
  127280. {
  127281. return;
  127282. }
  127283. var graphics = this.debugGraphic;
  127284. var bodies = Composite.allBodies(this.localWorld);
  127285. graphics.clear();
  127286. graphics.lineStyle(1, this.defaults.bodyDebugColor);
  127287. graphics.beginPath();
  127288. var i,j;
  127289. for (i = 0; i < bodies.length; i++)
  127290. {
  127291. if (!bodies[i].render.visible)
  127292. {
  127293. return;
  127294. }
  127295. // Handle drawing both single bodies and compound bodies. If compound, draw both the
  127296. // convex hull (first part) and the rest of the bodies.
  127297. for (j = 0; j < bodies[i].parts.length; j++)
  127298. {
  127299. var body = bodies[i].parts[j];
  127300. var vertices = body.vertices;
  127301. graphics.moveTo(vertices[0].x, vertices[0].y);
  127302. for (var k = 1; k < vertices.length; k++)
  127303. {
  127304. graphics.lineTo(vertices[k].x, vertices[k].y);
  127305. }
  127306. graphics.lineTo(vertices[0].x, vertices[0].y);
  127307. graphics.strokePath();
  127308. }
  127309. }
  127310. graphics.closePath();
  127311. if (this.defaults.debugShowJoint)
  127312. {
  127313. graphics.lineStyle(2, this.defaults.jointDebugColor);
  127314. // Render constraints
  127315. var constraints = Composite.allConstraints(this.localWorld);
  127316. for (i = 0; i < constraints.length; i++)
  127317. {
  127318. var constraint = constraints[i];
  127319. if (!constraint.render.visible || !constraint.pointA || !constraint.pointB)
  127320. {
  127321. continue;
  127322. }
  127323. if (constraint.render.lineWidth)
  127324. {
  127325. graphics.lineStyle(constraint.render.lineWidth, Common.colorToNumber(constraint.render.strokeStyle));
  127326. }
  127327. var bodyA = constraint.bodyA;
  127328. var bodyB = constraint.bodyB;
  127329. var start;
  127330. var end;
  127331. if (bodyA)
  127332. {
  127333. start = Vector.add(bodyA.position, constraint.pointA);
  127334. }
  127335. else
  127336. {
  127337. start = constraint.pointA;
  127338. }
  127339. if (constraint.render.type === 'pin')
  127340. {
  127341. graphics.beginPath();
  127342. graphics.arc(start.x, start.y, 3, 0, 2 * Math.PI);
  127343. graphics.closePath();
  127344. }
  127345. else
  127346. {
  127347. if (bodyB)
  127348. {
  127349. end = Vector.add(bodyB.position, constraint.pointB);
  127350. }
  127351. else
  127352. {
  127353. end = constraint.pointB;
  127354. }
  127355. graphics.beginPath();
  127356. graphics.moveTo(start.x, start.y);
  127357. if (constraint.render.type === 'spring')
  127358. {
  127359. var delta = Vector.sub(end, start);
  127360. var normal = Vector.perp(Vector.normalise(delta));
  127361. var coils = Math.ceil(Common.clamp(constraint.length / 5, 12, 20));
  127362. var offset;
  127363. for (j = 1; j < coils; j += 1)
  127364. {
  127365. offset = (j % 2 === 0) ? 1 : -1;
  127366. graphics.lineTo(
  127367. start.x + delta.x * (j / coils) + normal.x * offset * 4,
  127368. start.y + delta.y * (j / coils) + normal.y * offset * 4
  127369. );
  127370. }
  127371. }
  127372. graphics.lineTo(end.x, end.y);
  127373. }
  127374. if (constraint.render.lineWidth)
  127375. {
  127376. graphics.strokePath();
  127377. }
  127378. if (constraint.render.anchors)
  127379. {
  127380. graphics.fillStyle(Common.colorToNumber(constraint.render.strokeStyle));
  127381. graphics.beginPath();
  127382. graphics.arc(start.x, start.y, 6, 0, 2 * Math.PI);
  127383. graphics.arc(end.x, end.y, 6, 0, 2 * Math.PI);
  127384. graphics.closePath();
  127385. graphics.fillPath();
  127386. }
  127387. }
  127388. }
  127389. },
  127390. /**
  127391. * [description]
  127392. *
  127393. * @method Phaser.Physics.Matter.World#fromPath
  127394. * @since 3.0.0
  127395. *
  127396. * @param {string} path - [description]
  127397. * @param {array} points - [description]
  127398. *
  127399. * @return {array} [description]
  127400. */
  127401. fromPath: function (path, points)
  127402. {
  127403. if (points === undefined) { points = []; }
  127404. // var pathPattern = /L?\s*([-\d.e]+)[\s,]*([-\d.e]+)*/ig;
  127405. // eslint-disable-next-line no-useless-escape
  127406. var pathPattern = /L?\s*([\-\d\.e]+)[\s,]*([\-\d\.e]+)*/ig;
  127407. path.replace(pathPattern, function (match, x, y)
  127408. {
  127409. points.push({ x: parseFloat(x), y: parseFloat(y) });
  127410. });
  127411. return points;
  127412. },
  127413. /**
  127414. * [description]
  127415. *
  127416. * @method Phaser.Physics.Matter.World#shutdown
  127417. * @since 3.0.0
  127418. */
  127419. shutdown: function ()
  127420. {
  127421. MatterEvents.off(this.engine);
  127422. this.removeAllListeners();
  127423. MatterWorld.clear(this.localWorld, false);
  127424. Engine.clear(this.engine);
  127425. },
  127426. /**
  127427. * [description]
  127428. *
  127429. * @method Phaser.Physics.Matter.World#destroy
  127430. * @since 3.0.0
  127431. */
  127432. destroy: function ()
  127433. {
  127434. this.shutdown();
  127435. }
  127436. });
  127437. module.exports = World;
  127438. /***/ }),
  127439. /* 1013 */
  127440. /***/ (function(module, exports, __webpack_require__) {
  127441. /**
  127442. * The `Matter.Engine` module contains methods for creating and manipulating engines.
  127443. * An engine is a controller that manages updating the simulation of the world.
  127444. * See `Matter.Runner` for an optional game loop utility.
  127445. *
  127446. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  127447. *
  127448. * @class Engine
  127449. */
  127450. var Engine = {};
  127451. module.exports = Engine;
  127452. var World = __webpack_require__(679);
  127453. var Sleeping = __webpack_require__(336);
  127454. var Resolver = __webpack_require__(1014);
  127455. var Pairs = __webpack_require__(1015);
  127456. var Metrics = __webpack_require__(1036);
  127457. var Grid = __webpack_require__(1016);
  127458. var Events = __webpack_require__(306);
  127459. var Composite = __webpack_require__(226);
  127460. var Constraint = __webpack_require__(305);
  127461. var Common = __webpack_require__(42);
  127462. var Body = __webpack_require__(73);
  127463. (function() {
  127464. /**
  127465. * Creates a new engine. The options parameter is an object that specifies any properties you wish to override the defaults.
  127466. * All properties have default values, and many are pre-calculated automatically based on other properties.
  127467. * See the properties section below for detailed information on what you can pass via the `options` object.
  127468. * @method create
  127469. * @param {object} [options]
  127470. * @return {engine} engine
  127471. */
  127472. Engine.create = function(element, options) {
  127473. // options may be passed as the first (and only) argument
  127474. options = Common.isElement(element) ? options : element;
  127475. element = Common.isElement(element) ? element : null;
  127476. options = options || {};
  127477. if (element || options.render) {
  127478. Common.warn('Engine.create: engine.render is deprecated (see docs)');
  127479. }
  127480. var defaults = {
  127481. positionIterations: 6,
  127482. velocityIterations: 4,
  127483. constraintIterations: 2,
  127484. enableSleeping: false,
  127485. events: [],
  127486. plugin: {},
  127487. timing: {
  127488. timestamp: 0,
  127489. timeScale: 1
  127490. },
  127491. broadphase: {
  127492. controller: Grid
  127493. }
  127494. };
  127495. var engine = Common.extend(defaults, options);
  127496. /*
  127497. // @deprecated
  127498. if (element || engine.render) {
  127499. var renderDefaults = {
  127500. element: element,
  127501. controller: Render
  127502. };
  127503. engine.render = Common.extend(renderDefaults, engine.render);
  127504. }
  127505. // @deprecated
  127506. if (engine.render && engine.render.controller) {
  127507. engine.render = engine.render.controller.create(engine.render);
  127508. }
  127509. // @deprecated
  127510. if (engine.render) {
  127511. engine.render.engine = engine;
  127512. }
  127513. */
  127514. engine.world = options.world || World.create(engine.world);
  127515. engine.pairs = Pairs.create();
  127516. engine.broadphase = engine.broadphase.controller.create(engine.broadphase);
  127517. engine.metrics = engine.metrics || { extended: false };
  127518. // @if DEBUG
  127519. engine.metrics = Metrics.create(engine.metrics);
  127520. // @endif
  127521. return engine;
  127522. };
  127523. /**
  127524. * Moves the simulation forward in time by `delta` ms.
  127525. * The `correction` argument is an optional `Number` that specifies the time correction factor to apply to the update.
  127526. * This can help improve the accuracy of the simulation in cases where `delta` is changing between updates.
  127527. * The value of `correction` is defined as `delta / lastDelta`, i.e. the percentage change of `delta` over the last step.
  127528. * Therefore the value is always `1` (no correction) when `delta` constant (or when no correction is desired, which is the default).
  127529. * See the paper on <a href="http://lonesock.net/article/verlet.html">Time Corrected Verlet</a> for more information.
  127530. *
  127531. * Triggers `beforeUpdate` and `afterUpdate` events.
  127532. * Triggers `collisionStart`, `collisionActive` and `collisionEnd` events.
  127533. * @method update
  127534. * @param {engine} engine
  127535. * @param {number} [delta=16.666]
  127536. * @param {number} [correction=1]
  127537. */
  127538. Engine.update = function(engine, delta, correction) {
  127539. delta = delta || 1000 / 60;
  127540. correction = correction || 1;
  127541. var world = engine.world,
  127542. timing = engine.timing,
  127543. broadphase = engine.broadphase,
  127544. broadphasePairs = [],
  127545. i;
  127546. // increment timestamp
  127547. timing.timestamp += delta * timing.timeScale;
  127548. // create an event object
  127549. var event = {
  127550. timestamp: timing.timestamp
  127551. };
  127552. Events.trigger(engine, 'beforeUpdate', event);
  127553. // get lists of all bodies and constraints, no matter what composites they are in
  127554. var allBodies = Composite.allBodies(world),
  127555. allConstraints = Composite.allConstraints(world);
  127556. // @if DEBUG
  127557. // reset metrics logging
  127558. Metrics.reset(engine.metrics);
  127559. // @endif
  127560. // if sleeping enabled, call the sleeping controller
  127561. if (engine.enableSleeping)
  127562. Sleeping.update(allBodies, timing.timeScale);
  127563. // applies gravity to all bodies
  127564. _bodiesApplyGravity(allBodies, world.gravity);
  127565. // update all body position and rotation by integration
  127566. _bodiesUpdate(allBodies, delta, timing.timeScale, correction, world.bounds);
  127567. // update all constraints (first pass)
  127568. Constraint.preSolveAll(allBodies);
  127569. for (i = 0; i < engine.constraintIterations; i++) {
  127570. Constraint.solveAll(allConstraints, timing.timeScale);
  127571. }
  127572. Constraint.postSolveAll(allBodies);
  127573. // broadphase pass: find potential collision pairs
  127574. if (broadphase.controller) {
  127575. // if world is dirty, we must flush the whole grid
  127576. if (world.isModified)
  127577. broadphase.controller.clear(broadphase);
  127578. // update the grid buckets based on current bodies
  127579. broadphase.controller.update(broadphase, allBodies, engine, world.isModified);
  127580. broadphasePairs = broadphase.pairsList;
  127581. } else {
  127582. // if no broadphase set, we just pass all bodies
  127583. broadphasePairs = allBodies;
  127584. }
  127585. // clear all composite modified flags
  127586. if (world.isModified) {
  127587. Composite.setModified(world, false, false, true);
  127588. }
  127589. // narrowphase pass: find actual collisions, then create or update collision pairs
  127590. var collisions = broadphase.detector(broadphasePairs, engine);
  127591. // update collision pairs
  127592. var pairs = engine.pairs,
  127593. timestamp = timing.timestamp;
  127594. Pairs.update(pairs, collisions, timestamp);
  127595. Pairs.removeOld(pairs, timestamp);
  127596. // wake up bodies involved in collisions
  127597. if (engine.enableSleeping)
  127598. Sleeping.afterCollisions(pairs.list, timing.timeScale);
  127599. // trigger collision events
  127600. if (pairs.collisionStart.length > 0)
  127601. Events.trigger(engine, 'collisionStart', { pairs: pairs.collisionStart });
  127602. // iteratively resolve position between collisions
  127603. Resolver.preSolvePosition(pairs.list);
  127604. for (i = 0; i < engine.positionIterations; i++) {
  127605. Resolver.solvePosition(pairs.list, allBodies, timing.timeScale);
  127606. }
  127607. Resolver.postSolvePosition(allBodies);
  127608. // update all constraints (second pass)
  127609. Constraint.preSolveAll(allBodies);
  127610. for (i = 0; i < engine.constraintIterations; i++) {
  127611. Constraint.solveAll(allConstraints, timing.timeScale);
  127612. }
  127613. Constraint.postSolveAll(allBodies);
  127614. // iteratively resolve velocity between collisions
  127615. Resolver.preSolveVelocity(pairs.list);
  127616. for (i = 0; i < engine.velocityIterations; i++) {
  127617. Resolver.solveVelocity(pairs.list, timing.timeScale);
  127618. }
  127619. // trigger collision events
  127620. if (pairs.collisionActive.length > 0)
  127621. Events.trigger(engine, 'collisionActive', { pairs: pairs.collisionActive });
  127622. if (pairs.collisionEnd.length > 0)
  127623. Events.trigger(engine, 'collisionEnd', { pairs: pairs.collisionEnd });
  127624. // @if DEBUG
  127625. // update metrics log
  127626. Metrics.update(engine.metrics, engine);
  127627. // @endif
  127628. // clear force buffers
  127629. _bodiesClearForces(allBodies);
  127630. Events.trigger(engine, 'afterUpdate', event);
  127631. return engine;
  127632. };
  127633. /**
  127634. * Merges two engines by keeping the configuration of `engineA` but replacing the world with the one from `engineB`.
  127635. * @method merge
  127636. * @param {engine} engineA
  127637. * @param {engine} engineB
  127638. */
  127639. Engine.merge = function(engineA, engineB) {
  127640. Common.extend(engineA, engineB);
  127641. if (engineB.world) {
  127642. engineA.world = engineB.world;
  127643. Engine.clear(engineA);
  127644. var bodies = Composite.allBodies(engineA.world);
  127645. for (var i = 0; i < bodies.length; i++) {
  127646. var body = bodies[i];
  127647. Sleeping.set(body, false);
  127648. body.id = Common.nextId();
  127649. }
  127650. }
  127651. };
  127652. /**
  127653. * Clears the engine including the world, pairs and broadphase.
  127654. * @method clear
  127655. * @param {engine} engine
  127656. */
  127657. Engine.clear = function(engine) {
  127658. var world = engine.world;
  127659. Pairs.clear(engine.pairs);
  127660. var broadphase = engine.broadphase;
  127661. if (broadphase.controller) {
  127662. var bodies = Composite.allBodies(world);
  127663. broadphase.controller.clear(broadphase);
  127664. broadphase.controller.update(broadphase, bodies, engine, true);
  127665. }
  127666. };
  127667. /**
  127668. * Zeroes the `body.force` and `body.torque` force buffers.
  127669. * @method bodiesClearForces
  127670. * @private
  127671. * @param {body[]} bodies
  127672. */
  127673. var _bodiesClearForces = function(bodies) {
  127674. for (var i = 0; i < bodies.length; i++) {
  127675. var body = bodies[i];
  127676. // reset force buffers
  127677. body.force.x = 0;
  127678. body.force.y = 0;
  127679. body.torque = 0;
  127680. }
  127681. };
  127682. /**
  127683. * Applys a mass dependant force to all given bodies.
  127684. * @method bodiesApplyGravity
  127685. * @private
  127686. * @param {body[]} bodies
  127687. * @param {vector} gravity
  127688. */
  127689. var _bodiesApplyGravity = function(bodies, gravity) {
  127690. var gravityScale = typeof gravity.scale !== 'undefined' ? gravity.scale : 0.001;
  127691. if ((gravity.x === 0 && gravity.y === 0) || gravityScale === 0) {
  127692. return;
  127693. }
  127694. for (var i = 0; i < bodies.length; i++) {
  127695. var body = bodies[i];
  127696. if (body.ignoreGravity || body.isStatic || body.isSleeping)
  127697. continue;
  127698. // apply gravity
  127699. body.force.y += body.mass * gravity.y * gravityScale;
  127700. body.force.x += body.mass * gravity.x * gravityScale;
  127701. }
  127702. };
  127703. /**
  127704. * Applys `Body.update` to all given `bodies`.
  127705. * @method updateAll
  127706. * @private
  127707. * @param {body[]} bodies
  127708. * @param {number} deltaTime
  127709. * The amount of time elapsed between updates
  127710. * @param {number} timeScale
  127711. * @param {number} correction
  127712. * The Verlet correction factor (deltaTime / lastDeltaTime)
  127713. * @param {bounds} worldBounds
  127714. */
  127715. var _bodiesUpdate = function(bodies, deltaTime, timeScale, correction, worldBounds) {
  127716. for (var i = 0; i < bodies.length; i++) {
  127717. var body = bodies[i];
  127718. if (body.isStatic || body.isSleeping)
  127719. continue;
  127720. Body.update(body, deltaTime, timeScale, correction);
  127721. }
  127722. };
  127723. /**
  127724. * An alias for `Runner.run`, see `Matter.Runner` for more information.
  127725. * @method run
  127726. * @param {engine} engine
  127727. */
  127728. /**
  127729. * Fired just before an update
  127730. *
  127731. * @event beforeUpdate
  127732. * @param {} event An event object
  127733. * @param {number} event.timestamp The engine.timing.timestamp of the event
  127734. * @param {} event.source The source object of the event
  127735. * @param {} event.name The name of the event
  127736. */
  127737. /**
  127738. * Fired after engine update and all collision events
  127739. *
  127740. * @event afterUpdate
  127741. * @param {} event An event object
  127742. * @param {number} event.timestamp The engine.timing.timestamp of the event
  127743. * @param {} event.source The source object of the event
  127744. * @param {} event.name The name of the event
  127745. */
  127746. /**
  127747. * Fired after engine update, provides a list of all pairs that have started to collide in the current tick (if any)
  127748. *
  127749. * @event collisionStart
  127750. * @param {} event An event object
  127751. * @param {} event.pairs List of affected pairs
  127752. * @param {number} event.timestamp The engine.timing.timestamp of the event
  127753. * @param {} event.source The source object of the event
  127754. * @param {} event.name The name of the event
  127755. */
  127756. /**
  127757. * Fired after engine update, provides a list of all pairs that are colliding in the current tick (if any)
  127758. *
  127759. * @event collisionActive
  127760. * @param {} event An event object
  127761. * @param {} event.pairs List of affected pairs
  127762. * @param {number} event.timestamp The engine.timing.timestamp of the event
  127763. * @param {} event.source The source object of the event
  127764. * @param {} event.name The name of the event
  127765. */
  127766. /**
  127767. * Fired after engine update, provides a list of all pairs that have ended collision in the current tick (if any)
  127768. *
  127769. * @event collisionEnd
  127770. * @param {} event An event object
  127771. * @param {} event.pairs List of affected pairs
  127772. * @param {number} event.timestamp The engine.timing.timestamp of the event
  127773. * @param {} event.source The source object of the event
  127774. * @param {} event.name The name of the event
  127775. */
  127776. /*
  127777. *
  127778. * Properties Documentation
  127779. *
  127780. */
  127781. /**
  127782. * An integer `Number` that specifies the number of position iterations to perform each update.
  127783. * The higher the value, the higher quality the simulation will be at the expense of performance.
  127784. *
  127785. * @property positionIterations
  127786. * @type number
  127787. * @default 6
  127788. */
  127789. /**
  127790. * An integer `Number` that specifies the number of velocity iterations to perform each update.
  127791. * The higher the value, the higher quality the simulation will be at the expense of performance.
  127792. *
  127793. * @property velocityIterations
  127794. * @type number
  127795. * @default 4
  127796. */
  127797. /**
  127798. * An integer `Number` that specifies the number of constraint iterations to perform each update.
  127799. * The higher the value, the higher quality the simulation will be at the expense of performance.
  127800. * The default value of `2` is usually very adequate.
  127801. *
  127802. * @property constraintIterations
  127803. * @type number
  127804. * @default 2
  127805. */
  127806. /**
  127807. * A flag that specifies whether the engine should allow sleeping via the `Matter.Sleeping` module.
  127808. * Sleeping can improve stability and performance, but often at the expense of accuracy.
  127809. *
  127810. * @property enableSleeping
  127811. * @type boolean
  127812. * @default false
  127813. */
  127814. /**
  127815. * An `Object` containing properties regarding the timing systems of the engine.
  127816. *
  127817. * @property timing
  127818. * @type object
  127819. */
  127820. /**
  127821. * A `Number` that specifies the global scaling factor of time for all bodies.
  127822. * A value of `0` freezes the simulation.
  127823. * A value of `0.1` gives a slow-motion effect.
  127824. * A value of `1.2` gives a speed-up effect.
  127825. *
  127826. * @property timing.timeScale
  127827. * @type number
  127828. * @default 1
  127829. */
  127830. /**
  127831. * A `Number` that specifies the current simulation-time in milliseconds starting from `0`.
  127832. * It is incremented on every `Engine.update` by the given `delta` argument.
  127833. *
  127834. * @property timing.timestamp
  127835. * @type number
  127836. * @default 0
  127837. */
  127838. /**
  127839. * An instance of a `Render` controller. The default value is a `Matter.Render` instance created by `Engine.create`.
  127840. * One may also develop a custom renderer module based on `Matter.Render` and pass an instance of it to `Engine.create` via `options.render`.
  127841. *
  127842. * A minimal custom renderer object must define at least three functions: `create`, `clear` and `world` (see `Matter.Render`).
  127843. * It is also possible to instead pass the _module_ reference via `options.render.controller` and `Engine.create` will instantiate one for you.
  127844. *
  127845. * @property render
  127846. * @type render
  127847. * @deprecated see Demo.js for an example of creating a renderer
  127848. * @default a Matter.Render instance
  127849. */
  127850. /**
  127851. * An instance of a broadphase controller. The default value is a `Matter.Grid` instance created by `Engine.create`.
  127852. *
  127853. * @property broadphase
  127854. * @type grid
  127855. * @default a Matter.Grid instance
  127856. */
  127857. /**
  127858. * A `World` composite object that will contain all simulated bodies and constraints.
  127859. *
  127860. * @property world
  127861. * @type world
  127862. * @default a Matter.World instance
  127863. */
  127864. /**
  127865. * An object reserved for storing plugin-specific properties.
  127866. *
  127867. * @property plugin
  127868. * @type {}
  127869. */
  127870. })();
  127871. /***/ }),
  127872. /* 1014 */
  127873. /***/ (function(module, exports, __webpack_require__) {
  127874. /**
  127875. * The `Matter.Resolver` module contains methods for resolving collision pairs.
  127876. *
  127877. * @class Resolver
  127878. */
  127879. var Resolver = {};
  127880. module.exports = Resolver;
  127881. var Vertices = __webpack_require__(127);
  127882. var Vector = __webpack_require__(106);
  127883. var Common = __webpack_require__(42);
  127884. var Bounds = __webpack_require__(126);
  127885. (function() {
  127886. Resolver._restingThresh = 4;
  127887. Resolver._restingThreshTangent = 6;
  127888. Resolver._positionDampen = 0.9;
  127889. Resolver._positionWarming = 0.8;
  127890. Resolver._frictionNormalMultiplier = 5;
  127891. /**
  127892. * Prepare pairs for position solving.
  127893. * @method preSolvePosition
  127894. * @param {pair[]} pairs
  127895. */
  127896. Resolver.preSolvePosition = function(pairs) {
  127897. var i,
  127898. pair,
  127899. activeCount;
  127900. // find total contacts on each body
  127901. for (i = 0; i < pairs.length; i++) {
  127902. pair = pairs[i];
  127903. if (!pair.isActive)
  127904. continue;
  127905. activeCount = pair.activeContacts.length;
  127906. pair.collision.parentA.totalContacts += activeCount;
  127907. pair.collision.parentB.totalContacts += activeCount;
  127908. }
  127909. };
  127910. /**
  127911. * Find a solution for pair positions.
  127912. * @method solvePosition
  127913. * @param {pair[]} pairs
  127914. * @param {number} timeScale
  127915. */
  127916. Resolver.solvePosition = function(pairs, bodies, timeScale) {
  127917. var i,
  127918. normalX,
  127919. normalY,
  127920. pair,
  127921. collision,
  127922. bodyA,
  127923. bodyB,
  127924. normal,
  127925. separation,
  127926. penetration,
  127927. positionImpulseA,
  127928. positionImpulseB,
  127929. contactShare,
  127930. bodyBtoAX,
  127931. bodyBtoAY,
  127932. positionImpulse,
  127933. impulseCoefficient = timeScale * Resolver._positionDampen;
  127934. for (i = 0; i < bodies.length; i++) {
  127935. var body = bodies[i];
  127936. body.previousPositionImpulse.x = body.positionImpulse.x;
  127937. body.previousPositionImpulse.y = body.positionImpulse.y;
  127938. }
  127939. // find impulses required to resolve penetration
  127940. for (i = 0; i < pairs.length; i++) {
  127941. pair = pairs[i];
  127942. if (!pair.isActive || pair.isSensor)
  127943. continue;
  127944. collision = pair.collision;
  127945. bodyA = collision.parentA;
  127946. bodyB = collision.parentB;
  127947. normal = collision.normal;
  127948. positionImpulseA = bodyA.previousPositionImpulse;
  127949. positionImpulseB = bodyB.previousPositionImpulse;
  127950. penetration = collision.penetration;
  127951. // bodyBtoA = positionImpulseB - positionImpulseA + penetration
  127952. bodyBtoAX = positionImpulseB.x - positionImpulseA.x + penetration.x;
  127953. bodyBtoAY = positionImpulseB.y - positionImpulseA.y + penetration.y;
  127954. normalX = normal.x;
  127955. normalY = normal.y;
  127956. // separation = dot(normal, bodyBtoA)
  127957. separation = normalX * bodyBtoAX + normalY * bodyBtoAY;
  127958. pair.separation = separation;
  127959. positionImpulse = (separation - pair.slop) * impulseCoefficient;
  127960. if (bodyA.isStatic || bodyB.isStatic)
  127961. positionImpulse *= 2;
  127962. if (!(bodyA.isStatic || bodyA.isSleeping)) {
  127963. contactShare = positionImpulse / bodyA.totalContacts;
  127964. bodyA.positionImpulse.x += normalX * contactShare;
  127965. bodyA.positionImpulse.y += normalY * contactShare;
  127966. }
  127967. if (!(bodyB.isStatic || bodyB.isSleeping)) {
  127968. contactShare = positionImpulse / bodyB.totalContacts;
  127969. bodyB.positionImpulse.x -= normalX * contactShare;
  127970. bodyB.positionImpulse.y -= normalY * contactShare;
  127971. }
  127972. }
  127973. };
  127974. /**
  127975. * Apply position resolution.
  127976. * @method postSolvePosition
  127977. * @param {body[]} bodies
  127978. */
  127979. Resolver.postSolvePosition = function(bodies) {
  127980. for (var i = 0; i < bodies.length; i++) {
  127981. var body = bodies[i];
  127982. // reset contact count
  127983. body.totalContacts = 0;
  127984. if (body.positionImpulse.x !== 0 || body.positionImpulse.y !== 0) {
  127985. // update body geometry
  127986. for (var j = 0; j < body.parts.length; j++) {
  127987. var part = body.parts[j];
  127988. Vertices.translate(part.vertices, body.positionImpulse);
  127989. Bounds.update(part.bounds, part.vertices, body.velocity);
  127990. part.position.x += body.positionImpulse.x;
  127991. part.position.y += body.positionImpulse.y;
  127992. }
  127993. // move the body without changing velocity
  127994. body.positionPrev.x += body.positionImpulse.x;
  127995. body.positionPrev.y += body.positionImpulse.y;
  127996. if (Vector.dot(body.positionImpulse, body.velocity) < 0) {
  127997. // reset cached impulse if the body has velocity along it
  127998. body.positionImpulse.x = 0;
  127999. body.positionImpulse.y = 0;
  128000. } else {
  128001. // warm the next iteration
  128002. body.positionImpulse.x *= Resolver._positionWarming;
  128003. body.positionImpulse.y *= Resolver._positionWarming;
  128004. }
  128005. }
  128006. }
  128007. };
  128008. /**
  128009. * Prepare pairs for velocity solving.
  128010. * @method preSolveVelocity
  128011. * @param {pair[]} pairs
  128012. */
  128013. Resolver.preSolveVelocity = function(pairs) {
  128014. var i,
  128015. j,
  128016. pair,
  128017. contacts,
  128018. collision,
  128019. bodyA,
  128020. bodyB,
  128021. normal,
  128022. tangent,
  128023. contact,
  128024. contactVertex,
  128025. normalImpulse,
  128026. tangentImpulse,
  128027. offset,
  128028. impulse = Vector._temp[0],
  128029. tempA = Vector._temp[1];
  128030. for (i = 0; i < pairs.length; i++) {
  128031. pair = pairs[i];
  128032. if (!pair.isActive || pair.isSensor)
  128033. continue;
  128034. contacts = pair.activeContacts;
  128035. collision = pair.collision;
  128036. bodyA = collision.parentA;
  128037. bodyB = collision.parentB;
  128038. normal = collision.normal;
  128039. tangent = collision.tangent;
  128040. // resolve each contact
  128041. for (j = 0; j < contacts.length; j++) {
  128042. contact = contacts[j];
  128043. contactVertex = contact.vertex;
  128044. normalImpulse = contact.normalImpulse;
  128045. tangentImpulse = contact.tangentImpulse;
  128046. if (normalImpulse !== 0 || tangentImpulse !== 0) {
  128047. // total impulse from contact
  128048. impulse.x = (normal.x * normalImpulse) + (tangent.x * tangentImpulse);
  128049. impulse.y = (normal.y * normalImpulse) + (tangent.y * tangentImpulse);
  128050. // apply impulse from contact
  128051. if (!(bodyA.isStatic || bodyA.isSleeping)) {
  128052. offset = Vector.sub(contactVertex, bodyA.position, tempA);
  128053. bodyA.positionPrev.x += impulse.x * bodyA.inverseMass;
  128054. bodyA.positionPrev.y += impulse.y * bodyA.inverseMass;
  128055. bodyA.anglePrev += Vector.cross(offset, impulse) * bodyA.inverseInertia;
  128056. }
  128057. if (!(bodyB.isStatic || bodyB.isSleeping)) {
  128058. offset = Vector.sub(contactVertex, bodyB.position, tempA);
  128059. bodyB.positionPrev.x -= impulse.x * bodyB.inverseMass;
  128060. bodyB.positionPrev.y -= impulse.y * bodyB.inverseMass;
  128061. bodyB.anglePrev -= Vector.cross(offset, impulse) * bodyB.inverseInertia;
  128062. }
  128063. }
  128064. }
  128065. }
  128066. };
  128067. /**
  128068. * Find a solution for pair velocities.
  128069. * @method solveVelocity
  128070. * @param {pair[]} pairs
  128071. * @param {number} timeScale
  128072. */
  128073. Resolver.solveVelocity = function(pairs, timeScale) {
  128074. var timeScaleSquared = timeScale * timeScale,
  128075. impulse = Vector._temp[0],
  128076. tempA = Vector._temp[1],
  128077. tempB = Vector._temp[2],
  128078. tempC = Vector._temp[3],
  128079. tempD = Vector._temp[4],
  128080. tempE = Vector._temp[5];
  128081. for (var i = 0; i < pairs.length; i++) {
  128082. var pair = pairs[i];
  128083. if (!pair.isActive || pair.isSensor)
  128084. continue;
  128085. var collision = pair.collision,
  128086. bodyA = collision.parentA,
  128087. bodyB = collision.parentB,
  128088. normal = collision.normal,
  128089. tangent = collision.tangent,
  128090. contacts = pair.activeContacts,
  128091. contactShare = 1 / contacts.length;
  128092. // update body velocities
  128093. bodyA.velocity.x = bodyA.position.x - bodyA.positionPrev.x;
  128094. bodyA.velocity.y = bodyA.position.y - bodyA.positionPrev.y;
  128095. bodyB.velocity.x = bodyB.position.x - bodyB.positionPrev.x;
  128096. bodyB.velocity.y = bodyB.position.y - bodyB.positionPrev.y;
  128097. bodyA.angularVelocity = bodyA.angle - bodyA.anglePrev;
  128098. bodyB.angularVelocity = bodyB.angle - bodyB.anglePrev;
  128099. // resolve each contact
  128100. for (var j = 0; j < contacts.length; j++) {
  128101. var contact = contacts[j],
  128102. contactVertex = contact.vertex,
  128103. offsetA = Vector.sub(contactVertex, bodyA.position, tempA),
  128104. offsetB = Vector.sub(contactVertex, bodyB.position, tempB),
  128105. velocityPointA = Vector.add(bodyA.velocity, Vector.mult(Vector.perp(offsetA), bodyA.angularVelocity), tempC),
  128106. velocityPointB = Vector.add(bodyB.velocity, Vector.mult(Vector.perp(offsetB), bodyB.angularVelocity), tempD),
  128107. relativeVelocity = Vector.sub(velocityPointA, velocityPointB, tempE),
  128108. normalVelocity = Vector.dot(normal, relativeVelocity);
  128109. var tangentVelocity = Vector.dot(tangent, relativeVelocity),
  128110. tangentSpeed = Math.abs(tangentVelocity),
  128111. tangentVelocityDirection = Common.sign(tangentVelocity);
  128112. // raw impulses
  128113. var normalImpulse = (1 + pair.restitution) * normalVelocity,
  128114. normalForce = Common.clamp(pair.separation + normalVelocity, 0, 1) * Resolver._frictionNormalMultiplier;
  128115. // coulomb friction
  128116. var tangentImpulse = tangentVelocity,
  128117. maxFriction = Infinity;
  128118. if (tangentSpeed > pair.friction * pair.frictionStatic * normalForce * timeScaleSquared) {
  128119. maxFriction = tangentSpeed;
  128120. tangentImpulse = Common.clamp(
  128121. pair.friction * tangentVelocityDirection * timeScaleSquared,
  128122. -maxFriction, maxFriction
  128123. );
  128124. }
  128125. // modify impulses accounting for mass, inertia and offset
  128126. var oAcN = Vector.cross(offsetA, normal),
  128127. oBcN = Vector.cross(offsetB, normal),
  128128. share = contactShare / (bodyA.inverseMass + bodyB.inverseMass + bodyA.inverseInertia * oAcN * oAcN + bodyB.inverseInertia * oBcN * oBcN);
  128129. normalImpulse *= share;
  128130. tangentImpulse *= share;
  128131. // handle high velocity and resting collisions separately
  128132. if (normalVelocity < 0 && normalVelocity * normalVelocity > Resolver._restingThresh * timeScaleSquared) {
  128133. // high normal velocity so clear cached contact normal impulse
  128134. contact.normalImpulse = 0;
  128135. } else {
  128136. // solve resting collision constraints using Erin Catto's method (GDC08)
  128137. // impulse constraint tends to 0
  128138. var contactNormalImpulse = contact.normalImpulse;
  128139. contact.normalImpulse = Math.min(contact.normalImpulse + normalImpulse, 0);
  128140. normalImpulse = contact.normalImpulse - contactNormalImpulse;
  128141. }
  128142. // handle high velocity and resting collisions separately
  128143. if (tangentVelocity * tangentVelocity > Resolver._restingThreshTangent * timeScaleSquared) {
  128144. // high tangent velocity so clear cached contact tangent impulse
  128145. contact.tangentImpulse = 0;
  128146. } else {
  128147. // solve resting collision constraints using Erin Catto's method (GDC08)
  128148. // tangent impulse tends to -tangentSpeed or +tangentSpeed
  128149. var contactTangentImpulse = contact.tangentImpulse;
  128150. contact.tangentImpulse = Common.clamp(contact.tangentImpulse + tangentImpulse, -maxFriction, maxFriction);
  128151. tangentImpulse = contact.tangentImpulse - contactTangentImpulse;
  128152. }
  128153. // total impulse from contact
  128154. impulse.x = (normal.x * normalImpulse) + (tangent.x * tangentImpulse);
  128155. impulse.y = (normal.y * normalImpulse) + (tangent.y * tangentImpulse);
  128156. // apply impulse from contact
  128157. if (!(bodyA.isStatic || bodyA.isSleeping)) {
  128158. bodyA.positionPrev.x += impulse.x * bodyA.inverseMass;
  128159. bodyA.positionPrev.y += impulse.y * bodyA.inverseMass;
  128160. bodyA.anglePrev += Vector.cross(offsetA, impulse) * bodyA.inverseInertia;
  128161. }
  128162. if (!(bodyB.isStatic || bodyB.isSleeping)) {
  128163. bodyB.positionPrev.x -= impulse.x * bodyB.inverseMass;
  128164. bodyB.positionPrev.y -= impulse.y * bodyB.inverseMass;
  128165. bodyB.anglePrev -= Vector.cross(offsetB, impulse) * bodyB.inverseInertia;
  128166. }
  128167. }
  128168. }
  128169. };
  128170. })();
  128171. /***/ }),
  128172. /* 1015 */
  128173. /***/ (function(module, exports, __webpack_require__) {
  128174. /**
  128175. * The `Matter.Pairs` module contains methods for creating and manipulating collision pair sets.
  128176. *
  128177. * @class Pairs
  128178. */
  128179. var Pairs = {};
  128180. module.exports = Pairs;
  128181. var Pair = __webpack_require__(615);
  128182. var Common = __webpack_require__(42);
  128183. (function() {
  128184. var _pairMaxIdleLife = 1000;
  128185. /**
  128186. * Creates a new pairs structure.
  128187. * @method create
  128188. * @param {object} options
  128189. * @return {pairs} A new pairs structure
  128190. */
  128191. Pairs.create = function(options) {
  128192. return Common.extend({
  128193. table: {},
  128194. list: [],
  128195. collisionStart: [],
  128196. collisionActive: [],
  128197. collisionEnd: []
  128198. }, options);
  128199. };
  128200. /**
  128201. * Updates pairs given a list of collisions.
  128202. * @method update
  128203. * @param {object} pairs
  128204. * @param {collision[]} collisions
  128205. * @param {number} timestamp
  128206. */
  128207. Pairs.update = function(pairs, collisions, timestamp) {
  128208. var pairsList = pairs.list,
  128209. pairsTable = pairs.table,
  128210. collisionStart = pairs.collisionStart,
  128211. collisionEnd = pairs.collisionEnd,
  128212. collisionActive = pairs.collisionActive,
  128213. collision,
  128214. pairId,
  128215. pair,
  128216. i;
  128217. // clear collision state arrays, but maintain old reference
  128218. collisionStart.length = 0;
  128219. collisionEnd.length = 0;
  128220. collisionActive.length = 0;
  128221. for (i = 0; i < pairsList.length; i++) {
  128222. pairsList[i].confirmedActive = false;
  128223. }
  128224. for (i = 0; i < collisions.length; i++) {
  128225. collision = collisions[i];
  128226. if (collision.collided) {
  128227. pairId = Pair.id(collision.bodyA, collision.bodyB);
  128228. pair = pairsTable[pairId];
  128229. if (pair) {
  128230. // pair already exists (but may or may not be active)
  128231. if (pair.isActive) {
  128232. // pair exists and is active
  128233. collisionActive.push(pair);
  128234. } else {
  128235. // pair exists but was inactive, so a collision has just started again
  128236. collisionStart.push(pair);
  128237. }
  128238. // update the pair
  128239. Pair.update(pair, collision, timestamp);
  128240. pair.confirmedActive = true;
  128241. } else {
  128242. // pair did not exist, create a new pair
  128243. pair = Pair.create(collision, timestamp);
  128244. pairsTable[pairId] = pair;
  128245. // push the new pair
  128246. collisionStart.push(pair);
  128247. pairsList.push(pair);
  128248. }
  128249. }
  128250. }
  128251. // deactivate previously active pairs that are now inactive
  128252. for (i = 0; i < pairsList.length; i++) {
  128253. pair = pairsList[i];
  128254. if (!pair.confirmedActive) {
  128255. Pair.setActive(pair, false, timestamp);
  128256. collisionEnd.push(pair);
  128257. }
  128258. }
  128259. };
  128260. /**
  128261. * Finds and removes pairs that have been inactive for a set amount of time.
  128262. * @method removeOld
  128263. * @param {object} pairs
  128264. * @param {number} timestamp
  128265. */
  128266. Pairs.removeOld = function(pairs, timestamp) {
  128267. var pairsList = pairs.list,
  128268. pairsTable = pairs.table,
  128269. indexesToRemove = [],
  128270. pair,
  128271. collision,
  128272. pairIndex,
  128273. i;
  128274. for (i = 0; i < pairsList.length; i++) {
  128275. pair = pairsList[i];
  128276. collision = pair.collision;
  128277. // never remove sleeping pairs
  128278. if (collision.bodyA.isSleeping || collision.bodyB.isSleeping) {
  128279. pair.timeUpdated = timestamp;
  128280. continue;
  128281. }
  128282. // if pair is inactive for too long, mark it to be removed
  128283. if (timestamp - pair.timeUpdated > _pairMaxIdleLife) {
  128284. indexesToRemove.push(i);
  128285. }
  128286. }
  128287. // remove marked pairs
  128288. for (i = 0; i < indexesToRemove.length; i++) {
  128289. pairIndex = indexesToRemove[i] - i;
  128290. pair = pairsList[pairIndex];
  128291. delete pairsTable[pair.id];
  128292. pairsList.splice(pairIndex, 1);
  128293. }
  128294. };
  128295. /**
  128296. * Clears the given pairs structure.
  128297. * @method clear
  128298. * @param {pairs} pairs
  128299. * @return {pairs} pairs
  128300. */
  128301. Pairs.clear = function(pairs) {
  128302. pairs.table = {};
  128303. pairs.list.length = 0;
  128304. pairs.collisionStart.length = 0;
  128305. pairs.collisionActive.length = 0;
  128306. pairs.collisionEnd.length = 0;
  128307. return pairs;
  128308. };
  128309. })();
  128310. /***/ }),
  128311. /* 1016 */
  128312. /***/ (function(module, exports, __webpack_require__) {
  128313. /**
  128314. * The `Matter.Grid` module contains methods for creating and manipulating collision broadphase grid structures.
  128315. *
  128316. * @class Grid
  128317. */
  128318. var Grid = {};
  128319. module.exports = Grid;
  128320. var Pair = __webpack_require__(615);
  128321. var Detector = __webpack_require__(683);
  128322. var Common = __webpack_require__(42);
  128323. (function() {
  128324. /**
  128325. * Creates a new grid.
  128326. * @method create
  128327. * @param {} options
  128328. * @return {grid} A new grid
  128329. */
  128330. Grid.create = function(options) {
  128331. var defaults = {
  128332. controller: Grid,
  128333. detector: Detector.collisions,
  128334. buckets: {},
  128335. pairs: {},
  128336. pairsList: [],
  128337. bucketWidth: 48,
  128338. bucketHeight: 48
  128339. };
  128340. return Common.extend(defaults, options);
  128341. };
  128342. /**
  128343. * The width of a single grid bucket.
  128344. *
  128345. * @property bucketWidth
  128346. * @type number
  128347. * @default 48
  128348. */
  128349. /**
  128350. * The height of a single grid bucket.
  128351. *
  128352. * @property bucketHeight
  128353. * @type number
  128354. * @default 48
  128355. */
  128356. /**
  128357. * Updates the grid.
  128358. * @method update
  128359. * @param {grid} grid
  128360. * @param {body[]} bodies
  128361. * @param {engine} engine
  128362. * @param {boolean} forceUpdate
  128363. */
  128364. Grid.update = function(grid, bodies, engine, forceUpdate) {
  128365. var i, col, row,
  128366. world = engine.world,
  128367. buckets = grid.buckets,
  128368. bucket,
  128369. bucketId,
  128370. gridChanged = false;
  128371. // @if DEBUG
  128372. var metrics = engine.metrics;
  128373. metrics.broadphaseTests = 0;
  128374. // @endif
  128375. for (i = 0; i < bodies.length; i++) {
  128376. var body = bodies[i];
  128377. if (body.isSleeping && !forceUpdate)
  128378. continue;
  128379. // don't update out of world bodies
  128380. if (body.bounds.max.x < world.bounds.min.x || body.bounds.min.x > world.bounds.max.x
  128381. || body.bounds.max.y < world.bounds.min.y || body.bounds.min.y > world.bounds.max.y)
  128382. continue;
  128383. var newRegion = _getRegion(grid, body);
  128384. // if the body has changed grid region
  128385. if (!body.region || newRegion.id !== body.region.id || forceUpdate) {
  128386. // @if DEBUG
  128387. metrics.broadphaseTests += 1;
  128388. // @endif
  128389. if (!body.region || forceUpdate)
  128390. body.region = newRegion;
  128391. var union = _regionUnion(newRegion, body.region);
  128392. // update grid buckets affected by region change
  128393. // iterate over the union of both regions
  128394. for (col = union.startCol; col <= union.endCol; col++) {
  128395. for (row = union.startRow; row <= union.endRow; row++) {
  128396. bucketId = _getBucketId(col, row);
  128397. bucket = buckets[bucketId];
  128398. var isInsideNewRegion = (col >= newRegion.startCol && col <= newRegion.endCol
  128399. && row >= newRegion.startRow && row <= newRegion.endRow);
  128400. var isInsideOldRegion = (col >= body.region.startCol && col <= body.region.endCol
  128401. && row >= body.region.startRow && row <= body.region.endRow);
  128402. // remove from old region buckets
  128403. if (!isInsideNewRegion && isInsideOldRegion) {
  128404. if (isInsideOldRegion) {
  128405. if (bucket)
  128406. _bucketRemoveBody(grid, bucket, body);
  128407. }
  128408. }
  128409. // add to new region buckets
  128410. if (body.region === newRegion || (isInsideNewRegion && !isInsideOldRegion) || forceUpdate) {
  128411. if (!bucket)
  128412. bucket = _createBucket(buckets, bucketId);
  128413. _bucketAddBody(grid, bucket, body);
  128414. }
  128415. }
  128416. }
  128417. // set the new region
  128418. body.region = newRegion;
  128419. // flag changes so we can update pairs
  128420. gridChanged = true;
  128421. }
  128422. }
  128423. // update pairs list only if pairs changed (i.e. a body changed region)
  128424. if (gridChanged)
  128425. grid.pairsList = _createActivePairsList(grid);
  128426. };
  128427. /**
  128428. * Clears the grid.
  128429. * @method clear
  128430. * @param {grid} grid
  128431. */
  128432. Grid.clear = function(grid) {
  128433. grid.buckets = {};
  128434. grid.pairs = {};
  128435. grid.pairsList = [];
  128436. };
  128437. /**
  128438. * Finds the union of two regions.
  128439. * @method _regionUnion
  128440. * @private
  128441. * @param {} regionA
  128442. * @param {} regionB
  128443. * @return {} region
  128444. */
  128445. var _regionUnion = function(regionA, regionB) {
  128446. var startCol = Math.min(regionA.startCol, regionB.startCol),
  128447. endCol = Math.max(regionA.endCol, regionB.endCol),
  128448. startRow = Math.min(regionA.startRow, regionB.startRow),
  128449. endRow = Math.max(regionA.endRow, regionB.endRow);
  128450. return _createRegion(startCol, endCol, startRow, endRow);
  128451. };
  128452. /**
  128453. * Gets the region a given body falls in for a given grid.
  128454. * @method _getRegion
  128455. * @private
  128456. * @param {} grid
  128457. * @param {} body
  128458. * @return {} region
  128459. */
  128460. var _getRegion = function(grid, body) {
  128461. var bounds = body.bounds,
  128462. startCol = Math.floor(bounds.min.x / grid.bucketWidth),
  128463. endCol = Math.floor(bounds.max.x / grid.bucketWidth),
  128464. startRow = Math.floor(bounds.min.y / grid.bucketHeight),
  128465. endRow = Math.floor(bounds.max.y / grid.bucketHeight);
  128466. return _createRegion(startCol, endCol, startRow, endRow);
  128467. };
  128468. /**
  128469. * Creates a region.
  128470. * @method _createRegion
  128471. * @private
  128472. * @param {} startCol
  128473. * @param {} endCol
  128474. * @param {} startRow
  128475. * @param {} endRow
  128476. * @return {} region
  128477. */
  128478. var _createRegion = function(startCol, endCol, startRow, endRow) {
  128479. return {
  128480. id: startCol + ',' + endCol + ',' + startRow + ',' + endRow,
  128481. startCol: startCol,
  128482. endCol: endCol,
  128483. startRow: startRow,
  128484. endRow: endRow
  128485. };
  128486. };
  128487. /**
  128488. * Gets the bucket id at the given position.
  128489. * @method _getBucketId
  128490. * @private
  128491. * @param {} column
  128492. * @param {} row
  128493. * @return {string} bucket id
  128494. */
  128495. var _getBucketId = function(column, row) {
  128496. return 'C' + column + 'R' + row;
  128497. };
  128498. /**
  128499. * Creates a bucket.
  128500. * @method _createBucket
  128501. * @private
  128502. * @param {} buckets
  128503. * @param {} bucketId
  128504. * @return {} bucket
  128505. */
  128506. var _createBucket = function(buckets, bucketId) {
  128507. var bucket = buckets[bucketId] = [];
  128508. return bucket;
  128509. };
  128510. /**
  128511. * Adds a body to a bucket.
  128512. * @method _bucketAddBody
  128513. * @private
  128514. * @param {} grid
  128515. * @param {} bucket
  128516. * @param {} body
  128517. */
  128518. var _bucketAddBody = function(grid, bucket, body) {
  128519. // add new pairs
  128520. for (var i = 0; i < bucket.length; i++) {
  128521. var bodyB = bucket[i];
  128522. if (body.id === bodyB.id || (body.isStatic && bodyB.isStatic))
  128523. continue;
  128524. // keep track of the number of buckets the pair exists in
  128525. // important for Grid.update to work
  128526. var pairId = Pair.id(body, bodyB),
  128527. pair = grid.pairs[pairId];
  128528. if (pair) {
  128529. pair[2] += 1;
  128530. } else {
  128531. grid.pairs[pairId] = [body, bodyB, 1];
  128532. }
  128533. }
  128534. // add to bodies (after pairs, otherwise pairs with self)
  128535. bucket.push(body);
  128536. };
  128537. /**
  128538. * Removes a body from a bucket.
  128539. * @method _bucketRemoveBody
  128540. * @private
  128541. * @param {} grid
  128542. * @param {} bucket
  128543. * @param {} body
  128544. */
  128545. var _bucketRemoveBody = function(grid, bucket, body) {
  128546. // remove from bucket
  128547. bucket.splice(bucket.indexOf(body), 1);
  128548. // update pair counts
  128549. for (var i = 0; i < bucket.length; i++) {
  128550. // keep track of the number of buckets the pair exists in
  128551. // important for _createActivePairsList to work
  128552. var bodyB = bucket[i],
  128553. pairId = Pair.id(body, bodyB),
  128554. pair = grid.pairs[pairId];
  128555. if (pair)
  128556. pair[2] -= 1;
  128557. }
  128558. };
  128559. /**
  128560. * Generates a list of the active pairs in the grid.
  128561. * @method _createActivePairsList
  128562. * @private
  128563. * @param {} grid
  128564. * @return [] pairs
  128565. */
  128566. var _createActivePairsList = function(grid) {
  128567. var pairKeys,
  128568. pair,
  128569. pairs = [];
  128570. // grid.pairs is used as a hashmap
  128571. pairKeys = Common.keys(grid.pairs);
  128572. // iterate over grid.pairs
  128573. for (var k = 0; k < pairKeys.length; k++) {
  128574. pair = grid.pairs[pairKeys[k]];
  128575. // if pair exists in at least one bucket
  128576. // it is a pair that needs further collision testing so push it
  128577. if (pair[2] > 0) {
  128578. pairs.push(pair);
  128579. } else {
  128580. delete grid.pairs[pairKeys[k]];
  128581. }
  128582. }
  128583. return pairs;
  128584. };
  128585. })();
  128586. /***/ }),
  128587. /* 1017 */
  128588. /***/ (function(module, exports, __webpack_require__) {
  128589. /**
  128590. * The `Matter` module is the top level namespace. It also includes a function for installing plugins on top of the library.
  128591. *
  128592. * @class Matter
  128593. */
  128594. var Matter = {};
  128595. module.exports = Matter;
  128596. var Plugin = __webpack_require__(680);
  128597. var Common = __webpack_require__(42);
  128598. (function() {
  128599. /**
  128600. * The library name.
  128601. * @property name
  128602. * @readOnly
  128603. * @type {String}
  128604. */
  128605. Matter.name = 'matter-js';
  128606. /**
  128607. * The library version.
  128608. * @property version
  128609. * @readOnly
  128610. * @type {String}
  128611. */
  128612. Matter.version = '0.13.1';
  128613. /**
  128614. * A list of plugin dependencies to be installed. These are normally set and installed through `Matter.use`.
  128615. * Alternatively you may set `Matter.uses` manually and install them by calling `Plugin.use(Matter)`.
  128616. * @property uses
  128617. * @type {Array}
  128618. */
  128619. Matter.uses = [];
  128620. /**
  128621. * The plugins that have been installed through `Matter.Plugin.install`. Read only.
  128622. * @property used
  128623. * @readOnly
  128624. * @type {Array}
  128625. */
  128626. Matter.used = [];
  128627. /**
  128628. * Installs the given plugins on the `Matter` namespace.
  128629. * This is a short-hand for `Plugin.use`, see it for more information.
  128630. * Call this function once at the start of your code, with all of the plugins you wish to install as arguments.
  128631. * Avoid calling this function multiple times unless you intend to manually control installation order.
  128632. * @method use
  128633. * @param ...plugin {Function} The plugin(s) to install on `base` (multi-argument).
  128634. */
  128635. Matter.use = function() {
  128636. Plugin.use(Matter, Array.prototype.slice.call(arguments));
  128637. };
  128638. /**
  128639. * Chains a function to excute before the original function on the given `path` relative to `Matter`.
  128640. * See also docs for `Common.chain`.
  128641. * @method before
  128642. * @param {string} path The path relative to `Matter`
  128643. * @param {function} func The function to chain before the original
  128644. * @return {function} The chained function that replaced the original
  128645. */
  128646. Matter.before = function(path, func) {
  128647. path = path.replace(/^Matter./, '');
  128648. return Common.chainPathBefore(Matter, path, func);
  128649. };
  128650. /**
  128651. * Chains a function to excute after the original function on the given `path` relative to `Matter`.
  128652. * See also docs for `Common.chain`.
  128653. * @method after
  128654. * @param {string} path The path relative to `Matter`
  128655. * @param {function} func The function to chain after the original
  128656. * @return {function} The chained function that replaced the original
  128657. */
  128658. Matter.after = function(path, func) {
  128659. path = path.replace(/^Matter./, '');
  128660. return Common.chainPathAfter(Matter, path, func);
  128661. };
  128662. })();
  128663. /***/ }),
  128664. /* 1018 */
  128665. /***/ (function(module, exports, __webpack_require__) {
  128666. /**
  128667. * @author Richard Davey <rich@photonstorm.com>
  128668. * @copyright 2018 Photon Storm Ltd.
  128669. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128670. */
  128671. var AnimationComponent = __webpack_require__(307);
  128672. var Class = __webpack_require__(0);
  128673. var Components = __webpack_require__(616);
  128674. var GameObject = __webpack_require__(2);
  128675. var GetFastValue = __webpack_require__(1);
  128676. var Pipeline = __webpack_require__(296);
  128677. var Sprite = __webpack_require__(35);
  128678. var Vector2 = __webpack_require__(6);
  128679. /**
  128680. * @classdesc
  128681. * A Matter Physics Sprite Game Object.
  128682. *
  128683. * A Sprite Game Object is used for the display of both static and animated images in your game.
  128684. * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled
  128685. * and animated.
  128686. *
  128687. * The main difference between a Sprite and an Image Game Object is that you cannot animate Images.
  128688. * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation
  128689. * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases.
  128690. *
  128691. * @class Sprite
  128692. * @extends Phaser.GameObjects.Sprite
  128693. * @memberOf Phaser.Physics.Matter
  128694. * @constructor
  128695. * @since 3.0.0
  128696. *
  128697. * @extends Phaser.Physics.Matter.Components.Bounce
  128698. * @extends Phaser.Physics.Matter.Components.Collision
  128699. * @extends Phaser.Physics.Matter.Components.Force
  128700. * @extends Phaser.Physics.Matter.Components.Friction
  128701. * @extends Phaser.Physics.Matter.Components.Gravity
  128702. * @extends Phaser.Physics.Matter.Components.Mass
  128703. * @extends Phaser.Physics.Matter.Components.Sensor
  128704. * @extends Phaser.Physics.Matter.Components.SetBody
  128705. * @extends Phaser.Physics.Matter.Components.Sleep
  128706. * @extends Phaser.Physics.Matter.Components.Static
  128707. * @extends Phaser.Physics.Matter.Components.Transform
  128708. * @extends Phaser.Physics.Matter.Components.Velocity
  128709. * @extends Phaser.GameObjects.Components.Alpha
  128710. * @extends Phaser.GameObjects.Components.BlendMode
  128711. * @extends Phaser.GameObjects.Components.Depth
  128712. * @extends Phaser.GameObjects.Components.Flip
  128713. * @extends Phaser.GameObjects.Components.GetBounds
  128714. * @extends Phaser.GameObjects.Components.Origin
  128715. * @extends Phaser.GameObjects.Components.Pipeline
  128716. * @extends Phaser.GameObjects.Components.ScaleMode
  128717. * @extends Phaser.GameObjects.Components.ScrollFactor
  128718. * @extends Phaser.GameObjects.Components.Size
  128719. * @extends Phaser.GameObjects.Components.Texture
  128720. * @extends Phaser.GameObjects.Components.Tint
  128721. * @extends Phaser.GameObjects.Components.Transform
  128722. * @extends Phaser.GameObjects.Components.Visible
  128723. *
  128724. * @param {Phaser.Physics.Matter.World} world - [description]
  128725. * @param {number} x - The horizontal position of this Game Object in the world.
  128726. * @param {number} y - The vertical position of this Game Object in the world.
  128727. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  128728. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  128729. * @param {object} [options={}] - Matter.js configuration object.
  128730. */
  128731. var MatterSprite = new Class({
  128732. Extends: Sprite,
  128733. Mixins: [
  128734. Components.Bounce,
  128735. Components.Collision,
  128736. Components.Force,
  128737. Components.Friction,
  128738. Components.Gravity,
  128739. Components.Mass,
  128740. Components.Sensor,
  128741. Components.SetBody,
  128742. Components.Sleep,
  128743. Components.Static,
  128744. Components.Transform,
  128745. Components.Velocity,
  128746. Pipeline
  128747. ],
  128748. initialize:
  128749. function MatterSprite (world, x, y, texture, frame, options)
  128750. {
  128751. GameObject.call(this, world.scene, 'Image');
  128752. this.anims = new AnimationComponent(this);
  128753. this.setTexture(texture, frame);
  128754. this.setSizeToFrame();
  128755. this.setOrigin();
  128756. /**
  128757. * [description]
  128758. *
  128759. * @name Phaser.Physics.Matter.Sprite#world
  128760. * @type {Phaser.Physics.Matter.World}
  128761. * @since 3.0.0
  128762. */
  128763. this.world = world;
  128764. /**
  128765. * [description]
  128766. *
  128767. * @name Phaser.Physics.Matter.Sprite#_tempVec2
  128768. * @type {Phaser.Math.Vector2}
  128769. * @private
  128770. * @since 3.0.0
  128771. */
  128772. this._tempVec2 = new Vector2(x, y);
  128773. var shape = GetFastValue(options, 'shape', null);
  128774. if (shape)
  128775. {
  128776. this.setBody(shape, options);
  128777. }
  128778. else
  128779. {
  128780. this.setRectangle(this.width, this.height, options);
  128781. }
  128782. this.setPosition(x, y);
  128783. this.initPipeline('TextureTintPipeline');
  128784. }
  128785. });
  128786. module.exports = MatterSprite;
  128787. /***/ }),
  128788. /* 1019 */
  128789. /***/ (function(module, exports, __webpack_require__) {
  128790. /**
  128791. * @author Richard Davey <rich@photonstorm.com>
  128792. * @copyright 2018 Photon Storm Ltd.
  128793. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  128794. */
  128795. var Class = __webpack_require__(0);
  128796. var Components = __webpack_require__(616);
  128797. var GameObject = __webpack_require__(2);
  128798. var GetFastValue = __webpack_require__(1);
  128799. var Image = __webpack_require__(68);
  128800. var Pipeline = __webpack_require__(296);
  128801. var Vector2 = __webpack_require__(6);
  128802. /**
  128803. * @classdesc
  128804. * A Matter Physics Image Game Object.
  128805. *
  128806. * An Image is a light-weight Game Object useful for the display of static images in your game,
  128807. * such as logos, backgrounds, scenery or other non-animated elements. Images can have input
  128808. * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an
  128809. * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component.
  128810. *
  128811. * @class Image
  128812. * @extends Phaser.GameObjects.Image
  128813. * @memberOf Phaser.Physics.Matter
  128814. * @constructor
  128815. * @since 3.0.0
  128816. *
  128817. * @extends Phaser.Physics.Matter.Components.Bounce
  128818. * @extends Phaser.Physics.Matter.Components.Collision
  128819. * @extends Phaser.Physics.Matter.Components.Force
  128820. * @extends Phaser.Physics.Matter.Components.Friction
  128821. * @extends Phaser.Physics.Matter.Components.Gravity
  128822. * @extends Phaser.Physics.Matter.Components.Mass
  128823. * @extends Phaser.Physics.Matter.Components.Sensor
  128824. * @extends Phaser.Physics.Matter.Components.SetBody
  128825. * @extends Phaser.Physics.Matter.Components.Sleep
  128826. * @extends Phaser.Physics.Matter.Components.Static
  128827. * @extends Phaser.Physics.Matter.Components.Transform
  128828. * @extends Phaser.Physics.Matter.Components.Velocity
  128829. * @extends Phaser.GameObjects.Components.Alpha
  128830. * @extends Phaser.GameObjects.Components.BlendMode
  128831. * @extends Phaser.GameObjects.Components.Depth
  128832. * @extends Phaser.GameObjects.Components.Flip
  128833. * @extends Phaser.GameObjects.Components.GetBounds
  128834. * @extends Phaser.GameObjects.Components.Origin
  128835. * @extends Phaser.GameObjects.Components.Pipeline
  128836. * @extends Phaser.GameObjects.Components.ScaleMode
  128837. * @extends Phaser.GameObjects.Components.ScrollFactor
  128838. * @extends Phaser.GameObjects.Components.Size
  128839. * @extends Phaser.GameObjects.Components.Texture
  128840. * @extends Phaser.GameObjects.Components.Tint
  128841. * @extends Phaser.GameObjects.Components.Transform
  128842. * @extends Phaser.GameObjects.Components.Visible
  128843. *
  128844. * @param {Phaser.Physics.Matter.World} world - [description]
  128845. * @param {number} x - The horizontal position of this Game Object in the world.
  128846. * @param {number} y - The vertical position of this Game Object in the world.
  128847. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  128848. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  128849. * @param {object} [options={}] - Matter.js configuration object.
  128850. */
  128851. var MatterImage = new Class({
  128852. Extends: Image,
  128853. Mixins: [
  128854. Components.Bounce,
  128855. Components.Collision,
  128856. Components.Force,
  128857. Components.Friction,
  128858. Components.Gravity,
  128859. Components.Mass,
  128860. Components.Sensor,
  128861. Components.SetBody,
  128862. Components.Sleep,
  128863. Components.Static,
  128864. Components.Transform,
  128865. Components.Velocity,
  128866. Pipeline
  128867. ],
  128868. initialize:
  128869. function MatterImage (world, x, y, texture, frame, options)
  128870. {
  128871. GameObject.call(this, world.scene, 'Image');
  128872. this.setTexture(texture, frame);
  128873. this.setSizeToFrame();
  128874. this.setOrigin();
  128875. /**
  128876. * [description]
  128877. *
  128878. * @name Phaser.Physics.Matter.Image#world
  128879. * @type {Phaser.Physics.Matter.World}
  128880. * @since 3.0.0
  128881. */
  128882. this.world = world;
  128883. /**
  128884. * [description]
  128885. *
  128886. * @name Phaser.Physics.Matter.Image#_tempVec2
  128887. * @type {Phaser.Math.Vector2}
  128888. * @private
  128889. * @since 3.0.0
  128890. */
  128891. this._tempVec2 = new Vector2(x, y);
  128892. var shape = GetFastValue(options, 'shape', null);
  128893. if (shape)
  128894. {
  128895. this.setBody(shape, options);
  128896. }
  128897. else
  128898. {
  128899. this.setRectangle(this.width, this.height, options);
  128900. }
  128901. this.setPosition(x, y);
  128902. this.initPipeline('TextureTintPipeline');
  128903. }
  128904. });
  128905. module.exports = MatterImage;
  128906. /***/ }),
  128907. /* 1020 */
  128908. /***/ (function(module, exports, __webpack_require__) {
  128909. /**
  128910. * The `Matter.Composites` module contains factory methods for creating composite bodies
  128911. * with commonly used configurations (such as stacks and chains).
  128912. *
  128913. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  128914. *
  128915. * @class Composites
  128916. */
  128917. var Composites = {};
  128918. module.exports = Composites;
  128919. var Composite = __webpack_require__(226);
  128920. var Constraint = __webpack_require__(305);
  128921. var Common = __webpack_require__(42);
  128922. var Body = __webpack_require__(73);
  128923. var Bodies = __webpack_require__(171);
  128924. (function() {
  128925. /**
  128926. * Create a new composite containing bodies created in the callback in a grid arrangement.
  128927. * This function uses the body's bounds to prevent overlaps.
  128928. * @method stack
  128929. * @param {number} xx
  128930. * @param {number} yy
  128931. * @param {number} columns
  128932. * @param {number} rows
  128933. * @param {number} columnGap
  128934. * @param {number} rowGap
  128935. * @param {function} callback
  128936. * @return {composite} A new composite containing objects created in the callback
  128937. */
  128938. Composites.stack = function(xx, yy, columns, rows, columnGap, rowGap, callback) {
  128939. var stack = Composite.create({ label: 'Stack' }),
  128940. x = xx,
  128941. y = yy,
  128942. lastBody,
  128943. i = 0;
  128944. for (var row = 0; row < rows; row++) {
  128945. var maxHeight = 0;
  128946. for (var column = 0; column < columns; column++) {
  128947. var body = callback(x, y, column, row, lastBody, i);
  128948. if (body) {
  128949. var bodyHeight = body.bounds.max.y - body.bounds.min.y,
  128950. bodyWidth = body.bounds.max.x - body.bounds.min.x;
  128951. if (bodyHeight > maxHeight)
  128952. maxHeight = bodyHeight;
  128953. Body.translate(body, { x: bodyWidth * 0.5, y: bodyHeight * 0.5 });
  128954. x = body.bounds.max.x + columnGap;
  128955. Composite.addBody(stack, body);
  128956. lastBody = body;
  128957. i += 1;
  128958. } else {
  128959. x += columnGap;
  128960. }
  128961. }
  128962. y += maxHeight + rowGap;
  128963. x = xx;
  128964. }
  128965. return stack;
  128966. };
  128967. /**
  128968. * Chains all bodies in the given composite together using constraints.
  128969. * @method chain
  128970. * @param {composite} composite
  128971. * @param {number} xOffsetA
  128972. * @param {number} yOffsetA
  128973. * @param {number} xOffsetB
  128974. * @param {number} yOffsetB
  128975. * @param {object} options
  128976. * @return {composite} A new composite containing objects chained together with constraints
  128977. */
  128978. Composites.chain = function(composite, xOffsetA, yOffsetA, xOffsetB, yOffsetB, options) {
  128979. var bodies = composite.bodies;
  128980. for (var i = 1; i < bodies.length; i++) {
  128981. var bodyA = bodies[i - 1],
  128982. bodyB = bodies[i],
  128983. bodyAHeight = bodyA.bounds.max.y - bodyA.bounds.min.y,
  128984. bodyAWidth = bodyA.bounds.max.x - bodyA.bounds.min.x,
  128985. bodyBHeight = bodyB.bounds.max.y - bodyB.bounds.min.y,
  128986. bodyBWidth = bodyB.bounds.max.x - bodyB.bounds.min.x;
  128987. var defaults = {
  128988. bodyA: bodyA,
  128989. pointA: { x: bodyAWidth * xOffsetA, y: bodyAHeight * yOffsetA },
  128990. bodyB: bodyB,
  128991. pointB: { x: bodyBWidth * xOffsetB, y: bodyBHeight * yOffsetB }
  128992. };
  128993. var constraint = Common.extend(defaults, options);
  128994. Composite.addConstraint(composite, Constraint.create(constraint));
  128995. }
  128996. composite.label += ' Chain';
  128997. return composite;
  128998. };
  128999. /**
  129000. * Connects bodies in the composite with constraints in a grid pattern, with optional cross braces.
  129001. * @method mesh
  129002. * @param {composite} composite
  129003. * @param {number} columns
  129004. * @param {number} rows
  129005. * @param {boolean} crossBrace
  129006. * @param {object} options
  129007. * @return {composite} The composite containing objects meshed together with constraints
  129008. */
  129009. Composites.mesh = function(composite, columns, rows, crossBrace, options) {
  129010. var bodies = composite.bodies,
  129011. row,
  129012. col,
  129013. bodyA,
  129014. bodyB,
  129015. bodyC;
  129016. for (row = 0; row < rows; row++) {
  129017. for (col = 1; col < columns; col++) {
  129018. bodyA = bodies[(col - 1) + (row * columns)];
  129019. bodyB = bodies[col + (row * columns)];
  129020. Composite.addConstraint(composite, Constraint.create(Common.extend({ bodyA: bodyA, bodyB: bodyB }, options)));
  129021. }
  129022. if (row > 0) {
  129023. for (col = 0; col < columns; col++) {
  129024. bodyA = bodies[col + ((row - 1) * columns)];
  129025. bodyB = bodies[col + (row * columns)];
  129026. Composite.addConstraint(composite, Constraint.create(Common.extend({ bodyA: bodyA, bodyB: bodyB }, options)));
  129027. if (crossBrace && col > 0) {
  129028. bodyC = bodies[(col - 1) + ((row - 1) * columns)];
  129029. Composite.addConstraint(composite, Constraint.create(Common.extend({ bodyA: bodyC, bodyB: bodyB }, options)));
  129030. }
  129031. if (crossBrace && col < columns - 1) {
  129032. bodyC = bodies[(col + 1) + ((row - 1) * columns)];
  129033. Composite.addConstraint(composite, Constraint.create(Common.extend({ bodyA: bodyC, bodyB: bodyB }, options)));
  129034. }
  129035. }
  129036. }
  129037. }
  129038. composite.label += ' Mesh';
  129039. return composite;
  129040. };
  129041. /**
  129042. * Create a new composite containing bodies created in the callback in a pyramid arrangement.
  129043. * This function uses the body's bounds to prevent overlaps.
  129044. * @method pyramid
  129045. * @param {number} xx
  129046. * @param {number} yy
  129047. * @param {number} columns
  129048. * @param {number} rows
  129049. * @param {number} columnGap
  129050. * @param {number} rowGap
  129051. * @param {function} callback
  129052. * @return {composite} A new composite containing objects created in the callback
  129053. */
  129054. Composites.pyramid = function(xx, yy, columns, rows, columnGap, rowGap, callback) {
  129055. return Composites.stack(xx, yy, columns, rows, columnGap, rowGap, function(x, y, column, row, lastBody, i) {
  129056. var actualRows = Math.min(rows, Math.ceil(columns / 2)),
  129057. lastBodyWidth = lastBody ? lastBody.bounds.max.x - lastBody.bounds.min.x : 0;
  129058. if (row > actualRows)
  129059. return;
  129060. // reverse row order
  129061. row = actualRows - row;
  129062. var start = row,
  129063. end = columns - 1 - row;
  129064. if (column < start || column > end)
  129065. return;
  129066. // retroactively fix the first body's position, since width was unknown
  129067. if (i === 1) {
  129068. Body.translate(lastBody, { x: (column + (columns % 2 === 1 ? 1 : -1)) * lastBodyWidth, y: 0 });
  129069. }
  129070. var xOffset = lastBody ? column * lastBodyWidth : 0;
  129071. return callback(xx + xOffset + column * columnGap, y, column, row, lastBody, i);
  129072. });
  129073. };
  129074. /**
  129075. * Creates a composite with a Newton's Cradle setup of bodies and constraints.
  129076. * @method newtonsCradle
  129077. * @param {number} xx
  129078. * @param {number} yy
  129079. * @param {number} number
  129080. * @param {number} size
  129081. * @param {number} length
  129082. * @return {composite} A new composite newtonsCradle body
  129083. */
  129084. Composites.newtonsCradle = function(xx, yy, number, size, length) {
  129085. var newtonsCradle = Composite.create({ label: 'Newtons Cradle' });
  129086. for (var i = 0; i < number; i++) {
  129087. var separation = 1.9,
  129088. circle = Bodies.circle(xx + i * (size * separation), yy + length, size,
  129089. { inertia: Infinity, restitution: 1, friction: 0, frictionAir: 0.0001, slop: 1 }),
  129090. constraint = Constraint.create({ pointA: { x: xx + i * (size * separation), y: yy }, bodyB: circle });
  129091. Composite.addBody(newtonsCradle, circle);
  129092. Composite.addConstraint(newtonsCradle, constraint);
  129093. }
  129094. return newtonsCradle;
  129095. };
  129096. /**
  129097. * Creates a composite with simple car setup of bodies and constraints.
  129098. * @method car
  129099. * @param {number} xx
  129100. * @param {number} yy
  129101. * @param {number} width
  129102. * @param {number} height
  129103. * @param {number} wheelSize
  129104. * @return {composite} A new composite car body
  129105. */
  129106. Composites.car = function(xx, yy, width, height, wheelSize) {
  129107. var group = Body.nextGroup(true),
  129108. wheelBase = 20,
  129109. wheelAOffset = -width * 0.5 + wheelBase,
  129110. wheelBOffset = width * 0.5 - wheelBase,
  129111. wheelYOffset = 0;
  129112. var car = Composite.create({ label: 'Car' }),
  129113. body = Bodies.rectangle(xx, yy, width, height, {
  129114. collisionFilter: {
  129115. group: group
  129116. },
  129117. chamfer: {
  129118. radius: height * 0.5
  129119. },
  129120. density: 0.0002
  129121. });
  129122. var wheelA = Bodies.circle(xx + wheelAOffset, yy + wheelYOffset, wheelSize, {
  129123. collisionFilter: {
  129124. group: group
  129125. },
  129126. friction: 0.8
  129127. });
  129128. var wheelB = Bodies.circle(xx + wheelBOffset, yy + wheelYOffset, wheelSize, {
  129129. collisionFilter: {
  129130. group: group
  129131. },
  129132. friction: 0.8
  129133. });
  129134. var axelA = Constraint.create({
  129135. bodyB: body,
  129136. pointB: { x: wheelAOffset, y: wheelYOffset },
  129137. bodyA: wheelA,
  129138. stiffness: 1,
  129139. length: 0
  129140. });
  129141. var axelB = Constraint.create({
  129142. bodyB: body,
  129143. pointB: { x: wheelBOffset, y: wheelYOffset },
  129144. bodyA: wheelB,
  129145. stiffness: 1,
  129146. length: 0
  129147. });
  129148. Composite.addBody(car, body);
  129149. Composite.addBody(car, wheelA);
  129150. Composite.addBody(car, wheelB);
  129151. Composite.addConstraint(car, axelA);
  129152. Composite.addConstraint(car, axelB);
  129153. return car;
  129154. };
  129155. /**
  129156. * Creates a simple soft body like object.
  129157. * @method softBody
  129158. * @param {number} xx
  129159. * @param {number} yy
  129160. * @param {number} columns
  129161. * @param {number} rows
  129162. * @param {number} columnGap
  129163. * @param {number} rowGap
  129164. * @param {boolean} crossBrace
  129165. * @param {number} particleRadius
  129166. * @param {} particleOptions
  129167. * @param {} constraintOptions
  129168. * @return {composite} A new composite softBody
  129169. */
  129170. Composites.softBody = function(xx, yy, columns, rows, columnGap, rowGap, crossBrace, particleRadius, particleOptions, constraintOptions) {
  129171. particleOptions = Common.extend({ inertia: Infinity }, particleOptions);
  129172. constraintOptions = Common.extend({ stiffness: 0.2, render: { type: 'line', anchors: false } }, constraintOptions);
  129173. var softBody = Composites.stack(xx, yy, columns, rows, columnGap, rowGap, function(x, y) {
  129174. return Bodies.circle(x, y, particleRadius, particleOptions);
  129175. });
  129176. Composites.mesh(softBody, columns, rows, crossBrace, constraintOptions);
  129177. softBody.label = 'Soft Body';
  129178. return softBody;
  129179. };
  129180. })();
  129181. /***/ }),
  129182. /* 1021 */
  129183. /***/ (function(module, exports) {
  129184. /**
  129185. * @author Richard Davey <rich@photonstorm.com>
  129186. * @copyright 2018 Photon Storm Ltd.
  129187. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129188. */
  129189. module.exports = {
  129190. decomp: polygonDecomp,
  129191. quickDecomp: polygonQuickDecomp,
  129192. isSimple: polygonIsSimple,
  129193. removeCollinearPoints: polygonRemoveCollinearPoints,
  129194. makeCCW: polygonMakeCCW
  129195. };
  129196. /**
  129197. * Compute the intersection between two lines.
  129198. * @static
  129199. * @method lineInt
  129200. * @param {Array} l1 Line vector 1
  129201. * @param {Array} l2 Line vector 2
  129202. * @param {Number} precision Precision to use when checking if the lines are parallel
  129203. * @return {Array} The intersection point.
  129204. */
  129205. function lineInt(l1,l2,precision){
  129206. precision = precision || 0;
  129207. var i = [0,0]; // point
  129208. var a1, b1, c1, a2, b2, c2, det; // scalars
  129209. a1 = l1[1][1] - l1[0][1];
  129210. b1 = l1[0][0] - l1[1][0];
  129211. c1 = a1 * l1[0][0] + b1 * l1[0][1];
  129212. a2 = l2[1][1] - l2[0][1];
  129213. b2 = l2[0][0] - l2[1][0];
  129214. c2 = a2 * l2[0][0] + b2 * l2[0][1];
  129215. det = a1 * b2 - a2*b1;
  129216. if (!scalar_eq(det, 0, precision)) { // lines are not parallel
  129217. i[0] = (b2 * c1 - b1 * c2) / det;
  129218. i[1] = (a1 * c2 - a2 * c1) / det;
  129219. }
  129220. return i;
  129221. }
  129222. /**
  129223. * Checks if two line segments intersects.
  129224. * @method segmentsIntersect
  129225. * @param {Array} p1 The start vertex of the first line segment.
  129226. * @param {Array} p2 The end vertex of the first line segment.
  129227. * @param {Array} q1 The start vertex of the second line segment.
  129228. * @param {Array} q2 The end vertex of the second line segment.
  129229. * @return {Boolean} True if the two line segments intersect
  129230. */
  129231. function lineSegmentsIntersect(p1, p2, q1, q2){
  129232. var dx = p2[0] - p1[0];
  129233. var dy = p2[1] - p1[1];
  129234. var da = q2[0] - q1[0];
  129235. var db = q2[1] - q1[1];
  129236. // segments are parallel
  129237. if((da*dy - db*dx) === 0){
  129238. return false;
  129239. }
  129240. var s = (dx * (q1[1] - p1[1]) + dy * (p1[0] - q1[0])) / (da * dy - db * dx);
  129241. var t = (da * (p1[1] - q1[1]) + db * (q1[0] - p1[0])) / (db * dx - da * dy);
  129242. return (s>=0 && s<=1 && t>=0 && t<=1);
  129243. }
  129244. /**
  129245. * 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.
  129246. * @static
  129247. * @method area
  129248. * @param {Array} a
  129249. * @param {Array} b
  129250. * @param {Array} c
  129251. * @return {Number}
  129252. */
  129253. function triangleArea(a,b,c){
  129254. return (((b[0] - a[0])*(c[1] - a[1]))-((c[0] - a[0])*(b[1] - a[1])));
  129255. }
  129256. function isLeft(a,b,c){
  129257. return triangleArea(a,b,c) > 0;
  129258. }
  129259. function isLeftOn(a,b,c) {
  129260. return triangleArea(a, b, c) >= 0;
  129261. }
  129262. function isRight(a,b,c) {
  129263. return triangleArea(a, b, c) < 0;
  129264. }
  129265. function isRightOn(a,b,c) {
  129266. return triangleArea(a, b, c) <= 0;
  129267. }
  129268. var tmpPoint1 = [],
  129269. tmpPoint2 = [];
  129270. /**
  129271. * Check if three points are collinear
  129272. * @method collinear
  129273. * @param {Array} a
  129274. * @param {Array} b
  129275. * @param {Array} c
  129276. * @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.
  129277. * @return {Boolean}
  129278. */
  129279. function collinear(a,b,c,thresholdAngle) {
  129280. if(!thresholdAngle){
  129281. return triangleArea(a, b, c) === 0;
  129282. } else {
  129283. var ab = tmpPoint1,
  129284. bc = tmpPoint2;
  129285. ab[0] = b[0]-a[0];
  129286. ab[1] = b[1]-a[1];
  129287. bc[0] = c[0]-b[0];
  129288. bc[1] = c[1]-b[1];
  129289. var dot = ab[0]*bc[0] + ab[1]*bc[1],
  129290. magA = Math.sqrt(ab[0]*ab[0] + ab[1]*ab[1]),
  129291. magB = Math.sqrt(bc[0]*bc[0] + bc[1]*bc[1]),
  129292. angle = Math.acos(dot/(magA*magB));
  129293. return angle < thresholdAngle;
  129294. }
  129295. }
  129296. function sqdist(a,b){
  129297. var dx = b[0] - a[0];
  129298. var dy = b[1] - a[1];
  129299. return dx * dx + dy * dy;
  129300. }
  129301. /**
  129302. * Get a vertex at position i. It does not matter if i is out of bounds, this function will just cycle.
  129303. * @method at
  129304. * @param {Number} i
  129305. * @return {Array}
  129306. */
  129307. function polygonAt(polygon, i){
  129308. var s = polygon.length;
  129309. return polygon[i < 0 ? i % s + s : i % s];
  129310. }
  129311. /**
  129312. * Clear the polygon data
  129313. * @method clear
  129314. * @return {Array}
  129315. */
  129316. function polygonClear(polygon){
  129317. polygon.length = 0;
  129318. }
  129319. /**
  129320. * Append points "from" to "to"-1 from an other polygon "poly" onto this one.
  129321. * @method append
  129322. * @param {Polygon} poly The polygon to get points from.
  129323. * @param {Number} from The vertex index in "poly".
  129324. * @param {Number} to The end vertex index in "poly". Note that this vertex is NOT included when appending.
  129325. * @return {Array}
  129326. */
  129327. function polygonAppend(polygon, poly, from, to){
  129328. for(var i=from; i<to; i++){
  129329. polygon.push(poly[i]);
  129330. }
  129331. }
  129332. /**
  129333. * Make sure that the polygon vertices are ordered counter-clockwise.
  129334. * @method makeCCW
  129335. */
  129336. function polygonMakeCCW(polygon){
  129337. var br = 0,
  129338. v = polygon;
  129339. // find bottom right point
  129340. for (var i = 1; i < polygon.length; ++i) {
  129341. if (v[i][1] < v[br][1] || (v[i][1] === v[br][1] && v[i][0] > v[br][0])) {
  129342. br = i;
  129343. }
  129344. }
  129345. // reverse poly if clockwise
  129346. if (!isLeft(polygonAt(polygon, br - 1), polygonAt(polygon, br), polygonAt(polygon, br + 1))) {
  129347. polygonReverse(polygon);
  129348. }
  129349. }
  129350. /**
  129351. * Reverse the vertices in the polygon
  129352. * @method reverse
  129353. */
  129354. function polygonReverse(polygon){
  129355. var tmp = [];
  129356. var N = polygon.length;
  129357. for(var i=0; i!==N; i++){
  129358. tmp.push(polygon.pop());
  129359. }
  129360. for(var i=0; i!==N; i++){
  129361. polygon[i] = tmp[i];
  129362. }
  129363. }
  129364. /**
  129365. * Check if a point in the polygon is a reflex point
  129366. * @method isReflex
  129367. * @param {Number} i
  129368. * @return {Boolean}
  129369. */
  129370. function polygonIsReflex(polygon, i){
  129371. return isRight(polygonAt(polygon, i - 1), polygonAt(polygon, i), polygonAt(polygon, i + 1));
  129372. }
  129373. var tmpLine1=[],
  129374. tmpLine2=[];
  129375. /**
  129376. * Check if two vertices in the polygon can see each other
  129377. * @method canSee
  129378. * @param {Number} a Vertex index 1
  129379. * @param {Number} b Vertex index 2
  129380. * @return {Boolean}
  129381. */
  129382. function polygonCanSee(polygon, a,b) {
  129383. var p, dist, l1=tmpLine1, l2=tmpLine2;
  129384. if (isLeftOn(polygonAt(polygon, a + 1), polygonAt(polygon, a), polygonAt(polygon, b)) && isRightOn(polygonAt(polygon, a - 1), polygonAt(polygon, a), polygonAt(polygon, b))) {
  129385. return false;
  129386. }
  129387. dist = sqdist(polygonAt(polygon, a), polygonAt(polygon, b));
  129388. for (var i = 0; i !== polygon.length; ++i) { // for each edge
  129389. if ((i + 1) % polygon.length === a || i === a){ // ignore incident edges
  129390. continue;
  129391. }
  129392. 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
  129393. l1[0] = polygonAt(polygon, a);
  129394. l1[1] = polygonAt(polygon, b);
  129395. l2[0] = polygonAt(polygon, i);
  129396. l2[1] = polygonAt(polygon, i + 1);
  129397. p = lineInt(l1,l2);
  129398. if (sqdist(polygonAt(polygon, a), p) < dist) { // if edge is blocking visibility to b
  129399. return false;
  129400. }
  129401. }
  129402. }
  129403. return true;
  129404. }
  129405. /**
  129406. * Copy the polygon from vertex i to vertex j.
  129407. * @method copy
  129408. * @param {Number} i
  129409. * @param {Number} j
  129410. * @param {Polygon} [targetPoly] Optional target polygon to save in.
  129411. * @return {Polygon} The resulting copy.
  129412. */
  129413. function polygonCopy(polygon, i,j,targetPoly){
  129414. var p = targetPoly || [];
  129415. polygonClear(p);
  129416. if (i < j) {
  129417. // Insert all vertices from i to j
  129418. for(var k=i; k<=j; k++){
  129419. p.push(polygon[k]);
  129420. }
  129421. } else {
  129422. // Insert vertices 0 to j
  129423. for(var k=0; k<=j; k++){
  129424. p.push(polygon[k]);
  129425. }
  129426. // Insert vertices i to end
  129427. for(var k=i; k<polygon.length; k++){
  129428. p.push(polygon[k]);
  129429. }
  129430. }
  129431. return p;
  129432. }
  129433. /**
  129434. * Decomposes the polygon into convex pieces. Returns a list of edges [[p1,p2],[p2,p3],...] that cuts the polygon.
  129435. * Note that this algorithm has complexity O(N^4) and will be very slow for polygons with many vertices.
  129436. * @method getCutEdges
  129437. * @return {Array}
  129438. */
  129439. function polygonGetCutEdges(polygon) {
  129440. var min=[], tmp1=[], tmp2=[], tmpPoly = [];
  129441. var nDiags = Number.MAX_VALUE;
  129442. for (var i = 0; i < polygon.length; ++i) {
  129443. if (polygonIsReflex(polygon, i)) {
  129444. for (var j = 0; j < polygon.length; ++j) {
  129445. if (polygonCanSee(polygon, i, j)) {
  129446. tmp1 = polygonGetCutEdges(polygonCopy(polygon, i, j, tmpPoly));
  129447. tmp2 = polygonGetCutEdges(polygonCopy(polygon, j, i, tmpPoly));
  129448. for(var k=0; k<tmp2.length; k++){
  129449. tmp1.push(tmp2[k]);
  129450. }
  129451. if (tmp1.length < nDiags) {
  129452. min = tmp1;
  129453. nDiags = tmp1.length;
  129454. min.push([polygonAt(polygon, i), polygonAt(polygon, j)]);
  129455. }
  129456. }
  129457. }
  129458. }
  129459. }
  129460. return min;
  129461. }
  129462. /**
  129463. * Decomposes the polygon into one or more convex sub-Polygons.
  129464. * @method decomp
  129465. * @return {Array} An array or Polygon objects.
  129466. */
  129467. function polygonDecomp(polygon){
  129468. var edges = polygonGetCutEdges(polygon);
  129469. if(edges.length > 0){
  129470. return polygonSlice(polygon, edges);
  129471. } else {
  129472. return [polygon];
  129473. }
  129474. }
  129475. /**
  129476. * 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.
  129477. * @method slice
  129478. * @param {Array} cutEdges A list of edges, as returned by .getCutEdges()
  129479. * @return {Array}
  129480. */
  129481. function polygonSlice(polygon, cutEdges){
  129482. if(cutEdges.length === 0){
  129483. return [polygon];
  129484. }
  129485. if(cutEdges instanceof Array && cutEdges.length && cutEdges[0] instanceof Array && cutEdges[0].length===2 && cutEdges[0][0] instanceof Array){
  129486. var polys = [polygon];
  129487. for(var i=0; i<cutEdges.length; i++){
  129488. var cutEdge = cutEdges[i];
  129489. // Cut all polys
  129490. for(var j=0; j<polys.length; j++){
  129491. var poly = polys[j];
  129492. var result = polygonSlice(poly, cutEdge);
  129493. if(result){
  129494. // Found poly! Cut and quit
  129495. polys.splice(j,1);
  129496. polys.push(result[0],result[1]);
  129497. break;
  129498. }
  129499. }
  129500. }
  129501. return polys;
  129502. } else {
  129503. // Was given one edge
  129504. var cutEdge = cutEdges;
  129505. var i = polygon.indexOf(cutEdge[0]);
  129506. var j = polygon.indexOf(cutEdge[1]);
  129507. if(i !== -1 && j !== -1){
  129508. return [polygonCopy(polygon, i,j),
  129509. polygonCopy(polygon, j,i)];
  129510. } else {
  129511. return false;
  129512. }
  129513. }
  129514. }
  129515. /**
  129516. * Checks that the line segments of this polygon do not intersect each other.
  129517. * @method isSimple
  129518. * @param {Array} path An array of vertices e.g. [[0,0],[0,1],...]
  129519. * @return {Boolean}
  129520. * @todo Should it check all segments with all others?
  129521. */
  129522. function polygonIsSimple(polygon){
  129523. var path = polygon, i;
  129524. // Check
  129525. for(i=0; i<path.length-1; i++){
  129526. for(var j=0; j<i-1; j++){
  129527. if(lineSegmentsIntersect(path[i], path[i+1], path[j], path[j+1] )){
  129528. return false;
  129529. }
  129530. }
  129531. }
  129532. // Check the segment between the last and the first point to all others
  129533. for(i=1; i<path.length-2; i++){
  129534. if(lineSegmentsIntersect(path[0], path[path.length-1], path[i], path[i+1] )){
  129535. return false;
  129536. }
  129537. }
  129538. return true;
  129539. }
  129540. function getIntersectionPoint(p1, p2, q1, q2, delta){
  129541. delta = delta || 0;
  129542. var a1 = p2[1] - p1[1];
  129543. var b1 = p1[0] - p2[0];
  129544. var c1 = (a1 * p1[0]) + (b1 * p1[1]);
  129545. var a2 = q2[1] - q1[1];
  129546. var b2 = q1[0] - q2[0];
  129547. var c2 = (a2 * q1[0]) + (b2 * q1[1]);
  129548. var det = (a1 * b2) - (a2 * b1);
  129549. if(!scalar_eq(det,0,delta)){
  129550. return [((b2 * c1) - (b1 * c2)) / det, ((a1 * c2) - (a2 * c1)) / det];
  129551. } else {
  129552. return [0,0];
  129553. }
  129554. }
  129555. /**
  129556. * Quickly decompose the Polygon into convex sub-polygons.
  129557. * @method quickDecomp
  129558. * @param {Array} result
  129559. * @param {Array} [reflexVertices]
  129560. * @param {Array} [steinerPoints]
  129561. * @param {Number} [delta]
  129562. * @param {Number} [maxlevel]
  129563. * @param {Number} [level]
  129564. * @return {Array}
  129565. */
  129566. function polygonQuickDecomp(polygon, result,reflexVertices,steinerPoints,delta,maxlevel,level){
  129567. maxlevel = maxlevel || 100;
  129568. level = level || 0;
  129569. delta = delta || 25;
  129570. result = typeof(result)!=="undefined" ? result : [];
  129571. reflexVertices = reflexVertices || [];
  129572. steinerPoints = steinerPoints || [];
  129573. var upperInt=[0,0], lowerInt=[0,0], p=[0,0]; // Points
  129574. var upperDist=0, lowerDist=0, d=0, closestDist=0; // scalars
  129575. var upperIndex=0, lowerIndex=0, closestIndex=0; // Integers
  129576. var lowerPoly=[], upperPoly=[]; // polygons
  129577. var poly = polygon,
  129578. v = polygon;
  129579. if(v.length < 3){
  129580. return result;
  129581. }
  129582. level++;
  129583. if(level > maxlevel){
  129584. console.warn("quickDecomp: max level ("+maxlevel+") reached.");
  129585. return result;
  129586. }
  129587. for (var i = 0; i < polygon.length; ++i) {
  129588. if (polygonIsReflex(poly, i)) {
  129589. reflexVertices.push(poly[i]);
  129590. upperDist = lowerDist = Number.MAX_VALUE;
  129591. for (var j = 0; j < polygon.length; ++j) {
  129592. 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
  129593. p = getIntersectionPoint(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j), polygonAt(poly, j - 1)); // find the point of intersection
  129594. if (isRight(polygonAt(poly, i + 1), polygonAt(poly, i), p)) { // make sure it's inside the poly
  129595. d = sqdist(poly[i], p);
  129596. if (d < lowerDist) { // keep only the closest intersection
  129597. lowerDist = d;
  129598. lowerInt = p;
  129599. lowerIndex = j;
  129600. }
  129601. }
  129602. }
  129603. if (isLeft(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j + 1)) && isRightOn(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j))) {
  129604. p = getIntersectionPoint(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j), polygonAt(poly, j + 1));
  129605. if (isLeft(polygonAt(poly, i - 1), polygonAt(poly, i), p)) {
  129606. d = sqdist(poly[i], p);
  129607. if (d < upperDist) {
  129608. upperDist = d;
  129609. upperInt = p;
  129610. upperIndex = j;
  129611. }
  129612. }
  129613. }
  129614. }
  129615. // if there are no vertices to connect to, choose a point in the middle
  129616. if (lowerIndex === (upperIndex + 1) % polygon.length) {
  129617. //console.log("Case 1: Vertex("+i+"), lowerIndex("+lowerIndex+"), upperIndex("+upperIndex+"), poly.size("+polygon.length+")");
  129618. p[0] = (lowerInt[0] + upperInt[0]) / 2;
  129619. p[1] = (lowerInt[1] + upperInt[1]) / 2;
  129620. steinerPoints.push(p);
  129621. if (i < upperIndex) {
  129622. //lowerPoly.insert(lowerPoly.end(), poly.begin() + i, poly.begin() + upperIndex + 1);
  129623. polygonAppend(lowerPoly, poly, i, upperIndex+1);
  129624. lowerPoly.push(p);
  129625. upperPoly.push(p);
  129626. if (lowerIndex !== 0){
  129627. //upperPoly.insert(upperPoly.end(), poly.begin() + lowerIndex, poly.end());
  129628. polygonAppend(upperPoly, poly,lowerIndex,poly.length);
  129629. }
  129630. //upperPoly.insert(upperPoly.end(), poly.begin(), poly.begin() + i + 1);
  129631. polygonAppend(upperPoly, poly,0,i+1);
  129632. } else {
  129633. if (i !== 0){
  129634. //lowerPoly.insert(lowerPoly.end(), poly.begin() + i, poly.end());
  129635. polygonAppend(lowerPoly, poly,i,poly.length);
  129636. }
  129637. //lowerPoly.insert(lowerPoly.end(), poly.begin(), poly.begin() + upperIndex + 1);
  129638. polygonAppend(lowerPoly, poly,0,upperIndex+1);
  129639. lowerPoly.push(p);
  129640. upperPoly.push(p);
  129641. //upperPoly.insert(upperPoly.end(), poly.begin() + lowerIndex, poly.begin() + i + 1);
  129642. polygonAppend(upperPoly, poly,lowerIndex,i+1);
  129643. }
  129644. } else {
  129645. // connect to the closest point within the triangle
  129646. //console.log("Case 2: Vertex("+i+"), closestIndex("+closestIndex+"), poly.size("+polygon.length+")\n");
  129647. if (lowerIndex > upperIndex) {
  129648. upperIndex += polygon.length;
  129649. }
  129650. closestDist = Number.MAX_VALUE;
  129651. if(upperIndex < lowerIndex){
  129652. return result;
  129653. }
  129654. for (var j = lowerIndex; j <= upperIndex; ++j) {
  129655. if (isLeftOn(polygonAt(poly, i - 1), polygonAt(poly, i), polygonAt(poly, j)) && isRightOn(polygonAt(poly, i + 1), polygonAt(poly, i), polygonAt(poly, j))) {
  129656. d = sqdist(polygonAt(poly, i), polygonAt(poly, j));
  129657. if (d < closestDist) {
  129658. closestDist = d;
  129659. closestIndex = j % polygon.length;
  129660. }
  129661. }
  129662. }
  129663. if (i < closestIndex) {
  129664. polygonAppend(lowerPoly, poly,i,closestIndex+1);
  129665. if (closestIndex !== 0){
  129666. polygonAppend(upperPoly, poly,closestIndex,v.length);
  129667. }
  129668. polygonAppend(upperPoly, poly,0,i+1);
  129669. } else {
  129670. if (i !== 0){
  129671. polygonAppend(lowerPoly, poly,i,v.length);
  129672. }
  129673. polygonAppend(lowerPoly, poly,0,closestIndex+1);
  129674. polygonAppend(upperPoly, poly,closestIndex,i+1);
  129675. }
  129676. }
  129677. // solve smallest poly first
  129678. if (lowerPoly.length < upperPoly.length) {
  129679. polygonQuickDecomp(lowerPoly,result,reflexVertices,steinerPoints,delta,maxlevel,level);
  129680. polygonQuickDecomp(upperPoly,result,reflexVertices,steinerPoints,delta,maxlevel,level);
  129681. } else {
  129682. polygonQuickDecomp(upperPoly,result,reflexVertices,steinerPoints,delta,maxlevel,level);
  129683. polygonQuickDecomp(lowerPoly,result,reflexVertices,steinerPoints,delta,maxlevel,level);
  129684. }
  129685. return result;
  129686. }
  129687. }
  129688. result.push(polygon);
  129689. return result;
  129690. }
  129691. /**
  129692. * Remove collinear points in the polygon.
  129693. * @method removeCollinearPoints
  129694. * @param {Number} [precision] The threshold angle to use when determining whether two edges are collinear. Use zero for finest precision.
  129695. * @return {Number} The number of points removed
  129696. */
  129697. function polygonRemoveCollinearPoints(polygon, precision){
  129698. var num = 0;
  129699. for(var i=polygon.length-1; polygon.length>3 && i>=0; --i){
  129700. if(collinear(polygonAt(polygon, i-1),polygonAt(polygon, i),polygonAt(polygon, i+1),precision)){
  129701. // Remove the middle point
  129702. polygon.splice(i%polygon.length,1);
  129703. num++;
  129704. }
  129705. }
  129706. return num;
  129707. }
  129708. /**
  129709. * Check if two scalars are equal
  129710. * @static
  129711. * @method eq
  129712. * @param {Number} a
  129713. * @param {Number} b
  129714. * @param {Number} [precision]
  129715. * @return {Boolean}
  129716. */
  129717. function scalar_eq(a,b,precision){
  129718. precision = precision || 0;
  129719. return Math.abs(a-b) < precision;
  129720. }
  129721. /***/ }),
  129722. /* 1022 */
  129723. /***/ (function(module, exports, __webpack_require__) {
  129724. /**
  129725. * @author Richard Davey <rich@photonstorm.com>
  129726. * @copyright 2018 Photon Storm Ltd.
  129727. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  129728. */
  129729. var Bodies = __webpack_require__(171);
  129730. var Class = __webpack_require__(0);
  129731. var Composites = __webpack_require__(1020);
  129732. var Constraint = __webpack_require__(305);
  129733. var MatterGameObject = __webpack_require__(1052);
  129734. var MatterImage = __webpack_require__(1019);
  129735. var MatterSprite = __webpack_require__(1018);
  129736. var MatterTileBody = __webpack_require__(684);
  129737. var PointerConstraint = __webpack_require__(1038);
  129738. /**
  129739. * @classdesc
  129740. * [description]
  129741. *
  129742. * @class Factory
  129743. * @memberOf Phaser.Physics.Matter
  129744. * @constructor
  129745. * @since 3.0.0
  129746. *
  129747. * @param {Phaser.Physics.Matter.World} world - [description]
  129748. */
  129749. var Factory = new Class({
  129750. initialize:
  129751. function Factory (world)
  129752. {
  129753. /**
  129754. * [description]
  129755. *
  129756. * @name Phaser.Physics.Matter.Factory#world
  129757. * @type {Phaser.Physics.Matter.World}
  129758. * @since 3.0.0
  129759. */
  129760. this.world = world;
  129761. /**
  129762. * [description]
  129763. *
  129764. * @name Phaser.Physics.Matter.Factory#scene
  129765. * @type {Phaser.Scene}
  129766. * @since 3.0.0
  129767. */
  129768. this.scene = world.scene;
  129769. /**
  129770. * A reference to the Scene.Systems this Matter Physics instance belongs to.
  129771. *
  129772. * @name Phaser.Physics.Matter.Factory#sys
  129773. * @type {Phaser.Scenes.Systems}
  129774. * @since 3.0.0
  129775. */
  129776. this.sys = world.scene.sys;
  129777. },
  129778. /**
  129779. * [description]
  129780. *
  129781. * @method Phaser.Physics.Matter.Factory#rectangle
  129782. * @since 3.0.0
  129783. *
  129784. * @param {number} x - [description]
  129785. * @param {number} y - [description]
  129786. * @param {number} width - [description]
  129787. * @param {number} height - [description]
  129788. * @param {object} options - [description]
  129789. *
  129790. * @return {MatterJS.Body} A Matter JS Body.
  129791. */
  129792. rectangle: function (x, y, width, height, options)
  129793. {
  129794. var body = Bodies.rectangle(x, y, width, height, options);
  129795. this.world.add(body);
  129796. return body;
  129797. },
  129798. /**
  129799. * [description]
  129800. *
  129801. * @method Phaser.Physics.Matter.Factory#trapezoid
  129802. * @since 3.0.0
  129803. *
  129804. * @param {number} x - [description]
  129805. * @param {number} y - [description]
  129806. * @param {number} width - [description]
  129807. * @param {number} height - [description]
  129808. * @param {number} slope - [description]
  129809. * @param {object} options - [description]
  129810. *
  129811. * @return {MatterJS.Body} A Matter JS Body.
  129812. */
  129813. trapezoid: function (x, y, width, height, slope, options)
  129814. {
  129815. var body = Bodies.trapezoid(x, y, width, height, slope, options);
  129816. this.world.add(body);
  129817. return body;
  129818. },
  129819. /**
  129820. * [description]
  129821. *
  129822. * @method Phaser.Physics.Matter.Factory#circle
  129823. * @since 3.0.0
  129824. *
  129825. * @param {number} x - [description]
  129826. * @param {number} y - [description]
  129827. * @param {number} radius - [description]
  129828. * @param {object} options - [description]
  129829. * @param {number} maxSides - [description]
  129830. *
  129831. * @return {MatterJS.Body} A Matter JS Body.
  129832. */
  129833. circle: function (x, y, radius, options, maxSides)
  129834. {
  129835. var body = Bodies.circle(x, y, radius, options, maxSides);
  129836. this.world.add(body);
  129837. return body;
  129838. },
  129839. /**
  129840. * [description]
  129841. *
  129842. * @method Phaser.Physics.Matter.Factory#polygon
  129843. * @since 3.0.0
  129844. *
  129845. * @param {number} x - [description]
  129846. * @param {number} y - [description]
  129847. * @param {number} sides - [description]
  129848. * @param {number} radius - [description]
  129849. * @param {object} options - [description]
  129850. *
  129851. * @return {MatterJS.Body} A Matter JS Body.
  129852. */
  129853. polygon: function (x, y, sides, radius, options)
  129854. {
  129855. var body = Bodies.polygon(x, y, sides, radius, options);
  129856. this.world.add(body);
  129857. return body;
  129858. },
  129859. /**
  129860. * [description]
  129861. *
  129862. * @method Phaser.Physics.Matter.Factory#fromVertices
  129863. * @since 3.0.0
  129864. *
  129865. * @param {number} x - [description]
  129866. * @param {number} y - [description]
  129867. * @param {array} vertexSets - [description]
  129868. * @param {object} options - [description]
  129869. * @param {boolean} flagInternal - [description]
  129870. * @param {boolean} removeCollinear - [description]
  129871. * @param {number} minimumArea - [description]
  129872. *
  129873. * @return {MatterJS.Body} A Matter JS Body.
  129874. */
  129875. fromVertices: function (x, y, vertexSets, options, flagInternal, removeCollinear, minimumArea)
  129876. {
  129877. var body = Bodies.fromVertices(x, y, vertexSets, options, flagInternal, removeCollinear, minimumArea);
  129878. this.world.add(body);
  129879. return body;
  129880. },
  129881. /**
  129882. * Create a new composite containing Matter Image objects created in a grid arrangement.
  129883. * This function uses the body bounds to prevent overlaps.
  129884. *
  129885. * @method Phaser.Physics.Matter.Factory#imageStack
  129886. * @since 3.0.0
  129887. *
  129888. * @param {string} key - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  129889. * @param {(string|integer)} frame - An optional frame from the Texture this Game Object is rendering with. Set to `null` to skip this value.
  129890. * @param {number} x - The horizontal position of this composite in the world.
  129891. * @param {number} y - The vertical position of this composite in the world.
  129892. * @param {number} columns - The number of columns in the grid.
  129893. * @param {number} rows - The number of rows in the grid.
  129894. * @param {number} [columnGap=0] - The distance between each column.
  129895. * @param {number} [rowGap=0] - The distance between each row.
  129896. * @param {object} [options] - [description]
  129897. *
  129898. * @return {MatterJS.Composite} A Matter JS Composite Stack.
  129899. */
  129900. imageStack: function (key, frame, x, y, columns, rows, columnGap, rowGap, options)
  129901. {
  129902. if (columnGap === undefined) { columnGap = 0; }
  129903. if (rowGap === undefined) { rowGap = 0; }
  129904. if (options === undefined) { options = {}; }
  129905. var world = this.world;
  129906. var displayList = this.sys.displayList;
  129907. options.addToWorld = false;
  129908. var stack = Composites.stack(x, y, columns, rows, columnGap, rowGap, function (x, y)
  129909. {
  129910. var image = new MatterImage(world, x, y, key, frame, options);
  129911. displayList.add(image);
  129912. return image.body;
  129913. });
  129914. world.add(stack);
  129915. return stack;
  129916. },
  129917. /**
  129918. * Create a new composite containing bodies created in the callback in a grid arrangement.
  129919. * This function uses the body bounds to prevent overlaps.
  129920. *
  129921. * @method Phaser.Physics.Matter.Factory#stack
  129922. * @since 3.0.0
  129923. *
  129924. * @param {number} x - The horizontal position of this composite in the world.
  129925. * @param {number} y - The vertical position of this composite in the world.
  129926. * @param {number} columns - The number of columns in the grid.
  129927. * @param {number} rows - The number of rows in the grid.
  129928. * @param {number} columnGap - The distance between each column.
  129929. * @param {number} rowGap - The distance between each row.
  129930. * @param {function} callback - The callback that creates the stack.
  129931. *
  129932. * @return {MatterJS.Composite} A new composite containing objects created in the callback.
  129933. */
  129934. stack: function (x, y, columns, rows, columnGap, rowGap, callback)
  129935. {
  129936. var stack = Composites.stack(x, y, columns, rows, columnGap, rowGap, callback);
  129937. this.world.add(stack);
  129938. return stack;
  129939. },
  129940. /**
  129941. * Create a new composite containing bodies created in the callback in a pyramid arrangement.
  129942. * This function uses the body bounds to prevent overlaps.
  129943. *
  129944. * @method Phaser.Physics.Matter.Factory#pyramid
  129945. * @since 3.0.0
  129946. *
  129947. * @param {number} x - The horizontal position of this composite in the world.
  129948. * @param {number} y - The vertical position of this composite in the world.
  129949. * @param {number} columns - The number of columns in the pyramid.
  129950. * @param {number} rows - The number of rows in the pyramid.
  129951. * @param {number} columnGap - The distance between each column.
  129952. * @param {number} rowGap - The distance between each row.
  129953. * @param {function} callback - [description]
  129954. *
  129955. * @return {MatterJS.Composite} A Matter JS Composite pyramid.
  129956. */
  129957. pyramid: function (x, y, columns, rows, columnGap, rowGap, callback)
  129958. {
  129959. var stack = Composites.pyramid(x, y, columns, rows, columnGap, rowGap, callback);
  129960. this.world.add(stack);
  129961. return stack;
  129962. },
  129963. /**
  129964. * Chains all bodies in the given composite together using constraints.
  129965. *
  129966. * @method Phaser.Physics.Matter.Factory#chain
  129967. * @since 3.0.0
  129968. *
  129969. * @param {MatterJS.Composite} composite - [description]
  129970. * @param {number} xOffsetA - [description]
  129971. * @param {number} yOffsetA - [description]
  129972. * @param {number} xOffsetB - [description]
  129973. * @param {number} yOffsetB - [description]
  129974. * @param {object} options - [description]
  129975. *
  129976. * @return {MatterJS.Composite} A new composite containing objects chained together with constraints.
  129977. */
  129978. chain: function (composite, xOffsetA, yOffsetA, xOffsetB, yOffsetB, options)
  129979. {
  129980. return Composites.chain(composite, xOffsetA, yOffsetA, xOffsetB, yOffsetB, options);
  129981. },
  129982. /**
  129983. * Connects bodies in the composite with constraints in a grid pattern, with optional cross braces.
  129984. *
  129985. * @method Phaser.Physics.Matter.Factory#mesh
  129986. * @since 3.0.0
  129987. *
  129988. * @param {MatterJS.Composite} composite - [description]
  129989. * @param {number} columns - [description]
  129990. * @param {number} rows - [description]
  129991. * @param {boolean} crossBrace - [description]
  129992. * @param {object} options - [description]
  129993. *
  129994. * @return {MatterJS.Composite} The composite containing objects meshed together with constraints.
  129995. */
  129996. mesh: function (composite, columns, rows, crossBrace, options)
  129997. {
  129998. return Composites.mesh(composite, columns, rows, crossBrace, options);
  129999. },
  130000. /**
  130001. * Creates a composite with a Newton's Cradle setup of bodies and constraints.
  130002. *
  130003. * @method Phaser.Physics.Matter.Factory#newtonsCradle
  130004. * @since 3.0.0
  130005. *
  130006. * @param {number} x - [description]
  130007. * @param {number} y - [description]
  130008. * @param {number} number - [description]
  130009. * @param {number} size - [description]
  130010. * @param {number} length - [description]
  130011. *
  130012. * @return {MatterJS.Composite} A new composite newtonsCradle body.
  130013. */
  130014. newtonsCradle: function (x, y, number, size, length)
  130015. {
  130016. var composite = Composites.newtonsCradle(x, y, number, size, length);
  130017. this.world.add(composite);
  130018. return composite;
  130019. },
  130020. /**
  130021. * Creates a composite with simple car setup of bodies and constraints.
  130022. *
  130023. * @method Phaser.Physics.Matter.Factory#car
  130024. * @since 3.0.0
  130025. *
  130026. * @param {number} x - [description]
  130027. * @param {number} y - [description]
  130028. * @param {number} width - [description]
  130029. * @param {number} height - [description]
  130030. * @param {number} wheelSize - [description]
  130031. *
  130032. * @return {MatterJS.Composite} A new composite car body.
  130033. */
  130034. car: function (x, y, width, height, wheelSize)
  130035. {
  130036. var composite = Composites.car(x, y, width, height, wheelSize);
  130037. this.world.add(composite);
  130038. return composite;
  130039. },
  130040. /**
  130041. * Creates a simple soft body like object.
  130042. *
  130043. * @method Phaser.Physics.Matter.Factory#softBody
  130044. * @since 3.0.0
  130045. *
  130046. * @param {number} x - The horizontal position of this composite in the world.
  130047. * @param {number} y - The vertical position of this composite in the world.
  130048. * @param {number} columns - The number of columns in the Composite.
  130049. * @param {number} rows - The number of rows in the Composite.
  130050. * @param {number} columnGap - The distance between each column.
  130051. * @param {number} rowGap - The distance between each row.
  130052. * @param {boolean} crossBrace - [description]
  130053. * @param {number} particleRadius - [description]
  130054. * @param {object} particleOptions - [description]
  130055. * @param {object} constraintOptions - [description]
  130056. *
  130057. * @return {MatterJS.Composite} A new composite simple soft body.
  130058. */
  130059. softBody: function (x, y, columns, rows, columnGap, rowGap, crossBrace, particleRadius, particleOptions, constraintOptions)
  130060. {
  130061. var composite = Composites.softBody(x, y, columns, rows, columnGap, rowGap, crossBrace, particleRadius, particleOptions, constraintOptions);
  130062. this.world.add(composite);
  130063. return composite;
  130064. },
  130065. /**
  130066. * [description]
  130067. *
  130068. * @method Phaser.Physics.Matter.Factory#joint
  130069. * @since 3.0.0
  130070. *
  130071. * @param {MatterJS.Body} bodyA - [description]
  130072. * @param {MatterJS.Body} bodyB - [description]
  130073. * @param {number} length - [description]
  130074. * @param {number} [stiffness=1] - [description]
  130075. * @param {object} [options={}] - [description]
  130076. *
  130077. * @return {MatterJS.Constraint} A Matter JS Constraint.
  130078. */
  130079. joint: function (bodyA, bodyB, length, stiffness, options)
  130080. {
  130081. return this.constraint(bodyA, bodyB, length, stiffness, options);
  130082. },
  130083. /**
  130084. * [description]
  130085. *
  130086. * @method Phaser.Physics.Matter.Factory#spring
  130087. * @since 3.0.0
  130088. *
  130089. * @param {MatterJS.Body} bodyA - [description]
  130090. * @param {MatterJS.Body} bodyB - [description]
  130091. * @param {number} length - [description]
  130092. * @param {number} [stiffness=1] - [description]
  130093. * @param {object} [options={}] - [description]
  130094. *
  130095. * @return {MatterJS.Constraint} A Matter JS Constraint.
  130096. */
  130097. spring: function (bodyA, bodyB, length, stiffness, options)
  130098. {
  130099. return this.constraint(bodyA, bodyB, length, stiffness, options);
  130100. },
  130101. /**
  130102. * [description]
  130103. *
  130104. * @method Phaser.Physics.Matter.Factory#constraint
  130105. * @since 3.0.0
  130106. *
  130107. * @param {MatterJS.Body} bodyA - [description]
  130108. * @param {MatterJS.Body} bodyB - [description]
  130109. * @param {number} length - [description]
  130110. * @param {number} [stiffness=1] - [description]
  130111. * @param {object} [options={}] - [description]
  130112. *
  130113. * @return {MatterJS.Constraint} A Matter JS Constraint.
  130114. */
  130115. constraint: function (bodyA, bodyB, length, stiffness, options)
  130116. {
  130117. if (stiffness === undefined) { stiffness = 1; }
  130118. if (options === undefined) { options = {}; }
  130119. options.bodyA = (bodyA.type === 'body') ? bodyA : bodyA.body;
  130120. options.bodyB = (bodyB.type === 'body') ? bodyB : bodyB.body;
  130121. options.length = length;
  130122. options.stiffness = stiffness;
  130123. var constraint = Constraint.create(options);
  130124. this.world.add(constraint);
  130125. return constraint;
  130126. },
  130127. /**
  130128. * [description]
  130129. *
  130130. * @method Phaser.Physics.Matter.Factory#worldConstraint
  130131. * @since 3.0.0
  130132. *
  130133. * @param {MatterJS.Body} bodyB - [description]
  130134. * @param {number} length - [description]
  130135. * @param {number} [stiffness=1] - [description]
  130136. * @param {object} [options={}] - [description]
  130137. *
  130138. * @return {MatterJS.Constraint} A Matter JS Constraint.
  130139. */
  130140. worldConstraint: function (bodyB, length, stiffness, options)
  130141. {
  130142. if (stiffness === undefined) { stiffness = 1; }
  130143. if (options === undefined) { options = {}; }
  130144. options.bodyB = (bodyB.type === 'body') ? bodyB : bodyB.body;
  130145. options.length = length;
  130146. options.stiffness = stiffness;
  130147. var constraint = Constraint.create(options);
  130148. this.world.add(constraint);
  130149. return constraint;
  130150. },
  130151. /**
  130152. * [description]
  130153. *
  130154. * @method Phaser.Physics.Matter.Factory#mouseSpring
  130155. * @since 3.0.0
  130156. *
  130157. * @param {object} options - [description]
  130158. *
  130159. * @return {MatterJS.Constraint} A Matter JS Constraint.
  130160. */
  130161. mouseSpring: function (options)
  130162. {
  130163. return this.pointerConstraint(options);
  130164. },
  130165. /**
  130166. * [description]
  130167. *
  130168. * @method Phaser.Physics.Matter.Factory#pointerConstraint
  130169. * @since 3.0.0
  130170. *
  130171. * @param {object} options - [description]
  130172. *
  130173. * @return {MatterJS.Constraint} A Matter JS Constraint.
  130174. */
  130175. pointerConstraint: function (options)
  130176. {
  130177. if (options === undefined) { options = {}; }
  130178. if (!options.hasOwnProperty('render'))
  130179. {
  130180. options.render = { visible: false };
  130181. }
  130182. var pointerConstraint = new PointerConstraint(this.scene, this.world, options);
  130183. this.world.add(pointerConstraint.constraint);
  130184. return pointerConstraint;
  130185. },
  130186. /**
  130187. * [description]
  130188. *
  130189. * @method Phaser.Physics.Matter.Factory#image
  130190. * @since 3.0.0
  130191. *
  130192. * @param {number} x - The horizontal position of this Game Object in the world.
  130193. * @param {number} y - The vertical position of this Game Object in the world.
  130194. * @param {string} key - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  130195. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with. Set to `null` to skip this value.
  130196. * @param {object} [options={}] - [description]
  130197. *
  130198. * @return {Phaser.Physics.Matter.Image} [description]
  130199. */
  130200. image: function (x, y, key, frame, options)
  130201. {
  130202. var image = new MatterImage(this.world, x, y, key, frame, options);
  130203. this.sys.displayList.add(image);
  130204. return image;
  130205. },
  130206. /**
  130207. * [description]
  130208. *
  130209. * @method Phaser.Physics.Matter.Factory#tileBody
  130210. * @since 3.0.0
  130211. *
  130212. * @param {Phaser.Tilemaps.Tile} tile - [description]
  130213. * @param {object} options - [description]
  130214. *
  130215. * @return {Phaser.Physics.Matter.TileBody} [description]
  130216. */
  130217. tileBody: function (tile, options)
  130218. {
  130219. var tileBody = new MatterTileBody(this.world, tile, options);
  130220. return tileBody;
  130221. },
  130222. /**
  130223. * [description]
  130224. *
  130225. * @method Phaser.Physics.Matter.Factory#sprite
  130226. * @since 3.0.0
  130227. *
  130228. * @param {number} x - The horizontal position of this Game Object in the world.
  130229. * @param {number} y - The vertical position of this Game Object in the world.
  130230. * @param {string} key - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  130231. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with. Set to `null` to skip this value.
  130232. * @param {object} [options={}] - [description]
  130233. *
  130234. * @return {Phaser.Physics.Matter.Sprite} [description]
  130235. */
  130236. sprite: function (x, y, key, frame, options)
  130237. {
  130238. var sprite = new MatterSprite(this.world, x, y, key, frame, options);
  130239. this.sys.displayList.add(sprite);
  130240. this.sys.updateList.add(sprite);
  130241. return sprite;
  130242. },
  130243. /**
  130244. * [description]
  130245. *
  130246. * @method Phaser.Physics.Matter.Factory#gameObject
  130247. * @since 3.3.0
  130248. *
  130249. * @param {Phaser.GameObjects.GameObject} gameObject - The Game Object to inject the Matter Body in to.
  130250. * @param {object} options - [description]
  130251. *
  130252. * @return {Phaser.GameObjects.GameObject} The Game Object that had the Matter Body injected into it.
  130253. */
  130254. gameObject: function (gameObject, options)
  130255. {
  130256. return MatterGameObject(this.world, gameObject, options);
  130257. },
  130258. /**
  130259. * Destroys this Factory.
  130260. *
  130261. * @method Phaser.Physics.Matter.Factory#destroy
  130262. * @since 3.5.0
  130263. */
  130264. destroy: function ()
  130265. {
  130266. this.world = null;
  130267. this.scene = null;
  130268. this.sys = null;
  130269. }
  130270. });
  130271. module.exports = Factory;
  130272. /***/ }),
  130273. /* 1023 */
  130274. /***/ (function(module, exports, __webpack_require__) {
  130275. /**
  130276. * @author Richard Davey <rich@photonstorm.com>
  130277. * @copyright 2018 Photon Storm Ltd.
  130278. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  130279. */
  130280. var Body = __webpack_require__(1029);
  130281. var Class = __webpack_require__(0);
  130282. var COLLIDES = __webpack_require__(338);
  130283. var CollisionMap = __webpack_require__(1028);
  130284. var EventEmitter = __webpack_require__(9);
  130285. var GetFastValue = __webpack_require__(1);
  130286. var HasValue = __webpack_require__(111);
  130287. var Set = __webpack_require__(69);
  130288. var Solver = __webpack_require__(1056);
  130289. var TILEMAP_FORMATS = __webpack_require__(27);
  130290. var TYPE = __webpack_require__(337);
  130291. /**
  130292. * @typedef {object} Phaser.Physics.Impact.WorldConfig
  130293. *
  130294. * @property {number} [gravity=0] - [description]
  130295. * @property {number} [cellSize=64] - [description]
  130296. * @property {number} [timeScale=1] - [description]
  130297. * @property {number} [maxStep=0.05] - [description]
  130298. * @property {boolean} [debug=false] - [description]
  130299. * @property {number} [maxVelocity=100] - [description]
  130300. * @property {boolean} [debugShowBody=true] - [description]
  130301. * @property {boolean} [debugShowVelocity=true] - [description]
  130302. * @property {number} [debugBodyColor=0xff00ff] - [description]
  130303. * @property {number} [debugVelocityColor=0x00ff00] - [description]
  130304. * @property {number} [maxVelocityX=maxVelocity] - [description]
  130305. * @property {number} [maxVelocityY=maxVelocity] - [description]
  130306. * @property {number} [minBounceVelocity=40] - [description]
  130307. * @property {number} [gravityFactor=1] - [description]
  130308. * @property {number} [bounciness=0] - [description]
  130309. * @property {(object|boolean)} [setBounds] - [description]
  130310. * @property {number} [setBounds.x=0] - [description]
  130311. * @property {number} [setBounds.y=0] - [description]
  130312. * @property {number} [setBounds.width] - [description]
  130313. * @property {number} [setBounds.height] - [description]
  130314. * @property {number} [setBounds.thickness=64] - [description]
  130315. * @property {boolean} [setBounds.left=true] - [description]
  130316. * @property {boolean} [setBounds.right=true] - [description]
  130317. * @property {boolean} [setBounds.top=true] - [description]
  130318. * @property {boolean} [setBounds.bottom=true] - [description]
  130319. */
  130320. /**
  130321. * An object containing the 4 wall bodies that bound the physics world.
  130322. *
  130323. * @typedef {object} Phaser.Physics.Impact.WorldDefaults
  130324. *
  130325. * @property {boolean} debugShowBody - [description]
  130326. * @property {boolean} debugShowVelocity - [description]
  130327. * @property {number} bodyDebugColor - [description]
  130328. * @property {number} velocityDebugColor - [description]
  130329. * @property {number} maxVelocityX - [description]
  130330. * @property {number} maxVelocityY - [description]
  130331. * @property {number} minBounceVelocity - [description]
  130332. * @property {number} gravityFactor - [description]
  130333. * @property {number} bounciness - [description]
  130334. */
  130335. /**
  130336. * @typedef {object} Phaser.Physics.Impact.WorldWalls
  130337. *
  130338. * @property {?Phaser.Physics.Impact.Body} left - [description]
  130339. * @property {?Phaser.Physics.Impact.Body} right - [description]
  130340. * @property {?Phaser.Physics.Impact.Body} top - [description]
  130341. * @property {?Phaser.Physics.Impact.Body} bottom - [description]
  130342. */
  130343. /**
  130344. * @classdesc
  130345. * [description]
  130346. *
  130347. * @class World
  130348. * @extends Phaser.Events.EventEmitter
  130349. * @memberOf Phaser.Physics.Impact
  130350. * @constructor
  130351. * @since 3.0.0
  130352. *
  130353. * @param {Phaser.Scene} scene - [description]
  130354. * @param {Phaser.Physics.Impact.WorldConfig} config - [description]
  130355. */
  130356. var World = new Class({
  130357. Extends: EventEmitter,
  130358. initialize:
  130359. function World (scene, config)
  130360. {
  130361. EventEmitter.call(this);
  130362. /**
  130363. * [description]
  130364. *
  130365. * @name Phaser.Physics.Impact.World#scene
  130366. * @type {Phaser.Scene}
  130367. * @since 3.0.0
  130368. */
  130369. this.scene = scene;
  130370. /**
  130371. * [description]
  130372. *
  130373. * @name Phaser.Physics.Impact.World#bodies
  130374. * @type {Phaser.Structs.Set.<Phaser.Physics.Impact.Body>}
  130375. * @since 3.0.0
  130376. */
  130377. this.bodies = new Set();
  130378. /**
  130379. * [description]
  130380. *
  130381. * @name Phaser.Physics.Impact.World#gravity
  130382. * @type {number}
  130383. * @default 0
  130384. * @since 3.0.0
  130385. */
  130386. this.gravity = GetFastValue(config, 'gravity', 0);
  130387. /**
  130388. * Spatial hash cell dimensions
  130389. *
  130390. * @name Phaser.Physics.Impact.World#cellSize
  130391. * @type {integer}
  130392. * @default 64
  130393. * @since 3.0.0
  130394. */
  130395. this.cellSize = GetFastValue(config, 'cellSize', 64);
  130396. /**
  130397. * [description]
  130398. *
  130399. * @name Phaser.Physics.Impact.World#collisionMap
  130400. * @type {Phaser.Physics.Impact.CollisionMap}
  130401. * @since 3.0.0
  130402. */
  130403. this.collisionMap = new CollisionMap();
  130404. /**
  130405. * [description]
  130406. *
  130407. * @name Phaser.Physics.Impact.World#timeScale
  130408. * @type {number}
  130409. * @default 1
  130410. * @since 3.0.0
  130411. */
  130412. this.timeScale = GetFastValue(config, 'timeScale', 1);
  130413. /**
  130414. * Impacts maximum time step is 20 fps.
  130415. *
  130416. * @name Phaser.Physics.Impact.World#maxStep
  130417. * @type {number}
  130418. * @default 0.05
  130419. * @since 3.0.0
  130420. */
  130421. this.maxStep = GetFastValue(config, 'maxStep', 0.05);
  130422. /**
  130423. * [description]
  130424. *
  130425. * @name Phaser.Physics.Impact.World#enabled
  130426. * @type {boolean}
  130427. * @default true
  130428. * @since 3.0.0
  130429. */
  130430. this.enabled = true;
  130431. /**
  130432. * [description]
  130433. *
  130434. * @name Phaser.Physics.Impact.World#drawDebug
  130435. * @type {boolean}
  130436. * @since 3.0.0
  130437. */
  130438. this.drawDebug = GetFastValue(config, 'debug', false);
  130439. /**
  130440. * [description]
  130441. *
  130442. * @name Phaser.Physics.Impact.World#debugGraphic
  130443. * @type {Phaser.GameObjects.Graphics}
  130444. * @since 3.0.0
  130445. */
  130446. this.debugGraphic;
  130447. var _maxVelocity = GetFastValue(config, 'maxVelocity', 100);
  130448. /**
  130449. * [description]
  130450. *
  130451. * @name Phaser.Physics.Impact.World#defaults
  130452. * @type {Phaser.Physics.Impact.WorldDefaults}
  130453. * @since 3.0.0
  130454. */
  130455. this.defaults = {
  130456. debugShowBody: GetFastValue(config, 'debugShowBody', true),
  130457. debugShowVelocity: GetFastValue(config, 'debugShowVelocity', true),
  130458. bodyDebugColor: GetFastValue(config, 'debugBodyColor', 0xff00ff),
  130459. velocityDebugColor: GetFastValue(config, 'debugVelocityColor', 0x00ff00),
  130460. maxVelocityX: GetFastValue(config, 'maxVelocityX', _maxVelocity),
  130461. maxVelocityY: GetFastValue(config, 'maxVelocityY', _maxVelocity),
  130462. minBounceVelocity: GetFastValue(config, 'minBounceVelocity', 40),
  130463. gravityFactor: GetFastValue(config, 'gravityFactor', 1),
  130464. bounciness: GetFastValue(config, 'bounciness', 0)
  130465. };
  130466. /**
  130467. * An object containing the 4 wall bodies that bound the physics world.
  130468. *
  130469. * @name Phaser.Physics.Impact.World#walls
  130470. * @type {Phaser.Physics.Impact.WorldWalls}
  130471. * @since 3.0.0
  130472. */
  130473. this.walls = { left: null, right: null, top: null, bottom: null };
  130474. /**
  130475. * [description]
  130476. *
  130477. * @name Phaser.Physics.Impact.World#delta
  130478. * @type {number}
  130479. * @default 0
  130480. * @since 3.0.0
  130481. */
  130482. this.delta = 0;
  130483. /**
  130484. * [description]
  130485. *
  130486. * @name Phaser.Physics.Impact.World#_lastId
  130487. * @type {number}
  130488. * @private
  130489. * @default 0
  130490. * @since 3.0.0
  130491. */
  130492. this._lastId = 0;
  130493. if (GetFastValue(config, 'setBounds', false))
  130494. {
  130495. var boundsConfig = config['setBounds'];
  130496. if (typeof boundsConfig === 'boolean')
  130497. {
  130498. this.setBounds();
  130499. }
  130500. else
  130501. {
  130502. var x = GetFastValue(boundsConfig, 'x', 0);
  130503. var y = GetFastValue(boundsConfig, 'y', 0);
  130504. var width = GetFastValue(boundsConfig, 'width', scene.sys.game.config.width);
  130505. var height = GetFastValue(boundsConfig, 'height', scene.sys.game.config.height);
  130506. var thickness = GetFastValue(boundsConfig, 'thickness', 64);
  130507. var left = GetFastValue(boundsConfig, 'left', true);
  130508. var right = GetFastValue(boundsConfig, 'right', true);
  130509. var top = GetFastValue(boundsConfig, 'top', true);
  130510. var bottom = GetFastValue(boundsConfig, 'bottom', true);
  130511. this.setBounds(x, y, width, height, thickness, left, right, top, bottom);
  130512. }
  130513. }
  130514. if (this.drawDebug)
  130515. {
  130516. this.createDebugGraphic();
  130517. }
  130518. },
  130519. /**
  130520. * Sets the collision map for the world either from a Weltmeister JSON level in the cache or from
  130521. * a 2D array. If loading from a Weltmeister level, the map must have a layer called "collision".
  130522. *
  130523. * @method Phaser.Physics.Impact.World#setCollisionMap
  130524. * @since 3.0.0
  130525. *
  130526. * @param {(string|integer[][])} key - Either a string key that corresponds to a Weltmeister level
  130527. * in the cache, or a 2D array of collision IDs.
  130528. * @param {integer} tileSize - The size of a tile. This is optional if loading from a Weltmeister
  130529. * level in the cache.
  130530. *
  130531. * @return {?Phaser.Physics.Impact.CollisionMap} The newly created CollisionMap, or null if the method failed to
  130532. * create the CollisionMap.
  130533. */
  130534. setCollisionMap: function (key, tileSize)
  130535. {
  130536. if (typeof key === 'string')
  130537. {
  130538. var tilemapData = this.scene.cache.tilemap.get(key);
  130539. if (!tilemapData || tilemapData.format !== TILEMAP_FORMATS.WELTMEISTER)
  130540. {
  130541. console.warn('The specified key does not correspond to a Weltmeister tilemap: ' + key);
  130542. return null;
  130543. }
  130544. var layers = tilemapData.data.layer;
  130545. var collisionLayer;
  130546. for (var i = 0; i < layers.length; i++)
  130547. {
  130548. if (layers[i].name === 'collision')
  130549. {
  130550. collisionLayer = layers[i];
  130551. break;
  130552. }
  130553. }
  130554. if (tileSize === undefined) { tileSize = collisionLayer.tilesize; }
  130555. this.collisionMap = new CollisionMap(tileSize, collisionLayer.data);
  130556. }
  130557. else if (Array.isArray(key))
  130558. {
  130559. this.collisionMap = new CollisionMap(tileSize, key);
  130560. }
  130561. else
  130562. {
  130563. console.warn('Invalid Weltmeister collision map data: ' + key);
  130564. }
  130565. return this.collisionMap;
  130566. },
  130567. /**
  130568. * Sets the collision map for the world from a tilemap layer. Only tiles that are marked as
  130569. * colliding will be used. You can specify the mapping from tiles to slope IDs in a couple of
  130570. * ways. The easiest is to use Tiled and the slopeTileProperty option. Alternatively, you can
  130571. * manually create a slopeMap that stores the mapping between tile indices and slope IDs.
  130572. *
  130573. * @method Phaser.Physics.Impact.World#setCollisionMapFromTilemapLayer
  130574. * @since 3.0.0
  130575. *
  130576. * @param {(Phaser.Tilemaps.DynamicTilemapLayer|Phaser.Tilemaps.StaticTilemapLayer)} tilemapLayer - The tilemap layer to use.
  130577. * @param {object} [options] - Options for controlling the mapping from tiles to slope IDs.
  130578. * @param {string} [options.slopeTileProperty=null] - Slope IDs can be stored on tiles directly
  130579. * using Tiled's tileset editor. If a tile has a property with the given slopeTileProperty string
  130580. * name, the value of that property for the tile will be used for its slope mapping. E.g. a 45
  130581. * degree slope upward could be given a "slope" property with a value of 2.
  130582. * @param {object} [options.slopeMap=null] - A tile index to slope definition map.
  130583. * @param {integer} [options.defaultCollidingSlope=null] - If specified, the default slope ID to
  130584. * assign to a colliding tile. If not specified, the tile's index is used.
  130585. * @param {integer} [options.defaultNonCollidingSlope=0] - The default slope ID to assign to a
  130586. * non-colliding tile.
  130587. *
  130588. * @return {Phaser.Physics.Impact.CollisionMap} The newly created CollisionMap.
  130589. */
  130590. setCollisionMapFromTilemapLayer: function (tilemapLayer, options)
  130591. {
  130592. if (options === undefined) { options = {}; }
  130593. var slopeProperty = GetFastValue(options, 'slopeProperty', null);
  130594. var slopeMap = GetFastValue(options, 'slopeMap', null);
  130595. var collidingSlope = GetFastValue(options, 'defaultCollidingSlope', null);
  130596. var nonCollidingSlope = GetFastValue(options, 'defaultNonCollidingSlope', 0);
  130597. var layerData = tilemapLayer.layer;
  130598. var tileSize = layerData.baseTileWidth;
  130599. var collisionData = [];
  130600. for (var ty = 0; ty < layerData.height; ty++)
  130601. {
  130602. collisionData[ty] = [];
  130603. for (var tx = 0; tx < layerData.width; tx++)
  130604. {
  130605. var tile = layerData.data[ty][tx];
  130606. if (tile && tile.collides)
  130607. {
  130608. if (slopeProperty !== null && HasValue(tile.properties, slopeProperty))
  130609. {
  130610. collisionData[ty][tx] = parseInt(tile.properties[slopeProperty], 10);
  130611. }
  130612. else if (slopeMap !== null && HasValue(slopeMap, tile.index))
  130613. {
  130614. collisionData[ty][tx] = slopeMap[tile.index];
  130615. }
  130616. else if (collidingSlope !== null)
  130617. {
  130618. collisionData[ty][tx] = collidingSlope;
  130619. }
  130620. else
  130621. {
  130622. collisionData[ty][tx] = tile.index;
  130623. }
  130624. }
  130625. else
  130626. {
  130627. collisionData[ty][tx] = nonCollidingSlope;
  130628. }
  130629. }
  130630. }
  130631. this.collisionMap = new CollisionMap(tileSize, collisionData);
  130632. return this.collisionMap;
  130633. },
  130634. /**
  130635. * Sets the bounds of the Physics world to match the given world pixel dimensions.
  130636. * You can optionally set which 'walls' to create: left, right, top or bottom.
  130637. * If none of the walls are given it will default to use the walls settings it had previously.
  130638. * I.e. if you previously told it to not have the left or right walls, and you then adjust the world size
  130639. * the newly created bounds will also not have the left and right walls.
  130640. * Explicitly state them in the parameters to override this.
  130641. *
  130642. * @method Phaser.Physics.Impact.World#setBounds
  130643. * @since 3.0.0
  130644. *
  130645. * @param {number} [x] - The x coordinate of the top-left corner of the bounds.
  130646. * @param {number} [y] - The y coordinate of the top-left corner of the bounds.
  130647. * @param {number} [width] - The width of the bounds.
  130648. * @param {number} [height] - The height of the bounds.
  130649. * @param {number} [thickness=64] - [description]
  130650. * @param {boolean} [left=true] - If true will create the left bounds wall.
  130651. * @param {boolean} [right=true] - If true will create the right bounds wall.
  130652. * @param {boolean} [top=true] - If true will create the top bounds wall.
  130653. * @param {boolean} [bottom=true] - If true will create the bottom bounds wall.
  130654. *
  130655. * @return {Phaser.Physics.Impact.World} This World object.
  130656. */
  130657. setBounds: function (x, y, width, height, thickness, left, right, top, bottom)
  130658. {
  130659. if (x === undefined) { x = 0; }
  130660. if (y === undefined) { y = 0; }
  130661. if (width === undefined) { width = this.scene.sys.game.config.width; }
  130662. if (height === undefined) { height = this.scene.sys.game.config.height; }
  130663. if (thickness === undefined) { thickness = 64; }
  130664. if (left === undefined) { left = true; }
  130665. if (right === undefined) { right = true; }
  130666. if (top === undefined) { top = true; }
  130667. if (bottom === undefined) { bottom = true; }
  130668. this.updateWall(left, 'left', x - thickness, y, thickness, height);
  130669. this.updateWall(right, 'right', x + width, y, thickness, height);
  130670. this.updateWall(top, 'top', x, y - thickness, width, thickness);
  130671. this.updateWall(bottom, 'bottom', x, y + height, width, thickness);
  130672. return this;
  130673. },
  130674. /**
  130675. * position = 'left', 'right', 'top' or 'bottom'
  130676. *
  130677. * @method Phaser.Physics.Impact.World#updateWall
  130678. * @since 3.0.0
  130679. *
  130680. * @param {boolean} add - [description]
  130681. * @param {string} position - [description]
  130682. * @param {number} x - [description]
  130683. * @param {number} y - [description]
  130684. * @param {number} width - [description]
  130685. * @param {number} height - [description]
  130686. */
  130687. updateWall: function (add, position, x, y, width, height)
  130688. {
  130689. var wall = this.walls[position];
  130690. if (add)
  130691. {
  130692. if (wall)
  130693. {
  130694. wall.resetSize(x, y, width, height);
  130695. }
  130696. else
  130697. {
  130698. this.walls[position] = this.create(x, y, width, height);
  130699. this.walls[position].name = position;
  130700. this.walls[position].gravityFactor = 0;
  130701. this.walls[position].collides = COLLIDES.FIXED;
  130702. }
  130703. }
  130704. else
  130705. {
  130706. if (wall)
  130707. {
  130708. this.bodies.remove(wall);
  130709. }
  130710. this.walls[position] = null;
  130711. }
  130712. },
  130713. /**
  130714. * [description]
  130715. *
  130716. * @method Phaser.Physics.Impact.World#createDebugGraphic
  130717. * @since 3.0.0
  130718. *
  130719. * @return {Phaser.GameObjects.Graphics} [description]
  130720. */
  130721. createDebugGraphic: function ()
  130722. {
  130723. var graphic = this.scene.sys.add.graphics({ x: 0, y: 0 });
  130724. graphic.setDepth(Number.MAX_VALUE);
  130725. this.debugGraphic = graphic;
  130726. this.drawDebug = true;
  130727. return graphic;
  130728. },
  130729. /**
  130730. * [description]
  130731. *
  130732. * @method Phaser.Physics.Impact.World#getNextID
  130733. * @since 3.0.0
  130734. *
  130735. * @return {integer} [description]
  130736. */
  130737. getNextID: function ()
  130738. {
  130739. return this._lastId++;
  130740. },
  130741. /**
  130742. * [description]
  130743. *
  130744. * @method Phaser.Physics.Impact.World#create
  130745. * @since 3.0.0
  130746. *
  130747. * @param {number} x - [description]
  130748. * @param {number} y - [description]
  130749. * @param {number} sizeX - [description]
  130750. * @param {number} sizeY - [description]
  130751. *
  130752. * @return {Phaser.Physics.Impact.Body} The Body that was added to this World.
  130753. */
  130754. create: function (x, y, sizeX, sizeY)
  130755. {
  130756. var body = new Body(this, x, y, sizeX, sizeY);
  130757. this.bodies.set(body);
  130758. return body;
  130759. },
  130760. /**
  130761. * [description]
  130762. *
  130763. * @method Phaser.Physics.Impact.World#remove
  130764. * @since 3.0.0
  130765. *
  130766. * @param {Phaser.Physics.Impact.Body} object - The Body to remove from this World.
  130767. */
  130768. remove: function (object)
  130769. {
  130770. this.bodies.delete(object);
  130771. },
  130772. /**
  130773. * [description]
  130774. *
  130775. * @method Phaser.Physics.Impact.World#pause
  130776. * @since 3.0.0
  130777. *
  130778. * @return {Phaser.Physics.Impact.World} This World object.
  130779. */
  130780. pause: function ()
  130781. {
  130782. this.enabled = false;
  130783. this.emit('pause');
  130784. return this;
  130785. },
  130786. /**
  130787. * [description]
  130788. *
  130789. * @method Phaser.Physics.Impact.World#resume
  130790. * @since 3.0.0
  130791. *
  130792. * @return {Phaser.Physics.Impact.World} This World object.
  130793. */
  130794. resume: function ()
  130795. {
  130796. this.enabled = true;
  130797. this.emit('resume');
  130798. return this;
  130799. },
  130800. /**
  130801. * [description]
  130802. *
  130803. * @method Phaser.Physics.Impact.World#update
  130804. * @since 3.0.0
  130805. *
  130806. * @param {number} time - [description]
  130807. * @param {number} delta - [description]
  130808. */
  130809. update: function (time, delta)
  130810. {
  130811. if (!this.enabled || this.bodies.size === 0)
  130812. {
  130813. return;
  130814. }
  130815. // Impact uses a divided delta value that is clamped to the maxStep (20fps) maximum
  130816. var clampedDelta = Math.min(delta / 1000, this.maxStep) * this.timeScale;
  130817. this.delta = clampedDelta;
  130818. // Update all active bodies
  130819. var i;
  130820. var body;
  130821. var bodies = this.bodies.entries;
  130822. var len = bodies.length;
  130823. var hash = {};
  130824. var size = this.cellSize;
  130825. for (i = 0; i < len; i++)
  130826. {
  130827. body = bodies[i];
  130828. if (body.enabled)
  130829. {
  130830. body.update(clampedDelta);
  130831. }
  130832. }
  130833. // Run collision against them all now they're in the new positions from the update
  130834. for (i = 0; i < len; i++)
  130835. {
  130836. body = bodies[i];
  130837. if (body && !body.skipHash())
  130838. {
  130839. this.checkHash(body, hash, size);
  130840. }
  130841. }
  130842. if (this.drawDebug)
  130843. {
  130844. var graphics = this.debugGraphic;
  130845. graphics.clear();
  130846. for (i = 0; i < len; i++)
  130847. {
  130848. body = bodies[i];
  130849. if (body && body.willDrawDebug())
  130850. {
  130851. body.drawDebug(graphics);
  130852. }
  130853. }
  130854. }
  130855. },
  130856. /**
  130857. * Check the body against the spatial hash.
  130858. *
  130859. * @method Phaser.Physics.Impact.World#checkHash
  130860. * @since 3.0.0
  130861. *
  130862. * @param {Phaser.Physics.Impact.Body} body - [description]
  130863. * @param {object} hash - [description]
  130864. * @param {number} size - [description]
  130865. */
  130866. checkHash: function (body, hash, size)
  130867. {
  130868. var checked = {};
  130869. var xmin = Math.floor(body.pos.x / size);
  130870. var ymin = Math.floor(body.pos.y / size);
  130871. var xmax = Math.floor((body.pos.x + body.size.x) / size) + 1;
  130872. var ymax = Math.floor((body.pos.y + body.size.y) / size) + 1;
  130873. for (var x = xmin; x < xmax; x++)
  130874. {
  130875. for (var y = ymin; y < ymax; y++)
  130876. {
  130877. if (!hash[x])
  130878. {
  130879. hash[x] = {};
  130880. hash[x][y] = [ body ];
  130881. }
  130882. else if (!hash[x][y])
  130883. {
  130884. hash[x][y] = [ body ];
  130885. }
  130886. else
  130887. {
  130888. var cell = hash[x][y];
  130889. for (var c = 0; c < cell.length; c++)
  130890. {
  130891. if (body.touches(cell[c]) && !checked[cell[c].id])
  130892. {
  130893. checked[cell[c].id] = true;
  130894. this.checkBodies(body, cell[c]);
  130895. }
  130896. }
  130897. cell.push(body);
  130898. }
  130899. }
  130900. }
  130901. },
  130902. /**
  130903. * [description]
  130904. *
  130905. * @method Phaser.Physics.Impact.World#checkBodies
  130906. * @since 3.0.0
  130907. *
  130908. * @param {Phaser.Physics.Impact.Body} bodyA - [description]
  130909. * @param {Phaser.Physics.Impact.Body} bodyB - [description]
  130910. */
  130911. checkBodies: function (bodyA, bodyB)
  130912. {
  130913. // 2 fixed bodies won't do anything
  130914. if (bodyA.collides === COLLIDES.FIXED && bodyB.collides === COLLIDES.FIXED)
  130915. {
  130916. return;
  130917. }
  130918. // bitwise checks
  130919. if (bodyA.checkAgainst & bodyB.type)
  130920. {
  130921. bodyA.check(bodyB);
  130922. }
  130923. if (bodyB.checkAgainst & bodyA.type)
  130924. {
  130925. bodyB.check(bodyA);
  130926. }
  130927. if (bodyA.collides && bodyB.collides && bodyA.collides + bodyB.collides > COLLIDES.ACTIVE)
  130928. {
  130929. Solver(this, bodyA, bodyB);
  130930. }
  130931. },
  130932. /**
  130933. * [description]
  130934. *
  130935. * @method Phaser.Physics.Impact.World#setCollidesNever
  130936. * @since 3.0.0
  130937. *
  130938. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the collides value on.
  130939. *
  130940. * @return {Phaser.Physics.Impact.World} This World object.
  130941. */
  130942. setCollidesNever: function (bodies)
  130943. {
  130944. for (var i = 0; i < bodies.length; i++)
  130945. {
  130946. bodies[i].collides = COLLIDES.NEVER;
  130947. }
  130948. return this;
  130949. },
  130950. /**
  130951. * [description]
  130952. *
  130953. * @method Phaser.Physics.Impact.World#setLite
  130954. * @since 3.0.0
  130955. *
  130956. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the collides value on.
  130957. *
  130958. * @return {Phaser.Physics.Impact.World} This World object.
  130959. */
  130960. setLite: function (bodies)
  130961. {
  130962. for (var i = 0; i < bodies.length; i++)
  130963. {
  130964. bodies[i].collides = COLLIDES.LITE;
  130965. }
  130966. return this;
  130967. },
  130968. /**
  130969. * [description]
  130970. *
  130971. * @method Phaser.Physics.Impact.World#setPassive
  130972. * @since 3.0.0
  130973. *
  130974. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the collides value on.
  130975. *
  130976. * @return {Phaser.Physics.Impact.World} This World object.
  130977. */
  130978. setPassive: function (bodies)
  130979. {
  130980. for (var i = 0; i < bodies.length; i++)
  130981. {
  130982. bodies[i].collides = COLLIDES.PASSIVE;
  130983. }
  130984. return this;
  130985. },
  130986. /**
  130987. * [description]
  130988. *
  130989. * @method Phaser.Physics.Impact.World#setActive
  130990. * @since 3.0.0
  130991. *
  130992. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the collides value on.
  130993. *
  130994. * @return {Phaser.Physics.Impact.World} This World object.
  130995. */
  130996. setActive: function (bodies)
  130997. {
  130998. for (var i = 0; i < bodies.length; i++)
  130999. {
  131000. bodies[i].collides = COLLIDES.ACTIVE;
  131001. }
  131002. return this;
  131003. },
  131004. /**
  131005. * [description]
  131006. *
  131007. * @method Phaser.Physics.Impact.World#setFixed
  131008. * @since 3.0.0
  131009. *
  131010. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the collides value on.
  131011. *
  131012. * @return {Phaser.Physics.Impact.World} This World object.
  131013. */
  131014. setFixed: function (bodies)
  131015. {
  131016. for (var i = 0; i < bodies.length; i++)
  131017. {
  131018. bodies[i].collides = COLLIDES.FIXED;
  131019. }
  131020. return this;
  131021. },
  131022. /**
  131023. * [description]
  131024. *
  131025. * @method Phaser.Physics.Impact.World#setTypeNone
  131026. * @since 3.0.0
  131027. *
  131028. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  131029. *
  131030. * @return {Phaser.Physics.Impact.World} This World object.
  131031. */
  131032. setTypeNone: function (bodies)
  131033. {
  131034. for (var i = 0; i < bodies.length; i++)
  131035. {
  131036. bodies[i].type = TYPE.NONE;
  131037. }
  131038. return this;
  131039. },
  131040. /**
  131041. * [description]
  131042. *
  131043. * @method Phaser.Physics.Impact.World#setTypeA
  131044. * @since 3.0.0
  131045. *
  131046. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  131047. *
  131048. * @return {Phaser.Physics.Impact.World} This World object.
  131049. */
  131050. setTypeA: function (bodies)
  131051. {
  131052. for (var i = 0; i < bodies.length; i++)
  131053. {
  131054. bodies[i].type = TYPE.A;
  131055. }
  131056. return this;
  131057. },
  131058. /**
  131059. * [description]
  131060. *
  131061. * @method Phaser.Physics.Impact.World#setTypeB
  131062. * @since 3.0.0
  131063. *
  131064. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  131065. *
  131066. * @return {Phaser.Physics.Impact.World} This World object.
  131067. */
  131068. setTypeB: function (bodies)
  131069. {
  131070. for (var i = 0; i < bodies.length; i++)
  131071. {
  131072. bodies[i].type = TYPE.B;
  131073. }
  131074. return this;
  131075. },
  131076. /**
  131077. * [description]
  131078. *
  131079. * @method Phaser.Physics.Impact.World#setAvsB
  131080. * @since 3.0.0
  131081. *
  131082. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  131083. *
  131084. * @return {Phaser.Physics.Impact.World} This World object.
  131085. */
  131086. setAvsB: function (bodies)
  131087. {
  131088. for (var i = 0; i < bodies.length; i++)
  131089. {
  131090. bodies[i].type = TYPE.A;
  131091. bodies[i].checkAgainst = TYPE.B;
  131092. }
  131093. return this;
  131094. },
  131095. /**
  131096. * [description]
  131097. *
  131098. * @method Phaser.Physics.Impact.World#setBvsA
  131099. * @since 3.0.0
  131100. *
  131101. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  131102. *
  131103. * @return {Phaser.Physics.Impact.World} This World object.
  131104. */
  131105. setBvsA: function (bodies)
  131106. {
  131107. for (var i = 0; i < bodies.length; i++)
  131108. {
  131109. bodies[i].type = TYPE.B;
  131110. bodies[i].checkAgainst = TYPE.A;
  131111. }
  131112. return this;
  131113. },
  131114. /**
  131115. * [description]
  131116. *
  131117. * @method Phaser.Physics.Impact.World#setCheckAgainstNone
  131118. * @since 3.0.0
  131119. *
  131120. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  131121. *
  131122. * @return {Phaser.Physics.Impact.World} This World object.
  131123. */
  131124. setCheckAgainstNone: function (bodies)
  131125. {
  131126. for (var i = 0; i < bodies.length; i++)
  131127. {
  131128. bodies[i].checkAgainst = TYPE.NONE;
  131129. }
  131130. return this;
  131131. },
  131132. /**
  131133. * [description]
  131134. *
  131135. * @method Phaser.Physics.Impact.World#setCheckAgainstA
  131136. * @since 3.0.0
  131137. *
  131138. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  131139. *
  131140. * @return {Phaser.Physics.Impact.World} This World object.
  131141. */
  131142. setCheckAgainstA: function (bodies)
  131143. {
  131144. for (var i = 0; i < bodies.length; i++)
  131145. {
  131146. bodies[i].checkAgainst = TYPE.A;
  131147. }
  131148. return this;
  131149. },
  131150. /**
  131151. * [description]
  131152. *
  131153. * @method Phaser.Physics.Impact.World#setCheckAgainstB
  131154. * @since 3.0.0
  131155. *
  131156. * @param {Phaser.Physics.Impact.Body[]} bodies - An Array of Impact Bodies to set the type value on.
  131157. *
  131158. * @return {Phaser.Physics.Impact.World} This World object.
  131159. */
  131160. setCheckAgainstB: function (bodies)
  131161. {
  131162. for (var i = 0; i < bodies.length; i++)
  131163. {
  131164. bodies[i].checkAgainst = TYPE.B;
  131165. }
  131166. return this;
  131167. },
  131168. /**
  131169. * [description]
  131170. *
  131171. * @method Phaser.Physics.Impact.World#shutdown
  131172. * @since 3.0.0
  131173. */
  131174. shutdown: function ()
  131175. {
  131176. this.removeAllListeners();
  131177. },
  131178. /**
  131179. * [description]
  131180. *
  131181. * @method Phaser.Physics.Impact.World#destroy
  131182. * @since 3.0.0
  131183. */
  131184. destroy: function ()
  131185. {
  131186. this.removeAllListeners();
  131187. this.scene = null;
  131188. this.bodies.clear();
  131189. this.bodies = null;
  131190. this.collisionMap = null;
  131191. }
  131192. });
  131193. module.exports = World;
  131194. /***/ }),
  131195. /* 1024 */
  131196. /***/ (function(module, exports, __webpack_require__) {
  131197. /**
  131198. * @author Richard Davey <rich@photonstorm.com>
  131199. * @copyright 2018 Photon Storm Ltd.
  131200. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131201. */
  131202. var Class = __webpack_require__(0);
  131203. var Components = __webpack_require__(686);
  131204. var Sprite = __webpack_require__(35);
  131205. /**
  131206. * @classdesc
  131207. * An Impact Physics Sprite Game Object.
  131208. *
  131209. * A Sprite Game Object is used for the display of both static and animated images in your game.
  131210. * Sprites can have input events and physics bodies. They can also be tweened, tinted, scrolled
  131211. * and animated.
  131212. *
  131213. * The main difference between a Sprite and an Image Game Object is that you cannot animate Images.
  131214. * As such, Sprites take a fraction longer to process and have a larger API footprint due to the Animation
  131215. * Component. If you do not require animation then you can safely use Images to replace Sprites in all cases.
  131216. *
  131217. * @class ImpactSprite
  131218. * @extends Phaser.GameObjects.Sprite
  131219. * @memberOf Phaser.Physics.Impact
  131220. * @constructor
  131221. * @since 3.0.0
  131222. *
  131223. * @extends Phaser.Physics.Impact.Components.Acceleration
  131224. * @extends Phaser.Physics.Impact.Components.BodyScale
  131225. * @extends Phaser.Physics.Impact.Components.BodyType
  131226. * @extends Phaser.Physics.Impact.Components.Bounce
  131227. * @extends Phaser.Physics.Impact.Components.CheckAgainst
  131228. * @extends Phaser.Physics.Impact.Components.Collides
  131229. * @extends Phaser.Physics.Impact.Components.Debug
  131230. * @extends Phaser.Physics.Impact.Components.Friction
  131231. * @extends Phaser.Physics.Impact.Components.Gravity
  131232. * @extends Phaser.Physics.Impact.Components.Offset
  131233. * @extends Phaser.Physics.Impact.Components.SetGameObject
  131234. * @extends Phaser.Physics.Impact.Components.Velocity
  131235. * @extends Phaser.GameObjects.Components.Alpha
  131236. * @extends Phaser.GameObjects.Components.BlendMode
  131237. * @extends Phaser.GameObjects.Components.Depth
  131238. * @extends Phaser.GameObjects.Components.Flip
  131239. * @extends Phaser.GameObjects.Components.GetBounds
  131240. * @extends Phaser.GameObjects.Components.Origin
  131241. * @extends Phaser.GameObjects.Components.Pipeline
  131242. * @extends Phaser.GameObjects.Components.ScaleMode
  131243. * @extends Phaser.GameObjects.Components.ScrollFactor
  131244. * @extends Phaser.GameObjects.Components.Size
  131245. * @extends Phaser.GameObjects.Components.Texture
  131246. * @extends Phaser.GameObjects.Components.Tint
  131247. * @extends Phaser.GameObjects.Components.Transform
  131248. * @extends Phaser.GameObjects.Components.Visible
  131249. *
  131250. * @param {Phaser.Physics.Impact.World} world - [description]
  131251. * @param {number} x - The horizontal position of this Game Object in the world.
  131252. * @param {number} y - The vertical position of this Game Object in the world.
  131253. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  131254. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  131255. */
  131256. var ImpactSprite = new Class({
  131257. Extends: Sprite,
  131258. Mixins: [
  131259. Components.Acceleration,
  131260. Components.BodyScale,
  131261. Components.BodyType,
  131262. Components.Bounce,
  131263. Components.CheckAgainst,
  131264. Components.Collides,
  131265. Components.Debug,
  131266. Components.Friction,
  131267. Components.Gravity,
  131268. Components.Offset,
  131269. Components.SetGameObject,
  131270. Components.Velocity
  131271. ],
  131272. initialize:
  131273. function ImpactSprite (world, x, y, texture, frame)
  131274. {
  131275. Sprite.call(this, world.scene, x, y, texture, frame);
  131276. /**
  131277. * [description]
  131278. *
  131279. * @name Phaser.Physics.Impact.ImpactSprite#body
  131280. * @type {Phaser.Physics.Impact.Body}
  131281. * @since 3.0.0
  131282. */
  131283. this.body = world.create(x - this.frame.centerX, y - this.frame.centerY, this.width, this.height);
  131284. this.body.parent = this;
  131285. this.body.gameObject = this;
  131286. /**
  131287. * [description]
  131288. *
  131289. * @name Phaser.Physics.Impact.ImpactSprite#size
  131290. * @type {{x: number, y: number}}
  131291. * @since 3.0.0
  131292. */
  131293. this.size = this.body.size;
  131294. /**
  131295. * [description]
  131296. *
  131297. * @name Phaser.Physics.Impact.ImpactSprite#offset
  131298. * @type {{x: number, y: number}}
  131299. * @since 3.0.0
  131300. */
  131301. this.offset = this.body.offset;
  131302. /**
  131303. * [description]
  131304. *
  131305. * @name Phaser.Physics.Impact.ImpactSprite#vel
  131306. * @type {{x: number, y: number}}
  131307. * @since 3.0.0
  131308. */
  131309. this.vel = this.body.vel;
  131310. /**
  131311. * [description]
  131312. *
  131313. * @name Phaser.Physics.Impact.ImpactSprite#accel
  131314. * @type {{x: number, y: number}}
  131315. * @since 3.0.0
  131316. */
  131317. this.accel = this.body.accel;
  131318. /**
  131319. * [description]
  131320. *
  131321. * @name Phaser.Physics.Impact.ImpactSprite#friction
  131322. * @type {{x: number, y: number}}
  131323. * @since 3.0.0
  131324. */
  131325. this.friction = this.body.friction;
  131326. /**
  131327. * [description]
  131328. *
  131329. * @name Phaser.Physics.Impact.ImpactSprite#maxVel
  131330. * @type {{x: number, y: number}}
  131331. * @since 3.0.0
  131332. */
  131333. this.maxVel = this.body.maxVel;
  131334. }
  131335. });
  131336. module.exports = ImpactSprite;
  131337. /***/ }),
  131338. /* 1025 */
  131339. /***/ (function(module, exports, __webpack_require__) {
  131340. /**
  131341. * @author Richard Davey <rich@photonstorm.com>
  131342. * @copyright 2018 Photon Storm Ltd.
  131343. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131344. */
  131345. var Class = __webpack_require__(0);
  131346. var Components = __webpack_require__(686);
  131347. var Image = __webpack_require__(68);
  131348. /**
  131349. * @classdesc
  131350. * An Impact Physics Image Game Object.
  131351. *
  131352. * An Image is a light-weight Game Object useful for the display of static images in your game,
  131353. * such as logos, backgrounds, scenery or other non-animated elements. Images can have input
  131354. * events and physics bodies, or be tweened, tinted or scrolled. The main difference between an
  131355. * Image and a Sprite is that you cannot animate an Image as they do not have the Animation component.
  131356. *
  131357. * @class ImpactImage
  131358. * @extends Phaser.GameObjects.Image
  131359. * @memberOf Phaser.Physics.Impact
  131360. * @constructor
  131361. * @since 3.0.0
  131362. *
  131363. * @extends Phaser.Physics.Impact.Components.Acceleration
  131364. * @extends Phaser.Physics.Impact.Components.BodyScale
  131365. * @extends Phaser.Physics.Impact.Components.BodyType
  131366. * @extends Phaser.Physics.Impact.Components.Bounce
  131367. * @extends Phaser.Physics.Impact.Components.CheckAgainst
  131368. * @extends Phaser.Physics.Impact.Components.Collides
  131369. * @extends Phaser.Physics.Impact.Components.Debug
  131370. * @extends Phaser.Physics.Impact.Components.Friction
  131371. * @extends Phaser.Physics.Impact.Components.Gravity
  131372. * @extends Phaser.Physics.Impact.Components.Offset
  131373. * @extends Phaser.Physics.Impact.Components.SetGameObject
  131374. * @extends Phaser.Physics.Impact.Components.Velocity
  131375. * @extends Phaser.GameObjects.Components.Alpha
  131376. * @extends Phaser.GameObjects.Components.BlendMode
  131377. * @extends Phaser.GameObjects.Components.Depth
  131378. * @extends Phaser.GameObjects.Components.Flip
  131379. * @extends Phaser.GameObjects.Components.GetBounds
  131380. * @extends Phaser.GameObjects.Components.Origin
  131381. * @extends Phaser.GameObjects.Components.Pipeline
  131382. * @extends Phaser.GameObjects.Components.ScaleMode
  131383. * @extends Phaser.GameObjects.Components.ScrollFactor
  131384. * @extends Phaser.GameObjects.Components.Size
  131385. * @extends Phaser.GameObjects.Components.Texture
  131386. * @extends Phaser.GameObjects.Components.Tint
  131387. * @extends Phaser.GameObjects.Components.Transform
  131388. * @extends Phaser.GameObjects.Components.Visible
  131389. *
  131390. * @param {Phaser.Physics.Impact.World} world - [description]
  131391. * @param {number} x - The horizontal position of this Game Object in the world.
  131392. * @param {number} y - The vertical position of this Game Object in the world.
  131393. * @param {string} texture - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  131394. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  131395. */
  131396. var ImpactImage = new Class({
  131397. Extends: Image,
  131398. Mixins: [
  131399. Components.Acceleration,
  131400. Components.BodyScale,
  131401. Components.BodyType,
  131402. Components.Bounce,
  131403. Components.CheckAgainst,
  131404. Components.Collides,
  131405. Components.Debug,
  131406. Components.Friction,
  131407. Components.Gravity,
  131408. Components.Offset,
  131409. Components.SetGameObject,
  131410. Components.Velocity
  131411. ],
  131412. initialize:
  131413. function ImpactImage (world, x, y, texture, frame)
  131414. {
  131415. Image.call(this, world.scene, x, y, texture, frame);
  131416. /**
  131417. * [description]
  131418. *
  131419. * @name Phaser.Physics.Impact.ImpactImage#body
  131420. * @type {Phaser.Physics.Impact.Body}
  131421. * @since 3.0.0
  131422. */
  131423. this.body = world.create(x - this.frame.centerX, y - this.frame.centerY, this.width, this.height);
  131424. this.body.parent = this;
  131425. this.body.gameObject = this;
  131426. /**
  131427. * [description]
  131428. *
  131429. * @name Phaser.Physics.Impact.ImpactImage#size
  131430. * @type {{x: number, y: number}}
  131431. * @since 3.0.0
  131432. */
  131433. this.size = this.body.size;
  131434. /**
  131435. * [description]
  131436. *
  131437. * @name Phaser.Physics.Impact.ImpactImage#offset
  131438. * @type {{x: number, y: number}}
  131439. * @since 3.0.0
  131440. */
  131441. this.offset = this.body.offset;
  131442. /**
  131443. * [description]
  131444. *
  131445. * @name Phaser.Physics.Impact.ImpactImage#vel
  131446. * @type {{x: number, y: number}}
  131447. * @since 3.0.0
  131448. */
  131449. this.vel = this.body.vel;
  131450. /**
  131451. * [description]
  131452. *
  131453. * @name Phaser.Physics.Impact.ImpactImage#accel
  131454. * @type {{x: number, y: number}}
  131455. * @since 3.0.0
  131456. */
  131457. this.accel = this.body.accel;
  131458. /**
  131459. * [description]
  131460. *
  131461. * @name Phaser.Physics.Impact.ImpactImage#friction
  131462. * @type {{x: number, y: number}}
  131463. * @since 3.0.0
  131464. */
  131465. this.friction = this.body.friction;
  131466. /**
  131467. * [description]
  131468. *
  131469. * @name Phaser.Physics.Impact.ImpactImage#maxVel
  131470. * @type {{x: number, y: number}}
  131471. * @since 3.0.0
  131472. */
  131473. this.maxVel = this.body.maxVel;
  131474. }
  131475. });
  131476. module.exports = ImpactImage;
  131477. /***/ }),
  131478. /* 1026 */
  131479. /***/ (function(module, exports, __webpack_require__) {
  131480. /**
  131481. * @author Richard Davey <rich@photonstorm.com>
  131482. * @copyright 2018 Photon Storm Ltd.
  131483. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131484. */
  131485. var Class = __webpack_require__(0);
  131486. var Components = __webpack_require__(686);
  131487. /**
  131488. * @classdesc
  131489. * [description]
  131490. *
  131491. * @class ImpactBody
  131492. * @memberOf Phaser.Physics.Impact
  131493. * @constructor
  131494. * @since 3.0.0
  131495. *
  131496. * @extends Phaser.Physics.Impact.Components.Acceleration
  131497. * @extends Phaser.Physics.Impact.Components.BodyScale
  131498. * @extends Phaser.Physics.Impact.Components.BodyType
  131499. * @extends Phaser.Physics.Impact.Components.Bounce
  131500. * @extends Phaser.Physics.Impact.Components.CheckAgainst
  131501. * @extends Phaser.Physics.Impact.Components.Collides
  131502. * @extends Phaser.Physics.Impact.Components.Debug
  131503. * @extends Phaser.Physics.Impact.Components.Friction
  131504. * @extends Phaser.Physics.Impact.Components.Gravity
  131505. * @extends Phaser.Physics.Impact.Components.Offset
  131506. * @extends Phaser.Physics.Impact.Components.SetGameObject
  131507. * @extends Phaser.Physics.Impact.Components.Velocity
  131508. *
  131509. * @param {Phaser.Physics.Impact.World} world - [description]
  131510. * @param {number} x - [description]
  131511. * @param {number} y - [description]
  131512. * @param {number} width - [description]
  131513. * @param {number} height - [description]
  131514. */
  131515. var ImpactBody = new Class({
  131516. Mixins: [
  131517. Components.Acceleration,
  131518. Components.BodyScale,
  131519. Components.BodyType,
  131520. Components.Bounce,
  131521. Components.CheckAgainst,
  131522. Components.Collides,
  131523. Components.Debug,
  131524. Components.Friction,
  131525. Components.Gravity,
  131526. Components.Offset,
  131527. Components.SetGameObject,
  131528. Components.Velocity
  131529. ],
  131530. initialize:
  131531. function ImpactBody (world, x, y, width, height)
  131532. {
  131533. /**
  131534. * [description]
  131535. *
  131536. * @name Phaser.Physics.Impact.ImpactBody#body
  131537. * @type {Phaser.Physics.Impact.Body}
  131538. * @since 3.0.0
  131539. */
  131540. this.body = world.create(x, y, width, height);
  131541. this.body.parent = this;
  131542. /**
  131543. * [description]
  131544. *
  131545. * @name Phaser.Physics.Impact.ImpactBody#size
  131546. * @type {{x: number, y: number}}
  131547. * @since 3.0.0
  131548. */
  131549. this.size = this.body.size;
  131550. /**
  131551. * [description]
  131552. *
  131553. * @name Phaser.Physics.Impact.ImpactBody#offset
  131554. * @type {{x: number, y: number}}
  131555. * @since 3.0.0
  131556. */
  131557. this.offset = this.body.offset;
  131558. /**
  131559. * [description]
  131560. *
  131561. * @name Phaser.Physics.Impact.ImpactBody#vel
  131562. * @type {{x: number, y: number}}
  131563. * @since 3.0.0
  131564. */
  131565. this.vel = this.body.vel;
  131566. /**
  131567. * [description]
  131568. *
  131569. * @name Phaser.Physics.Impact.ImpactBody#accel
  131570. * @type {{x: number, y: number}}
  131571. * @since 3.0.0
  131572. */
  131573. this.accel = this.body.accel;
  131574. /**
  131575. * [description]
  131576. *
  131577. * @name Phaser.Physics.Impact.ImpactBody#friction
  131578. * @type {{x: number, y: number}}
  131579. * @since 3.0.0
  131580. */
  131581. this.friction = this.body.friction;
  131582. /**
  131583. * [description]
  131584. *
  131585. * @name Phaser.Physics.Impact.ImpactBody#maxVel
  131586. * @type {{x: number, y: number}}
  131587. * @since 3.0.0
  131588. */
  131589. this.maxVel = this.body.maxVel;
  131590. }
  131591. });
  131592. module.exports = ImpactBody;
  131593. /***/ }),
  131594. /* 1027 */
  131595. /***/ (function(module, exports, __webpack_require__) {
  131596. /**
  131597. * @author Richard Davey <rich@photonstorm.com>
  131598. * @copyright 2018 Photon Storm Ltd.
  131599. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131600. */
  131601. var Class = __webpack_require__(0);
  131602. var ImpactBody = __webpack_require__(1026);
  131603. var ImpactImage = __webpack_require__(1025);
  131604. var ImpactSprite = __webpack_require__(1024);
  131605. /**
  131606. * @classdesc
  131607. * The Impact Physics Factory allows you to easily create Impact Physics enabled Game Objects.
  131608. * Objects that are created by this Factory are automatically added to the physics world.
  131609. *
  131610. * @class Factory
  131611. * @memberOf Phaser.Physics.Impact
  131612. * @constructor
  131613. * @since 3.0.0
  131614. *
  131615. * @param {Phaser.Physics.Impact.World} world - [description]
  131616. */
  131617. var Factory = new Class({
  131618. initialize:
  131619. function Factory (world)
  131620. {
  131621. /**
  131622. * [description]
  131623. *
  131624. * @name Phaser.Physics.Impact.Factory#world
  131625. * @type {Phaser.Physics.Impact.World}
  131626. * @since 3.0.0
  131627. */
  131628. this.world = world;
  131629. /**
  131630. * A reference to the Scene.Systems this Impact Physics instance belongs to.
  131631. *
  131632. * @name Phaser.Physics.Impact.Factory#sys
  131633. * @type {Phaser.Scenes.Systems}
  131634. * @since 3.0.0
  131635. */
  131636. this.sys = world.scene.sys;
  131637. },
  131638. /**
  131639. * [description]
  131640. *
  131641. * @method Phaser.Physics.Impact.Factory#body
  131642. * @since 3.0.0
  131643. *
  131644. * @param {number} x - [description]
  131645. * @param {number} y - [description]
  131646. * @param {number} width - [description]
  131647. * @param {number} height - [description]
  131648. *
  131649. * @return {Phaser.Physics.Impact.ImpactBody} The ImpactBody object that was created.
  131650. */
  131651. body: function (x, y, width, height)
  131652. {
  131653. return new ImpactBody(this.world, x, y, width, height);
  131654. },
  131655. /**
  131656. * Adds an Impact Physics Body to the given Game Object.
  131657. *
  131658. * @method Phaser.Physics.Impact.Factory#existing
  131659. * @since 3.0.0
  131660. *
  131661. * @param {Phaser.GameObjects.GameObject} gameObject - [description]
  131662. *
  131663. * @return {Phaser.GameObjects.GameObject} The Game Object.
  131664. */
  131665. existing: function (gameObject)
  131666. {
  131667. var x = gameObject.x - gameObject.frame.centerX;
  131668. var y = gameObject.y - gameObject.frame.centerY;
  131669. var w = gameObject.width;
  131670. var h = gameObject.height;
  131671. gameObject.body = this.world.create(x, y, w, h);
  131672. gameObject.body.parent = gameObject;
  131673. gameObject.body.gameObject = gameObject;
  131674. return gameObject;
  131675. },
  131676. /**
  131677. * [description]
  131678. *
  131679. * @method Phaser.Physics.Impact.Factory#image
  131680. * @since 3.0.0
  131681. *
  131682. * @param {number} x - The horizontal position of this Game Object in the world.
  131683. * @param {number} y - The vertical position of this Game Object in the world.
  131684. * @param {string} key - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  131685. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  131686. *
  131687. * @return {Phaser.Physics.Impact.ImpactImage} The ImpactImage object that was created.
  131688. */
  131689. image: function (x, y, key, frame)
  131690. {
  131691. var image = new ImpactImage(this.world, x, y, key, frame);
  131692. this.sys.displayList.add(image);
  131693. return image;
  131694. },
  131695. /**
  131696. * [description]
  131697. *
  131698. * @method Phaser.Physics.Impact.Factory#sprite
  131699. * @since 3.0.0
  131700. *
  131701. * @param {number} x - The horizontal position of this Game Object in the world.
  131702. * @param {number} y - The vertical position of this Game Object in the world.
  131703. * @param {string} key - The key of the Texture this Game Object will use to render with, as stored in the Texture Manager.
  131704. * @param {(string|integer)} [frame] - An optional frame from the Texture this Game Object is rendering with.
  131705. *
  131706. * @return {Phaser.Physics.Impact.ImpactSprite} The ImpactSprite object that was created.
  131707. */
  131708. sprite: function (x, y, key, frame)
  131709. {
  131710. var sprite = new ImpactSprite(this.world, x, y, key, frame);
  131711. this.sys.displayList.add(sprite);
  131712. this.sys.updateList.add(sprite);
  131713. return sprite;
  131714. },
  131715. /**
  131716. * Destroys this Factory.
  131717. *
  131718. * @method Phaser.Physics.Impact.Factory#destroy
  131719. * @since 3.5.0
  131720. */
  131721. destroy: function ()
  131722. {
  131723. this.world = null;
  131724. this.sys = null;
  131725. }
  131726. });
  131727. module.exports = Factory;
  131728. /***/ }),
  131729. /* 1028 */
  131730. /***/ (function(module, exports, __webpack_require__) {
  131731. /**
  131732. * @author Richard Davey <rich@photonstorm.com>
  131733. * @copyright 2018 Photon Storm Ltd.
  131734. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  131735. */
  131736. var Class = __webpack_require__(0);
  131737. var DefaultDefs = __webpack_require__(1070);
  131738. /**
  131739. * @classdesc
  131740. * [description]
  131741. *
  131742. * @class CollisionMap
  131743. * @memberOf Phaser.Physics.Impact
  131744. * @constructor
  131745. * @since 3.0.0
  131746. *
  131747. * @param {integer} [tilesize=32] - [description]
  131748. * @param {array} [data] - [description]
  131749. */
  131750. var CollisionMap = new Class({
  131751. initialize:
  131752. function CollisionMap (tilesize, data)
  131753. {
  131754. if (tilesize === undefined) { tilesize = 32; }
  131755. /**
  131756. * [description]
  131757. *
  131758. * @name Phaser.Physics.Impact.CollisionMap#tilesize
  131759. * @type {integer}
  131760. * @default 32
  131761. * @since 3.0.0
  131762. */
  131763. this.tilesize = tilesize;
  131764. /**
  131765. * [description]
  131766. *
  131767. * @name Phaser.Physics.Impact.CollisionMap#data
  131768. * @type {array}
  131769. * @since 3.0.0
  131770. */
  131771. this.data = (Array.isArray(data)) ? data : [];
  131772. /**
  131773. * [description]
  131774. *
  131775. * @name Phaser.Physics.Impact.CollisionMap#width
  131776. * @type {number}
  131777. * @since 3.0.0
  131778. */
  131779. this.width = (Array.isArray(data)) ? data[0].length : 0;
  131780. /**
  131781. * [description]
  131782. *
  131783. * @name Phaser.Physics.Impact.CollisionMap#height
  131784. * @type {number}
  131785. * @since 3.0.0
  131786. */
  131787. this.height = (Array.isArray(data)) ? data.length : 0;
  131788. /**
  131789. * [description]
  131790. *
  131791. * @name Phaser.Physics.Impact.CollisionMap#lastSlope
  131792. * @type {integer}
  131793. * @default 55
  131794. * @since 3.0.0
  131795. */
  131796. this.lastSlope = 55;
  131797. /**
  131798. * [description]
  131799. *
  131800. * @name Phaser.Physics.Impact.CollisionMap#tiledef
  131801. * @type {object}
  131802. * @since 3.0.0
  131803. */
  131804. this.tiledef = DefaultDefs;
  131805. },
  131806. /**
  131807. * [description]
  131808. *
  131809. * @method Phaser.Physics.Impact.CollisionMap#trace
  131810. * @since 3.0.0
  131811. *
  131812. * @param {number} x - [description]
  131813. * @param {number} y - [description]
  131814. * @param {number} vx - [description]
  131815. * @param {number} vy - [description]
  131816. * @param {number} objectWidth - [description]
  131817. * @param {number} objectHeight - [description]
  131818. *
  131819. * @return {boolean} [description]
  131820. */
  131821. trace: function (x, y, vx, vy, objectWidth, objectHeight)
  131822. {
  131823. // Set up the trace-result
  131824. var res = {
  131825. collision: { x: false, y: false, slope: false },
  131826. pos: { x: x + vx, y: y + vy },
  131827. tile: { x: 0, y: 0 }
  131828. };
  131829. if (!this.data)
  131830. {
  131831. return res;
  131832. }
  131833. var steps = Math.ceil(Math.max(Math.abs(vx), Math.abs(vy)) / this.tilesize);
  131834. if (steps > 1)
  131835. {
  131836. var sx = vx / steps;
  131837. var sy = vy / steps;
  131838. for (var i = 0; i < steps && (sx || sy); i++)
  131839. {
  131840. this.step(res, x, y, sx, sy, objectWidth, objectHeight, vx, vy, i);
  131841. x = res.pos.x;
  131842. y = res.pos.y;
  131843. if (res.collision.x)
  131844. {
  131845. sx = 0;
  131846. vx = 0;
  131847. }
  131848. if (res.collision.y)
  131849. {
  131850. sy = 0;
  131851. vy = 0;
  131852. }
  131853. if (res.collision.slope)
  131854. {
  131855. break;
  131856. }
  131857. }
  131858. }
  131859. else
  131860. {
  131861. this.step(res, x, y, vx, vy, objectWidth, objectHeight, vx, vy, 0);
  131862. }
  131863. return res;
  131864. },
  131865. /**
  131866. * [description]
  131867. *
  131868. * @method Phaser.Physics.Impact.CollisionMap#step
  131869. * @since 3.0.0
  131870. *
  131871. * @param {object} res - [description]
  131872. * @param {number} x - [description]
  131873. * @param {number} y - [description]
  131874. * @param {number} vx - [description]
  131875. * @param {number} vy - [description]
  131876. * @param {number} width - [description]
  131877. * @param {number} height - [description]
  131878. * @param {number} rvx - [description]
  131879. * @param {number} rvy - [description]
  131880. * @param {number} step - [description]
  131881. */
  131882. step: function (res, x, y, vx, vy, width, height, rvx, rvy, step)
  131883. {
  131884. var t = 0;
  131885. var tileX;
  131886. var tileY;
  131887. var tilesize = this.tilesize;
  131888. var mapWidth = this.width;
  131889. var mapHeight = this.height;
  131890. // Horizontal
  131891. if (vx)
  131892. {
  131893. var pxOffsetX = (vx > 0 ? width : 0);
  131894. var tileOffsetX = (vx < 0 ? tilesize : 0);
  131895. var firstTileY = Math.max(Math.floor(y / tilesize), 0);
  131896. var lastTileY = Math.min(Math.ceil((y + height) / tilesize), mapHeight);
  131897. tileX = Math.floor((res.pos.x + pxOffsetX) / tilesize);
  131898. var prevTileX = Math.floor((x + pxOffsetX) / tilesize);
  131899. if (step > 0 || tileX === prevTileX || prevTileX < 0 || prevTileX >= mapWidth)
  131900. {
  131901. prevTileX = -1;
  131902. }
  131903. if (tileX >= 0 && tileX < mapWidth)
  131904. {
  131905. for (tileY = firstTileY; tileY < lastTileY; tileY++)
  131906. {
  131907. if (prevTileX !== -1)
  131908. {
  131909. t = this.data[tileY][prevTileX];
  131910. if (t > 1 && t <= this.lastSlope && this.checkDef(res, t, x, y, rvx, rvy, width, height, prevTileX, tileY))
  131911. {
  131912. break;
  131913. }
  131914. }
  131915. t = this.data[tileY][tileX];
  131916. if (t === 1 || t > this.lastSlope || (t > 1 && this.checkDef(res, t, x, y, rvx, rvy, width, height, tileX, tileY)))
  131917. {
  131918. if (t > 1 && t <= this.lastSlope && res.collision.slope)
  131919. {
  131920. break;
  131921. }
  131922. res.collision.x = true;
  131923. res.tile.x = t;
  131924. res.pos.x = (tileX * tilesize) - pxOffsetX + tileOffsetX;
  131925. x = res.pos.x;
  131926. rvx = 0;
  131927. break;
  131928. }
  131929. }
  131930. }
  131931. }
  131932. // Vertical
  131933. if (vy)
  131934. {
  131935. var pxOffsetY = (vy > 0 ? height : 0);
  131936. var tileOffsetY = (vy < 0 ? tilesize : 0);
  131937. var firstTileX = Math.max(Math.floor(res.pos.x / tilesize), 0);
  131938. var lastTileX = Math.min(Math.ceil((res.pos.x + width) / tilesize), mapWidth);
  131939. tileY = Math.floor((res.pos.y + pxOffsetY) / tilesize);
  131940. var prevTileY = Math.floor((y + pxOffsetY) / tilesize);
  131941. if (step > 0 || tileY === prevTileY || prevTileY < 0 || prevTileY >= mapHeight)
  131942. {
  131943. prevTileY = -1;
  131944. }
  131945. if (tileY >= 0 && tileY < mapHeight)
  131946. {
  131947. for (tileX = firstTileX; tileX < lastTileX; tileX++)
  131948. {
  131949. if (prevTileY !== -1)
  131950. {
  131951. t = this.data[prevTileY][tileX];
  131952. if (t > 1 && t <= this.lastSlope && this.checkDef(res, t, x, y, rvx, rvy, width, height, tileX, prevTileY))
  131953. {
  131954. break;
  131955. }
  131956. }
  131957. t = this.data[tileY][tileX];
  131958. if (t === 1 || t > this.lastSlope || (t > 1 && this.checkDef(res, t, x, y, rvx, rvy, width, height, tileX, tileY)))
  131959. {
  131960. if (t > 1 && t <= this.lastSlope && res.collision.slope)
  131961. {
  131962. break;
  131963. }
  131964. res.collision.y = true;
  131965. res.tile.y = t;
  131966. res.pos.y = tileY * tilesize - pxOffsetY + tileOffsetY;
  131967. break;
  131968. }
  131969. }
  131970. }
  131971. }
  131972. },
  131973. /**
  131974. * [description]
  131975. *
  131976. * @method Phaser.Physics.Impact.CollisionMap#checkDef
  131977. * @since 3.0.0
  131978. *
  131979. * @param {object} res - [description]
  131980. * @param {number} t - [description]
  131981. * @param {number} x - [description]
  131982. * @param {number} y - [description]
  131983. * @param {number} vx - [description]
  131984. * @param {number} vy - [description]
  131985. * @param {number} width - [description]
  131986. * @param {number} height - [description]
  131987. * @param {number} tileX - [description]
  131988. * @param {number} tileY - [description]
  131989. *
  131990. * @return {boolean} [description]
  131991. */
  131992. checkDef: function (res, t, x, y, vx, vy, width, height, tileX, tileY)
  131993. {
  131994. var def = this.tiledef[t];
  131995. if (!def)
  131996. {
  131997. return false;
  131998. }
  131999. var tilesize = this.tilesize;
  132000. var lx = (tileX + def[0]) * tilesize;
  132001. var ly = (tileY + def[1]) * tilesize;
  132002. var lvx = (def[2] - def[0]) * tilesize;
  132003. var lvy = (def[3] - def[1]) * tilesize;
  132004. var solid = def[4];
  132005. var tx = x + vx + (lvy < 0 ? width : 0) - lx;
  132006. var ty = y + vy + (lvx > 0 ? height : 0) - ly;
  132007. if (lvx * ty - lvy * tx > 0)
  132008. {
  132009. if (vx * -lvy + vy * lvx < 0)
  132010. {
  132011. return solid;
  132012. }
  132013. var length = Math.sqrt(lvx * lvx + lvy * lvy);
  132014. var nx = lvy / length;
  132015. var ny = -lvx / length;
  132016. var proj = tx * nx + ty * ny;
  132017. var px = nx * proj;
  132018. var py = ny * proj;
  132019. if (px * px + py * py >= vx * vx + vy * vy)
  132020. {
  132021. return solid || (lvx * (ty - vy) - lvy * (tx - vx) < 0.5);
  132022. }
  132023. res.pos.x = x + vx - px;
  132024. res.pos.y = y + vy - py;
  132025. res.collision.slope = { x: lvx, y: lvy, nx: nx, ny: ny };
  132026. return true;
  132027. }
  132028. return false;
  132029. }
  132030. });
  132031. module.exports = CollisionMap;
  132032. /***/ }),
  132033. /* 1029 */
  132034. /***/ (function(module, exports, __webpack_require__) {
  132035. /**
  132036. * @author Richard Davey <rich@photonstorm.com>
  132037. * @copyright 2018 Photon Storm Ltd.
  132038. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  132039. */
  132040. var Class = __webpack_require__(0);
  132041. var COLLIDES = __webpack_require__(338);
  132042. var GetVelocity = __webpack_require__(1072);
  132043. var TYPE = __webpack_require__(337);
  132044. var UpdateMotion = __webpack_require__(1071);
  132045. /**
  132046. * @callback BodyUpdateCallback
  132047. *
  132048. * @param {Phaser.Physics.Impact.Body} body - [description]
  132049. */
  132050. /**
  132051. * @typedef {object} JSONImpactBody
  132052. * @todo Replace object types
  132053. *
  132054. * @property {string} name - [description]
  132055. * @property {object} size - [description]
  132056. * @property {object} pos - [description]
  132057. * @property {object} vel - [description]
  132058. * @property {object} accel - [description]
  132059. * @property {object} friction - [description]
  132060. * @property {object} maxVel - [description]
  132061. * @property {number} gravityFactor - [description]
  132062. * @property {number} bounciness - [description]
  132063. * @property {number} minBounceVelocity - [description]
  132064. * @property {Phaser.Physics.Impact.TYPE} type - [description]
  132065. * @property {Phaser.Physics.Impact.TYPE} checkAgainst - [description]
  132066. * @property {Phaser.Physics.Impact.COLLIDES} collides - [description]
  132067. */
  132068. /**
  132069. * @classdesc
  132070. * An Impact.js compatible physics body.
  132071. * This re-creates the properties you'd get on an Entity and the math needed to update them.
  132072. *
  132073. * @class Body
  132074. * @memberOf Phaser.Physics.Impact
  132075. * @constructor
  132076. * @since 3.0.0
  132077. *
  132078. * @param {Phaser.Physics.Impact.World} world - [description]
  132079. * @param {number} x - [description]
  132080. * @param {number} y - [description]
  132081. * @param {number} [sx=16] - [description]
  132082. * @param {number} [sy=16] - [description]
  132083. */
  132084. var Body = new Class({
  132085. initialize:
  132086. function Body (world, x, y, sx, sy)
  132087. {
  132088. if (sx === undefined) { sx = 16; }
  132089. if (sy === undefined) { sy = sx; }
  132090. /**
  132091. * [description]
  132092. *
  132093. * @name Phaser.Physics.Impact.Body#world
  132094. * @type {Phaser.Physics.Impact.World}
  132095. * @since 3.0.0
  132096. */
  132097. this.world = world;
  132098. /**
  132099. * [description]
  132100. *
  132101. * @name Phaser.Physics.Impact.Body#gameObject
  132102. * @type {Phaser.GameObjects.GameObject}
  132103. * @default null
  132104. * @since 3.0.0
  132105. */
  132106. this.gameObject = null;
  132107. /**
  132108. * [description]
  132109. *
  132110. * @name Phaser.Physics.Impact.Body#enabled
  132111. * @type {boolean}
  132112. * @default true
  132113. * @since 3.0.0
  132114. */
  132115. this.enabled = true;
  132116. /**
  132117. * The ImpactBody, ImpactSprite or ImpactImage object that owns this Body, if any.
  132118. *
  132119. * @name Phaser.Physics.Impact.Body#parent
  132120. * @type {?(Phaser.Physics.Impact.ImpactBody|Phaser.Physics.Impact.ImpactImage|Phaser.Physics.Impact.ImpactSprite)}
  132121. * @since 3.0.0
  132122. */
  132123. this.parent;
  132124. /**
  132125. * [description]
  132126. *
  132127. * @name Phaser.Physics.Impact.Body#id
  132128. * @type {integer}
  132129. * @since 3.0.0
  132130. */
  132131. this.id = world.getNextID();
  132132. /**
  132133. * [description]
  132134. *
  132135. * @name Phaser.Physics.Impact.Body#name
  132136. * @type {string}
  132137. * @default ''
  132138. * @since 3.0.0
  132139. */
  132140. this.name = '';
  132141. /**
  132142. * [description]
  132143. *
  132144. * @name Phaser.Physics.Impact.Body#size
  132145. * @type {{x: number, y: number}}
  132146. * @since 3.0.0
  132147. */
  132148. this.size = { x: sx, y: sy };
  132149. /**
  132150. * [description]
  132151. *
  132152. * @name Phaser.Physics.Impact.Body#offset
  132153. * @type {{x: number, y: number}}
  132154. * @since 3.0.0
  132155. */
  132156. this.offset = { x: 0, y: 0 };
  132157. /**
  132158. * [description]
  132159. *
  132160. * @name Phaser.Physics.Impact.Body#pos
  132161. * @type {{x: number, y: number}}
  132162. * @since 3.0.0
  132163. */
  132164. this.pos = { x: x, y: y };
  132165. /**
  132166. * [description]
  132167. *
  132168. * @name Phaser.Physics.Impact.Body#last
  132169. * @type {{x: number, y: number}}
  132170. * @since 3.0.0
  132171. */
  132172. this.last = { x: x, y: y };
  132173. /**
  132174. * [description]
  132175. *
  132176. * @name Phaser.Physics.Impact.Body#vel
  132177. * @type {{x: number, y: number}}
  132178. * @since 3.0.0
  132179. */
  132180. this.vel = { x: 0, y: 0 };
  132181. /**
  132182. * [description]
  132183. *
  132184. * @name Phaser.Physics.Impact.Body#accel
  132185. * @type {{x: number, y: number}}
  132186. * @since 3.0.0
  132187. */
  132188. this.accel = { x: 0, y: 0 };
  132189. /**
  132190. * [description]
  132191. *
  132192. * @name Phaser.Physics.Impact.Body#friction
  132193. * @type {{x: number, y: number}}
  132194. * @since 3.0.0
  132195. */
  132196. this.friction = { x: 0, y: 0 };
  132197. /**
  132198. * [description]
  132199. *
  132200. * @name Phaser.Physics.Impact.Body#maxVel
  132201. * @type {{x: number, y: number}}
  132202. * @since 3.0.0
  132203. */
  132204. this.maxVel = { x: world.defaults.maxVelocityX, y: world.defaults.maxVelocityY };
  132205. /**
  132206. * [description]
  132207. *
  132208. * @name Phaser.Physics.Impact.Body#standing
  132209. * @type {boolean}
  132210. * @default false
  132211. * @since 3.0.0
  132212. */
  132213. this.standing = false;
  132214. /**
  132215. * [description]
  132216. *
  132217. * @name Phaser.Physics.Impact.Body#gravityFactor
  132218. * @type {number}
  132219. * @since 3.0.0
  132220. */
  132221. this.gravityFactor = world.defaults.gravityFactor;
  132222. /**
  132223. * [description]
  132224. *
  132225. * @name Phaser.Physics.Impact.Body#bounciness
  132226. * @type {number}
  132227. * @since 3.0.0
  132228. */
  132229. this.bounciness = world.defaults.bounciness;
  132230. /**
  132231. * [description]
  132232. *
  132233. * @name Phaser.Physics.Impact.Body#minBounceVelocity
  132234. * @type {number}
  132235. * @since 3.0.0
  132236. */
  132237. this.minBounceVelocity = world.defaults.minBounceVelocity;
  132238. /**
  132239. * [description]
  132240. *
  132241. * @name Phaser.Physics.Impact.Body#accelGround
  132242. * @type {number}
  132243. * @default 0
  132244. * @since 3.0.0
  132245. */
  132246. this.accelGround = 0;
  132247. /**
  132248. * [description]
  132249. *
  132250. * @name Phaser.Physics.Impact.Body#accelAir
  132251. * @type {number}
  132252. * @default 0
  132253. * @since 3.0.0
  132254. */
  132255. this.accelAir = 0;
  132256. /**
  132257. * [description]
  132258. *
  132259. * @name Phaser.Physics.Impact.Body#jumpSpeed
  132260. * @type {number}
  132261. * @default 0
  132262. * @since 3.0.0
  132263. */
  132264. this.jumpSpeed = 0;
  132265. /**
  132266. * [description]
  132267. *
  132268. * @name Phaser.Physics.Impact.Body#type
  132269. * @type {Phaser.Physics.Impact.TYPE}
  132270. * @since 3.0.0
  132271. */
  132272. this.type = TYPE.NONE;
  132273. /**
  132274. * [description]
  132275. *
  132276. * @name Phaser.Physics.Impact.Body#checkAgainst
  132277. * @type {Phaser.Physics.Impact.TYPE}
  132278. * @since 3.0.0
  132279. */
  132280. this.checkAgainst = TYPE.NONE;
  132281. /**
  132282. * [description]
  132283. *
  132284. * @name Phaser.Physics.Impact.Body#collides
  132285. * @type {Phaser.Physics.Impact.COLLIDES}
  132286. * @since 3.0.0
  132287. */
  132288. this.collides = COLLIDES.NEVER;
  132289. /**
  132290. * [description]
  132291. *
  132292. * @name Phaser.Physics.Impact.Body#debugShowBody
  132293. * @type {boolean}
  132294. * @since 3.0.0
  132295. */
  132296. this.debugShowBody = world.defaults.debugShowBody;
  132297. /**
  132298. * [description]
  132299. *
  132300. * @name Phaser.Physics.Impact.Body#debugShowVelocity
  132301. * @type {boolean}
  132302. * @since 3.0.0
  132303. */
  132304. this.debugShowVelocity = world.defaults.debugShowVelocity;
  132305. /**
  132306. * [description]
  132307. *
  132308. * @name Phaser.Physics.Impact.Body#debugBodyColor
  132309. * @type {integer}
  132310. * @since 3.0.0
  132311. */
  132312. this.debugBodyColor = world.defaults.bodyDebugColor;
  132313. /**
  132314. * [description]
  132315. *
  132316. * @name Phaser.Physics.Impact.Body#updateCallback
  132317. * @type {?BodyUpdateCallback}
  132318. * @since 3.0.0
  132319. */
  132320. this.updateCallback;
  132321. /**
  132322. * min 44 deg, max 136 deg
  132323. *
  132324. * @name Phaser.Physics.Impact.Body#slopeStanding
  132325. * @type {{ min: number, max: number }}
  132326. * @since 3.0.0
  132327. */
  132328. this.slopeStanding = { min: 0.767944870877505, max: 2.3736477827122884 };
  132329. },
  132330. /**
  132331. * [description]
  132332. *
  132333. * @method Phaser.Physics.Impact.Body#reset
  132334. * @since 3.0.0
  132335. *
  132336. * @param {number} x - [description]
  132337. * @param {number} y - [description]
  132338. */
  132339. reset: function (x, y)
  132340. {
  132341. this.pos = { x: x, y: y };
  132342. this.last = { x: x, y: y };
  132343. this.vel = { x: 0, y: 0 };
  132344. this.accel = { x: 0, y: 0 };
  132345. this.friction = { x: 0, y: 0 };
  132346. this.maxVel = { x: 100, y: 100 };
  132347. this.standing = false;
  132348. this.gravityFactor = 1;
  132349. this.bounciness = 0;
  132350. this.minBounceVelocity = 40;
  132351. this.accelGround = 0;
  132352. this.accelAir = 0;
  132353. this.jumpSpeed = 0;
  132354. this.type = TYPE.NONE;
  132355. this.checkAgainst = TYPE.NONE;
  132356. this.collides = COLLIDES.NEVER;
  132357. },
  132358. /**
  132359. * [description]
  132360. *
  132361. * @method Phaser.Physics.Impact.Body#update
  132362. * @since 3.0.0
  132363. *
  132364. * @param {number} delta - [description]
  132365. */
  132366. update: function (delta)
  132367. {
  132368. var pos = this.pos;
  132369. this.last.x = pos.x;
  132370. this.last.y = pos.y;
  132371. this.vel.y += this.world.gravity * delta * this.gravityFactor;
  132372. this.vel.x = GetVelocity(delta, this.vel.x, this.accel.x, this.friction.x, this.maxVel.x);
  132373. this.vel.y = GetVelocity(delta, this.vel.y, this.accel.y, this.friction.y, this.maxVel.y);
  132374. var mx = this.vel.x * delta;
  132375. var my = this.vel.y * delta;
  132376. var res = this.world.collisionMap.trace(pos.x, pos.y, mx, my, this.size.x, this.size.y);
  132377. if (this.handleMovementTrace(res))
  132378. {
  132379. UpdateMotion(this, res);
  132380. }
  132381. var go = this.gameObject;
  132382. if (go)
  132383. {
  132384. go.x = (pos.x - this.offset.x) + go.displayOriginX * go.scaleX;
  132385. go.y = (pos.y - this.offset.y) + go.displayOriginY * go.scaleY;
  132386. }
  132387. if (this.updateCallback)
  132388. {
  132389. this.updateCallback(this);
  132390. }
  132391. },
  132392. /**
  132393. * [description]
  132394. *
  132395. * @method Phaser.Physics.Impact.Body#drawDebug
  132396. * @since 3.0.0
  132397. *
  132398. * @param {Phaser.GameObjects.Graphics} graphic - [description]
  132399. */
  132400. drawDebug: function (graphic)
  132401. {
  132402. var pos = this.pos;
  132403. if (this.debugShowBody)
  132404. {
  132405. graphic.lineStyle(1, this.debugBodyColor, 1);
  132406. graphic.strokeRect(pos.x, pos.y, this.size.x, this.size.y);
  132407. }
  132408. if (this.debugShowVelocity)
  132409. {
  132410. var x = pos.x + this.size.x / 2;
  132411. var y = pos.y + this.size.y / 2;
  132412. graphic.lineStyle(1, this.world.defaults.velocityDebugColor, 1);
  132413. graphic.lineBetween(x, y, x + this.vel.x, y + this.vel.y);
  132414. }
  132415. },
  132416. /**
  132417. * [description]
  132418. *
  132419. * @method Phaser.Physics.Impact.Body#willDrawDebug
  132420. * @since 3.0.0
  132421. *
  132422. * @return {boolean} [description]
  132423. */
  132424. willDrawDebug: function ()
  132425. {
  132426. return (this.debugShowBody || this.debugShowVelocity);
  132427. },
  132428. /**
  132429. * [description]
  132430. *
  132431. * @method Phaser.Physics.Impact.Body#skipHash
  132432. * @since 3.0.0
  132433. *
  132434. * @return {boolean} [description]
  132435. */
  132436. skipHash: function ()
  132437. {
  132438. return (!this.enabled || (this.type === 0 && this.checkAgainst === 0 && this.collides === 0));
  132439. },
  132440. /**
  132441. * [description]
  132442. *
  132443. * @method Phaser.Physics.Impact.Body#touches
  132444. * @since 3.0.0
  132445. *
  132446. * @param {Phaser.Physics.Impact.Body} other - [description]
  132447. *
  132448. * @return {boolean} [description]
  132449. */
  132450. touches: function (other)
  132451. {
  132452. return !(
  132453. this.pos.x >= other.pos.x + other.size.x ||
  132454. this.pos.x + this.size.x <= other.pos.x ||
  132455. this.pos.y >= other.pos.y + other.size.y ||
  132456. this.pos.y + this.size.y <= other.pos.y
  132457. );
  132458. },
  132459. /**
  132460. * [description]
  132461. *
  132462. * @method Phaser.Physics.Impact.Body#resetSize
  132463. * @since 3.0.0
  132464. *
  132465. * @param {number} x - [description]
  132466. * @param {number} y - [description]
  132467. * @param {number} width - [description]
  132468. * @param {number} height - [description]
  132469. *
  132470. * @return {Phaser.Physics.Impact.Body} This Body object.
  132471. */
  132472. resetSize: function (x, y, width, height)
  132473. {
  132474. this.pos.x = x;
  132475. this.pos.y = y;
  132476. this.size.x = width;
  132477. this.size.y = height;
  132478. return this;
  132479. },
  132480. /**
  132481. * [description]
  132482. *
  132483. * @method Phaser.Physics.Impact.Body#toJSON
  132484. * @since 3.0.0
  132485. *
  132486. * @return {JSONImpactBody} [description]
  132487. */
  132488. toJSON: function ()
  132489. {
  132490. var output = {
  132491. name: this.name,
  132492. size: { x: this.size.x, y: this.size.y },
  132493. pos: { x: this.pos.x, y: this.pos.y },
  132494. vel: { x: this.vel.x, y: this.vel.y },
  132495. accel: { x: this.accel.x, y: this.accel.y },
  132496. friction: { x: this.friction.x, y: this.friction.y },
  132497. maxVel: { x: this.maxVel.x, y: this.maxVel.y },
  132498. gravityFactor: this.gravityFactor,
  132499. bounciness: this.bounciness,
  132500. minBounceVelocity: this.minBounceVelocity,
  132501. type: this.type,
  132502. checkAgainst: this.checkAgainst,
  132503. collides: this.collides
  132504. };
  132505. return output;
  132506. },
  132507. /**
  132508. * [description]
  132509. *
  132510. * @method Phaser.Physics.Impact.Body#fromJSON
  132511. * @todo Code it!
  132512. * @since 3.0.0
  132513. *
  132514. * @param {object} config - [description]
  132515. */
  132516. fromJSON: function ()
  132517. {
  132518. },
  132519. /**
  132520. * Can be overridden by user code
  132521. *
  132522. * @method Phaser.Physics.Impact.Body#check
  132523. * @since 3.0.0
  132524. *
  132525. * @param {Phaser.Physics.Impact.Body} other - [description]
  132526. */
  132527. check: function ()
  132528. {
  132529. },
  132530. /**
  132531. * Can be overridden by user code
  132532. *
  132533. * @method Phaser.Physics.Impact.Body#collideWith
  132534. * @since 3.0.0
  132535. *
  132536. * @param {Phaser.Physics.Impact.Body} other - [description]
  132537. * @param {string} axis - [description]
  132538. */
  132539. collideWith: function (other, axis)
  132540. {
  132541. if (this.parent && this.parent._collideCallback)
  132542. {
  132543. this.parent._collideCallback.call(this.parent._callbackScope, this, other, axis);
  132544. }
  132545. },
  132546. /**
  132547. * Can be overridden by user code but must return a boolean.
  132548. *
  132549. * @method Phaser.Physics.Impact.Body#handleMovementTrace
  132550. * @since 3.0.0
  132551. *
  132552. * @param {number} res - [description]
  132553. *
  132554. * @return {boolean} [description]
  132555. */
  132556. handleMovementTrace: function ()
  132557. {
  132558. return true;
  132559. },
  132560. /**
  132561. * [description]
  132562. *
  132563. * @method Phaser.Physics.Impact.Body#destroy
  132564. * @since 3.0.0
  132565. */
  132566. destroy: function ()
  132567. {
  132568. this.world.remove(this);
  132569. this.enabled = false;
  132570. this.world = null;
  132571. this.gameObject = null;
  132572. this.parent = null;
  132573. }
  132574. });
  132575. module.exports = Body;
  132576. /***/ }),
  132577. /* 1030 */,
  132578. /* 1031 */,
  132579. /* 1032 */
  132580. /***/ (function(module, exports, __webpack_require__) {
  132581. var Matter = __webpack_require__(681);
  132582. /**
  132583. * A coordinate wrapping plugin for matter.js.
  132584. * See the readme for usage and examples.
  132585. * @module MatterWrap
  132586. */
  132587. var MatterWrap = {
  132588. // plugin meta
  132589. name: 'matter-wrap', // PLUGIN_NAME
  132590. version: '0.1.4', // PLUGIN_VERSION
  132591. for: 'matter-js@^0.13.1',
  132592. silent: true, // no console log please
  132593. // installs the plugin where `base` is `Matter`
  132594. // you should not need to call this directly.
  132595. install: function(base) {
  132596. base.after('Engine.update', function() {
  132597. MatterWrap.Engine.update(this);
  132598. });
  132599. },
  132600. Engine: {
  132601. /**
  132602. * Updates the engine by wrapping bodies and composites inside `engine.world`.
  132603. * This is called automatically by the plugin.
  132604. * @function MatterWrap.Engine.update
  132605. * @param {Matter.Engine} engine The engine to update.
  132606. * @returns {void} No return value.
  132607. */
  132608. update: function(engine) {
  132609. var world = engine.world,
  132610. bodies = Matter.Composite.allBodies(world),
  132611. composites = Matter.Composite.allComposites(world);
  132612. for (var i = 0; i < bodies.length; i += 1) {
  132613. var body = bodies[i];
  132614. if (body.plugin.wrap) {
  132615. MatterWrap.Body.wrap(body, body.plugin.wrap);
  132616. }
  132617. }
  132618. for (i = 0; i < composites.length; i += 1) {
  132619. var composite = composites[i];
  132620. if (composite.plugin.wrap) {
  132621. MatterWrap.Composite.wrap(composite, composite.plugin.wrap);
  132622. }
  132623. }
  132624. }
  132625. },
  132626. Bounds: {
  132627. /**
  132628. * Returns a translation vector that wraps the `objectBounds` inside the `bounds`.
  132629. * @function MatterWrap.Bounds.wrap
  132630. * @param {Matter.Bounds} objectBounds The bounds of the object to wrap inside the bounds.
  132631. * @param {Matter.Bounds} bounds The bounds to wrap the body inside.
  132632. * @returns {?Matter.Vector} A translation vector (only if wrapping is required).
  132633. */
  132634. wrap: function(objectBounds, bounds) {
  132635. var x = null,
  132636. y = null;
  132637. if (typeof bounds.min.x !== 'undefined' && typeof bounds.max.x !== 'undefined') {
  132638. if (objectBounds.min.x > bounds.max.x) {
  132639. x = bounds.min.x - objectBounds.max.x;
  132640. } else if (objectBounds.max.x < bounds.min.x) {
  132641. x = bounds.max.x - objectBounds.min.x;
  132642. }
  132643. }
  132644. if (typeof bounds.min.y !== 'undefined' && typeof bounds.max.y !== 'undefined') {
  132645. if (objectBounds.min.y > bounds.max.y) {
  132646. y = bounds.min.y - objectBounds.max.y;
  132647. } else if (objectBounds.max.y < bounds.min.y) {
  132648. y = bounds.max.y - objectBounds.min.y;
  132649. }
  132650. }
  132651. if (x !== null || y !== null) {
  132652. return {
  132653. x: x || 0,
  132654. y: y || 0
  132655. };
  132656. }
  132657. }
  132658. },
  132659. Body: {
  132660. /**
  132661. * Wraps the `body` position such that it always stays within the given bounds.
  132662. * Upon crossing a boundary the body will appear on the opposite side of the bounds,
  132663. * while maintaining its velocity.
  132664. * This is called automatically by the plugin.
  132665. * @function MatterWrap.Body.wrap
  132666. * @param {Matter.Body} body The body to wrap.
  132667. * @param {Matter.Bounds} bounds The bounds to wrap the body inside.
  132668. * @returns {?Matter.Vector} The translation vector that was applied (only if wrapping was required).
  132669. */
  132670. wrap: function(body, bounds) {
  132671. var translation = MatterWrap.Bounds.wrap(body.bounds, bounds);
  132672. if (translation) {
  132673. Matter.Body.translate(body, translation);
  132674. }
  132675. return translation;
  132676. }
  132677. },
  132678. Composite: {
  132679. /**
  132680. * Returns the union of the bounds of all of the composite's bodies
  132681. * (not accounting for constraints).
  132682. * @function MatterWrap.Composite.bounds
  132683. * @param {Matter.Composite} composite The composite.
  132684. * @returns {Matter.Bounds} The composite bounds.
  132685. */
  132686. bounds: function(composite) {
  132687. var bodies = Matter.Composite.allBodies(composite),
  132688. vertices = [];
  132689. for (var i = 0; i < bodies.length; i += 1) {
  132690. var body = bodies[i];
  132691. vertices.push(body.bounds.min, body.bounds.max);
  132692. }
  132693. return Matter.Bounds.create(vertices);
  132694. },
  132695. /**
  132696. * Wraps the `composite` position such that it always stays within the given bounds.
  132697. * Upon crossing a boundary the composite will appear on the opposite side of the bounds,
  132698. * while maintaining its velocity.
  132699. * This is called automatically by the plugin.
  132700. * @function MatterWrap.Composite.wrap
  132701. * @param {Matter.Composite} composite The composite to wrap.
  132702. * @param {Matter.Bounds} bounds The bounds to wrap the composite inside.
  132703. * @returns {?Matter.Vector} The translation vector that was applied (only if wrapping was required).
  132704. */
  132705. wrap: function(composite, bounds) {
  132706. var translation = MatterWrap.Bounds.wrap(
  132707. MatterWrap.Composite.bounds(composite),
  132708. bounds
  132709. );
  132710. if (translation) {
  132711. Matter.Composite.translate(composite, translation);
  132712. }
  132713. return translation;
  132714. }
  132715. }
  132716. };
  132717. module.exports = MatterWrap;
  132718. /**
  132719. * @namespace Matter.Body
  132720. * @see http://brm.io/matter-js/docs/classes/Body.html
  132721. */
  132722. /**
  132723. * This plugin adds a new property `body.plugin.wrap` to instances of `Matter.Body`.
  132724. * This is a `Matter.Bounds` instance that specifies the wrapping region.
  132725. * @property {Matter.Bounds} body.plugin.wrap
  132726. * @memberof Matter.Body
  132727. */
  132728. /**
  132729. * This plugin adds a new property `composite.plugin.wrap` to instances of `Matter.Composite`.
  132730. * This is a `Matter.Bounds` instance that specifies the wrapping region.
  132731. * @property {Matter.Bounds} composite.plugin.wrap
  132732. * @memberof Matter.Composite
  132733. */
  132734. /***/ }),
  132735. /* 1033 */
  132736. /***/ (function(module, exports, __webpack_require__) {
  132737. var Matter = __webpack_require__(681);
  132738. /**
  132739. * An attractors plugin for matter.js.
  132740. * See the readme for usage and examples.
  132741. * @module MatterAttractors
  132742. */
  132743. var MatterAttractors = {
  132744. // plugin meta
  132745. name: 'matter-attractors', // PLUGIN_NAME
  132746. version: '0.1.7', // PLUGIN_VERSION
  132747. for: 'matter-js@^0.13.1',
  132748. silent: true, // no console log please
  132749. // installs the plugin where `base` is `Matter`
  132750. // you should not need to call this directly.
  132751. install: function(base) {
  132752. base.after('Body.create', function() {
  132753. MatterAttractors.Body.init(this);
  132754. });
  132755. base.before('Engine.update', function(engine) {
  132756. MatterAttractors.Engine.update(engine);
  132757. });
  132758. },
  132759. Body: {
  132760. /**
  132761. * Initialises the `body` to support attractors.
  132762. * This is called automatically by the plugin.
  132763. * @function MatterAttractors.Body.init
  132764. * @param {Matter.Body} body The body to init.
  132765. * @returns {void} No return value.
  132766. */
  132767. init: function(body) {
  132768. body.plugin.attractors = body.plugin.attractors || [];
  132769. }
  132770. },
  132771. Engine: {
  132772. /**
  132773. * Applies all attractors for all bodies in the `engine`.
  132774. * This is called automatically by the plugin.
  132775. * @function MatterAttractors.Engine.update
  132776. * @param {Matter.Engine} engine The engine to update.
  132777. * @returns {void} No return value.
  132778. */
  132779. update: function(engine) {
  132780. var world = engine.world,
  132781. bodies = Matter.Composite.allBodies(world);
  132782. for (var i = 0; i < bodies.length; i += 1) {
  132783. var bodyA = bodies[i],
  132784. attractors = bodyA.plugin.attractors;
  132785. if (attractors && attractors.length > 0) {
  132786. for (var j = i + 1; j < bodies.length; j += 1) {
  132787. var bodyB = bodies[j];
  132788. for (var k = 0; k < attractors.length; k += 1) {
  132789. var attractor = attractors[k],
  132790. forceVector = attractor;
  132791. if (Matter.Common.isFunction(attractor)) {
  132792. forceVector = attractor(bodyA, bodyB);
  132793. }
  132794. if (forceVector) {
  132795. Matter.Body.applyForce(bodyB, bodyB.position, forceVector);
  132796. }
  132797. }
  132798. }
  132799. }
  132800. }
  132801. }
  132802. },
  132803. /**
  132804. * Defines some useful common attractor functions that can be used
  132805. * by pushing them to your body's `body.plugin.attractors` array.
  132806. * @namespace MatterAttractors.Attractors
  132807. * @property {number} gravityConstant The gravitational constant used by the gravity attractor.
  132808. */
  132809. Attractors: {
  132810. gravityConstant: 0.001,
  132811. /**
  132812. * An attractor function that applies Newton's law of gravitation.
  132813. * Use this by pushing `MatterAttractors.Attractors.gravity` to your body's `body.plugin.attractors` array.
  132814. * The gravitational constant defaults to `0.001` which you can change
  132815. * at `MatterAttractors.Attractors.gravityConstant`.
  132816. * @function MatterAttractors.Attractors.gravity
  132817. * @param {Matter.Body} bodyA The first body.
  132818. * @param {Matter.Body} bodyB The second body.
  132819. * @returns {void} No return value.
  132820. */
  132821. gravity: function(bodyA, bodyB) {
  132822. // use Newton's law of gravitation
  132823. var bToA = Matter.Vector.sub(bodyB.position, bodyA.position),
  132824. distanceSq = Matter.Vector.magnitudeSquared(bToA) || 0.0001,
  132825. normal = Matter.Vector.normalise(bToA),
  132826. magnitude = -MatterAttractors.Attractors.gravityConstant * (bodyA.mass * bodyB.mass / distanceSq),
  132827. force = Matter.Vector.mult(normal, magnitude);
  132828. // to apply forces to both bodies
  132829. Matter.Body.applyForce(bodyA, bodyA.position, Matter.Vector.neg(force));
  132830. Matter.Body.applyForce(bodyB, bodyB.position, force);
  132831. }
  132832. }
  132833. };
  132834. module.exports = MatterAttractors;
  132835. /**
  132836. * @namespace Matter.Body
  132837. * @see http://brm.io/matter-js/docs/classes/Body.html
  132838. */
  132839. /**
  132840. * This plugin adds a new property `body.plugin.attractors` to instances of `Matter.Body`.
  132841. * This is an array of callback functions that will be called automatically
  132842. * for every pair of bodies, on every engine update.
  132843. * @property {Function[]} body.plugin.attractors
  132844. * @memberof Matter.Body
  132845. */
  132846. /**
  132847. * An attractor function calculates the force to be applied
  132848. * to `bodyB`, it should either:
  132849. * - return the force vector to be applied to `bodyB`
  132850. * - or apply the force to the body(s) itself
  132851. * @callback AttractorFunction
  132852. * @param {Matter.Body} bodyA
  132853. * @param {Matter.Body} bodyB
  132854. * @returns {(Vector|undefined)} a force vector (optional)
  132855. */
  132856. /***/ }),
  132857. /* 1034 */
  132858. /***/ (function(module, exports, __webpack_require__) {
  132859. /**
  132860. * @author Richard Davey <rich@photonstorm.com>
  132861. * @copyright 2018 Photon Storm Ltd.
  132862. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  132863. */
  132864. var Class = __webpack_require__(0);
  132865. var Factory = __webpack_require__(1022);
  132866. var GetFastValue = __webpack_require__(1);
  132867. var GetValue = __webpack_require__(4);
  132868. var MatterAttractors = __webpack_require__(1033);
  132869. var MatterLib = __webpack_require__(1017);
  132870. var MatterWrap = __webpack_require__(1032);
  132871. var Merge = __webpack_require__(94);
  132872. var Plugin = __webpack_require__(680);
  132873. var PluginCache = __webpack_require__(12);
  132874. var World = __webpack_require__(1012);
  132875. /**
  132876. * @classdesc
  132877. * [description]
  132878. *
  132879. * @class MatterPhysics
  132880. * @memberOf Phaser.Physics.Matter
  132881. * @constructor
  132882. * @since 3.0.0
  132883. *
  132884. * @param {Phaser.Scene} scene - [description]
  132885. */
  132886. var MatterPhysics = new Class({
  132887. initialize:
  132888. function MatterPhysics (scene)
  132889. {
  132890. /**
  132891. * [description]
  132892. *
  132893. * @name Phaser.Physics.Matter.MatterPhysics#scene
  132894. * @type {Phaser.Scene}
  132895. * @since 3.0.0
  132896. */
  132897. this.scene = scene;
  132898. /**
  132899. * [description]
  132900. *
  132901. * @name Phaser.Physics.Matter.MatterPhysics#systems
  132902. * @type {Phaser.Scenes.Systems}
  132903. * @since 3.0.0
  132904. */
  132905. this.systems = scene.sys;
  132906. /**
  132907. * [description]
  132908. *
  132909. * @name Phaser.Physics.Matter.MatterPhysics#config
  132910. * @type {object}
  132911. * @since 3.0.0
  132912. */
  132913. this.config = this.getConfig();
  132914. /**
  132915. * [description]
  132916. *
  132917. * @name Phaser.Physics.Matter.MatterPhysics#world
  132918. * @type {Phaser.Physics.Matter.World}
  132919. * @since 3.0.0
  132920. */
  132921. this.world;
  132922. /**
  132923. * [description]
  132924. *
  132925. * @name Phaser.Physics.Matter.MatterPhysics#add
  132926. * @type {Phaser.Physics.Matter.Factory}
  132927. * @since 3.0.0
  132928. */
  132929. this.add;
  132930. // Matter plugins
  132931. if (GetValue(this.config, 'plugins.attractors', false))
  132932. {
  132933. Plugin.register(MatterAttractors);
  132934. Plugin.use(MatterLib, MatterAttractors);
  132935. }
  132936. if (GetValue(this.config, 'plugins.wrap', false))
  132937. {
  132938. Plugin.register(MatterWrap);
  132939. Plugin.use(MatterLib, MatterWrap);
  132940. }
  132941. scene.sys.events.once('boot', this.boot, this);
  132942. scene.sys.events.on('start', this.start, this);
  132943. },
  132944. /**
  132945. * This method is called automatically, only once, when the Scene is first created.
  132946. * Do not invoke it directly.
  132947. *
  132948. * @method Phaser.Physics.Matter.MatterPhysics#boot
  132949. * @private
  132950. * @since 3.5.1
  132951. */
  132952. boot: function ()
  132953. {
  132954. this.world = new World(this.scene, this.config);
  132955. this.add = new Factory(this.world);
  132956. this.systems.events.once('destroy', this.destroy, this);
  132957. },
  132958. /**
  132959. * This method is called automatically by the Scene when it is starting up.
  132960. * It is responsible for creating local systems, properties and listening for Scene events.
  132961. * Do not invoke it directly.
  132962. *
  132963. * @method Phaser.Physics.Matter.MatterPhysics#start
  132964. * @private
  132965. * @since 3.5.0
  132966. */
  132967. start: function ()
  132968. {
  132969. if (!this.world)
  132970. {
  132971. this.world = new World(this.scene, this.config);
  132972. this.add = new Factory(this.world);
  132973. }
  132974. var eventEmitter = this.systems.events;
  132975. eventEmitter.on('update', this.world.update, this.world);
  132976. eventEmitter.on('postupdate', this.world.postUpdate, this.world);
  132977. eventEmitter.once('shutdown', this.shutdown, this);
  132978. },
  132979. /**
  132980. * [description]
  132981. *
  132982. * @method Phaser.Physics.Matter.MatterPhysics#getConfig
  132983. * @since 3.0.0
  132984. *
  132985. * @return {object} [description]
  132986. */
  132987. getConfig: function ()
  132988. {
  132989. var gameConfig = this.systems.game.config.physics;
  132990. var sceneConfig = this.systems.settings.physics;
  132991. var config = Merge(
  132992. GetFastValue(sceneConfig, 'matter', {}),
  132993. GetFastValue(gameConfig, 'matter', {})
  132994. );
  132995. return config;
  132996. },
  132997. /**
  132998. * [description]
  132999. *
  133000. * @method Phaser.Physics.Matter.MatterPhysics#enableAttractorPlugin
  133001. * @since 3.0.0
  133002. *
  133003. * @return {Phaser.Physics.Matter.MatterPhysics} This Matter Physics instance.
  133004. */
  133005. enableAttractorPlugin: function ()
  133006. {
  133007. Plugin.register(MatterAttractors);
  133008. Plugin.use(MatterLib, MatterAttractors);
  133009. return this;
  133010. },
  133011. /**
  133012. * [description]
  133013. *
  133014. * @method Phaser.Physics.Matter.MatterPhysics#enableWrapPlugin
  133015. * @since 3.0.0
  133016. *
  133017. * @return {Phaser.Physics.Matter.MatterPhysics} This Matter Physics instance.
  133018. */
  133019. enableWrapPlugin: function ()
  133020. {
  133021. Plugin.register(MatterWrap);
  133022. Plugin.use(MatterLib, MatterWrap);
  133023. return this;
  133024. },
  133025. /**
  133026. * [description]
  133027. *
  133028. * @method Phaser.Physics.Matter.MatterPhysics#pause
  133029. * @since 3.0.0
  133030. *
  133031. * @return {Phaser.Physics.Matter.World} The Matter World object.
  133032. */
  133033. pause: function ()
  133034. {
  133035. return this.world.pause();
  133036. },
  133037. /**
  133038. * [description]
  133039. *
  133040. * @method Phaser.Physics.Matter.MatterPhysics#resume
  133041. * @since 3.0.0
  133042. *
  133043. * @return {Phaser.Physics.Matter.World} The Matter World object.
  133044. */
  133045. resume: function ()
  133046. {
  133047. return this.world.resume();
  133048. },
  133049. /**
  133050. * Sets the Matter Engine to run at fixed timestep of 60Hz and enables `autoUpdate`.
  133051. * If you have set a custom `getDelta` function then this will override it.
  133052. *
  133053. * @method Phaser.Physics.Matter.MatterPhysics#set60Hz
  133054. * @since 3.4.0
  133055. *
  133056. * @return {Phaser.Physics.Matter.MatterPhysics} This Matter Physics instance.
  133057. */
  133058. set60Hz: function ()
  133059. {
  133060. this.world.getDelta = this.world.update60Hz;
  133061. this.world.autoUpdate = true;
  133062. return this;
  133063. },
  133064. /**
  133065. * Sets the Matter Engine to run at fixed timestep of 30Hz and enables `autoUpdate`.
  133066. * If you have set a custom `getDelta` function then this will override it.
  133067. *
  133068. * @method Phaser.Physics.Matter.MatterPhysics#set30Hz
  133069. * @since 3.4.0
  133070. *
  133071. * @return {Phaser.Physics.Matter.MatterPhysics} This Matter Physics instance.
  133072. */
  133073. set30Hz: function ()
  133074. {
  133075. this.world.getDelta = this.world.update30Hz;
  133076. this.world.autoUpdate = true;
  133077. return this;
  133078. },
  133079. /**
  133080. * Manually advances the physics simulation by one iteration.
  133081. *
  133082. * You can optionally pass in the `delta` and `correction` values to be used by Engine.update.
  133083. * If undefined they use the Matter defaults of 60Hz and no correction.
  133084. *
  133085. * Calling `step` directly bypasses any checks of `enabled` or `autoUpdate`.
  133086. *
  133087. * It also ignores any custom `getDelta` functions, as you should be passing the delta
  133088. * value in to this call.
  133089. *
  133090. * You can adjust the number of iterations that Engine.update performs internally.
  133091. * Use the Scene Matter Physics config object to set the following properties:
  133092. *
  133093. * positionIterations (defaults to 6)
  133094. * velocityIterations (defaults to 4)
  133095. * constraintIterations (defaults to 2)
  133096. *
  133097. * Adjusting these values can help performance in certain situations, depending on the physics requirements
  133098. * of your game.
  133099. *
  133100. * @method Phaser.Physics.Matter.MatterPhysics#step
  133101. * @since 3.4.0
  133102. *
  133103. * @param {number} [delta=16.666] - [description]
  133104. * @param {number} [correction=1] - [description]
  133105. */
  133106. step: function (delta, correction)
  133107. {
  133108. this.world.step(delta, correction);
  133109. },
  133110. /**
  133111. * The Scene that owns this plugin is shutting down.
  133112. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  133113. *
  133114. * @method Phaser.Physics.Matter.MatterPhysics#shutdown
  133115. * @private
  133116. * @since 3.0.0
  133117. */
  133118. shutdown: function ()
  133119. {
  133120. var eventEmitter = this.systems.events;
  133121. eventEmitter.off('update', this.world.update, this.world);
  133122. eventEmitter.off('postupdate', this.world.postUpdate, this.world);
  133123. eventEmitter.off('shutdown', this.shutdown, this);
  133124. this.add.destroy();
  133125. this.world.destroy();
  133126. this.add = null;
  133127. this.world = null;
  133128. },
  133129. /**
  133130. * The Scene that owns this plugin is being destroyed.
  133131. * We need to shutdown and then kill off all external references.
  133132. *
  133133. * @method Phaser.Physics.Matter.MatterPhysics#destroy
  133134. * @private
  133135. * @since 3.0.0
  133136. */
  133137. destroy: function ()
  133138. {
  133139. this.shutdown();
  133140. this.scene.sys.events.off('start', this.start, this);
  133141. this.scene = null;
  133142. this.systems = null;
  133143. }
  133144. });
  133145. PluginCache.register('MatterPhysics', MatterPhysics, 'matterPhysics');
  133146. module.exports = MatterPhysics;
  133147. /***/ }),
  133148. /* 1035 */
  133149. /***/ (function(module, exports, __webpack_require__) {
  133150. /**
  133151. * The `Matter.Svg` module contains methods for converting SVG images into an array of vector points.
  133152. *
  133153. * To use this module you also need the SVGPathSeg polyfill: https://github.com/progers/pathseg
  133154. *
  133155. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  133156. *
  133157. * @class Svg
  133158. */
  133159. var Svg = {};
  133160. module.exports = Svg;
  133161. var Bounds = __webpack_require__(126);
  133162. (function() {
  133163. /**
  133164. * Converts an SVG path into an array of vector points.
  133165. * If the input path forms a concave shape, you must decompose the result into convex parts before use.
  133166. * See `Bodies.fromVertices` which provides support for this.
  133167. * Note that this function is not guaranteed to support complex paths (such as those with holes).
  133168. * @method pathToVertices
  133169. * @param {SVGPathElement} path
  133170. * @param {Number} [sampleLength=15]
  133171. * @return {Vector[]} points
  133172. */
  133173. Svg.pathToVertices = function(path, sampleLength) {
  133174. // https://github.com/wout/svg.topoly.js/blob/master/svg.topoly.js
  133175. var i, il, total, point, segment, segments,
  133176. segmentsQueue, lastSegment,
  133177. lastPoint, segmentIndex, points = [],
  133178. lx, ly, length = 0, x = 0, y = 0;
  133179. sampleLength = sampleLength || 15;
  133180. var addPoint = function(px, py, pathSegType) {
  133181. // all odd-numbered path types are relative except PATHSEG_CLOSEPATH (1)
  133182. var isRelative = pathSegType % 2 === 1 && pathSegType > 1;
  133183. // when the last point doesn't equal the current point add the current point
  133184. if (!lastPoint || px != lastPoint.x || py != lastPoint.y) {
  133185. if (lastPoint && isRelative) {
  133186. lx = lastPoint.x;
  133187. ly = lastPoint.y;
  133188. } else {
  133189. lx = 0;
  133190. ly = 0;
  133191. }
  133192. var point = {
  133193. x: lx + px,
  133194. y: ly + py
  133195. };
  133196. // set last point
  133197. if (isRelative || !lastPoint) {
  133198. lastPoint = point;
  133199. }
  133200. points.push(point);
  133201. x = lx + px;
  133202. y = ly + py;
  133203. }
  133204. };
  133205. var addSegmentPoint = function(segment) {
  133206. var segType = segment.pathSegTypeAsLetter.toUpperCase();
  133207. // skip path ends
  133208. if (segType === 'Z')
  133209. return;
  133210. // map segment to x and y
  133211. switch (segType) {
  133212. case 'M':
  133213. case 'L':
  133214. case 'T':
  133215. case 'C':
  133216. case 'S':
  133217. case 'Q':
  133218. x = segment.x;
  133219. y = segment.y;
  133220. break;
  133221. case 'H':
  133222. x = segment.x;
  133223. break;
  133224. case 'V':
  133225. y = segment.y;
  133226. break;
  133227. }
  133228. addPoint(x, y, segment.pathSegType);
  133229. };
  133230. // ensure path is absolute
  133231. _svgPathToAbsolute(path);
  133232. // get total length
  133233. total = path.getTotalLength();
  133234. // queue segments
  133235. segments = [];
  133236. for (i = 0; i < path.pathSegList.numberOfItems; i += 1)
  133237. segments.push(path.pathSegList.getItem(i));
  133238. segmentsQueue = segments.concat();
  133239. // sample through path
  133240. while (length < total) {
  133241. // get segment at position
  133242. segmentIndex = path.getPathSegAtLength(length);
  133243. segment = segments[segmentIndex];
  133244. // new segment
  133245. if (segment != lastSegment) {
  133246. while (segmentsQueue.length && segmentsQueue[0] != segment)
  133247. addSegmentPoint(segmentsQueue.shift());
  133248. lastSegment = segment;
  133249. }
  133250. // add points in between when curving
  133251. // TODO: adaptive sampling
  133252. switch (segment.pathSegTypeAsLetter.toUpperCase()) {
  133253. case 'C':
  133254. case 'T':
  133255. case 'S':
  133256. case 'Q':
  133257. case 'A':
  133258. point = path.getPointAtLength(length);
  133259. addPoint(point.x, point.y, 0);
  133260. break;
  133261. }
  133262. // increment by sample value
  133263. length += sampleLength;
  133264. }
  133265. // add remaining segments not passed by sampling
  133266. for (i = 0, il = segmentsQueue.length; i < il; ++i)
  133267. addSegmentPoint(segmentsQueue[i]);
  133268. return points;
  133269. };
  133270. var _svgPathToAbsolute = function(path) {
  133271. // http://phrogz.net/convert-svg-path-to-all-absolute-commands
  133272. // Copyright (c) Gavin Kistner
  133273. // http://phrogz.net/js/_ReuseLicense.txt
  133274. // Modifications: tidy formatting and naming
  133275. var x0, y0, x1, y1, x2, y2, segs = path.pathSegList,
  133276. x = 0, y = 0, len = segs.numberOfItems;
  133277. for (var i = 0; i < len; ++i) {
  133278. var seg = segs.getItem(i),
  133279. segType = seg.pathSegTypeAsLetter;
  133280. if (/[MLHVCSQTA]/.test(segType)) {
  133281. if ('x' in seg) x = seg.x;
  133282. if ('y' in seg) y = seg.y;
  133283. } else {
  133284. if ('x1' in seg) x1 = x + seg.x1;
  133285. if ('x2' in seg) x2 = x + seg.x2;
  133286. if ('y1' in seg) y1 = y + seg.y1;
  133287. if ('y2' in seg) y2 = y + seg.y2;
  133288. if ('x' in seg) x += seg.x;
  133289. if ('y' in seg) y += seg.y;
  133290. switch (segType) {
  133291. case 'm':
  133292. segs.replaceItem(path.createSVGPathSegMovetoAbs(x, y), i);
  133293. break;
  133294. case 'l':
  133295. segs.replaceItem(path.createSVGPathSegLinetoAbs(x, y), i);
  133296. break;
  133297. case 'h':
  133298. segs.replaceItem(path.createSVGPathSegLinetoHorizontalAbs(x), i);
  133299. break;
  133300. case 'v':
  133301. segs.replaceItem(path.createSVGPathSegLinetoVerticalAbs(y), i);
  133302. break;
  133303. case 'c':
  133304. segs.replaceItem(path.createSVGPathSegCurvetoCubicAbs(x, y, x1, y1, x2, y2), i);
  133305. break;
  133306. case 's':
  133307. segs.replaceItem(path.createSVGPathSegCurvetoCubicSmoothAbs(x, y, x2, y2), i);
  133308. break;
  133309. case 'q':
  133310. segs.replaceItem(path.createSVGPathSegCurvetoQuadraticAbs(x, y, x1, y1), i);
  133311. break;
  133312. case 't':
  133313. segs.replaceItem(path.createSVGPathSegCurvetoQuadraticSmoothAbs(x, y), i);
  133314. break;
  133315. case 'a':
  133316. segs.replaceItem(path.createSVGPathSegArcAbs(x, y, seg.r1, seg.r2, seg.angle, seg.largeArcFlag, seg.sweepFlag), i);
  133317. break;
  133318. case 'z':
  133319. case 'Z':
  133320. x = x0;
  133321. y = y0;
  133322. break;
  133323. }
  133324. }
  133325. if (segType == 'M' || segType == 'm') {
  133326. x0 = x;
  133327. y0 = y;
  133328. }
  133329. }
  133330. };
  133331. })();
  133332. /***/ }),
  133333. /* 1036 */
  133334. /***/ (function(module, exports, __webpack_require__) {
  133335. // @if DEBUG
  133336. /**
  133337. * _Internal Class_, not generally used outside of the engine's internals.
  133338. *
  133339. */
  133340. var Metrics = {};
  133341. module.exports = Metrics;
  133342. var Composite = __webpack_require__(226);
  133343. var Common = __webpack_require__(42);
  133344. (function() {
  133345. /**
  133346. * Creates a new metrics.
  133347. * @method create
  133348. * @private
  133349. * @return {metrics} A new metrics
  133350. */
  133351. Metrics.create = function(options) {
  133352. var defaults = {
  133353. extended: false,
  133354. narrowDetections: 0,
  133355. narrowphaseTests: 0,
  133356. narrowReuse: 0,
  133357. narrowReuseCount: 0,
  133358. midphaseTests: 0,
  133359. broadphaseTests: 0,
  133360. narrowEff: 0.0001,
  133361. midEff: 0.0001,
  133362. broadEff: 0.0001,
  133363. collisions: 0,
  133364. buckets: 0,
  133365. bodies: 0,
  133366. pairs: 0
  133367. };
  133368. return Common.extend(defaults, false, options);
  133369. };
  133370. /**
  133371. * Resets metrics.
  133372. * @method reset
  133373. * @private
  133374. * @param {metrics} metrics
  133375. */
  133376. Metrics.reset = function(metrics) {
  133377. if (metrics.extended) {
  133378. metrics.narrowDetections = 0;
  133379. metrics.narrowphaseTests = 0;
  133380. metrics.narrowReuse = 0;
  133381. metrics.narrowReuseCount = 0;
  133382. metrics.midphaseTests = 0;
  133383. metrics.broadphaseTests = 0;
  133384. metrics.narrowEff = 0;
  133385. metrics.midEff = 0;
  133386. metrics.broadEff = 0;
  133387. metrics.collisions = 0;
  133388. metrics.buckets = 0;
  133389. metrics.pairs = 0;
  133390. metrics.bodies = 0;
  133391. }
  133392. };
  133393. /**
  133394. * Updates metrics.
  133395. * @method update
  133396. * @private
  133397. * @param {metrics} metrics
  133398. * @param {engine} engine
  133399. */
  133400. Metrics.update = function(metrics, engine) {
  133401. if (metrics.extended) {
  133402. var world = engine.world,
  133403. bodies = Composite.allBodies(world);
  133404. metrics.collisions = metrics.narrowDetections;
  133405. metrics.pairs = engine.pairs.list.length;
  133406. metrics.bodies = bodies.length;
  133407. metrics.midEff = (metrics.narrowDetections / (metrics.midphaseTests || 1)).toFixed(2);
  133408. metrics.narrowEff = (metrics.narrowDetections / (metrics.narrowphaseTests || 1)).toFixed(2);
  133409. metrics.broadEff = (1 - (metrics.broadphaseTests / (bodies.length || 1))).toFixed(2);
  133410. metrics.narrowReuse = (metrics.narrowReuseCount / (metrics.narrowphaseTests || 1)).toFixed(2);
  133411. //var broadphase = engine.broadphase[engine.broadphase.current];
  133412. //if (broadphase.instance)
  133413. // metrics.buckets = Common.keys(broadphase.instance.buckets).length;
  133414. }
  133415. };
  133416. })();
  133417. // @endif
  133418. /***/ }),
  133419. /* 1037 */
  133420. /***/ (function(module, exports, __webpack_require__) {
  133421. /**
  133422. * The `Matter.Query` module contains methods for performing collision queries.
  133423. *
  133424. * See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).
  133425. *
  133426. * @class Query
  133427. */
  133428. var Query = {};
  133429. module.exports = Query;
  133430. var Vector = __webpack_require__(106);
  133431. var SAT = __webpack_require__(682);
  133432. var Bounds = __webpack_require__(126);
  133433. var Bodies = __webpack_require__(171);
  133434. var Vertices = __webpack_require__(127);
  133435. (function() {
  133436. /**
  133437. * Casts a ray segment against a set of bodies and returns all collisions, ray width is optional. Intersection points are not provided.
  133438. * @method ray
  133439. * @param {body[]} bodies
  133440. * @param {vector} startPoint
  133441. * @param {vector} endPoint
  133442. * @param {number} [rayWidth]
  133443. * @return {object[]} Collisions
  133444. */
  133445. Query.ray = function(bodies, startPoint, endPoint, rayWidth) {
  133446. rayWidth = rayWidth || 1e-100;
  133447. var rayAngle = Vector.angle(startPoint, endPoint),
  133448. rayLength = Vector.magnitude(Vector.sub(startPoint, endPoint)),
  133449. rayX = (endPoint.x + startPoint.x) * 0.5,
  133450. rayY = (endPoint.y + startPoint.y) * 0.5,
  133451. ray = Bodies.rectangle(rayX, rayY, rayLength, rayWidth, { angle: rayAngle }),
  133452. collisions = [];
  133453. for (var i = 0; i < bodies.length; i++) {
  133454. var bodyA = bodies[i];
  133455. if (Bounds.overlaps(bodyA.bounds, ray.bounds)) {
  133456. for (var j = bodyA.parts.length === 1 ? 0 : 1; j < bodyA.parts.length; j++) {
  133457. var part = bodyA.parts[j];
  133458. if (Bounds.overlaps(part.bounds, ray.bounds)) {
  133459. var collision = SAT.collides(part, ray);
  133460. if (collision.collided) {
  133461. collision.body = collision.bodyA = collision.bodyB = bodyA;
  133462. collisions.push(collision);
  133463. break;
  133464. }
  133465. }
  133466. }
  133467. }
  133468. }
  133469. return collisions;
  133470. };
  133471. /**
  133472. * Returns all bodies whose bounds are inside (or outside if set) the given set of bounds, from the given set of bodies.
  133473. * @method region
  133474. * @param {body[]} bodies
  133475. * @param {bounds} bounds
  133476. * @param {bool} [outside=false]
  133477. * @return {body[]} The bodies matching the query
  133478. */
  133479. Query.region = function(bodies, bounds, outside) {
  133480. var result = [];
  133481. for (var i = 0; i < bodies.length; i++) {
  133482. var body = bodies[i],
  133483. overlaps = Bounds.overlaps(body.bounds, bounds);
  133484. if ((overlaps && !outside) || (!overlaps && outside))
  133485. result.push(body);
  133486. }
  133487. return result;
  133488. };
  133489. /**
  133490. * Returns all bodies whose vertices contain the given point, from the given set of bodies.
  133491. * @method point
  133492. * @param {body[]} bodies
  133493. * @param {vector} point
  133494. * @return {body[]} The bodies matching the query
  133495. */
  133496. Query.point = function(bodies, point) {
  133497. var result = [];
  133498. for (var i = 0; i < bodies.length; i++) {
  133499. var body = bodies[i];
  133500. if (Bounds.contains(body.bounds, point)) {
  133501. for (var j = body.parts.length === 1 ? 0 : 1; j < body.parts.length; j++) {
  133502. var part = body.parts[j];
  133503. if (Bounds.contains(part.bounds, point)
  133504. && Vertices.contains(part.vertices, point)) {
  133505. result.push(body);
  133506. break;
  133507. }
  133508. }
  133509. }
  133510. }
  133511. return result;
  133512. };
  133513. })();
  133514. /***/ }),
  133515. /* 1038 */
  133516. /***/ (function(module, exports, __webpack_require__) {
  133517. /**
  133518. * @author Richard Davey <rich@photonstorm.com>
  133519. * @copyright 2018 Photon Storm Ltd.
  133520. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133521. */
  133522. var Bounds = __webpack_require__(126);
  133523. var Class = __webpack_require__(0);
  133524. var Composite = __webpack_require__(226);
  133525. var Constraint = __webpack_require__(305);
  133526. var Detector = __webpack_require__(683);
  133527. var GetFastValue = __webpack_require__(1);
  133528. var Merge = __webpack_require__(94);
  133529. var Sleeping = __webpack_require__(336);
  133530. var Vector2 = __webpack_require__(6);
  133531. var Vertices = __webpack_require__(127);
  133532. /**
  133533. * @classdesc
  133534. * [description]
  133535. *
  133536. * @class PointerConstraint
  133537. * @memberOf Phaser.Physics.Matter
  133538. * @constructor
  133539. * @since 3.0.0
  133540. *
  133541. * @param {Phaser.Scene} scene - [description]
  133542. * @param {Phaser.Physics.Matter.World} world - [description]
  133543. * @param {object} options - [description]
  133544. */
  133545. var PointerConstraint = new Class({
  133546. initialize:
  133547. function PointerConstraint (scene, world, options)
  133548. {
  133549. if (options === undefined) { options = {}; }
  133550. // Defaults
  133551. var defaults = {
  133552. label: 'Pointer Constraint',
  133553. pointA: { x: 0, y: 0 },
  133554. pointB: { x: 0, y: 0 },
  133555. damping: 0,
  133556. length: 0.01,
  133557. stiffness: 0.1,
  133558. angularStiffness: 1,
  133559. collisionFilter: {
  133560. category: 0x0001,
  133561. mask: 0xFFFFFFFF,
  133562. group: 0
  133563. }
  133564. };
  133565. /**
  133566. * [description]
  133567. *
  133568. * @name Phaser.Physics.Matter.PointerConstraint#scene
  133569. * @type {Phaser.Scene}
  133570. * @since 3.0.0
  133571. */
  133572. this.scene = scene;
  133573. /**
  133574. * [description]
  133575. *
  133576. * @name Phaser.Physics.Matter.PointerConstraint#world
  133577. * @type {Phaser.Physics.Matter.World}
  133578. * @since 3.0.0
  133579. */
  133580. this.world = world;
  133581. /**
  133582. * [description]
  133583. *
  133584. * @name Phaser.Physics.Matter.PointerConstraint#camera
  133585. * @type {Phaser.Cameras.Scene2D.Camera}
  133586. * @since 3.0.0
  133587. */
  133588. var camera = GetFastValue(options, 'camera', null);
  133589. if (!camera)
  133590. {
  133591. this.camera = scene.sys.cameras.main;
  133592. }
  133593. else
  133594. {
  133595. this.camera = camera;
  133596. delete options.camera;
  133597. }
  133598. /**
  133599. * [description]
  133600. *
  133601. * @name Phaser.Physics.Matter.PointerConstraint#pointer
  133602. * @type {Phaser.Input.Pointer}
  133603. * @default null
  133604. * @since 3.0.0
  133605. */
  133606. this.pointer = null;
  133607. /**
  133608. * [description]
  133609. *
  133610. * @name Phaser.Physics.Matter.PointerConstraint#active
  133611. * @type {boolean}
  133612. * @default true
  133613. * @since 3.0.0
  133614. */
  133615. this.active = true;
  133616. /**
  133617. * The transformed position.
  133618. *
  133619. * @name Phaser.Physics.Matter.PointerConstraint#position
  133620. * @type {Phaser.Math.Vector2}
  133621. * @since 3.0.0
  133622. */
  133623. this.position = new Vector2();
  133624. /**
  133625. * [description]
  133626. *
  133627. * @name Phaser.Physics.Matter.PointerConstraint#constraint
  133628. * @type {object}
  133629. * @since 3.0.0
  133630. */
  133631. this.constraint = Constraint.create(Merge(options, defaults));
  133632. this.world.on('beforeupdate', this.update, this);
  133633. scene.sys.input.on('pointerdown', this.onDown, this);
  133634. scene.sys.input.on('pointerup', this.onUp, this);
  133635. },
  133636. /**
  133637. * [description]
  133638. *
  133639. * @method Phaser.Physics.Matter.PointerConstraint#onDown
  133640. * @since 3.0.0
  133641. *
  133642. * @param {Phaser.Input.Pointer} pointer - [description]
  133643. */
  133644. onDown: function (pointer)
  133645. {
  133646. this.pointer = pointer;
  133647. },
  133648. /**
  133649. * [description]
  133650. *
  133651. * @method Phaser.Physics.Matter.PointerConstraint#onUp
  133652. * @since 3.0.0
  133653. */
  133654. onUp: function ()
  133655. {
  133656. this.pointer = null;
  133657. },
  133658. /**
  133659. * [description]
  133660. *
  133661. * @method Phaser.Physics.Matter.PointerConstraint#getBodyPart
  133662. * @since 3.0.0
  133663. *
  133664. * @param {MatterJS.Body} body - [description]
  133665. * @param {Phaser.Math.Vector2} position - [description]
  133666. *
  133667. * @return {boolean} [description]
  133668. */
  133669. getBodyPart: function (body, position)
  133670. {
  133671. var constraint = this.constraint;
  133672. var start = (body.parts.length > 1) ? 1 : 0;
  133673. for (var i = start; i < body.parts.length; i++)
  133674. {
  133675. var part = body.parts[i];
  133676. if (Vertices.contains(part.vertices, position))
  133677. {
  133678. constraint.bodyB = body;
  133679. constraint.pointA.x = position.x;
  133680. constraint.pointA.y = position.y;
  133681. constraint.pointB.x = position.x - body.position.x;
  133682. constraint.pointB.y = position.y - body.position.y;
  133683. constraint.angleB = body.angle;
  133684. Sleeping.set(body, false);
  133685. return true;
  133686. }
  133687. }
  133688. return false;
  133689. },
  133690. /**
  133691. * [description]
  133692. *
  133693. * @method Phaser.Physics.Matter.PointerConstraint#update
  133694. * @since 3.0.0
  133695. */
  133696. update: function ()
  133697. {
  133698. if (!this.active)
  133699. {
  133700. return;
  133701. }
  133702. var pointer = this.pointer;
  133703. var constraint = this.constraint;
  133704. if (!pointer)
  133705. {
  133706. // Pointer is up / released
  133707. if (constraint.bodyB)
  133708. {
  133709. constraint.bodyB = null;
  133710. }
  133711. }
  133712. else
  133713. {
  133714. var pos = this.position;
  133715. this.camera.getWorldPoint(pointer.x, pointer.y, pos);
  133716. if (constraint.bodyB)
  133717. {
  133718. // Pointer is down and we have bodyB, so wake it up
  133719. Sleeping.set(constraint.bodyB, false);
  133720. constraint.pointA.x = pos.x;
  133721. constraint.pointA.y = pos.y;
  133722. }
  133723. else
  133724. {
  133725. var bodies = Composite.allBodies(this.world.localWorld);
  133726. // Pointer is down and no bodyB, so check if we've hit anything
  133727. for (var i = 0; i < bodies.length; i++)
  133728. {
  133729. var body = bodies[i];
  133730. if (!body.ignorePointer && Bounds.contains(body.bounds, pos) &&
  133731. Detector.canCollide(body.collisionFilter, constraint.collisionFilter))
  133732. {
  133733. if (this.getBodyPart(body, pos))
  133734. {
  133735. break;
  133736. }
  133737. }
  133738. }
  133739. }
  133740. }
  133741. },
  133742. /**
  133743. * [description]
  133744. *
  133745. * @method Phaser.Physics.Matter.PointerConstraint#destroy
  133746. * @since 3.0.0
  133747. */
  133748. destroy: function ()
  133749. {
  133750. this.world.removeConstraint(this.constraint);
  133751. this.constraint = null;
  133752. this.world.off('beforeupdate', this.update);
  133753. this.scene.sys.input.off('pointerdown', this.onDown, this);
  133754. this.scene.sys.input.off('pointerup', this.onUp, this);
  133755. }
  133756. });
  133757. module.exports = PointerConstraint;
  133758. /***/ }),
  133759. /* 1039 */
  133760. /***/ (function(module, exports, __webpack_require__) {
  133761. /**
  133762. * @author Richard Davey <rich@photonstorm.com>
  133763. * @copyright 2018 Photon Storm Ltd.
  133764. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133765. */
  133766. var Body = __webpack_require__(73);
  133767. /**
  133768. * [description]
  133769. *
  133770. * @name Phaser.Physics.Matter.Components.Velocity
  133771. * @since 3.0.0
  133772. */
  133773. var Velocity = {
  133774. /**
  133775. * [description]
  133776. *
  133777. * @method Phaser.Physics.Matter.Components.Velocity#setAngularVelocity
  133778. * @since 3.0.0
  133779. *
  133780. * @param {number} value - [description]
  133781. *
  133782. * @return {Phaser.GameObjects.GameObject} This Game Object.
  133783. */
  133784. setAngularVelocity: function (value)
  133785. {
  133786. Body.setAngularVelocity(this.body, value);
  133787. return this;
  133788. },
  133789. /**
  133790. * [description]
  133791. *
  133792. * @method Phaser.Physics.Matter.Components.Velocity#setVelocityX
  133793. * @since 3.0.0
  133794. *
  133795. * @param {number} x - [description]
  133796. *
  133797. * @return {Phaser.GameObjects.GameObject} This Game Object.
  133798. */
  133799. setVelocityX: function (x)
  133800. {
  133801. this._tempVec2.set(x, this.body.velocity.y);
  133802. Body.setVelocity(this.body, this._tempVec2);
  133803. return this;
  133804. },
  133805. /**
  133806. * [description]
  133807. *
  133808. * @method Phaser.Physics.Matter.Components.Velocity#setVelocityY
  133809. * @since 3.0.0
  133810. *
  133811. * @param {number} y - [description]
  133812. *
  133813. * @return {Phaser.GameObjects.GameObject} This Game Object.
  133814. */
  133815. setVelocityY: function (y)
  133816. {
  133817. this._tempVec2.set(this.body.velocity.x, y);
  133818. Body.setVelocity(this.body, this._tempVec2);
  133819. return this;
  133820. },
  133821. /**
  133822. * [description]
  133823. *
  133824. * @method Phaser.Physics.Matter.Components.Velocity#setVelocity
  133825. * @since 3.0.0
  133826. *
  133827. * @param {number} x - [description]
  133828. * @param {number} [y=x] - [description]
  133829. *
  133830. * @return {Phaser.GameObjects.GameObject} This Game Object.
  133831. */
  133832. setVelocity: function (x, y)
  133833. {
  133834. this._tempVec2.set(x, y);
  133835. Body.setVelocity(this.body, this._tempVec2);
  133836. return this;
  133837. }
  133838. };
  133839. module.exports = Velocity;
  133840. /***/ }),
  133841. /* 1040 */
  133842. /***/ (function(module, exports, __webpack_require__) {
  133843. /**
  133844. * @author Richard Davey <rich@photonstorm.com>
  133845. * @copyright 2018 Photon Storm Ltd.
  133846. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  133847. */
  133848. var Body = __webpack_require__(73);
  133849. var MATH_CONST = __webpack_require__(15);
  133850. var WrapAngle = __webpack_require__(217);
  133851. var WrapAngleDegrees = __webpack_require__(216);
  133852. // global bitmask flag for GameObject.renderMask (used by Scale)
  133853. var _FLAG = 4; // 0100
  133854. // Transform Component
  133855. /**
  133856. * [description]
  133857. *
  133858. * @name Phaser.Physics.Matter.Components.Transform
  133859. * @since 3.0.0
  133860. */
  133861. var Transform = {
  133862. /**
  133863. * [description]
  133864. *
  133865. * @name Phaser.Physics.Matter.Components.Transform#x
  133866. * @type {number}
  133867. * @since 3.0.0
  133868. */
  133869. x: {
  133870. get: function ()
  133871. {
  133872. return this.body.position.x;
  133873. },
  133874. set: function (value)
  133875. {
  133876. this._tempVec2.set(value, this.y);
  133877. Body.setPosition(this.body, this._tempVec2);
  133878. }
  133879. },
  133880. /**
  133881. * [description]
  133882. *
  133883. * @name Phaser.Physics.Matter.Components.Transform#y
  133884. * @type {number}
  133885. * @since 3.0.0
  133886. */
  133887. y: {
  133888. get: function ()
  133889. {
  133890. return this.body.position.y;
  133891. },
  133892. set: function (value)
  133893. {
  133894. this._tempVec2.set(this.x, value);
  133895. Body.setPosition(this.body, this._tempVec2);
  133896. }
  133897. },
  133898. /**
  133899. * [description]
  133900. *
  133901. * @name Phaser.Physics.Matter.Components.Transform#scaleX
  133902. * @type {number}
  133903. * @since 3.0.0
  133904. */
  133905. scaleX: {
  133906. get: function ()
  133907. {
  133908. return this._scaleX;
  133909. },
  133910. set: function (value)
  133911. {
  133912. this._scaleX = value;
  133913. if (this._scaleX === 0)
  133914. {
  133915. this.renderFlags &= ~_FLAG;
  133916. }
  133917. else
  133918. {
  133919. this.renderFlags |= _FLAG;
  133920. }
  133921. Body.scale(this.body, value, this._scaleY);
  133922. }
  133923. },
  133924. /**
  133925. * [description]
  133926. *
  133927. * @name Phaser.Physics.Matter.Components.Transform#scaleY
  133928. * @type {number}
  133929. * @since 3.0.0
  133930. */
  133931. scaleY: {
  133932. get: function ()
  133933. {
  133934. return this._scaleY;
  133935. },
  133936. set: function (value)
  133937. {
  133938. this._scaleY = value;
  133939. if (this._scaleY === 0)
  133940. {
  133941. this.renderFlags &= ~_FLAG;
  133942. }
  133943. else
  133944. {
  133945. this.renderFlags |= _FLAG;
  133946. }
  133947. Body.scale(this.body, this._scaleX, value);
  133948. }
  133949. },
  133950. /**
  133951. * [description]
  133952. *
  133953. * @name Phaser.Physics.Matter.Components.Transform#angle
  133954. * @type {number}
  133955. * @since 3.0.0
  133956. */
  133957. angle: {
  133958. get: function ()
  133959. {
  133960. return WrapAngleDegrees(this.body.angle * MATH_CONST.RAD_TO_DEG);
  133961. },
  133962. set: function (value)
  133963. {
  133964. // value is in degrees
  133965. this.rotation = WrapAngleDegrees(value) * MATH_CONST.DEG_TO_RAD;
  133966. }
  133967. },
  133968. /**
  133969. * [description]
  133970. *
  133971. * @name Phaser.Physics.Matter.Components.Transform#rotation
  133972. * @type {number}
  133973. * @since 3.0.0
  133974. */
  133975. rotation: {
  133976. get: function ()
  133977. {
  133978. return this.body.angle;
  133979. },
  133980. set: function (value)
  133981. {
  133982. // value is in radians
  133983. this._rotation = WrapAngle(value);
  133984. Body.setAngle(this.body, this._rotation);
  133985. }
  133986. },
  133987. /**
  133988. * [description]
  133989. *
  133990. * @method Phaser.Physics.Matter.Components.Transform#setPosition
  133991. * @since 3.0.0
  133992. *
  133993. * @param {number} [x=0] - [description]
  133994. * @param {number} [y=x] - [description]
  133995. *
  133996. * @return{Phaser.GameObjects.GameObject} This Game Object.
  133997. */
  133998. setPosition: function (x, y)
  133999. {
  134000. if (x === undefined) { x = 0; }
  134001. if (y === undefined) { y = x; }
  134002. this._tempVec2.set(x, y);
  134003. Body.setPosition(this.body, this._tempVec2);
  134004. return this;
  134005. },
  134006. /**
  134007. * [description]
  134008. *
  134009. * @method Phaser.Physics.Matter.Components.Transform#setRotation
  134010. * @since 3.0.0
  134011. *
  134012. * @param {number} [radians=0] - [description]
  134013. *
  134014. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134015. */
  134016. setRotation: function (radians)
  134017. {
  134018. if (radians === undefined) { radians = 0; }
  134019. this._rotation = WrapAngle(radians);
  134020. Body.setAngle(this.body, radians);
  134021. return this;
  134022. },
  134023. /**
  134024. * [description]
  134025. *
  134026. * @method Phaser.Physics.Matter.Components.Transform#setFixedRotation
  134027. * @since 3.0.0
  134028. *
  134029. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134030. */
  134031. setFixedRotation: function ()
  134032. {
  134033. Body.setInertia(this.body, Infinity);
  134034. return this;
  134035. },
  134036. /**
  134037. * [description]
  134038. *
  134039. * @method Phaser.Physics.Matter.Components.Transform#setAngle
  134040. * @since 3.0.0
  134041. *
  134042. * @param {number} [degrees=0] - [description]
  134043. *
  134044. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134045. */
  134046. setAngle: function (degrees)
  134047. {
  134048. if (degrees === undefined) { degrees = 0; }
  134049. this.angle = degrees;
  134050. Body.setAngle(this.body, this.rotation);
  134051. return this;
  134052. },
  134053. /**
  134054. * [description]
  134055. *
  134056. * @method Phaser.Physics.Matter.Components.Transform#setScale
  134057. * @since 3.0.0
  134058. *
  134059. * @param {number} [x=1] - [description]
  134060. * @param {number} [y=x] - [description]
  134061. * @param {Phaser.Math.Vector2} [point] - [description]
  134062. *
  134063. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134064. */
  134065. setScale: function (x, y, point)
  134066. {
  134067. if (x === undefined) { x = 1; }
  134068. if (y === undefined) { y = x; }
  134069. this._scaleX = x;
  134070. this._scaleY = y;
  134071. Body.scale(this.body, x, y, point);
  134072. return this;
  134073. }
  134074. };
  134075. module.exports = Transform;
  134076. /***/ }),
  134077. /* 1041 */
  134078. /***/ (function(module, exports, __webpack_require__) {
  134079. /**
  134080. * @author Richard Davey <rich@photonstorm.com>
  134081. * @copyright 2018 Photon Storm Ltd.
  134082. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134083. */
  134084. var MatterEvents = __webpack_require__(306);
  134085. /**
  134086. * [description]
  134087. *
  134088. * @name Phaser.Physics.Matter.Components.Sleep
  134089. * @since 3.0.0
  134090. */
  134091. var Sleep = {
  134092. /**
  134093. * [description]
  134094. *
  134095. * @method Phaser.Physics.Matter.Components.Sleep#setSleepThreshold
  134096. * @since 3.0.0
  134097. *
  134098. * @param {number} [value=60] - [description]
  134099. *
  134100. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134101. */
  134102. setSleepThreshold: function (value)
  134103. {
  134104. if (value === undefined) { value = 60; }
  134105. this.body.sleepThreshold = value;
  134106. return this;
  134107. },
  134108. /**
  134109. * [description]
  134110. *
  134111. * @method Phaser.Physics.Matter.Components.Sleep#setSleepEvents
  134112. * @since 3.0.0
  134113. *
  134114. * @param {boolean} start - [description]
  134115. * @param {boolean} end - [description]
  134116. *
  134117. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134118. */
  134119. setSleepEvents: function (start, end)
  134120. {
  134121. this.setSleepStartEvent(start);
  134122. this.setSleepEndEvent(end);
  134123. return this;
  134124. },
  134125. /**
  134126. * [description]
  134127. *
  134128. * @method Phaser.Physics.Matter.Components.Sleep#setSleepStartEvent
  134129. * @since 3.0.0
  134130. *
  134131. * @param {boolean} value - [description]
  134132. *
  134133. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134134. */
  134135. setSleepStartEvent: function (value)
  134136. {
  134137. if (value)
  134138. {
  134139. var world = this.world;
  134140. MatterEvents.on(this.body, 'sleepStart', function (event)
  134141. {
  134142. world.emit('sleepstart', event, this);
  134143. });
  134144. }
  134145. else
  134146. {
  134147. MatterEvents.off(this.body, 'sleepStart');
  134148. }
  134149. return this;
  134150. },
  134151. /**
  134152. * [description]
  134153. *
  134154. * @method Phaser.Physics.Matter.Components.Sleep#setSleepEndEvent
  134155. * @since 3.0.0
  134156. *
  134157. * @param {boolean} value - [description]
  134158. *
  134159. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134160. */
  134161. setSleepEndEvent: function (value)
  134162. {
  134163. if (value)
  134164. {
  134165. var world = this.world;
  134166. MatterEvents.on(this.body, 'sleepEnd', function (event)
  134167. {
  134168. world.emit('sleepend', event, this);
  134169. });
  134170. }
  134171. else
  134172. {
  134173. MatterEvents.off(this.body, 'sleepEnd');
  134174. }
  134175. return this;
  134176. }
  134177. };
  134178. module.exports = Sleep;
  134179. /***/ }),
  134180. /* 1042 */
  134181. /***/ (function(module, exports, __webpack_require__) {
  134182. /**
  134183. * @author Joachim Grill <joachim@codeandweb.com>
  134184. * @copyright 2018 CodeAndWeb GmbH
  134185. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134186. */
  134187. var Bodies = __webpack_require__(171);
  134188. var Body = __webpack_require__(73);
  134189. var Bounds = __webpack_require__(126);
  134190. var Common = __webpack_require__(42);
  134191. var GetFastValue = __webpack_require__(1);
  134192. var Vector = __webpack_require__(106);
  134193. var Vertices = __webpack_require__(127);
  134194. /**
  134195. * Use PhysicsEditorParser.parseBody() to build a Matter body object, based on a physics data file
  134196. * created and exported with PhysicsEditor (https://www.codeandweb.com/physicseditor).
  134197. *
  134198. * @namespace Phaser.Physics.Matter.PhysicsEditorParser
  134199. * @since 3.10.0
  134200. */
  134201. var PhysicsEditorParser = {
  134202. /**
  134203. * Parses a body element exported by PhysicsEditor.
  134204. *
  134205. * @function Phaser.Physics.Matter.PhysicsEditorParser.parseBody
  134206. * @since 3.10.0
  134207. *
  134208. * @param {number} x - x position.
  134209. * @param {number} y - y position.
  134210. * @param {number} w - width.
  134211. * @param {number} h - height.
  134212. * @param {object} config - body configuration and fixture (child body) definitions.
  134213. *
  134214. * @return {object} A matter body, consisting of several parts (child bodies)
  134215. */
  134216. parseBody: function (x, y, w, h, config)
  134217. {
  134218. var fixtureConfigs = GetFastValue(config, 'fixtures', []);
  134219. var fixtures = [];
  134220. for (var fc = 0; fc < fixtureConfigs.length; fc++)
  134221. {
  134222. var fixtureParts = this.parseFixture(fixtureConfigs[fc]);
  134223. for (var i = 0; i < fixtureParts.length; i++)
  134224. {
  134225. fixtures.push(fixtureParts[i]);
  134226. }
  134227. }
  134228. var matterConfig = Common.extend({}, false, config);
  134229. delete matterConfig.fixtures;
  134230. delete matterConfig.type;
  134231. var body = Body.create(matterConfig);
  134232. Body.setParts(body, fixtures);
  134233. body.render.sprite.xOffset = body.position.x / w;
  134234. body.render.sprite.yOffset = body.position.y / h;
  134235. Body.setPosition(body, { x: x, y: y });
  134236. return body;
  134237. },
  134238. /**
  134239. * Parses an element of the "fixtures" list exported by PhysicsEditor
  134240. *
  134241. * @function Phaser.Physics.Matter.PhysicsEditorParser.parseFixture
  134242. * @since 3.10.0
  134243. *
  134244. * @param {object} fixtureConfig - the fixture object to parse
  134245. *
  134246. * @return {object[]} - A list of matter bodies
  134247. */
  134248. parseFixture: function (fixtureConfig)
  134249. {
  134250. var matterConfig = Common.extend({}, false, fixtureConfig);
  134251. delete matterConfig.circle;
  134252. delete matterConfig.vertices;
  134253. var fixtures;
  134254. if (fixtureConfig.circle)
  134255. {
  134256. var x = GetFastValue(fixtureConfig.circle, 'x');
  134257. var y = GetFastValue(fixtureConfig.circle, 'y');
  134258. var r = GetFastValue(fixtureConfig.circle, 'radius');
  134259. fixtures = [ Bodies.circle(x, y, r, matterConfig) ];
  134260. }
  134261. else if (fixtureConfig.vertices)
  134262. {
  134263. fixtures = this.parseVertices(fixtureConfig.vertices, matterConfig);
  134264. }
  134265. return fixtures;
  134266. },
  134267. /**
  134268. * Parses the "vertices" lists exported by PhysicsEditor.
  134269. *
  134270. * @function Phaser.Physics.Matter.PhysicsEditorParser.parseVertices
  134271. * @since 3.10.0
  134272. *
  134273. * @param {object} vertexSets - The vertex lists to parse.
  134274. * @param {object} options - Matter body options.
  134275. *
  134276. * @return {object[]} - A list of matter bodies.
  134277. */
  134278. parseVertices: function (vertexSets, options)
  134279. {
  134280. var i, j, k, v, z;
  134281. var parts = [];
  134282. options = options || {};
  134283. for (v = 0; v < vertexSets.length; v += 1)
  134284. {
  134285. parts.push(Body.create(Common.extend({
  134286. position: Vertices.centre(vertexSets[v]),
  134287. vertices: vertexSets[v]
  134288. }, options)));
  134289. }
  134290. // flag coincident part edges
  134291. var coincidentMaxDist = 5;
  134292. for (i = 0; i < parts.length; i++)
  134293. {
  134294. var partA = parts[i];
  134295. for (j = i + 1; j < parts.length; j++)
  134296. {
  134297. var partB = parts[j];
  134298. if (Bounds.overlaps(partA.bounds, partB.bounds))
  134299. {
  134300. var pav = partA.vertices,
  134301. pbv = partB.vertices;
  134302. // iterate vertices of both parts
  134303. for (k = 0; k < partA.vertices.length; k++)
  134304. {
  134305. for (z = 0; z < partB.vertices.length; z++)
  134306. {
  134307. // find distances between the vertices
  134308. var da = Vector.magnitudeSquared(Vector.sub(pav[(k + 1) % pav.length], pbv[z])),
  134309. db = Vector.magnitudeSquared(Vector.sub(pav[k], pbv[(z + 1) % pbv.length]));
  134310. // if both vertices are very close, consider the edge concident (internal)
  134311. if (da < coincidentMaxDist && db < coincidentMaxDist)
  134312. {
  134313. pav[k].isInternal = true;
  134314. pbv[z].isInternal = true;
  134315. }
  134316. }
  134317. }
  134318. }
  134319. }
  134320. }
  134321. return parts;
  134322. }
  134323. };
  134324. module.exports = PhysicsEditorParser;
  134325. /***/ }),
  134326. /* 1043 */
  134327. /***/ (function(module, exports, __webpack_require__) {
  134328. /**
  134329. * @author Richard Davey <rich@photonstorm.com>
  134330. * @copyright 2018 Photon Storm Ltd.
  134331. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134332. */
  134333. var Bodies = __webpack_require__(171);
  134334. var Body = __webpack_require__(73);
  134335. var GetFastValue = __webpack_require__(1);
  134336. var PhysicsEditorParser = __webpack_require__(1042);
  134337. /**
  134338. * [description]
  134339. *
  134340. * @name Phaser.Physics.Matter.Components.SetBody
  134341. * @since 3.0.0
  134342. */
  134343. var SetBody = {
  134344. // Calling any of these methods resets previous properties you may have set on the body, including plugins, mass, etc
  134345. /**
  134346. * [description]
  134347. *
  134348. * @method Phaser.Physics.Matter.Components.SetBody#setRectangle
  134349. * @since 3.0.0
  134350. *
  134351. * @param {number} width - [description]
  134352. * @param {number} height - [description]
  134353. * @param {object} options - [description]
  134354. *
  134355. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134356. */
  134357. setRectangle: function (width, height, options)
  134358. {
  134359. return this.setBody({ type: 'rectangle', width: width, height: height }, options);
  134360. },
  134361. /**
  134362. * [description]
  134363. *
  134364. * @method Phaser.Physics.Matter.Components.SetBody#setCircle
  134365. * @since 3.0.0
  134366. *
  134367. * @param {number} radius - [description]
  134368. * @param {object} options - [description]
  134369. *
  134370. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134371. */
  134372. setCircle: function (radius, options)
  134373. {
  134374. return this.setBody({ type: 'circle', radius: radius }, options);
  134375. },
  134376. /**
  134377. * [description]
  134378. *
  134379. * @method Phaser.Physics.Matter.Components.SetBody#setPolygon
  134380. * @since 3.0.0
  134381. *
  134382. * @param {number} radius - [description]
  134383. * @param {number} sides - [description]
  134384. * @param {object} options - [description]
  134385. *
  134386. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134387. */
  134388. setPolygon: function (radius, sides, options)
  134389. {
  134390. return this.setBody({ type: 'polygon', sides: sides, radius: radius }, options);
  134391. },
  134392. /**
  134393. * [description]
  134394. *
  134395. * @method Phaser.Physics.Matter.Components.SetBody#setTrapezoid
  134396. * @since 3.0.0
  134397. *
  134398. * @param {number} width - [description]
  134399. * @param {number} height - [description]
  134400. * @param {number} slope - [description]
  134401. * @param {object} options - [description]
  134402. *
  134403. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134404. */
  134405. setTrapezoid: function (width, height, slope, options)
  134406. {
  134407. return this.setBody({ type: 'trapezoid', width: width, height: height, slope: slope }, options);
  134408. },
  134409. /**
  134410. * [description]
  134411. *
  134412. * @method Phaser.Physics.Matter.Components.SetBody#setExistingBody
  134413. * @since 3.0.0
  134414. *
  134415. * @param {MatterJS.Body} body - [description]
  134416. * @param {boolean} [addToWorld=true] - [description]
  134417. *
  134418. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134419. */
  134420. setExistingBody: function (body, addToWorld)
  134421. {
  134422. if (addToWorld === undefined)
  134423. {
  134424. addToWorld = true;
  134425. }
  134426. if (this.body)
  134427. {
  134428. this.world.remove(this.body);
  134429. }
  134430. this.body = body;
  134431. this.body.gameObject = this;
  134432. var _this = this;
  134433. body.destroy = function destroy ()
  134434. {
  134435. _this.world.remove(_this.body);
  134436. _this.body.gameObject = null;
  134437. };
  134438. if (addToWorld)
  134439. {
  134440. this.world.add(body);
  134441. }
  134442. if (this._originComponent)
  134443. {
  134444. this.setOrigin(body.render.sprite.xOffset, body.render.sprite.yOffset);
  134445. }
  134446. return this;
  134447. },
  134448. /**
  134449. * [description]
  134450. *
  134451. * @method Phaser.Physics.Matter.Components.SetBody#setBody
  134452. * @since 3.0.0
  134453. *
  134454. * @param {object} config - [description]
  134455. * @param {object} options - [description]
  134456. *
  134457. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134458. */
  134459. setBody: function (config, options)
  134460. {
  134461. if (!config)
  134462. {
  134463. return this;
  134464. }
  134465. var body;
  134466. // Allow them to do: shape: 'circle' instead of shape: { type: 'circle' }
  134467. if (typeof config === 'string')
  134468. {
  134469. // Using defaults
  134470. config = { type: config };
  134471. }
  134472. var shapeType = GetFastValue(config, 'type', 'rectangle');
  134473. var bodyX = GetFastValue(config, 'x', this._tempVec2.x);
  134474. var bodyY = GetFastValue(config, 'y', this._tempVec2.y);
  134475. var bodyWidth = GetFastValue(config, 'width', this.width);
  134476. var bodyHeight = GetFastValue(config, 'height', this.height);
  134477. switch (shapeType)
  134478. {
  134479. case 'rectangle':
  134480. body = Bodies.rectangle(bodyX, bodyY, bodyWidth, bodyHeight, options);
  134481. break;
  134482. case 'circle':
  134483. var radius = GetFastValue(config, 'radius', Math.max(bodyWidth, bodyHeight) / 2);
  134484. var maxSides = GetFastValue(config, 'maxSides', 25);
  134485. body = Bodies.circle(bodyX, bodyY, radius, options, maxSides);
  134486. break;
  134487. case 'trapezoid':
  134488. var slope = GetFastValue(config, 'slope', 0.5);
  134489. body = Bodies.trapezoid(bodyX, bodyY, bodyWidth, bodyHeight, slope, options);
  134490. break;
  134491. case 'polygon':
  134492. var sides = GetFastValue(config, 'sides', 5);
  134493. var pradius = GetFastValue(config, 'radius', Math.max(bodyWidth, bodyHeight) / 2);
  134494. body = Bodies.polygon(bodyX, bodyY, sides, pradius, options);
  134495. break;
  134496. case 'fromVertices':
  134497. case 'fromVerts':
  134498. var verts = GetFastValue(config, 'verts', []);
  134499. if (this.body)
  134500. {
  134501. Body.setVertices(this.body, verts);
  134502. body = this.body;
  134503. }
  134504. else
  134505. {
  134506. var flagInternal = GetFastValue(config, 'flagInternal', false);
  134507. var removeCollinear = GetFastValue(config, 'removeCollinear', 0.01);
  134508. var minimumArea = GetFastValue(config, 'minimumArea', 10);
  134509. body = Bodies.fromVertices(bodyX, bodyY, verts, options, flagInternal, removeCollinear, minimumArea);
  134510. }
  134511. break;
  134512. case 'fromPhysicsEditor':
  134513. body = PhysicsEditorParser.parseBody(bodyX, bodyY, bodyWidth, bodyHeight, config);
  134514. break;
  134515. }
  134516. this.setExistingBody(body, config.addToWorld);
  134517. return this;
  134518. }
  134519. };
  134520. module.exports = SetBody;
  134521. /***/ }),
  134522. /* 1044 */
  134523. /***/ (function(module, exports) {
  134524. /**
  134525. * @author Richard Davey <rich@photonstorm.com>
  134526. * @copyright 2018 Photon Storm Ltd.
  134527. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134528. */
  134529. /**
  134530. * [description]
  134531. *
  134532. * @name Phaser.Physics.Matter.Components.Sensor
  134533. * @since 3.0.0
  134534. */
  134535. var Sensor = {
  134536. /**
  134537. * [description]
  134538. *
  134539. * @method Phaser.Physics.Matter.Components.Sensor#setSensor
  134540. * @since 3.0.0
  134541. *
  134542. * @param {boolean} value - [description]
  134543. *
  134544. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134545. */
  134546. setSensor: function (value)
  134547. {
  134548. this.body.isSensor = value;
  134549. return this;
  134550. },
  134551. /**
  134552. * [description]
  134553. *
  134554. * @method Phaser.Physics.Matter.Components.Sensor#isSensor
  134555. * @since 3.0.0
  134556. *
  134557. * @return {boolean} [description]
  134558. */
  134559. isSensor: function ()
  134560. {
  134561. return this.body.isSensor;
  134562. }
  134563. };
  134564. module.exports = Sensor;
  134565. /***/ }),
  134566. /* 1045 */
  134567. /***/ (function(module, exports, __webpack_require__) {
  134568. /**
  134569. * @author Richard Davey <rich@photonstorm.com>
  134570. * @copyright 2018 Photon Storm Ltd.
  134571. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134572. */
  134573. var Body = __webpack_require__(73);
  134574. /**
  134575. * [description]
  134576. *
  134577. * @name Phaser.Physics.Matter.Components.Static
  134578. * @since 3.0.0
  134579. */
  134580. var Static = {
  134581. /**
  134582. * [description]
  134583. *
  134584. * @method Phaser.Physics.Matter.Components.Static#setStatic
  134585. * @since 3.0.0
  134586. *
  134587. * @param {boolean} value - [description]
  134588. *
  134589. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134590. */
  134591. setStatic: function (value)
  134592. {
  134593. Body.setStatic(this.body, value);
  134594. return this;
  134595. },
  134596. /**
  134597. * [description]
  134598. *
  134599. * @method Phaser.Physics.Matter.Components.Static#isStatic
  134600. * @since 3.0.0
  134601. *
  134602. * @return {boolean} [description]
  134603. */
  134604. isStatic: function ()
  134605. {
  134606. return this.body.isStatic;
  134607. }
  134608. };
  134609. module.exports = Static;
  134610. /***/ }),
  134611. /* 1046 */
  134612. /***/ (function(module, exports, __webpack_require__) {
  134613. /**
  134614. * @author Richard Davey <rich@photonstorm.com>
  134615. * @copyright 2018 Photon Storm Ltd.
  134616. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134617. */
  134618. var Body = __webpack_require__(73);
  134619. var Vector2 = __webpack_require__(6);
  134620. /**
  134621. * [description]
  134622. *
  134623. * @name Phaser.Physics.Matter.Components.Mass
  134624. * @since 3.0.0
  134625. */
  134626. var Mass = {
  134627. /**
  134628. * [description]
  134629. *
  134630. * @method Phaser.Physics.Matter.Components.Mass#setMass
  134631. * @since 3.0.0
  134632. *
  134633. * @param {number} value - [description]
  134634. *
  134635. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134636. */
  134637. setMass: function (value)
  134638. {
  134639. Body.setMass(this.body, value);
  134640. return this;
  134641. },
  134642. /**
  134643. * [description]
  134644. *
  134645. * @method Phaser.Physics.Matter.Components.Mass#setDensity
  134646. * @since 3.0.0
  134647. *
  134648. * @param {number} value - [description]
  134649. *
  134650. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134651. */
  134652. setDensity: function (value)
  134653. {
  134654. Body.setDensity(this.body, value);
  134655. return this;
  134656. },
  134657. /**
  134658. * The body's center of mass.
  134659. *
  134660. * @name Phaser.Physics.Matter.Components.Mass#centerOfMass
  134661. * @readOnly
  134662. * @since 3.10.0
  134663. *
  134664. * @return {Phaser.Math.Vector2} The center of mass.
  134665. */
  134666. centerOfMass: {
  134667. get: function ()
  134668. {
  134669. return new Vector2(this.body.render.sprite.xOffset * this.width, this.body.render.sprite.yOffset * this.height);
  134670. }
  134671. }
  134672. };
  134673. module.exports = Mass;
  134674. /***/ }),
  134675. /* 1047 */
  134676. /***/ (function(module, exports) {
  134677. /**
  134678. * @author Richard Davey <rich@photonstorm.com>
  134679. * @copyright 2018 Photon Storm Ltd.
  134680. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134681. */
  134682. /**
  134683. * [description]
  134684. *
  134685. * @name Phaser.Physics.Matter.Components.Gravity
  134686. * @since 3.0.0
  134687. */
  134688. var Gravity = {
  134689. /**
  134690. * [description]
  134691. *
  134692. * @method Phaser.Physics.Matter.Components.Gravity#setIgnoreGravity
  134693. * @since 3.0.0
  134694. *
  134695. * @param {boolean} value - [description]
  134696. *
  134697. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134698. */
  134699. setIgnoreGravity: function (value)
  134700. {
  134701. this.body.ignoreGravity = value;
  134702. return this;
  134703. }
  134704. };
  134705. module.exports = Gravity;
  134706. /***/ }),
  134707. /* 1048 */
  134708. /***/ (function(module, exports) {
  134709. /**
  134710. * @author Richard Davey <rich@photonstorm.com>
  134711. * @copyright 2018 Photon Storm Ltd.
  134712. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134713. */
  134714. /**
  134715. * [description]
  134716. *
  134717. * @name Phaser.Physics.Matter.Components.Friction
  134718. * @since 3.0.0
  134719. */
  134720. var Friction = {
  134721. /**
  134722. * [description]
  134723. *
  134724. * @method Phaser.Physics.Matter.Components.Friction#setFriction
  134725. * @since 3.0.0
  134726. *
  134727. * @param {number} value - [description]
  134728. * @param {number} [air] - [description]
  134729. * @param {number} [fstatic] - [description]
  134730. *
  134731. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134732. */
  134733. setFriction: function (value, air, fstatic)
  134734. {
  134735. this.body.friction = value;
  134736. if (air !== undefined)
  134737. {
  134738. this.body.frictionAir = air;
  134739. }
  134740. if (fstatic !== undefined)
  134741. {
  134742. this.body.frictionStatic = fstatic;
  134743. }
  134744. return this;
  134745. },
  134746. /**
  134747. * [description]
  134748. *
  134749. * @method Phaser.Physics.Matter.Components.Friction#setFrictionAir
  134750. * @since 3.0.0
  134751. *
  134752. * @param {number} value - [description]
  134753. *
  134754. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134755. */
  134756. setFrictionAir: function (value)
  134757. {
  134758. this.body.frictionAir = value;
  134759. return this;
  134760. },
  134761. /**
  134762. * [description]
  134763. *
  134764. * @method Phaser.Physics.Matter.Components.Friction#setFrictionStatic
  134765. * @since 3.0.0
  134766. *
  134767. * @param {number} value - [description]
  134768. *
  134769. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134770. */
  134771. setFrictionStatic: function (value)
  134772. {
  134773. this.body.frictionStatic = value;
  134774. return this;
  134775. }
  134776. };
  134777. module.exports = Friction;
  134778. /***/ }),
  134779. /* 1049 */
  134780. /***/ (function(module, exports, __webpack_require__) {
  134781. /**
  134782. * @author Richard Davey <rich@photonstorm.com>
  134783. * @copyright 2018 Photon Storm Ltd.
  134784. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134785. */
  134786. var Body = __webpack_require__(73);
  134787. /**
  134788. * [description]
  134789. *
  134790. * @name Phaser.Physics.Matter.Components.Force
  134791. * @since 3.0.0
  134792. */
  134793. var Force = {
  134794. // force = vec2 / point
  134795. /**
  134796. * [description]
  134797. *
  134798. * @method Phaser.Physics.Matter.Components.Force#applyForce
  134799. * @since 3.0.0
  134800. *
  134801. * @param {Phaser.Math.Vector2} force - [description]
  134802. *
  134803. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134804. */
  134805. applyForce: function (force)
  134806. {
  134807. this._tempVec2.set(this.body.position.x, this.body.position.y);
  134808. Body.applyForce(this.body, this._tempVec2, force);
  134809. return this;
  134810. },
  134811. /**
  134812. * [description]
  134813. *
  134814. * @method Phaser.Physics.Matter.Components.Force#applyForceFrom
  134815. * @since 3.0.0
  134816. *
  134817. * @param {Phaser.Math.Vector2} position - [description]
  134818. * @param {Phaser.Math.Vector2} force - [description]
  134819. *
  134820. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134821. */
  134822. applyForceFrom: function (position, force)
  134823. {
  134824. Body.applyForce(this.body, position, force);
  134825. return this;
  134826. },
  134827. /**
  134828. * [description]
  134829. *
  134830. * @method Phaser.Physics.Matter.Components.Force#thrust
  134831. * @since 3.0.0
  134832. *
  134833. * @param {number} speed - [description]
  134834. *
  134835. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134836. */
  134837. thrust: function (speed)
  134838. {
  134839. var angle = this.body.angle;
  134840. this._tempVec2.set(speed * Math.cos(angle), speed * Math.sin(angle));
  134841. Body.applyForce(this.body, { x: this.body.position.x, y: this.body.position.y }, this._tempVec2);
  134842. return this;
  134843. },
  134844. /**
  134845. * [description]
  134846. *
  134847. * @method Phaser.Physics.Matter.Components.Force#thrustLeft
  134848. * @since 3.0.0
  134849. *
  134850. * @param {number} speed - [description]
  134851. *
  134852. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134853. */
  134854. thrustLeft: function (speed)
  134855. {
  134856. var angle = this.body.angle - Math.PI / 2;
  134857. this._tempVec2.set(speed * Math.cos(angle), speed * Math.sin(angle));
  134858. Body.applyForce(this.body, { x: this.body.position.x, y: this.body.position.y }, this._tempVec2);
  134859. return this;
  134860. },
  134861. /**
  134862. * [description]
  134863. *
  134864. * @method Phaser.Physics.Matter.Components.Force#thrustRight
  134865. * @since 3.0.0
  134866. *
  134867. * @param {number} speed - [description]
  134868. *
  134869. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134870. */
  134871. thrustRight: function (speed)
  134872. {
  134873. var angle = this.body.angle + Math.PI / 2;
  134874. this._tempVec2.set(speed * Math.cos(angle), speed * Math.sin(angle));
  134875. Body.applyForce(this.body, { x: this.body.position.x, y: this.body.position.y }, this._tempVec2);
  134876. return this;
  134877. },
  134878. /**
  134879. * [description]
  134880. *
  134881. * @method Phaser.Physics.Matter.Components.Force#thrustBack
  134882. * @since 3.0.0
  134883. *
  134884. * @param {number} speed - [description]
  134885. *
  134886. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134887. */
  134888. thrustBack: function (speed)
  134889. {
  134890. var angle = this.body.angle - Math.PI;
  134891. this._tempVec2.set(speed * Math.cos(angle), speed * Math.sin(angle));
  134892. Body.applyForce(this.body, { x: this.body.position.x, y: this.body.position.y }, this._tempVec2);
  134893. return this;
  134894. }
  134895. };
  134896. module.exports = Force;
  134897. /***/ }),
  134898. /* 1050 */
  134899. /***/ (function(module, exports) {
  134900. /**
  134901. * @author Richard Davey <rich@photonstorm.com>
  134902. * @copyright 2018 Photon Storm Ltd.
  134903. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134904. */
  134905. /**
  134906. * [description]
  134907. *
  134908. * @name Phaser.Physics.Matter.Components.Collision
  134909. * @since 3.0.0
  134910. */
  134911. var Collision = {
  134912. /**
  134913. * [description]
  134914. *
  134915. * @method Phaser.Physics.Matter.Components.Collision#setCollisionCategory
  134916. * @since 3.0.0
  134917. *
  134918. * @param {number} value - Unique category bitfield.
  134919. *
  134920. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134921. */
  134922. setCollisionCategory: function (value)
  134923. {
  134924. this.body.collisionFilter.category = value;
  134925. return this;
  134926. },
  134927. /**
  134928. * [description]
  134929. *
  134930. * @method Phaser.Physics.Matter.Components.Collision#setCollisionGroup
  134931. * @since 3.0.0
  134932. *
  134933. * @param {number} value - Unique group index.
  134934. *
  134935. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134936. */
  134937. setCollisionGroup: function (value)
  134938. {
  134939. this.body.collisionFilter.group = value;
  134940. return this;
  134941. },
  134942. /**
  134943. * [description]
  134944. *
  134945. * @method Phaser.Physics.Matter.Components.Collision#setCollidesWith
  134946. * @since 3.0.0
  134947. *
  134948. * @param {(number|number[])} categories - A unique category bitfield, or an array of them.
  134949. *
  134950. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134951. */
  134952. setCollidesWith: function (categories)
  134953. {
  134954. var flags = 0;
  134955. if (!Array.isArray(categories))
  134956. {
  134957. flags = categories;
  134958. }
  134959. else
  134960. {
  134961. for (var i = 0; i < categories.length; i++)
  134962. {
  134963. flags |= categories[i];
  134964. }
  134965. }
  134966. this.body.collisionFilter.mask = flags;
  134967. return this;
  134968. }
  134969. };
  134970. module.exports = Collision;
  134971. /***/ }),
  134972. /* 1051 */
  134973. /***/ (function(module, exports) {
  134974. /**
  134975. * @author Richard Davey <rich@photonstorm.com>
  134976. * @copyright 2018 Photon Storm Ltd.
  134977. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  134978. */
  134979. /**
  134980. * [description]
  134981. *
  134982. * @name Phaser.Physics.Matter.Components.Bounce
  134983. * @since 3.0.0
  134984. */
  134985. var Bounce = {
  134986. /**
  134987. * [description]
  134988. *
  134989. * @method Phaser.Physics.Matter.Components.Bounce#setBounce
  134990. * @since 3.0.0
  134991. *
  134992. * @param {number} value - [description]
  134993. *
  134994. * @return {Phaser.GameObjects.GameObject} This Game Object.
  134995. */
  134996. setBounce: function (value)
  134997. {
  134998. this.body.restitution = value;
  134999. return this;
  135000. }
  135001. };
  135002. module.exports = Bounce;
  135003. /***/ }),
  135004. /* 1052 */
  135005. /***/ (function(module, exports, __webpack_require__) {
  135006. /**
  135007. * @author Richard Davey <rich@photonstorm.com>
  135008. * @copyright 2018 Photon Storm Ltd.
  135009. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135010. */
  135011. var Components = __webpack_require__(616);
  135012. var GetFastValue = __webpack_require__(1);
  135013. var Vector2 = __webpack_require__(6);
  135014. /**
  135015. * [description]
  135016. *
  135017. * @function hasGetterOrSetter
  135018. * @private
  135019. *
  135020. * @param {object} def - The object to check.
  135021. *
  135022. * @return {boolean} True if it has a getter or setter, otherwise false.
  135023. */
  135024. function hasGetterOrSetter (def)
  135025. {
  135026. return (!!def.get && typeof def.get === 'function') || (!!def.set && typeof def.set === 'function');
  135027. }
  135028. /**
  135029. * [description]
  135030. *
  135031. * @function Phaser.Physics.Matter.MatterGameObject
  135032. * @since 3.3.0
  135033. *
  135034. * @param {Phaser.Physics.Matter.World} world - [description]
  135035. * @param {Phaser.GameObjects.GameObject} gameObject - [description]
  135036. * @param {object} options - [description]
  135037. *
  135038. * @return {Phaser.GameObjects.GameObject} [description]
  135039. */
  135040. var MatterGameObject = function (world, gameObject, options)
  135041. {
  135042. if (options === undefined) { options = {}; }
  135043. var x = gameObject.x;
  135044. var y = gameObject.y;
  135045. // Temp body pos to avoid body null checks
  135046. gameObject.body = {
  135047. position: {
  135048. x: x,
  135049. y: y
  135050. }
  135051. };
  135052. var mixins = [
  135053. Components.Bounce,
  135054. Components.Collision,
  135055. Components.Force,
  135056. Components.Friction,
  135057. Components.Gravity,
  135058. Components.Mass,
  135059. Components.Sensor,
  135060. Components.SetBody,
  135061. Components.Sleep,
  135062. Components.Static,
  135063. Components.Transform,
  135064. Components.Velocity
  135065. ];
  135066. // First let's inject all of the components into the Game Object
  135067. mixins.forEach(function (mixin)
  135068. {
  135069. for (var key in mixin)
  135070. {
  135071. if (hasGetterOrSetter(mixin[key]))
  135072. {
  135073. Object.defineProperty(gameObject, key, {
  135074. get: mixin[key].get,
  135075. set: mixin[key].set
  135076. });
  135077. }
  135078. else
  135079. {
  135080. Object.defineProperty(gameObject, key, {value: mixin[key]});
  135081. }
  135082. }
  135083. });
  135084. gameObject.world = world;
  135085. gameObject._tempVec2 = new Vector2(x, y);
  135086. var shape = GetFastValue(options, 'shape', null);
  135087. if (!shape)
  135088. {
  135089. shape = 'rectangle';
  135090. }
  135091. gameObject.setBody(shape, options);
  135092. return gameObject;
  135093. };
  135094. module.exports = MatterGameObject;
  135095. /***/ }),
  135096. /* 1053 */
  135097. /***/ (function(module, exports, __webpack_require__) {
  135098. /**
  135099. * @author Richard Davey <rich@photonstorm.com>
  135100. * @copyright 2018 Photon Storm Ltd.
  135101. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135102. */
  135103. /**
  135104. * @namespace Phaser.Physics.Matter
  135105. */
  135106. module.exports = {
  135107. Factory: __webpack_require__(1022),
  135108. Image: __webpack_require__(1019),
  135109. Matter: __webpack_require__(681),
  135110. MatterPhysics: __webpack_require__(1034),
  135111. PolyDecomp: __webpack_require__(1021),
  135112. Sprite: __webpack_require__(1018),
  135113. TileBody: __webpack_require__(684),
  135114. World: __webpack_require__(1012)
  135115. };
  135116. /**
  135117. * @namespace MatterJS
  135118. */
  135119. /**
  135120. * @classdesc
  135121. * The `Matter.Body` module contains methods for creating and manipulating body models.
  135122. * A `Matter.Body` is a rigid body that can be simulated by a `Matter.Engine`.
  135123. * Factories for commonly used body configurations (such as rectangles, circles and other polygons) can be found in the module `Matter.Bodies`.
  135124. *
  135125. * @class MatterJS.Body
  135126. */
  135127. /**
  135128. * @classdesc
  135129. * The `Matter.Composite` module contains methods for creating and manipulating composite bodies.
  135130. * A composite body is a collection of `Matter.Body`, `Matter.Constraint` and other `Matter.Composite`, therefore composites form a tree structure.
  135131. * It is important to use the functions in this module to modify composites, rather than directly modifying their properties.
  135132. * 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`.
  135133. *
  135134. * @class MatterJS.Composite
  135135. */
  135136. /**
  135137. * @classdesc
  135138. * The `Matter.World` module contains methods for creating and manipulating the world composite.
  135139. * A `Matter.World` is a `Matter.Composite` body, which is a collection of `Matter.Body`, `Matter.Constraint` and other `Matter.Composite`.
  135140. * A `Matter.World` has a few additional properties including `gravity` and `bounds`.
  135141. * It is important to use the functions in the `Matter.Composite` module to modify the world composite, rather than directly modifying its properties.
  135142. * There are also a few methods here that alias those in `Matter.Composite` for easier readability.
  135143. *
  135144. * @class MatterJS.World
  135145. * @extends MatterJS.Composite
  135146. */
  135147. /**
  135148. * @classdesc
  135149. * The `Matter.Constraint` module contains methods for creating and manipulating constraints.
  135150. * Constraints are used for specifying that a fixed distance must be maintained between two bodies (or a body and a fixed world-space position).
  135151. * The stiffness of constraints can be modified to create springs or elastic.
  135152. *
  135153. * @class MatterJS.Constraint
  135154. */
  135155. /**
  135156. * @classdesc
  135157. * The `Matter.Engine` module contains methods for creating and manipulating engines.
  135158. * An engine is a controller that manages updating the simulation of the world.
  135159. *
  135160. * @class MatterJS.Engine
  135161. */
  135162. /***/ }),
  135163. /* 1054 */
  135164. /***/ (function(module, exports) {
  135165. /**
  135166. * @author Richard Davey <rich@photonstorm.com>
  135167. * @copyright 2018 Photon Storm Ltd.
  135168. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135169. */
  135170. /**
  135171. * [description]
  135172. *
  135173. * @function Phaser.Physics.Impact.SeperateY
  135174. * @since 3.0.0
  135175. *
  135176. * @param {Phaser.Physics.Impact.World} world - [description]
  135177. * @param {Phaser.Physics.Impact.Body} top - [description]
  135178. * @param {Phaser.Physics.Impact.Body} bottom - [description]
  135179. * @param {Phaser.Physics.Impact.Body} [weak] - [description]
  135180. */
  135181. var SeperateY = function (world, top, bottom, weak)
  135182. {
  135183. var nudge = (top.pos.y + top.size.y - bottom.pos.y);
  135184. var nudgeX;
  135185. var resTop;
  135186. if (weak)
  135187. {
  135188. var strong = (top === weak) ? bottom : top;
  135189. weak.vel.y = -weak.vel.y * weak.bounciness + strong.vel.y;
  135190. // Riding on a platform?
  135191. nudgeX = 0;
  135192. if (weak === top && Math.abs(weak.vel.y - strong.vel.y) < weak.minBounceVelocity)
  135193. {
  135194. weak.standing = true;
  135195. nudgeX = strong.vel.x * world.delta;
  135196. }
  135197. var resWeak = world.collisionMap.trace(weak.pos.x, weak.pos.y, nudgeX, weak === top ? -nudge : nudge, weak.size.x, weak.size.y);
  135198. weak.pos.y = resWeak.pos.y;
  135199. weak.pos.x = resWeak.pos.x;
  135200. }
  135201. else if (world.gravity && (bottom.standing || top.vel.y > 0))
  135202. {
  135203. 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);
  135204. top.pos.y = resTop.pos.y;
  135205. if (top.bounciness > 0 && top.vel.y > top.minBounceVelocity)
  135206. {
  135207. top.vel.y *= -top.bounciness;
  135208. }
  135209. else
  135210. {
  135211. top.standing = true;
  135212. top.vel.y = 0;
  135213. }
  135214. }
  135215. else
  135216. {
  135217. var v2 = (top.vel.y - bottom.vel.y) / 2;
  135218. top.vel.y = -v2;
  135219. bottom.vel.y = v2;
  135220. nudgeX = bottom.vel.x * world.delta;
  135221. resTop = world.collisionMap.trace(top.pos.x, top.pos.y, nudgeX, -nudge / 2, top.size.x, top.size.y);
  135222. top.pos.y = resTop.pos.y;
  135223. var resBottom = world.collisionMap.trace(bottom.pos.x, bottom.pos.y, 0, nudge / 2, bottom.size.x, bottom.size.y);
  135224. bottom.pos.y = resBottom.pos.y;
  135225. }
  135226. };
  135227. module.exports = SeperateY;
  135228. /***/ }),
  135229. /* 1055 */
  135230. /***/ (function(module, exports) {
  135231. /**
  135232. * @author Richard Davey <rich@photonstorm.com>
  135233. * @copyright 2018 Photon Storm Ltd.
  135234. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135235. */
  135236. /**
  135237. * [description]
  135238. *
  135239. * @function Phaser.Physics.Impact.SeperateX
  135240. * @since 3.0.0
  135241. *
  135242. * @param {Phaser.Physics.Impact.World} world - [description]
  135243. * @param {Phaser.Physics.Impact.Body} left - [description]
  135244. * @param {Phaser.Physics.Impact.Body} right - [description]
  135245. * @param {Phaser.Physics.Impact.Body} [weak] - [description]
  135246. */
  135247. var SeperateX = function (world, left, right, weak)
  135248. {
  135249. var nudge = left.pos.x + left.size.x - right.pos.x;
  135250. // We have a weak entity, so just move this one
  135251. if (weak)
  135252. {
  135253. var strong = (left === weak) ? right : left;
  135254. weak.vel.x = -weak.vel.x * weak.bounciness + strong.vel.x;
  135255. var resWeak = world.collisionMap.trace(weak.pos.x, weak.pos.y, weak === left ? -nudge : nudge, 0, weak.size.x, weak.size.y);
  135256. weak.pos.x = resWeak.pos.x;
  135257. }
  135258. else
  135259. {
  135260. var v2 = (left.vel.x - right.vel.x) / 2;
  135261. left.vel.x = -v2;
  135262. right.vel.x = v2;
  135263. var resLeft = world.collisionMap.trace(left.pos.x, left.pos.y, -nudge / 2, 0, left.size.x, left.size.y);
  135264. left.pos.x = Math.floor(resLeft.pos.x);
  135265. var resRight = world.collisionMap.trace(right.pos.x, right.pos.y, nudge / 2, 0, right.size.x, right.size.y);
  135266. right.pos.x = Math.ceil(resRight.pos.x);
  135267. }
  135268. };
  135269. module.exports = SeperateX;
  135270. /***/ }),
  135271. /* 1056 */
  135272. /***/ (function(module, exports, __webpack_require__) {
  135273. /**
  135274. * @author Richard Davey <rich@photonstorm.com>
  135275. * @copyright 2018 Photon Storm Ltd.
  135276. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135277. */
  135278. var COLLIDES = __webpack_require__(338);
  135279. var SeperateX = __webpack_require__(1055);
  135280. var SeperateY = __webpack_require__(1054);
  135281. /**
  135282. * Impact Physics Solver
  135283. *
  135284. * @function Phaser.Physics.Impact.Solver
  135285. * @since 3.0.0
  135286. *
  135287. * @param {Phaser.Physics.Impact.World} world - [description]
  135288. * @param {Phaser.Physics.Impact.Body} bodyA - [description]
  135289. * @param {Phaser.Physics.Impact.Body} bodyB - [description]
  135290. */
  135291. var Solver = function (world, bodyA, bodyB)
  135292. {
  135293. var weak = null;
  135294. if (bodyA.collides === COLLIDES.LITE || bodyB.collides === COLLIDES.FIXED)
  135295. {
  135296. weak = bodyA;
  135297. }
  135298. else if (bodyB.collides === COLLIDES.LITE || bodyA.collides === COLLIDES.FIXED)
  135299. {
  135300. weak = bodyB;
  135301. }
  135302. if (bodyA.last.x + bodyA.size.x > bodyB.last.x && bodyA.last.x < bodyB.last.x + bodyB.size.x)
  135303. {
  135304. if (bodyA.last.y < bodyB.last.y)
  135305. {
  135306. SeperateY(world, bodyA, bodyB, weak);
  135307. }
  135308. else
  135309. {
  135310. SeperateY(world, bodyB, bodyA, weak);
  135311. }
  135312. bodyA.collideWith(bodyB, 'y');
  135313. bodyB.collideWith(bodyA, 'y');
  135314. world.emit('collide', bodyA, bodyB, 'y');
  135315. }
  135316. else if (bodyA.last.y + bodyA.size.y > bodyB.last.y && bodyA.last.y < bodyB.last.y + bodyB.size.y)
  135317. {
  135318. if (bodyA.last.x < bodyB.last.x)
  135319. {
  135320. SeperateX(world, bodyA, bodyB, weak);
  135321. }
  135322. else
  135323. {
  135324. SeperateX(world, bodyB, bodyA, weak);
  135325. }
  135326. bodyA.collideWith(bodyB, 'x');
  135327. bodyB.collideWith(bodyA, 'x');
  135328. world.emit('collide', bodyA, bodyB, 'x');
  135329. }
  135330. };
  135331. module.exports = Solver;
  135332. /***/ }),
  135333. /* 1057 */
  135334. /***/ (function(module, exports, __webpack_require__) {
  135335. /**
  135336. * @author Richard Davey <rich@photonstorm.com>
  135337. * @copyright 2018 Photon Storm Ltd.
  135338. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135339. */
  135340. var Class = __webpack_require__(0);
  135341. var Factory = __webpack_require__(1027);
  135342. var GetFastValue = __webpack_require__(1);
  135343. var Merge = __webpack_require__(94);
  135344. var PluginCache = __webpack_require__(12);
  135345. var World = __webpack_require__(1023);
  135346. /**
  135347. * @classdesc
  135348. * [description]
  135349. *
  135350. * @class ImpactPhysics
  135351. * @memberOf Phaser.Physics.Impact
  135352. * @constructor
  135353. * @since 3.0.0
  135354. *
  135355. * @param {Phaser.Scene} scene - [description]
  135356. */
  135357. var ImpactPhysics = new Class({
  135358. initialize:
  135359. function ImpactPhysics (scene)
  135360. {
  135361. /**
  135362. * [description]
  135363. *
  135364. * @name Phaser.Physics.Impact.ImpactPhysics#scene
  135365. * @type {Phaser.Scene}
  135366. * @since 3.0.0
  135367. */
  135368. this.scene = scene;
  135369. /**
  135370. * [description]
  135371. *
  135372. * @name Phaser.Physics.Impact.ImpactPhysics#systems
  135373. * @type {Phaser.Scenes.Systems}
  135374. * @since 3.0.0
  135375. */
  135376. this.systems = scene.sys;
  135377. /**
  135378. * [description]
  135379. *
  135380. * @name Phaser.Physics.Impact.ImpactPhysics#config
  135381. * @type {object}
  135382. * @since 3.0.0
  135383. */
  135384. this.config = this.getConfig();
  135385. /**
  135386. * [description]
  135387. *
  135388. * @name Phaser.Physics.Impact.ImpactPhysics#world
  135389. * @type {Phaser.Physics.Impact.World}
  135390. * @since 3.0.0
  135391. */
  135392. this.world;
  135393. /**
  135394. * [description]
  135395. *
  135396. * @name Phaser.Physics.Impact.ImpactPhysics#add
  135397. * @type {Phaser.Physics.Impact.Factory}
  135398. * @since 3.0.0
  135399. */
  135400. this.add;
  135401. scene.sys.events.once('boot', this.boot, this);
  135402. scene.sys.events.on('start', this.start, this);
  135403. },
  135404. /**
  135405. * This method is called automatically, only once, when the Scene is first created.
  135406. * Do not invoke it directly.
  135407. *
  135408. * @method Phaser.Physics.Impact.ImpactPhysics#boot
  135409. * @private
  135410. * @since 3.5.1
  135411. */
  135412. boot: function ()
  135413. {
  135414. this.world = new World(this.scene, this.config);
  135415. this.add = new Factory(this.world);
  135416. this.systems.events.once('destroy', this.destroy, this);
  135417. },
  135418. /**
  135419. * This method is called automatically by the Scene when it is starting up.
  135420. * It is responsible for creating local systems, properties and listening for Scene events.
  135421. * Do not invoke it directly.
  135422. *
  135423. * @method Phaser.Physics.Impact.ImpactPhysics#start
  135424. * @private
  135425. * @since 3.5.0
  135426. */
  135427. start: function ()
  135428. {
  135429. if (!this.world)
  135430. {
  135431. this.world = new World(this.scene, this.config);
  135432. this.add = new Factory(this.world);
  135433. }
  135434. var eventEmitter = this.systems.events;
  135435. eventEmitter.on('update', this.world.update, this.world);
  135436. eventEmitter.once('shutdown', this.shutdown, this);
  135437. },
  135438. /**
  135439. * [description]
  135440. *
  135441. * @method Phaser.Physics.Impact.ImpactPhysics#getConfig
  135442. * @since 3.0.0
  135443. *
  135444. * @return {object} [description]
  135445. */
  135446. getConfig: function ()
  135447. {
  135448. var gameConfig = this.systems.game.config.physics;
  135449. var sceneConfig = this.systems.settings.physics;
  135450. var config = Merge(
  135451. GetFastValue(sceneConfig, 'impact', {}),
  135452. GetFastValue(gameConfig, 'impact', {})
  135453. );
  135454. return config;
  135455. },
  135456. /**
  135457. * [description]
  135458. *
  135459. * @method Phaser.Physics.Impact.ImpactPhysics#pause
  135460. * @since 3.0.0
  135461. *
  135462. * @return {Phaser.Physics.Impact.World} The Impact World object.
  135463. */
  135464. pause: function ()
  135465. {
  135466. return this.world.pause();
  135467. },
  135468. /**
  135469. * [description]
  135470. *
  135471. * @method Phaser.Physics.Impact.ImpactPhysics#resume
  135472. * @since 3.0.0
  135473. *
  135474. * @return {Phaser.Physics.Impact.World} The Impact World object.
  135475. */
  135476. resume: function ()
  135477. {
  135478. return this.world.resume();
  135479. },
  135480. /**
  135481. * The Scene that owns this plugin is shutting down.
  135482. * We need to kill and reset all internal properties as well as stop listening to Scene events.
  135483. *
  135484. * @method Phaser.Physics.Impact.ImpactPhysics#shutdown
  135485. * @private
  135486. * @since 3.0.0
  135487. */
  135488. shutdown: function ()
  135489. {
  135490. var eventEmitter = this.systems.events;
  135491. eventEmitter.off('update', this.world.update, this.world);
  135492. eventEmitter.off('shutdown', this.shutdown, this);
  135493. this.add.destroy();
  135494. this.world.destroy();
  135495. this.add = null;
  135496. this.world = null;
  135497. },
  135498. /**
  135499. * The Scene that owns this plugin is being destroyed.
  135500. * We need to shutdown and then kill off all external references.
  135501. *
  135502. * @method Phaser.Physics.Impact.ImpactPhysics#destroy
  135503. * @private
  135504. * @since 3.0.0
  135505. */
  135506. destroy: function ()
  135507. {
  135508. this.shutdown();
  135509. this.scene.sys.events.off('start', this.start, this);
  135510. this.scene = null;
  135511. this.systems = null;
  135512. }
  135513. });
  135514. PluginCache.register('ImpactPhysics', ImpactPhysics, 'impactPhysics');
  135515. module.exports = ImpactPhysics;
  135516. /***/ }),
  135517. /* 1058 */
  135518. /***/ (function(module, exports) {
  135519. /**
  135520. * @author Richard Davey <rich@photonstorm.com>
  135521. * @copyright 2018 Photon Storm Ltd.
  135522. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135523. */
  135524. /**
  135525. * [description]
  135526. *
  135527. * @name Phaser.Physics.Impact.Components.Velocity
  135528. * @since 3.0.0
  135529. */
  135530. var Velocity = {
  135531. /**
  135532. * [description]
  135533. *
  135534. * @method Phaser.Physics.Impact.Components.Velocity#setVelocityX
  135535. * @since 3.0.0
  135536. *
  135537. * @param {number} x - [description]
  135538. *
  135539. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135540. */
  135541. setVelocityX: function (x)
  135542. {
  135543. this.vel.x = x;
  135544. return this;
  135545. },
  135546. /**
  135547. * [description]
  135548. *
  135549. * @method Phaser.Physics.Impact.Components.Velocity#setVelocityY
  135550. * @since 3.0.0
  135551. *
  135552. * @param {number} y - [description]
  135553. *
  135554. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135555. */
  135556. setVelocityY: function (y)
  135557. {
  135558. this.vel.y = y;
  135559. return this;
  135560. },
  135561. /**
  135562. * [description]
  135563. *
  135564. * @method Phaser.Physics.Impact.Components.Velocity#setVelocity
  135565. * @since 3.0.0
  135566. *
  135567. * @param {number} x - [description]
  135568. * @param {number} [y=x] - [description]
  135569. *
  135570. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135571. */
  135572. setVelocity: function (x, y)
  135573. {
  135574. if (y === undefined) { y = x; }
  135575. this.vel.x = x;
  135576. this.vel.y = y;
  135577. return this;
  135578. },
  135579. /**
  135580. * [description]
  135581. *
  135582. * @method Phaser.Physics.Impact.Components.Velocity#setMaxVelocity
  135583. * @since 3.0.0
  135584. *
  135585. * @param {number} x - [description]
  135586. * @param {number} [y=x] - [description]
  135587. *
  135588. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135589. */
  135590. setMaxVelocity: function (x, y)
  135591. {
  135592. if (y === undefined) { y = x; }
  135593. this.maxVel.x = x;
  135594. this.maxVel.y = y;
  135595. return this;
  135596. }
  135597. };
  135598. module.exports = Velocity;
  135599. /***/ }),
  135600. /* 1059 */
  135601. /***/ (function(module, exports) {
  135602. /**
  135603. * @author Richard Davey <rich@photonstorm.com>
  135604. * @copyright 2018 Photon Storm Ltd.
  135605. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135606. */
  135607. /**
  135608. * [description]
  135609. *
  135610. * @name Phaser.Physics.Impact.Components.SetGameObject
  135611. * @since 3.0.0
  135612. */
  135613. var SetGameObject = {
  135614. /**
  135615. * [description]
  135616. *
  135617. * @method Phaser.Physics.Impact.Components.SetGameObject#setGameObject
  135618. * @since 3.0.0
  135619. *
  135620. * @param {Phaser.GameObjects.GameObject} gameObject - [description]
  135621. * @param {boolean} [sync=true] - [description]
  135622. *
  135623. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135624. */
  135625. setGameObject: function (gameObject, sync)
  135626. {
  135627. if (sync === undefined) { sync = true; }
  135628. if (gameObject)
  135629. {
  135630. this.body.gameObject = gameObject;
  135631. if (sync)
  135632. {
  135633. this.syncGameObject();
  135634. }
  135635. }
  135636. else
  135637. {
  135638. this.body.gameObject = null;
  135639. }
  135640. return this;
  135641. },
  135642. /**
  135643. * [description]
  135644. *
  135645. * @method Phaser.Physics.Impact.Components.SetGameObject#syncGameObject
  135646. * @since 3.0.0
  135647. *
  135648. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135649. */
  135650. syncGameObject: function ()
  135651. {
  135652. var gameObject = this.body.gameObject;
  135653. if (gameObject)
  135654. {
  135655. this.setBodySize(gameObject.width * gameObject.scaleX, gameObject.height * gameObject.scaleY);
  135656. }
  135657. return this;
  135658. }
  135659. };
  135660. module.exports = SetGameObject;
  135661. /***/ }),
  135662. /* 1060 */
  135663. /***/ (function(module, exports) {
  135664. /**
  135665. * @author Richard Davey <rich@photonstorm.com>
  135666. * @copyright 2018 Photon Storm Ltd.
  135667. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135668. */
  135669. /**
  135670. * [description]
  135671. *
  135672. * @name Phaser.Physics.Impact.Components.Offset
  135673. * @since 3.0.0
  135674. */
  135675. var Offset = {
  135676. /**
  135677. * [description]
  135678. *
  135679. * @method Phaser.Physics.Impact.Components.Offset#setOffset
  135680. * @since 3.0.0
  135681. *
  135682. * @param {number} x - [description]
  135683. * @param {number} y - [description]
  135684. * @param {number} [width] - [description]
  135685. * @param {number} [height] - [description]
  135686. *
  135687. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135688. */
  135689. setOffset: function (x, y, width, height)
  135690. {
  135691. this.body.offset.x = x;
  135692. this.body.offset.y = y;
  135693. if (width)
  135694. {
  135695. this.setBodySize(width, height);
  135696. }
  135697. return this;
  135698. }
  135699. };
  135700. module.exports = Offset;
  135701. /***/ }),
  135702. /* 1061 */
  135703. /***/ (function(module, exports) {
  135704. /**
  135705. * @author Richard Davey <rich@photonstorm.com>
  135706. * @copyright 2018 Photon Storm Ltd.
  135707. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135708. */
  135709. /**
  135710. * [description]
  135711. *
  135712. * @name Phaser.Physics.Impact.Components.Gravity
  135713. * @since 3.0.0
  135714. */
  135715. var Gravity = {
  135716. /**
  135717. * [description]
  135718. *
  135719. * @method Phaser.Physics.Impact.Components.Gravity#setGravity
  135720. * @since 3.0.0
  135721. *
  135722. * @param {number} value - [description]
  135723. *
  135724. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135725. */
  135726. setGravity: function (value)
  135727. {
  135728. this.body.gravityFactor = value;
  135729. return this;
  135730. },
  135731. /**
  135732. * [description]
  135733. *
  135734. * @name Phaser.Physics.Impact.Components.Gravity#gravity
  135735. * @type {number}
  135736. * @since 3.0.0
  135737. */
  135738. gravity: {
  135739. get: function ()
  135740. {
  135741. return this.body.gravityFactor;
  135742. },
  135743. set: function (value)
  135744. {
  135745. this.body.gravityFactor = value;
  135746. }
  135747. }
  135748. };
  135749. module.exports = Gravity;
  135750. /***/ }),
  135751. /* 1062 */
  135752. /***/ (function(module, exports) {
  135753. /**
  135754. * @author Richard Davey <rich@photonstorm.com>
  135755. * @copyright 2018 Photon Storm Ltd.
  135756. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135757. */
  135758. /**
  135759. * [description]
  135760. *
  135761. * @name Phaser.Physics.Impact.Components.Friction
  135762. * @since 3.0.0
  135763. */
  135764. var Friction = {
  135765. /**
  135766. * [description]
  135767. *
  135768. * @method Phaser.Physics.Impact.Components.Friction#setFrictionX
  135769. * @since 3.0.0
  135770. *
  135771. * @param {number} x - [description]
  135772. *
  135773. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135774. */
  135775. setFrictionX: function (x)
  135776. {
  135777. this.friction.x = x;
  135778. return this;
  135779. },
  135780. /**
  135781. * [description]
  135782. *
  135783. * @method Phaser.Physics.Impact.Components.Friction#setFrictionY
  135784. * @since 3.0.0
  135785. *
  135786. * @param {number} y - [description]
  135787. *
  135788. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135789. */
  135790. setFrictionY: function (y)
  135791. {
  135792. this.friction.y = y;
  135793. return this;
  135794. },
  135795. /**
  135796. * [description]
  135797. *
  135798. * @method Phaser.Physics.Impact.Components.Friction#setFriction
  135799. * @since 3.0.0
  135800. *
  135801. * @param {number} x - [description]
  135802. * @param {number} y - [description]
  135803. *
  135804. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135805. */
  135806. setFriction: function (x, y)
  135807. {
  135808. this.friction.x = x;
  135809. this.friction.y = y;
  135810. return this;
  135811. }
  135812. };
  135813. module.exports = Friction;
  135814. /***/ }),
  135815. /* 1063 */
  135816. /***/ (function(module, exports) {
  135817. /**
  135818. * @author Richard Davey <rich@photonstorm.com>
  135819. * @copyright 2018 Photon Storm Ltd.
  135820. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135821. */
  135822. /**
  135823. * [description]
  135824. *
  135825. * @name Phaser.Physics.Impact.Components.Debug
  135826. * @since 3.0.0
  135827. */
  135828. var Debug = {
  135829. /**
  135830. * [description]
  135831. *
  135832. * @method Phaser.Physics.Impact.Components.Debug#setDebug
  135833. * @since 3.0.0
  135834. *
  135835. * @param {boolean} showBody - [description]
  135836. * @param {boolean} showVelocity - [description]
  135837. * @param {number} bodyColor - [description]
  135838. *
  135839. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135840. */
  135841. setDebug: function (showBody, showVelocity, bodyColor)
  135842. {
  135843. this.debugShowBody = showBody;
  135844. this.debugShowVelocity = showVelocity;
  135845. this.debugBodyColor = bodyColor;
  135846. return this;
  135847. },
  135848. /**
  135849. * [description]
  135850. *
  135851. * @method Phaser.Physics.Impact.Components.Debug#setDebugBodyColor
  135852. * @since 3.0.0
  135853. *
  135854. * @param {number} value - [description]
  135855. *
  135856. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135857. */
  135858. setDebugBodyColor: function (value)
  135859. {
  135860. this.body.debugBodyColor = value;
  135861. return this;
  135862. },
  135863. /**
  135864. * [description]
  135865. *
  135866. * @name Phaser.Physics.Impact.Components.Debug#debugShowBody
  135867. * @type {boolean}
  135868. * @since 3.0.0
  135869. */
  135870. debugShowBody: {
  135871. get: function ()
  135872. {
  135873. return this.body.debugShowBody;
  135874. },
  135875. set: function (value)
  135876. {
  135877. this.body.debugShowBody = value;
  135878. }
  135879. },
  135880. /**
  135881. * [description]
  135882. *
  135883. * @name Phaser.Physics.Impact.Components.Debug#debugShowVelocity
  135884. * @type {boolean}
  135885. * @since 3.0.0
  135886. */
  135887. debugShowVelocity: {
  135888. get: function ()
  135889. {
  135890. return this.body.debugShowVelocity;
  135891. },
  135892. set: function (value)
  135893. {
  135894. this.body.debugShowVelocity = value;
  135895. }
  135896. },
  135897. /**
  135898. * [description]
  135899. *
  135900. * @name Phaser.Physics.Impact.Components.Debug#debugBodyColor
  135901. * @type {number}
  135902. * @since 3.0.0
  135903. */
  135904. debugBodyColor: {
  135905. get: function ()
  135906. {
  135907. return this.body.debugBodyColor;
  135908. },
  135909. set: function (value)
  135910. {
  135911. this.body.debugBodyColor = value;
  135912. }
  135913. }
  135914. };
  135915. module.exports = Debug;
  135916. /***/ }),
  135917. /* 1064 */
  135918. /***/ (function(module, exports, __webpack_require__) {
  135919. /**
  135920. * @author Richard Davey <rich@photonstorm.com>
  135921. * @copyright 2018 Photon Storm Ltd.
  135922. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  135923. */
  135924. var COLLIDES = __webpack_require__(338);
  135925. /**
  135926. * @callback CollideCallback
  135927. *
  135928. * @param {Phaser.Physics.Impact.Body} body - [description]
  135929. * @param {Phaser.Physics.Impact.Body} other - [description]
  135930. * @param {string} axis - [description]
  135931. */
  135932. /**
  135933. * [description]
  135934. *
  135935. * @name Phaser.Physics.Impact.Components.Collides
  135936. * @since 3.0.0
  135937. */
  135938. var Collides = {
  135939. _collideCallback: null,
  135940. _callbackScope: null,
  135941. /**
  135942. * [description]
  135943. *
  135944. * @method Phaser.Physics.Impact.Components.Collides#setCollideCallback
  135945. * @since 3.0.0
  135946. *
  135947. * @param {CollideCallback} callback - [description]
  135948. * @param {*} scope - [description]
  135949. *
  135950. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135951. */
  135952. setCollideCallback: function (callback, scope)
  135953. {
  135954. this._collideCallback = callback;
  135955. if (scope)
  135956. {
  135957. this._callbackScope = scope;
  135958. }
  135959. return this;
  135960. },
  135961. /**
  135962. * [description]
  135963. *
  135964. * @method Phaser.Physics.Impact.Components.Collides#setCollidesNever
  135965. * @since 3.0.0
  135966. *
  135967. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135968. */
  135969. setCollidesNever: function ()
  135970. {
  135971. this.body.collides = COLLIDES.NEVER;
  135972. return this;
  135973. },
  135974. /**
  135975. * [description]
  135976. *
  135977. * @method Phaser.Physics.Impact.Components.Collides#setLiteCollision
  135978. * @since 3.6.0
  135979. *
  135980. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135981. */
  135982. setLiteCollision: function ()
  135983. {
  135984. this.body.collides = COLLIDES.LITE;
  135985. return this;
  135986. },
  135987. /**
  135988. * [description]
  135989. *
  135990. * @method Phaser.Physics.Impact.Components.Collides#setPassiveCollision
  135991. * @since 3.6.0
  135992. *
  135993. * @return {Phaser.GameObjects.GameObject} This Game Object.
  135994. */
  135995. setPassiveCollision: function ()
  135996. {
  135997. this.body.collides = COLLIDES.PASSIVE;
  135998. return this;
  135999. },
  136000. /**
  136001. * [description]
  136002. *
  136003. * @method Phaser.Physics.Impact.Components.Collides#setActiveCollision
  136004. * @since 3.6.0
  136005. *
  136006. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136007. */
  136008. setActiveCollision: function ()
  136009. {
  136010. this.body.collides = COLLIDES.ACTIVE;
  136011. return this;
  136012. },
  136013. /**
  136014. * [description]
  136015. *
  136016. * @method Phaser.Physics.Impact.Components.Collides#setFixedCollision
  136017. * @since 3.6.0
  136018. *
  136019. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136020. */
  136021. setFixedCollision: function ()
  136022. {
  136023. this.body.collides = COLLIDES.FIXED;
  136024. return this;
  136025. },
  136026. /**
  136027. * [description]
  136028. *
  136029. * @name Phaser.Physics.Impact.Components.Collides#collides
  136030. * @type {number}
  136031. * @since 3.0.0
  136032. */
  136033. collides: {
  136034. get: function ()
  136035. {
  136036. return this.body.collides;
  136037. },
  136038. set: function (value)
  136039. {
  136040. this.body.collides = value;
  136041. }
  136042. }
  136043. };
  136044. module.exports = Collides;
  136045. /***/ }),
  136046. /* 1065 */
  136047. /***/ (function(module, exports, __webpack_require__) {
  136048. /**
  136049. * @author Richard Davey <rich@photonstorm.com>
  136050. * @copyright 2018 Photon Storm Ltd.
  136051. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136052. */
  136053. var TYPE = __webpack_require__(337);
  136054. /**
  136055. * [description]
  136056. *
  136057. * @name Phaser.Physics.Impact.Components.CheckAgainst
  136058. * @since 3.0.0
  136059. */
  136060. var CheckAgainst = {
  136061. /**
  136062. * [description]
  136063. *
  136064. * @method Phaser.Physics.Impact.Components.CheckAgainst#setAvsB
  136065. * @since 3.0.0
  136066. *
  136067. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136068. */
  136069. setAvsB: function ()
  136070. {
  136071. this.setTypeA();
  136072. return this.setCheckAgainstB();
  136073. },
  136074. /**
  136075. * [description]
  136076. *
  136077. * @method Phaser.Physics.Impact.Components.CheckAgainst#setBvsA
  136078. * @since 3.0.0
  136079. *
  136080. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136081. */
  136082. setBvsA: function ()
  136083. {
  136084. this.setTypeB();
  136085. return this.setCheckAgainstA();
  136086. },
  136087. /**
  136088. * [description]
  136089. *
  136090. * @method Phaser.Physics.Impact.Components.CheckAgainst#setCheckAgainstNone
  136091. * @since 3.0.0
  136092. *
  136093. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136094. */
  136095. setCheckAgainstNone: function ()
  136096. {
  136097. this.body.checkAgainst = TYPE.NONE;
  136098. return this;
  136099. },
  136100. /**
  136101. * [description]
  136102. *
  136103. * @method Phaser.Physics.Impact.Components.CheckAgainst#setCheckAgainstA
  136104. * @since 3.0.0
  136105. *
  136106. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136107. */
  136108. setCheckAgainstA: function ()
  136109. {
  136110. this.body.checkAgainst = TYPE.A;
  136111. return this;
  136112. },
  136113. /**
  136114. * [description]
  136115. *
  136116. * @method Phaser.Physics.Impact.Components.CheckAgainst#setCheckAgainstB
  136117. * @since 3.0.0
  136118. *
  136119. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136120. */
  136121. setCheckAgainstB: function ()
  136122. {
  136123. this.body.checkAgainst = TYPE.B;
  136124. return this;
  136125. },
  136126. /**
  136127. * [description]
  136128. *
  136129. * @name Phaser.Physics.Impact.Components.CheckAgainst#checkAgainst
  136130. * @type {number}
  136131. * @since 3.0.0
  136132. */
  136133. checkAgainst: {
  136134. get: function ()
  136135. {
  136136. return this.body.checkAgainst;
  136137. },
  136138. set: function (value)
  136139. {
  136140. this.body.checkAgainst = value;
  136141. }
  136142. }
  136143. };
  136144. module.exports = CheckAgainst;
  136145. /***/ }),
  136146. /* 1066 */
  136147. /***/ (function(module, exports) {
  136148. /**
  136149. * @author Richard Davey <rich@photonstorm.com>
  136150. * @copyright 2018 Photon Storm Ltd.
  136151. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136152. */
  136153. /**
  136154. * [description]
  136155. *
  136156. * @name Phaser.Physics.Impact.Components.Bounce
  136157. * @since 3.0.0
  136158. */
  136159. var Bounce = {
  136160. /**
  136161. * [description]
  136162. *
  136163. * @method Phaser.Physics.Impact.Components.Bounce#setBounce
  136164. * @since 3.0.0
  136165. *
  136166. * @param {number} value - [description]
  136167. *
  136168. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136169. */
  136170. setBounce: function (value)
  136171. {
  136172. this.body.bounciness = value;
  136173. return this;
  136174. },
  136175. /**
  136176. * [description]
  136177. *
  136178. * @method Phaser.Physics.Impact.Components.Bounce#setMinBounceVelocity
  136179. * @since 3.0.0
  136180. *
  136181. * @param {number} value - [description]
  136182. *
  136183. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136184. */
  136185. setMinBounceVelocity: function (value)
  136186. {
  136187. this.body.minBounceVelocity = value;
  136188. return this;
  136189. },
  136190. /**
  136191. * [description]
  136192. *
  136193. * @name Phaser.Physics.Impact.Components.Bounce#bounce
  136194. * @type {number}
  136195. * @since 3.0.0
  136196. */
  136197. bounce: {
  136198. get: function ()
  136199. {
  136200. return this.body.bounciness;
  136201. },
  136202. set: function (value)
  136203. {
  136204. this.body.bounciness = value;
  136205. }
  136206. }
  136207. };
  136208. module.exports = Bounce;
  136209. /***/ }),
  136210. /* 1067 */
  136211. /***/ (function(module, exports, __webpack_require__) {
  136212. /**
  136213. * @author Richard Davey <rich@photonstorm.com>
  136214. * @copyright 2018 Photon Storm Ltd.
  136215. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136216. */
  136217. var TYPE = __webpack_require__(337);
  136218. /**
  136219. * [description]
  136220. *
  136221. * @name Phaser.Physics.Impact.Components.BodyType
  136222. * @since 3.0.0
  136223. */
  136224. var BodyType = {
  136225. /**
  136226. * [description]
  136227. *
  136228. * @method Phaser.Physics.Impact.Components.BodyType#getBodyType
  136229. * @since 3.0.0
  136230. *
  136231. * @return {number} [description]
  136232. */
  136233. getBodyType: function ()
  136234. {
  136235. return this.body.type;
  136236. },
  136237. /**
  136238. * [description]
  136239. *
  136240. * @method Phaser.Physics.Impact.Components.BodyType#setTypeNone
  136241. * @since 3.0.0
  136242. *
  136243. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136244. */
  136245. setTypeNone: function ()
  136246. {
  136247. this.body.type = TYPE.NONE;
  136248. return this;
  136249. },
  136250. /**
  136251. * [description]
  136252. *
  136253. * @method Phaser.Physics.Impact.Components.BodyType#setTypeA
  136254. * @since 3.0.0
  136255. *
  136256. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136257. */
  136258. setTypeA: function ()
  136259. {
  136260. this.body.type = TYPE.A;
  136261. return this;
  136262. },
  136263. /**
  136264. * [description]
  136265. *
  136266. * @method Phaser.Physics.Impact.Components.BodyType#setTypeB
  136267. * @since 3.0.0
  136268. *
  136269. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136270. */
  136271. setTypeB: function ()
  136272. {
  136273. this.body.type = TYPE.B;
  136274. return this;
  136275. }
  136276. };
  136277. module.exports = BodyType;
  136278. /***/ }),
  136279. /* 1068 */
  136280. /***/ (function(module, exports) {
  136281. /**
  136282. * @author Richard Davey <rich@photonstorm.com>
  136283. * @copyright 2018 Photon Storm Ltd.
  136284. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136285. */
  136286. /**
  136287. * [description]
  136288. *
  136289. * @name Phaser.Physics.Impact.Components.BodyScale
  136290. * @since 3.0.0
  136291. */
  136292. var BodyScale = {
  136293. /**
  136294. * [description]
  136295. *
  136296. * @method Phaser.Physics.Impact.Components.BodyScale#setBodySize
  136297. * @since 3.0.0
  136298. *
  136299. * @param {number} width - [description]
  136300. * @param {number} [height=width] - [description]
  136301. *
  136302. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136303. */
  136304. setBodySize: function (width, height)
  136305. {
  136306. if (height === undefined) { height = width; }
  136307. this.body.size.x = Math.round(width);
  136308. this.body.size.y = Math.round(height);
  136309. return this;
  136310. },
  136311. /**
  136312. * [description]
  136313. *
  136314. * @method Phaser.Physics.Impact.Components.BodyScale#setBodyScale
  136315. * @since 3.0.0
  136316. *
  136317. * @param {number} scaleX - [description]
  136318. * @param {number} [scaleY] - [description]
  136319. *
  136320. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136321. */
  136322. setBodyScale: function (scaleX, scaleY)
  136323. {
  136324. if (scaleY === undefined) { scaleY = scaleX; }
  136325. var gameObject = this.body.gameObject;
  136326. if (gameObject)
  136327. {
  136328. gameObject.setScale(scaleX, scaleY);
  136329. return this.setBodySize(gameObject.width * gameObject.scaleX, gameObject.height * gameObject.scaleY);
  136330. }
  136331. else
  136332. {
  136333. return this.setBodySize(this.body.size.x * scaleX, this.body.size.y * scaleY);
  136334. }
  136335. }
  136336. };
  136337. module.exports = BodyScale;
  136338. /***/ }),
  136339. /* 1069 */
  136340. /***/ (function(module, exports) {
  136341. /**
  136342. * @author Richard Davey <rich@photonstorm.com>
  136343. * @copyright 2018 Photon Storm Ltd.
  136344. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136345. */
  136346. /**
  136347. * [description]
  136348. *
  136349. * @name Phaser.Physics.Impact.Components.Acceleration
  136350. * @since 3.0.0
  136351. */
  136352. var Acceleration = {
  136353. /**
  136354. * [description]
  136355. *
  136356. * @method Phaser.Physics.Impact.Components.Acceleration#setAccelerationX
  136357. * @since 3.0.0
  136358. *
  136359. * @param {number} x - [description]
  136360. *
  136361. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136362. */
  136363. setAccelerationX: function (x)
  136364. {
  136365. this.accel.x = x;
  136366. return this;
  136367. },
  136368. /**
  136369. * [description]
  136370. *
  136371. * @method Phaser.Physics.Impact.Components.Acceleration#setAccelerationY
  136372. * @since 3.0.0
  136373. *
  136374. * @param {number} y - [description]
  136375. *
  136376. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136377. */
  136378. setAccelerationY: function (y)
  136379. {
  136380. this.accel.y = y;
  136381. return this;
  136382. },
  136383. /**
  136384. * [description]
  136385. *
  136386. * @method Phaser.Physics.Impact.Components.Acceleration#setAcceleration
  136387. * @since 3.0.0
  136388. *
  136389. * @param {number} x - [description]
  136390. * @param {number} y - [description]
  136391. *
  136392. * @return {Phaser.GameObjects.GameObject} This Game Object.
  136393. */
  136394. setAcceleration: function (x, y)
  136395. {
  136396. this.accel.x = x;
  136397. this.accel.y = y;
  136398. return this;
  136399. }
  136400. };
  136401. module.exports = Acceleration;
  136402. /***/ }),
  136403. /* 1070 */
  136404. /***/ (function(module, exports) {
  136405. /**
  136406. * @author Richard Davey <rich@photonstorm.com>
  136407. * @copyright 2018 Photon Storm Ltd.
  136408. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136409. */
  136410. var H = 0.5;
  136411. var N = 1 / 3;
  136412. var M = 2 / 3;
  136413. // Tile ID to Slope defs.
  136414. // First 4 elements = line data, final = solid or non-solid behind the line
  136415. module.exports = {
  136416. 2: [ 0, 1, 1, 0, true ],
  136417. 3: [ 0, 1, 1, H, true ],
  136418. 4: [ 0, H, 1, 0, true ],
  136419. 5: [ 0, 1, 1, M, true ],
  136420. 6: [ 0, M, 1, N, true ],
  136421. 7: [ 0, N, 1, 0, true ],
  136422. 8: [ H, 1, 0, 0, true ],
  136423. 9: [ 1, 0, H, 1, true ],
  136424. 10: [ H, 1, 1, 0, true ],
  136425. 11: [ 0, 0, H, 1, true ],
  136426. 12: [ 0, 0, 1, 0, false ],
  136427. 13: [ 1, 1, 0, 0, true ],
  136428. 14: [ 1, H, 0, 0, true ],
  136429. 15: [ 1, 1, 0, H, true ],
  136430. 16: [ 1, N, 0, 0, true ],
  136431. 17: [ 1, M, 0, N, true ],
  136432. 18: [ 1, 1, 0, M, true ],
  136433. 19: [ 1, 1, H, 0, true ],
  136434. 20: [ H, 0, 0, 1, true ],
  136435. 21: [ 0, 1, H, 0, true ],
  136436. 22: [ H, 0, 1, 1, true ],
  136437. 23: [ 1, 1, 0, 1, false ],
  136438. 24: [ 0, 0, 1, 1, true ],
  136439. 25: [ 0, 0, 1, H, true ],
  136440. 26: [ 0, H, 1, 1, true ],
  136441. 27: [ 0, 0, 1, N, true ],
  136442. 28: [ 0, N, 1, M, true ],
  136443. 29: [ 0, M, 1, 1, true ],
  136444. 30: [ N, 1, 0, 0, true ],
  136445. 31: [ 1, 0, M, 1, true ],
  136446. 32: [ M, 1, 1, 0, true ],
  136447. 33: [ 0, 0, N, 1, true ],
  136448. 34: [ 1, 0, 1, 1, false ],
  136449. 35: [ 1, 0, 0, 1, true ],
  136450. 36: [ 1, H, 0, 1, true ],
  136451. 37: [ 1, 0, 0, H, true ],
  136452. 38: [ 1, M, 0, 1, true ],
  136453. 39: [ 1, N, 0, M, true ],
  136454. 40: [ 1, 0, 0, N, true ],
  136455. 41: [ M, 1, N, 0, true ],
  136456. 42: [ M, 0, N, 1, true ],
  136457. 43: [ N, 1, M, 0, true ],
  136458. 44: [ N, 0, M, 1, true ],
  136459. 45: [ 0, 1, 0, 0, false ],
  136460. 52: [ 1, 1, M, 0, true ],
  136461. 53: [ N, 0, 0, 1, true ],
  136462. 54: [ 0, 1, N, 0, true ],
  136463. 55: [ M, 0, 1, 1, true ]
  136464. };
  136465. /***/ }),
  136466. /* 1071 */
  136467. /***/ (function(module, exports) {
  136468. /**
  136469. * @author Richard Davey <rich@photonstorm.com>
  136470. * @copyright 2018 Photon Storm Ltd.
  136471. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136472. */
  136473. /**
  136474. * Set up the trace-result
  136475. * var res = {
  136476. * collision: {x: false, y: false, slope: false},
  136477. * pos: {x: x, y: y},
  136478. * tile: {x: 0, y: 0}
  136479. * };
  136480. *
  136481. * @function Phaser.Physics.Impact.UpdateMotion
  136482. * @since 3.0.0
  136483. *
  136484. * @param {Phaser.Physics.Impact.Body} body - [description]
  136485. * @param {object} res - [description]
  136486. */
  136487. var UpdateMotion = function (body, res)
  136488. {
  136489. body.standing = false;
  136490. // Y
  136491. if (res.collision.y)
  136492. {
  136493. if (body.bounciness > 0 && Math.abs(body.vel.y) > body.minBounceVelocity)
  136494. {
  136495. body.vel.y *= -body.bounciness;
  136496. }
  136497. else
  136498. {
  136499. if (body.vel.y > 0)
  136500. {
  136501. body.standing = true;
  136502. }
  136503. body.vel.y = 0;
  136504. }
  136505. }
  136506. // X
  136507. if (res.collision.x)
  136508. {
  136509. if (body.bounciness > 0 && Math.abs(body.vel.x) > body.minBounceVelocity)
  136510. {
  136511. body.vel.x *= -body.bounciness;
  136512. }
  136513. else
  136514. {
  136515. body.vel.x = 0;
  136516. }
  136517. }
  136518. // SLOPE
  136519. if (res.collision.slope)
  136520. {
  136521. var s = res.collision.slope;
  136522. if (body.bounciness > 0)
  136523. {
  136524. var proj = body.vel.x * s.nx + body.vel.y * s.ny;
  136525. body.vel.x = (body.vel.x - s.nx * proj * 2) * body.bounciness;
  136526. body.vel.y = (body.vel.y - s.ny * proj * 2) * body.bounciness;
  136527. }
  136528. else
  136529. {
  136530. var lengthSquared = s.x * s.x + s.y * s.y;
  136531. var dot = (body.vel.x * s.x + body.vel.y * s.y) / lengthSquared;
  136532. body.vel.x = s.x * dot;
  136533. body.vel.y = s.y * dot;
  136534. var angle = Math.atan2(s.x, s.y);
  136535. if (angle > body.slopeStanding.min && angle < body.slopeStanding.max)
  136536. {
  136537. body.standing = true;
  136538. }
  136539. }
  136540. }
  136541. body.pos.x = res.pos.x;
  136542. body.pos.y = res.pos.y;
  136543. };
  136544. module.exports = UpdateMotion;
  136545. /***/ }),
  136546. /* 1072 */
  136547. /***/ (function(module, exports, __webpack_require__) {
  136548. /**
  136549. * @author Richard Davey <rich@photonstorm.com>
  136550. * @copyright 2018 Photon Storm Ltd.
  136551. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136552. */
  136553. var Clamp = __webpack_require__(19);
  136554. /**
  136555. * [description]
  136556. *
  136557. * @function Phaser.Physics.Impact.GetVelocity
  136558. * @since 3.0.0
  136559. *
  136560. * @param {number} delta - [description]
  136561. * @param {number} vel - [description]
  136562. * @param {number} accel - [description]
  136563. * @param {number} friction - [description]
  136564. * @param {number} max - [description]
  136565. *
  136566. * @return {number} [description]
  136567. */
  136568. var GetVelocity = function (delta, vel, accel, friction, max)
  136569. {
  136570. if (accel)
  136571. {
  136572. return Clamp(vel + accel * delta, -max, max);
  136573. }
  136574. else if (friction)
  136575. {
  136576. var frictionDelta = friction * delta;
  136577. if (vel - frictionDelta > 0)
  136578. {
  136579. return vel - frictionDelta;
  136580. }
  136581. else if (vel + frictionDelta < 0)
  136582. {
  136583. return vel + frictionDelta;
  136584. }
  136585. else
  136586. {
  136587. return 0;
  136588. }
  136589. }
  136590. return Clamp(vel, -max, max);
  136591. };
  136592. module.exports = GetVelocity;
  136593. /***/ }),
  136594. /* 1073 */
  136595. /***/ (function(module, exports, __webpack_require__) {
  136596. /**
  136597. * @author Richard Davey <rich@photonstorm.com>
  136598. * @copyright 2018 Photon Storm Ltd.
  136599. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136600. */
  136601. /**
  136602. * An Impact.js compatible physics world, body and solver, for those who are used
  136603. * to the Impact way of defining and controlling physics bodies. Also works with
  136604. * the new Loader support for Weltmeister map data.
  136605. *
  136606. * World updated to run off the Phaser main loop.
  136607. * Body extended to support additional setter functions.
  136608. *
  136609. * To create the map data you'll need Weltmeister, which comes with Impact
  136610. * and can be purchased from http://impactjs.com
  136611. *
  136612. * My thanks to Dominic Szablewski for his permission to support Impact in Phaser.
  136613. *
  136614. * @namespace Phaser.Physics.Impact
  136615. */
  136616. module.exports = {
  136617. Body: __webpack_require__(1029),
  136618. COLLIDES: __webpack_require__(338),
  136619. CollisionMap: __webpack_require__(1028),
  136620. Factory: __webpack_require__(1027),
  136621. Image: __webpack_require__(1025),
  136622. ImpactBody: __webpack_require__(1026),
  136623. ImpactPhysics: __webpack_require__(1057),
  136624. Sprite: __webpack_require__(1024),
  136625. TYPE: __webpack_require__(337),
  136626. World: __webpack_require__(1023)
  136627. };
  136628. /***/ }),
  136629. /* 1074 */
  136630. /***/ (function(module, exports, __webpack_require__) {
  136631. /**
  136632. * @author Richard Davey <rich@photonstorm.com>
  136633. * @copyright 2018 Photon Storm Ltd.
  136634. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136635. */
  136636. /**
  136637. * @namespace Phaser.Physics
  136638. */
  136639. module.exports = {
  136640. Arcade: __webpack_require__(708),
  136641. Impact: __webpack_require__(1073),
  136642. Matter: __webpack_require__(1053)
  136643. };
  136644. /***/ }),
  136645. /* 1075 */
  136646. /***/ (function(module, exports, __webpack_require__) {
  136647. /* WEBPACK VAR INJECTION */(function(global) {/**
  136648. * @author Richard Davey <rich@photonstorm.com>
  136649. * @copyright 2018 Photon Storm Ltd.
  136650. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
  136651. */
  136652. __webpack_require__(614);
  136653. var CONST = __webpack_require__(22);
  136654. var Extend = __webpack_require__(16);
  136655. /**
  136656. * @namespace Phaser
  136657. */
  136658. var Phaser = {
  136659. Actions: __webpack_require__(604),
  136660. Animation: __webpack_require__(572),
  136661. Cache: __webpack_require__(571),
  136662. Cameras: __webpack_require__(964),
  136663. Class: __webpack_require__(0),
  136664. Create: __webpack_require__(958),
  136665. Curves: __webpack_require__(952),
  136666. Data: __webpack_require__(514),
  136667. Display: __webpack_require__(949),
  136668. DOM: __webpack_require__(920),
  136669. Events: __webpack_require__(506),
  136670. Game: __webpack_require__(504),
  136671. GameObjects: __webpack_require__(919),
  136672. Geom: __webpack_require__(404),
  136673. Input: __webpack_require__(389),
  136674. Loader: __webpack_require__(761),
  136675. Math: __webpack_require__(747),
  136676. Physics: __webpack_require__(1074),
  136677. Plugins: __webpack_require__(335),
  136678. Renderer: __webpack_require__(678),
  136679. Scene: __webpack_require__(198),
  136680. Scenes: __webpack_require__(333),
  136681. Sound: __webpack_require__(331),
  136682. Structs: __webpack_require__(330),
  136683. Textures: __webpack_require__(329),
  136684. Tilemaps: __webpack_require__(673),
  136685. Time: __webpack_require__(313),
  136686. Tweens: __webpack_require__(311),
  136687. Utils: __webpack_require__(624)
  136688. };
  136689. // Merge in the consts
  136690. Phaser = Extend(false, Phaser, CONST);
  136691. // Export it
  136692. module.exports = Phaser;
  136693. global.Phaser = Phaser;
  136694. /*
  136695. * "Documentation is like pizza: when it is good, it is very, very good;
  136696. * and when it is bad, it is better than nothing."
  136697. * -- Dick Brandon
  136698. */
  136699. /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(220)))
  136700. /***/ })
  136701. /******/ ]);
  136702. });